Timer0 loop no funciona en PIC12F508

0

Soy bastante nuevo en la programación de PICS, pero ya he hecho algunos proyectos. Todos ellos trabajaban bien. Pero ahora me quedo con uno muy simple y no descubro qué está mal. Estoy bastante seguro de que se debe a un error realmente tonto, pero debido a la falta de soporte de depuración del PIC12F508, no sé cómo encontrar mi error, así que decidí preguntarle a ustedes. El problema es que el LED (conectado a GP5 que está configurado como salida) está encendido al principio, luego se apaga después de aprox. 1 segundo y luego nunca continúa. Esperé que parpadee una vez por segundo ...

Aquí está el código donde se oculta el error. Lo estoy mirando horas ahora, pero no lo encuentro. (Ah, btw .: ejecutar el código en el simulador funciona bien. No se produce el error).

START

    MOVLW       .199                    ; no WakeUp on pin change, no weak pull-ups, timer source internal, don't care, prescaler for timer0, 1:256
    OPTION                              ; set options

    MOVLW       .0                      ; all GPIOs are outputs
    TRIS        GPIO                    ; set tristate register

; the pre-scaler is set to 1:256, which means that every 256 µs the timer
; is increased by 1. This is done 256 times until it overflows. During this
; time 65 ms have passed. 15 times 65 ms are approx 1 s. So we need to do the
; loop 15 times

RestartLoop:
    MOVLW       .15                     ; 15 loops
    MOVWF       LoopCount               ; write into file register (correctly defined)
NextRound:
    MOVLW       .1                      ; set the TMR0 register to 1
    MOVWF       TMR0                    ; it should not be 0 as the logic below would not work
                                        ; I know, that's not good practice, but at least it should work
CheckTimer:
    MOVF        TMR0, W                 ; read current timer value into W
    BTFSS       STATUS, Z               ; has an overflow occurred and it is 0?
    GOTO        CheckTimer              ; no, read timer value again
    DECF        LoopCount, F            ; yes, decrease the loop counter by 1
    BTFSS       STATUS, Z               ; is the loop counter 0?
    GOTO        NextRound               ; no, then restart Timer0 and wait again until it's 0
    MOVF        LED, W                  ; yes, read the file register LED into W
    BTFSS       STATUS, Z               ; is it 0?
    GOTO        MakeLEDOff              ; no, LED is on, switch it off

    BSF         LED, 0                  ; yes, LED is off, switch it on
                                        ; set bit 0 in the file register LED
    BSF         GPIO, GP5               ; switch on the LED
    GOTO        RestartLoop             ; restart the 1 second loop

MakeLEDOff:
    BCF         LED, 0                  ; clear bit 0 in file register LED (should be 0 then)
    BCF         GPIO, GP5               ; switch off LED
    GOTO        RestartLoop             ; restart the 1 second loop


    MOVLW 0x55                      ; your instructions
    GOTO $                          ; loop forever

    END

¿Alguna pista de por qué esto no funciona como se esperaba?

Otra cosa que podría interesar es la configuración de los bits de configuración:

     __CONFIG _OSC_IntRC & _WDT_OFF & _CP_OFF & _MCLRE_OFF

Saludos cordiales, Cuadrado

    
pregunta TomS

1 respuesta

1

Nunca se inicializó el LED. Si se establece alguno de los 7 bits superiores, su algoritmo no funcionará.

    
respondido por el Olin Lathrop

Lea otras preguntas en las etiquetas