Subrutina Division 24 bits VS 16 bits, AVR ensamblador

Subrutina División 24 bits VS 16 bits, AVR ensamblador


SUB-RUTINA DE DIVISIÓN DE UN NUMERO DE 24 BITS(ALOJADO EN 3 REGISTROS DE 8 BITS C/U) ENTRE UN NUMERO DE 16 BITS (ALOJADO EN 2 REGISTROS DE 8 BITS C/U), EN LENGUAJE ENSAMBLADOR, COMPATIBLE PARA DIFERENTES FAMILIAS DE MICOCONTROLADORES AVR DE 8 BITS (ATTINY, ATMEGA, ENTRE OTRAS).

REALIZADA POR ING. C.N. JOSUE NORBERTO MARTINEZ F. (DICIEMBRE 2018)

TAMAÑO DEL CÓDIGO 218 BYTES

EL CÓDIGO DE ESTA SUBRUTINA PUEDE SER AGREGADO AL CODIGO DEL PROGRAMA PRINCIPAL O PUEDE SER INCLUIDO UTILIZANDO EL COMANDO ".INCLUDE".

EJEMPLO:
.INCLUDE "SUBRUTINA_DIVISION_24_VS_16_BITS_V2.INC"

ESTA SUB-RUTINA PUEDE SER LLAMADA EN EL MOMENTO QUE SE DESEE UTILIZANDO EN COMANDO "RCALL"

EJEMPLO:
RCALL SUBRUTINA_DIVISION_24_VS_16_BITS_V2

DURANTE LAS OPERACIONES QUE REALIZA, ESTA SUBRUTINA SOBREESCRIBE LOS REGISTROS R12, R13, R14 Y R15


PARA EJECUTAR ESTA SUBRUTINA SE DEBEN SEGUIR LOS SIGUIENTES PASOS:


1.- DEBE DEFINIR LOS REGISTROS QUE DESEA UTILIZAR COMO A CONTINUACIÓN SE DESCRIBE (NO UTILIZAR R12, R13, R14 Y R15):

DIVIDENDO_BYTE1 .- BYTE MENOS SIGNIFICATIVO DEL DIVIDENDO
DIVIDENDO_BYTE2 .- BYTE INTERMEDIO DEL DIVIDENDO
DIVIDENDO_BYTE3 .- BYTE MÁS SIGNIFICATIVO DEL DIVIDENDO

DIVISOR_BYTE1 .- BYTE MENOS SIGNIFICATIVO DEL DIVISOR
DIVISOR_BYTE2 .- BYTE MÁS SIGNIFICATIVO DEL DIVISOR

RESULTADO_BYTE1 .- BYTE MENOS SIGNIFICATIVO DEL RESULTADO
RESULTADO_BYTE2 .- BYTE INTERMEDIO DEL RESULTADO
RESULTADO_BYTE3 .- BYTE MÁS SIGNIFICATIVO DEL RESULTADO

RESIDUO_BYTE1 .- BYTE MENOS SIGNIFICATIVO DEL RESIDUO
RESIDUO_BYTE2 .- BYTE MÁS DEL RESIDUO

2.- ASIGNAR VALORES AL DIVIDENDO Y AL DIVISOR

3.- EJECUTAR LA SUBRUTINA UTILIZANDO EN COMANDO "RCALL"

4.- EL RESULTADO DE LA DIVISIÓN Y EL RESIDUO SE ENCONTRARÁN EN LOS REGISTROS CORRESPONDIENTES


EJEMPLO DE IMPLEMENTACIÓN:


.DEF DIVIDENDO_BYTE1 = R21
.DEF DIVIDENDO_BYTE2 = R22
.DEF DIVIDENDO_BYTE3 = R23

.DEF DIVISOR_BYTE1 = R24
.DEF DIVISOR_BYTE2 = R25

.DEF RESULTADO_BYTE1 = R26
.DEF RESULTADO_BYTE2 = R27
.DEF RESULTADO_BYTE3 = R28

.DEF RESIDUO_BYTE1 = R29
.DEF RESIDUO_BYTE2 = R30

LDI DIVIDENDO_BYTE1, $A6
LDI DIVIDENDO_BYTE2, $01
LDI DIVIDENDO_BYTE3, $0F

LDI DIVISOR_BYTE1, $B2
LDI DIVISOR_BYTE2, $F1

RCALL SUBRUTINA_DIVISION_24_VS_16_BITS_V2

FIN:
RJMP FIN


DESCRIPCIÓN DEL ALGORITMO DE LA SUB-RUTINA


El principio es así: Supongamos que queremos dividir A / B. Si duplicamos el valor de B y el resultado cabe en A, entonces sabemos que B puede estar contenido en A al menos dos veces. Si volvemos a duplicar B y aún puede estar contenido en A, sabemos que B puede cabe cuatro veces en A... y así sucesivamente. En un cierto punto, ya no podemos seguir duplicando B, ya que no cabrá en A. Por lo tanto, restamos el múltiplo más grande de B que cupo en A, y repetimos el proceso con este nuevo valor, que ahora es el Nuevo dividendo. Este enfoque reduce dramáticamente las restas necesarias.

