Hola, estoy dando mis primeros pasos con el timer0 (PIC16F84A) y necesito ayuda pues no logro programarlo.
Lo que quiero hacer es muy sencillo. Se trata de hacer la prueba más sencilla para comprobar que salta la rutina del timer0. Tan sólo quiero que cuando salte el timer0 me ponga a 1 el bit 0 del PORTA. O sea que el programa debería arrancar, lanzar el timer0 e inmediatamente debería saltar la interrupción ya que estaría inicializado a un valor muy bajo, sin contador ni nada. Eso sería todo ya que las proximas veces que saltase el timer0 volvería a poner el bit 0 del PORTA a 1 pero ya estaría de antes, así que eso sería lo único. Para ver el valor del PORTA utilizo un led (que está bien pues lo compruebo con el bit1 del PORTA que lo pongo a 1). El caso es que el bit 0 del PORTA se mantiene a 0 y nunca cambia a 1. Bueno ya me he extendido demasiado para explicar lo que viene a ser una chorrada. A continuación pongo el código fuente para ver si me podeis ayudar. Muchas gracias y un saludo.
#include "p16f84a.inc"
bank0 udata
W_save res 1
Status_save res 1
PCLATH_save res 1
FSR_save res 1
contador res 1
STARTUP code
pagesel main
goto main
nop
InterruptServiceVector
bcf INTCON,GIE ;enmascarar int general
banksel W_save
movwf W_save
movf STATUS,W
clrf STATUS
movwf Status_save
movf PCLATH,w
movwf PCLATH_save
movf FSR,w
movwf FSR_save
Process_ISR
clrwdt
btfsc INTCON,T0IF ; Timer 0
call timer0 ;llamar rutina del t0 (recargar y borrar flag)
EndISR
clrf STATUS ; select bank 0
movf FSR_save,w ; restore the FSR
movwf FSR
movf PCLATH_save,w ; restore PCLATH
movwf PCLATH
movf Status_save,w ; restore Status
movwf STATUS
swapf W_save,f ; restore W without corrupting STATUS
swapf W_save,w
bsf INTCON,GIE ; habilitar int general
retfie
code
timer0 ;rutina del timer0 (salta cada 50ms)
bsf PORTA,0
movlw 0x3c ;regargar t0
movwf TMR0
bcf INTCON,T0IF ;borrar flag
return
main
clrf STATUS
clrf PORTA
bsf STATUS,5
movlw 0x00
movwf TRISA
bcf STATUS,5
bsf INTCON,GIE ;habilitar int general
bsf INTCON,T0IE ;habilitar int t0
clrwdt ;borrar wdt antes de reasignar prescaler
bsf OPTION_REG,T0CS ;habilitar t0 por overflow
bcf OPTION_REG,PSA ;asignar prescaler a t0
bsf OPTION_REG,PS0 ;configurar prescaler para incrementarse cada 255 ciclos
bsf OPTION_REG,PS1
bsf OPTION_REG,PS2
bcf PORTA,0
bsf PORTA,1
movlw 0x3c ;primera carga del timer0
movwf TMR0 ;aquí debería lanzarse la temporización
loop
goto loop
end