0
\$\begingroup\$

I'm quite new in programming PICS, but have already done some projects. All of them were working fine. But now I'm stuck with a very simple one and I don't find out what's wrong. I'm pretty sure that's due to some really silly mistake, but due to the lack of debugging support of the PIC12F508 I do not know how to find my mistake, so I decided to ask you guys. The problem is, that the LED (connected to GP5 which is configured as output) is on at first, then is switched off after approx. 1 second and then never goes on. I expected it to blink once a second...

Here's the code where the bug is hidden. I'm staring at it hours now, but I don't find it. (Ah, btw.: running the code in the simulator is working fine. The error does not occur.)

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

Any clue why this is not working as expected?

One more thing that might be of interest is the setting of the configuration bits:

     __CONFIG _OSC_IntRC & _WDT_OFF & _CP_OFF & _MCLRE_OFF

Best regards, Boxy

\$\endgroup\$
1
\$\begingroup\$

You never initialized LED. If any of the upper 7 bits are set, then your algorithm doesn't work.

|improve this answer|||||
\$\endgroup\$
  • \$\begingroup\$ It's working now, though it was not enough to just initialize LED to 0. I had to change the BCF and BSF commands to MOVLW .0 followed by MOVWF LED and MOVLW .1 followed by MOVWF LED, respectively. \$\endgroup\$ – TomS Oct 3 '15 at 19:41

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service, privacy policy and cookie policy

Not the answer you're looking for? Browse other questions tagged or ask your own question.