Para comunicarnos con otros dispositivos electrónicos como LCD o HMI estos interpretan los datos como si fueran ASCII entonces el envio y recepción de datos deben ser caracteres ASCII de lo contrario no habría comunicación.
Comunicación de Binario a ASCII
A continuación tenemos las principales representaciones de caracteres ASCII, como podemos ver por ejemplo un valor de 41 HEX nos representará a un carácter A.
Si quiero representar números ASCII entonces debo tener en cuenta la tabla 4.
Tabla1
Tabla2
Tabla3
Tabla4
Ahora ya sabemos que valores en hexadecimal representa a un carácter ASCII, Pero como hago la conversión de mis datos(binarios) a ASCII???.
Bueno aquí esta la finalidad de este tema del blog y la forma de llevarlo es de la siguiente manera:
De binario a Ascii
La conversión de Binario a BCD ya la abarcamos en una entrada anterior, que es mas que todo la representación de 4 bits en un número decimal, puedes revisarla.
Una vez que tengamos nuestros datos en BCD vamos a representarlos a ASCII. para ello haremos un ejemplo que nos definirá la manera de llevar mis datos a ASCII.
Ejemplo- de Binario a ASCII
En el ejemplo anterior se realiza el procedimiento de conversión de binario a ASCII de binario "0110" a ASCII 6. Se puede observar que para convertir un decimal de 4 bit(BCD) le debemos sumar 30hex para que mi decimal(6) se convierta en el carácter ASCII(6).
Diagrama de Flujo
En el siguiente DiagramA de flujo se muestra el procedimiento de conversión de BCD a ASCII.
Diagrama de Flujo-Forma general.
Conclusión
Para llevar mi datos binarios a ASCII debo pasar por dos pasos: el primer paso para llevar mi dato binario es llevarlos a BCD(grupos de 4 bits) y el segundo paso es finalmente llevarlos a ASCII.
Para llevar mi dato BCD a ASCII le sumo 30 Hex y habré convertido mi BCD a un caracter ASCII equivalente.
¿Tienes alguna duda de este tema?, o ¿De qué otros temas quieres que hablemos?, puedes escribirnos directamente a nuestro grupo de Telegram
Los modos de direccionamiento son un aspecto fundamental cuando se diseña la arquitectura de un procesador, porque definen muchas de las características que se ven reflejadas cuando es puesto en marcha, características que involucran: la ubicación de los datos sobre los que operan las instrucciones, el tamaño de las constantes, los registros que se pueden considerar como operandos en una instrucción y el alcance de los saltos.
En los microcontroladores AVR se observan 7 modos de direccionamiento:
Directo por registro.
COM R1
INC R2
SER R3
Directo a Registro I/O.
OUT PORTB,R13
IN R15, PINA
Directo a memoria de datos(SRAM).
LDS R16,0x110
STS 0x0100,R5
Indirecto a memoria de datos.
LD R5,Y
ST X,R11
Indirecto a memoria de código(Flash Program).
LPM
LPM R3,Z
SPM
Inmediato.
ANDI R17,0xF3
SUBI R19,0x12
ORI R31,0x03
LDI R16,0x25
Direccionamiento en bifurcaciones.
RJMP -20
RCALL 32
BREQ 15
BRNE -10
BRGE 10
IJMP
ICALL
JMP
CALL
En la imagen se muestra algunas transferencias de datos.
Transferencia de datos
Se puede observar que las transferencias directas usa direcciones de memoria de manera directa.
Las transferencias indirectas hacia la memoria de datos usa a los apuntadores X,Y,Z.
las transferencias indirectas hacia la memoria de programa(FLASH) únicamente se puede usar el apuntador Z con las instrucciones LPM,SPM.
Algunos AVR tienen 160 registros de I/O extendidos por ejemplo el Atmega 328P, Atmega88, Atmega168,Atmega 8U2/16U2/32U2 entre otro , aquí se encuentran registros como EIMSK,EICRA(registros de interrupción externa) entre otros . Pero en el caso de los atmega 32 no tienen estos registros E/S extendidos por ello la memoria SRAM interna empieza desde 60 hex hasta RAMEND(085F).
El AVR tiene dos tipos de memoria memoria de programa y memoria de datos(FLASH, SRAM), en esta oportunidad nos enfocaremos en SRAM.
En la RAM ó SRAM se tienen tres espacios diferentes en un mapa con direccionamiento lineal, inicia en la dirección 0x000 y concluye en la 0x85F(para Atmega 32). Las primeras 32 localidades son del Archivo de Registros(GPRs), luego siguen 64 localidades denominadas como Registros I/O(SFRs), necesarios para el manejo de recursos, y finalmente se tienen 2k ó 2018 Bytes localidades de SRAM de propósito general para un atmega32.
Figura1
El núcleo AVR está optimizado para trabajar con los registros de propósito general(GPRs) , las instrucciones los refieren como R0 a R31, o bien como apuntadores (X, Y o Z). No obstante, estos registros también pueden ser referidos como cualquier localidad de SRAM de propósito general,
De acuerdo con la figura 2, los Registros I/O también pueden ser referidos como cualquier localidad de SRAM de propósito general, utilizando instrucciones de carga (LD) o almacenamiento (ST), con direcciones en el rango de 0x20 a 0x5F.
Tratar a los Registros de Propósito General o a los Registros I/O como SRAM de propósito general no es conveniente, porque las instrucciones de acceso a memoria se ejecutan en 2 ciclos de reloj.
Figura2
El espacio de propósito general queda disponible para: variables simples que no alcanzan en los 32 registros, para variables compuestas, como arreglos o estructuras, o bien, para la pila de datos temporales. Pero al ser una arquitectura del tipo Registro a Registro, cualquier variable de SRAM que requiera una modificación debe ser llevada a un registro, para ello se realiza una carga (LD, load) y para respaldar un registro en SRAM se realiza un almacenamiento (ST, store), esto se representa en la figura 3
Figura3
Figura4-Data Memory-Atmega328P-Atmega88
Algunos AVR tienen 160 registros de I/O extendidos por ejemplo el Atmega 328P, Atmega88, Atmega168 ,Atmega 8U2/16U2/32U2 entre otros, aquí se encuentran registros como EIMSK,EICRA(registros de interrupción externa) y mas .En estos casos la memoria SRAM empieza desde 0x0100 hasta RAMEND(varia según el micro)
Pero en el caso de los atmega 32 no tienen estos registros E/S extendidos por ello la memoria SRAM interna empieza desde 60 hex hasta RAMEND(085F).
Para realizar esta conversión primero debemos establecer la cantidad exacta de bits al cual convertir,
en este ejemplo vamos a convertir 16 bits a BCD, recordando que 16 bits está formado por 2 Bytes, la
representación máxima de un número de 16 bits es:
11111111 11111111 que es equivalente a FF FF en hexedecimal y en decimal sería el número
65 535(sesenta y cinco mil quinientos treinta y cinco).
Un número BCD(Decimal Codificado en Binario) está representado por digitos del 0-9 como se muestra en la
imagen:
Como se puede ver en la imagen los números BCD agrupa 4 bits para representar un número decimal.
Saber como convertir bits a BCD es importante en el proceso de muchos otros procesos que veremos posteriormente, por ejemplo en el momento de convertir bits a ASCII entre muchos otros sistemas de conversion para infinitas aplicaciones y es que saber como se hace el proceso de conversiones nos permitirá convertir cualquier cantidad de bits a cualquier formato de conversión. y lo mejor de todo que sea el lenguaje de programación que estemos usando el proceso es el mismo solo es importante hacer los pasos necesarios, para ello veremos un diagrama de flujo del proceso de conversión para luego plasmarlo en código, por supuesto nosotros usaremos asembler para la códificación.
Como ejemplo de conversión a BCD tomaremos el número máximo de 16 bits que es el 65 535 en decimal.
Proceso de Conversión
Hay distintas maneras de realizar la conversión por ejemplo divisiones sucesivas u diferencias sucesivas, como el código que implementaremos estará en un microcontrolador de 8 bits Atmega32L y no posee instrucciones para realizar divisiones entonces optamos por el método de diferencias sucesivas para la conversion de binario a BCD.
Una vez elegida el método profundirizaremos mas su implemetación:
El proceso de conversión consiste en ir restando paulatinamente el número a convertir, ¿pero cual será mi minuendo y sustraendo y que hago con el residuo?.
el primer término, minuendo será el número a convertir a bcd y el segundo término el sustraendo será 10000, 1000, 100,10 depende de la cantidad de digitos del minuendo, el minuendo y el sustraendo deben tener la misma cantidad de digitos.
Por ejemplo para nuestro ejemplo , el minuendo será el 65530 y el sustraendo será el 10000, ahora ya sabemos que cantidades se van a restar y el resultado de esta operación será el residuo y se guardará en variables o registros para realizar nuevamente la diferencia, ahora el residuo será mi nuevo minuendo, las veces que se produce una resta se van guardando en una variable o registro , por otro lado el término sustraendo se mantiene en 1000 y haremos una nueva operación resta. Pero hasta cuando haremos diferencias?? Pues hasta que el minuendo sea menor al sustraendo y/o sean iguales.
Para hacer una diferencia entre números es suficiente comparar los números mas a la izquierda o si es que se quiere decir los MSB(Most Significant Bit).
El número BCD final será la cantidad de restas o diferencias que se harán en el proceso de conversión.
Lo anterior es la descripción del proceso de conversión de binario a BCD de manera general, no completa pero con nociones básicas del procedimiento.