LLevo varios dias intentando hacer parpadear un LED mediante la interrupcion del TMR0. Mi idea es que este un segundo apagado y un segundo encendido. Utilizo un 16f876. El problema que tengo con el codigo es que solo efectua el apagado una sola vez, y despues esta permanentemente en ese estado. Estoy casi seguro que el codigo es correcto, pero lo cierto es que no funciona.
Os adjunto el codigo para ver si sois capaces de ver algo extraño, porque yo estoy a punto de desistir.
No consigo formatear el texto adecuadamente. Se ve bastante confuso...
;***************************************************************************************
; VARIABLES DE PROGRAMA
;***************************************************************************************
ORG 0x20 ; Direccion de inicio de las variables
;variables de retardos
VarCont3 res 1 ; Contador de apoyo del TMR0 para temporizar 1 seg
;***************************************************************************************
; INICIO DEL CODIGO
;***************************************************************************************
ORG 0x00
goto INICIO
ORG 0x04
goto RSI
ORG 0x05
INICIO
bcf STATUS,RP1
bsf STATUS,RP0 ; Banco 1
clrf TRISA ; Puerto A todo salida
clrf TRISB ; Puerto B todo salida
clrf TRISC ; Puerto C todo salida
movlw b'00000110' ; Prescaler 1:128
movwf OPTION_REG ; Se carga en OPTION_REG
bcf STATUS,RP0 ; Banco 0
movlw 0xB2
movwf TMR0 ; cargamos el TMR0 con 78
clrf INTCON ; Borra los flags, incluido T0IF.
clrf VarCont3
bsf INTCON,T0IE ; Activa interrupcion del tmr0
bsf INTCON,GIE ; Activa interrupciones globales
bsf PORTA,5 ; enciende el led
BUCLE
movf VarCont3,W ; Se incrementa cada 10 ms en uno al producirse la interrupción
xorlw 0x64 ; Ha llegado a 1000 ms si llevamos 100 (0x64) cuentas
btfss STATUS,Z ; Si es así, salta para cambiar el LED
goto BUCLE ; Si no es así, prueba otra vez
clrf VarCont3 ; El contador vuelve a 0 para iniciar el nuevo ciclo
btfss PORTA,5 ; Está encendido? Si sí, apaga
goto Encien
Apaga bcf PORTA,5 ; Apaga el LED
goto BUCLE
Encien bcf PORTA,5 ; Enciende el LED
goto BUCLE
;***************************************************************************************
; RSI - RUTINA DE SERVICIO DE INTERRUPCION
;***************************************************************************************
RSI
incf VarCont3,F
movlw 0xB2
movwf TMR0 ; cargamos el TMR0 con 1
bcf INTCON,T0IF ; borra la bandera de interrupcion
bsf INTCON,T0IE ; habilita la interrupcion del TMR0
retfie
END ; Fin del fichero **********************************************
[/size]