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
;migsantiago@tutopia.com
;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
Ahora para los fans de los PICs, les dejo un programa idéntico pero hecho con el 16f84a. Compárenlos. :]
;Int. por timer 1 segundo en PIC16f84a
;saca conteo binario cada segundo por portb
LIST P=16f84
include "p16f84a.inc"
;Registros
contador4ms equ 0x0c
org 0x00
goto inicio
org 0x04
goto timer ;Vector de interrupción
org 0x05
inicio bsf STATUS,RP0 ;banco 1
clrf TRISB ;todo B salida
movlw 0x03 ;00000011
movwf OPTION_REG ;1:16 escala
bcf STATUS,RP0 ;banco 0
clrf PORTB
clrf contador4ms ;borra conteo de 4ms
movlw 0x06 ;256-250=6
movwf TMR0
movlw 0xa0 ;10100000
movwf INTCON ;habilita GIE y T0IE
ciclo nop
goto ciclo
timer btfss INTCON,T0IF ;por si hubo otra interrupción
retfie
incf contador4ms,F
movf contador4ms,W ;pasa contador4ms a w
sublw 0xfa ;compara con 250
btfss STATUS,Z ;brinca si Z=1
goto pon_conteo
clrf contador4ms
incf PORTB,F
pon_conteo movlw 0x06 ;regresa conteo
movwf TMR0
bcf INTCON,T0IF ;borra bandera int. tmr
bsf INTCON,T0IE ;rehabilita int. por timer
retfie
end