Tutoriales

Curso Básico AVR AT90S1200 - Página 5


Programa con interrupción por timer cada segundo

Bueno, ya que están medio familiarizados con las interrupciones les dejo un programa que genera una salida binaria cada segundo usando interrupciones:

--------------------------------------------------------------------------------
;Programa que incrementa conteo binario
;en PtoB cada segundo usando interrupción
;por timer

;CK/64 tiempo mínimo=16us
;4ms/16us=250 conteos
;256-250=6 -> TCNT0
;4ms x 250conteos= 1s
 
.include "1200def.inc"
rjmp main
nop
rjmp timer
main: clr r17 ;pone a cero salida a ptoB
clr r25 ;pone a cero contador 4ms
ser r16
out ddrb,r16 ;ptoB de salida
out timsk,r16 ;habilita int. por timer
ldi r16,6
out tcnt0,r16 ;manda el 6 a timer
sei ;habilita I en SREG
ldi r16,$03
out tccr0,r16 ;011 en escala: CK/64
ciclo: nop ;pasa el tiempo
rjmp ciclo
 
timer: inc r25 ;inc. conteo de 4ms
cpi r25,$fa ;250d = fah
breq increm ;se va a inc. ptoB
pon_conteo: ldi r16,$06
out tcnt0,r16 ;comienza tiempo 4ms otra vez
reti ;regresa de interrupción
;habilitando I en SREG
 
increm: inc r17 ;inc conteo en ptoB
out portb,r17 ;saca conteo
clr r25 ;borra conteo de 4ms
rjmp pon_conteo
 

--------------------------------------------------------------------------------
 
 
Les explico los registros del TIMER:
 
TIMSK - Habilita la interrupción por sobreflujo del contador TCNT0
TIFR - Es la bandera que dice si hubo sobreflujo del TCNT0
TCCR0 - Aquí uno da las escalas de división de TCNT0
TCNT0 - Aquí se lleva la cuenta
 
En TCCR0 Se tiene CS02, CS01 y CS00 los cuales indican la escala y el funcionamiento del Timer, los datos que llevan son CS02, CS01 y CS00 respectivamente:
 
*Cristal de 4MHz
000 - stop, no cuenta
001 - CK, la escala es igual al cristal que uno le ponga (0.25us por conteo y 4MHz)
010 - CK/8 (2us)
011 - CK/64 (16us)
100 - CK/256 (64us)
101 - CK/1024 (256us)
110 - Flanco derecho en patita T0 PD4
111 - Flanco izquierdo en T0
 
R25 va a contar 250 veces el desbordamiento del timer. El timer se va a desbordar cada 4ms ya que se usó CK/64. R16 lleva un 6 para que el conteo se haga 250 veces.
 
16us x 250 (r16) = 4ms
4ms x 250 (r25) = 1000ms
 
 
Trabajando los registros 16 a 31
 
Antes de explicarte, por favor baja este archivo de Atmel:
 http://www.atmel.com/dyn/resources/prod_documents/DOC0856.PDF
 
Este archivo trae las explicaciones de cada código de operación de la familia de 8bit de AVRs. Trae instrucciones que los AT90S1200 no incluyen, pero a esas no les hagas caso, sólo estudia las que trabaja el 1200.
 
Ya que tengas el archivo checa la página 16 por ejemplo. Ahí viene explicada bien la instrucción ADC (Suma con acarreo) por ejemplo. Abajo dice que los registros que maneja esta instrucción son 0 < d < 31, 0 < r < 31 (menor o igual)
 
Ahora checa la página 20. Ahí se explica la operación ANDI (AND inmediata). Los registros que ella trabaja son 16 < d < 31, 0 < K < 255 (K es el número a poner en la AND)
 
¿Porqué? No te puedo dar una respuesta exacta, pero tiene que ver con el modo de direccionamiento del AVR. Cada instrucción tiene límites de trabajo con los registros, siempre hay que checarlas.
 
Te recomiendo que leas las instrucciones en las que estés interesado.
 
 
Eso es todo por mi parte. Este es un curso muy breve que se basa en conocimientos que el lector ya tenga sobre lenguaje ensamblador.
 
Si buscas un programador para este AVR te recomiendo entres a http://www.atmel.com y hagas una búsqueda. Ahí encontrarás programadores muy sencillos y el software para trabajarlos.
 
15 junio 2005