sábado, 25 de mayo de 2019

De Binario a ASCII

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


miércoles, 22 de mayo de 2019

Direccionamiento directo e indirecto

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:

  1. Directo por registro.
  • COM R1
  • INC   R2 
  • SER   R3
  1. Directo a Registro I/O.
  • OUT PORTB,R13
  • IN     R15, PINA
  1. Directo a memoria de datos(SRAM).
  • LDS R16,0x110
  • STS 0x0100,R5
  1. Indirecto a memoria de datos.
  • LD R5,Y
  • ST X,R11
  1. Indirecto a memoria de código(Flash Program).
  • LPM 
  • LPM R3,Z
  • SPM
  1. Inmediato.
  • ANDI R17,0xF3
  • SUBI  R19,0x12
  • ORI    R31,0x03
  • LDI    R16,0x25
  1. 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).


jueves, 9 de mayo de 2019

SRAM y SRAM de propósito general

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).




martes, 7 de mayo de 2019

Conversión de Binario a BCD

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.

Diagrama de Flujo- Link

Código

Tienes alguna duda de este tema, o ¿de qué otros temas quieres que hablemos?, puedes escribirnos directamente a nuestro grupo de Telegram

Uso del firmware original de la grabadora USBasp AVR en MX-USBASP (clon chino)

Te vendieron un USBisp pensado que es un USBasp?? Hace 2 meses compré un "USBasp" fui a probarlo y no funcionó....pensé me estafar...