EJEMPLO DE APLICACIÓN DEL ALGORITMO:

We must perform: 10 / 2
Set a counter (CT) to 0: CT = 0
Set partial dividend to 0: K = 0
Double the divisor: 4, set K = 4
4 can be contained in 10? yes. So, increment CT by 1 (CT = 1)
Double again: 4 * 2 = 8, K = 8
8  can be contained in 10? yes. So, increment CT by 1 (CT = 2)
Double again: 8 * 2 = 16, K = 16
16 can be contained in 10? no. K = K / 2 
(we discard 16 and go back to 8)
So we have: 
K = 8 (partial dividend), CT = 2
The quotient between K and divisor (2) is: Q1 = 2^CT = 2 ^ 2 = 4
Now, we have divided by two a part of the original dividend. 
The part left to divide is:
10 - 8 = 2. And we set K = 2
Double the divisor: 2 * 2 = 4, K = 4
4 can be contained in 2? No, so we have K = K / 2 = 2, CT = 0
K = 2 (partial dividend), CT = 0
The quotient between K and divisor 2 is Q2 = 2 ^ CT = 1
Now we add the two quotients together to obtain:
Total quotient = Q1 + Q2 = 4 + 1 = 5
That's the final result, as 10 / 2 = 5.

DIAGRAMA DE FLUJO DE LA SUBRUTINA DE DIVISION


VIDEO TUTORIAL QUE EXPLICA COMO REALIZAR LA DIVISIÓN DE UN NUMERO DE 24 BITS ENTRE OTRO DE 16 BITS UTILIZANDO LA SUB-RUTINA DE DIVISIÓN PRESENTADA EN ESTE POST.





LINK DE DESCARGA DEL CÓDIGO DE LA SUBRUTINA EN LENGUAJE ENSAMBLADOR


SUBRUTINA DE DIVISION 24 BITS VS 16 BITS VERSION 2.
Tamaño: 3KB
Tipo: Archivo comprimido en WinRar








.

PR-0318 Tarjeta de programación de AVR, para múltiples modelos

PR-0318 Tarjeta de programación de AVR, para múltiples modelos.

EL DISEÑO ORIGINAL DEL CIRCUITO QUE SE MUESTRA EN ESTE POST, FUE OBTENIDO DE LA SIGUIENTE REFERENCIA:

Paredes Martínez, Ernesto. (2018). Curso práctico para programación de AVR - Proyectos completos, código y explicación. México: Alfaomega. 


https://www.alfaomega.com.mx/default/catalogo/profesional/ciencia-y-tecnologia/curso-practico-para-programacion-de-avr.html




En este post les comparto el PCB de la tarjeta de programación para microcontroladores AVR, para múltiples modelos, dentro de los que se encuentran los siguientes:

ATTiny12
ATTiny13
ATTiny15
ATTiny25
ATTiny45
ATTiny85
ATTiny2313
ATTiny4313
ATMega8
ATMega48
ATMega88
ATMega328
ATMega16
ATMega32
ATMega8535
ATMega8515
ATMega162

¿Porqué utilizar este circuito en vez de programar directamente los microcontroladores en un protoboard?
Respuesta: la tarjeta cuenta con resistencias limitadoras de corriente que evitan un corto circuito (en caso de que un pin se programe como salida y se encuentre conectado a tierra ó que un pin se programe en estado bajo y reciba una señal de voltaje que provoca un cortocircuito y que queme nuestro microcontrolador), así mismo evita que arruinemos nuestros micro-controladores debido a un error en la conexión y facilita el montaje y desmontaje al momento de programar gracias a su zócalo tipo ZIF.

**Esta tarjeta cuenta con un conector de 6 pines compatible con el conector del programador AVR-ISP MK-I  y MK-II.
**Esta tarjeta puede utilizarse con cualquier programador serial como los diferentes modelos de AVR-ISP ó USBASP.
**Esta tarjeta se debe alimentar con 5V regulados.
**En la parte izquierda de la tarjeta se encuentra una columna de pines en grupos de 3. Utilizando "jumpers" o puentes se selecciona la configuración adecuada de acuerdo al modelo de microcontrolador que se desea utilizar.
**El grosor de las pistas es adecuado para utilizar CNC, película fotosensible ó el método de planchado

El siguiente video muestra como utilizar esta tarjeta de programación:



A continuación el link de descarga del PCB en formato Circuit Wizard.
Link de descarga del Circuito Impreso:

PCB Tarjeta programadora AVR.
Tamaño: 28KB
Tipo: Archivo de CircuitWizard.


Si no cuentas con el programa Circuit Wizard, descargalo dando click aqui:








____________________________________________________
Palabras clave: programador, programmer, base de programación, zócalo de programación, DIY, Circuito impreso, plantilla, PCB, microcontrolador, MCU, AVR, atmel, ZIF, completo, universal, gratis, descargar, aprender.