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