sábado, 11 de junio de 2011

CRC KERMIT Y CCITT EN ATMEGA

Cuando se tiene aplicaciones que involucran transmisión de datos siempre es importante tener un medio para detectar errores o para verificar la integridad de dicha información, es aquí donde entra a tallar el Chequeo de Redundancia Cíclica (CRC).

En éste post mostrare un par de rutinas para hacer el calculo del CRC KERMIT Y CRC CCITT en assembler de ATMEL.

Los resultados pueden ser chequeados en On-line CRC calculation

Aquí no hay mucho que decir así que pasare a mostrar las rutinas.

CRC1

Aqui hay dos buques que calcularan el crc de la cadena de texto (“JONATHAN RAUL SEMINARIO”) que se encuentra en la memoria de programa.

CRC2

CRC3

Las rutinas son muy similares, tienen la misma cantidad de instrucciones (22 instrucciones) y son ejecutadas en la misma cantidad de ciclos de instrucción(28 c.i). Si trabajamos con un XTAL=16MHz nos tomará 1.75us calcular el crc de cada byte.


Bueno, eso es todo en éste post…bye !!!

domingo, 5 de junio de 2011

Input Capture Unit


El timer1 incorpora una unidad de captura la cual puede capturar eventos externos y darnos un tiempo referencial en el cual estos ocurrieron.
La señal que indica el evento puede ser aplicado al pin ICP1 o vía la unidad de comparación analógica. El tiempo que es capturado puede ser usado para medir frecuencia, duty-cycle u alguna otra característica de la señal aplicada.

En el siguiente gráfico de muestra el diagrama de bloques de la unidad de captura.

bloques

Se puede ver que las entradas pueden ser el pin ICP1 o el comparador analógico. LA unidad también cuenta con un modulo de cancelación de ruido el cual tomará 4 muestras de la señal y si las 4 son iguales la señal será valida. También ésta el modulo de detección de flanco que nos permite seleccionar entre los flancos de subida(‘1’) o bajada(‘0’).
Cuando el evento ocurre los 16bits del contador TCNT1 son escritos al registro ICR1, también  en éste mismo instante se generará un interrupción( siempre que se activen los flag’s TICIE1 en el registro TIMSK y I en SREG.

En éste post usaré la unidad de captura para medir la frecuencia de una señal cuadrada.
El principio de medición consiste en capturar el valor de cuenta del timer1 (TCNT1) en un periodo de la señal a medir, luego con el valor de la captura , la frecuencia a la que trabaja el uC y conociendo el pre-escaler usado podremos fácilmente encontrar la frecuencia de la señal.

Por ejemplo: Si se trabaja con una F_CPU=16MHz, el valor capturado es ICR1=0x08BB y el pre-escaler usado es 64, entonces la frecuencia de la señal es:

image

Aplicando los datos a la formula:

image

Ahora pasaré a mostrar el código. Hay algunas macros y rutinas que ya he mostrado en post anteriores pero las estoy volviendo a mostrar.

Primero mostrare las macros.






m24

Ahora mostraré la rutinas de conversión de binario a ascii.

binascii1

binascii2

Ahora la rutinas para manejo del LCD.

lcd1

lcd2

lcd3

Las rutina de retardo que es usado junto a las macros delay_ms y delay_us.

retardo

La rutina para efectuar la división.

div1

div2

Y por último el código principal.






main23


main24

El funcionamiento del programa es como sigue.
  • Se configura los periféricos, se habilita la interrupción y se espera a que ésta ocurra.

  • Cuando ocurra la interrupción por captura el programa saltará a la rutina “CAPTURA_EVEN”, aquí tomará el valor capturado y lo pondrá en dos registros(R19:R18=ICR1H:ICR1L).
  • Se verificara si el timer se ha desbordado, en caso de ser así se mostrará un mensaje indicado que aquella es una frecuencia que no se puede medir(“fuera de rango”).

  • Si no se ha desbordado se calculará la frecuencia, con la formula ya antes mostrada, y se guardará en FRECASCII.

  • Luego del calculo de mostrará la frecuencia en el LCD.

  • Se espera 300ms y luego se espera al siguiente flanco de subida para iniciar la siguiente captura de datos (la medida de la frecuencia se toma entre dos francos de subida).
Hay que tener presente que con este método no se puede medir frecuencias muy altas, mientras mayor es la frecuencia mayor es el error en la medición. En un próximo post  mostraré como usar el mismo timer para hacer medidas de frecuencias mas altas.
Espero este pequeño ejemplo le ayude..!!!

Ahora un video del programa en funcionamiento.