Something's wrong ... and it's driving me crazy
Here's a simple, little LED blinker. I've been over it a million times, I've tweaked it a thousand ways, but it flat doesn't work:
It's supposed to blink at 1 Hz, with a 25% duty cycle. The behavior is just as if the second WAITCNT missed its "window". I get one quick flash, and then the LED stays on *forever* (well, you know how long), and then a quick flash, etc. I have tried:
Tom.
[noparse][[/noparse]Edited to add that it works just fine if either WAITCNT is commented out, only when both are active does the problem appear.]
org 0
entry
or dira, Pin ' Select P4 for output (1)
andn outa, Pin ' Set P4 low (0)
mov OnTime, OnDelay ' Set up delays on/off
add OnTime, cnt
mov OffTime, OffDelay
add OffTime, cnt
:loop
xor outa, Pin ' Toggle pin
waitcnt OnTime, OnDelay ' Pause 1/4 sec
xor outa, Pin ' Toggle pin
waitcnt OffTime, OffDelay ' Pause 3/4 sec
jmp #:loop
Pin long |< 4
OnDelay long 80_000_000 / 4
OffDelay long (80_000_000 / 4) * 3
OnTime res 1
OffTime res 1
fit
It's supposed to blink at 1 Hz, with a 25% duty cycle. The behavior is just as if the second WAITCNT missed its "window". I get one quick flash, and then the LED stays on *forever* (well, you know how long), and then a quick flash, etc. I have tried:
- Using the same initial value of CNT for both waits
- Using a small immediate value (#24) instead of Delay on the first go
- Using hard-coded Delays (20_ and 60_000_000)
- Reordering the MOV/ADD
- Grouping the MOV/ADD
- etc.
Tom.
[noparse][[/noparse]Edited to add that it works just fine if either WAITCNT is commented out, only when both are active does the problem appear.]

Comments
needs to be:
waitcnt OnTime, OffDelay ' Pause 3/4 sec
As waitcnt adds ondelay to the OnTime varible during the wait .
As you use a new varible that is set to zero, it would take 58sec for the counter to roll over
Do this instead:
org 0 entry or dira, Pin ' Select P4 for output (1) andn outa, Pin ' Set P4 low (0) mov counter, OnDelay ' Set up delays on/off add counter, cnt :loop xor outa, Pin ' Toggle pin waitcnt counter, OffDelay ' Pause 1/4 sec xor outa, Pin ' Toggle pin waitcnt counter, OnDelay ' Pause 3/4 sec jmp #:loop Pin long |< 4 OnDelay long 80_000_000 / 4 OffDelay long (80_000_000 / 4) * 3 Counter res 1 fit▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔
Nyamekye,
Harprit
mov OnTime,cnt add OnTime,OnDelay ' End of on period is 1/4 second from now mov OffTime,OnTime add OffTime,OffDelay ' End of off period is 3/4 second from end of on periodYou then want the WAITCNTs to move ahead 1 second each time through the loop like:
waitcnt OnTime,OneSecond ... and waitcnt OffTime,OneSecond ... with OneSecond long 80_000_000That's true, but I'm adding dozens of millions of Delay cycle time, too. I was sure that I was missing the "window" -- but I just don't see how.
I'll try all suggestions and report back.
Thanks!
TonyP12 and Kye's suggestions really amount to the same thing, and I get one quick flash (1/4 sec), and then a steady stream of 3/4 sec flashes.
Mike's idea produces a series of 1/4 second flashes only. Not exactly what I'm looking for.
I want the LED to be ON for 1/4 second, and OFF for 3/4 second. Like so, from the PE Kit book:
PUB LedOnOff dira := 1 repeat outa := 1 waitcnt(clkfreq/4 + cnt) outa := 0 waitcnt(clkfreq/4*3 + cnt)Tom.
-Jack
org 0 entry or dira, Pin ' Select P4 for output (1) andn outa, Pin ' Set P4 low (0) mov counter, OffDelay ' Set up delays on/off add counter, cnt :loop waitcnt counter, OnDelay ' Pause 3/4 sec or outa, Pin ' Turn on LED waitcnt counter, OffDelay ' Pause 1/4 sec andn outa, Pin ' Turn off LED jmp #:loop Pin long |< 4 OnDelay long 80_000_000 / 4 OffDelay long (80_000_000 / 4) * 3 Counter res 1 fitThanks to one and all for your suggestions.