• Martes 14 de Mayo de 2024, 22:51

Autor Tema:  No consigo hacer parpadear un led mediante el Tmr0  (Leído 1731 veces)

Javierix

  • Nuevo Miembro
  • *
  • Mensajes: 1
    • Ver Perfil
No consigo hacer parpadear un led mediante el Tmr0
« en: Jueves 6 de Abril de 2006, 10:19 »
0
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]

Mars

  • Nuevo Miembro
  • *
  • Mensajes: 6
    • Ver Perfil
Re: No consigo hacer parpadear un led mediante el Tmr0
« Respuesta #1 en: Lunes 10 de Abril de 2006, 21:46 »
0
Hola!!

No se si sera este el fallo, pero me ha parecido ver que en la penultima linea antes de la rutina de interrupcion ponse "Encender el LED" y la instruccion utilizada es BCF. No deberia ser BSF para encenderlo? compruebalo!! ;)

Un saludo!!!