OUCH!
After running my loop in the SIM.
I realized the timing was Waaaayyyyy OFF.
Fortunately, the other examples were "OFF" too ... just not as far. ![EEK!](images/smilies/eek.gif)
I've always said PAUSE is the worst statement in the BASIC language.
It got me again. ![Frown](images/smilies/frown.gif)
Here's a version that should compensate ...
It uses the CCP module in "Compare" mode to create a precise 10mS interval.
So when you give a delay value of 50, it actually takes 500mS, on the nose.
Sorry, it's more than 8 lines now. ![Embarrassment](images/smilies/redface.gif)
Code:
DEFINE OSC 4
DEFINE BLINKYFREQ 100 ; 10mS periods
DATA 50,22,38,75,17,40,62,13 ; default periods for each Output
;----------------------------------------------------------------
CCPR1val CON EXT : @CCPR1val = (OSC*1000000/4)/ BLINKYFREQ
CCPR1 VAR WORD EXT : @CCPR1 = CCPR1L
Timer1 VAR WORD EXT : @Timer1 = TMR1L
CCPIF VAR PIR1.2
LoopLED VAR BYTE[8]
LoopCON VAR BYTE[8]
x VAR BYTE
;----[Initialize]------------------------------------------------
FOR x = 0 to 7 ; load the periods from EEPROM
READ x, LoopCON(x)
NEXT X
;-- setup CCP1 and Start Timer1 --
CCPR1 = CCPR1val ; set compare value
CCP1CON = %00001011 ; compare mode, special event
Timer1 = 0 ; clear Timer1
T1CON.0 = 1 ; start Timer1
TRISB = 0 ; PORTB all OUTPUT
;----[Main Program Loop]----------------------------------------
Main:
x = (x + 1) // 8
PORTB.0(x) = !(LoopLED(x) < LoopCON(x))
LoopLED(x) = (LoopLED(x) + 1) // (LoopCON(x) << 1)
IF x != 7 THEN Main
Waiting: IF !CCPIF THEN Waiting
CCPIF = 0
GOTO Main
Cheers,
Bookmarks