debug T1PS and TimerConst to see what's going on would be a good start
debug T1PS and TimerConst to see what's going on would be a good start
Roger, oveur.
My Creality Ender 3 S1 Plus is a giant paperweight that can't even be used as a boat anchor, cause I'd be fined for polluting our waterways with electronic devices.
Not as dumb as yesterday, but stupider than tomorrow!
yep there was no elapsed-18_k22
seems to me the easiest way to restore correct function for "ticks" when the post scaler is in use is to move the ticks loop inside the post scale loop , no extra vars no extra overhead
Code:ClockCount: @ RELOAD_TIMER ; Reload TIMER1 T1Post = T1Post + 1 IF T1Post = T1PS THEN T1Post = 0 Ticks = Ticks + 1 IF Ticks = 100 THEN Ticks = 0 Seconds = Seconds + 1 SecondsChanged = 1 IF Seconds = 60 THEN Seconds = 0 Minutes = Minutes + 1 MinutesChanged = 1 ENDIF IF Minutes = 60 THEN Minutes = 0 Hours = Hours + 1 HoursChanged = 1 ENDIF IF Hours = 24 THEN Days = Days + 1 DaysChanged = 1 Hours = 0 ENDIF ENDIF ENDIF @ INT_RETURN ; Restore context and return from interrupt
I can only think that there was a reason why Darrel did it as he did. The dude could probably code this stuff while playing ping pong; the Bruce Lee of PBP and ASM.
There's more than one way to solve a problem, he probably took the one that worked for all PICs (until the K22 series came along). And even that he's solved the problem, it just wasn't widely known. I can only think he had greater concerns on his mind. Can you imagine how much of a headache it must have been tracking the new releases versus his routines? Makes me appreciate and miss him even more.
I now fear the day when Microchip releases a new product line. I love the K22 like I loved the 16F628 and 16F877, I'm not changing unless I'm forced to change.
Shoot, I might even stay on PBP 2.6. LOL
it has nothing to do with the k22's its the problem exists whenever the T1PS value is >1 on any chip
its all to do with the way he implemented the post scaling , the loops are inside out . its no bigie to fix . its only apparent if you need to use "ticks" .
imho most of the time using ticks is pointless by the time you process the reading and then display it it's already meaningless and out of date . if you want to time events to such accuracy trigger times need to be allowed for and properly sync'ed , there are much better ways
ps
the k22 interrupt vagaries are a separate issue and unrelated to ticks not being 100th's of a sec
Last edited by richard; - 24th December 2014 at 02:16. Reason: ps
There, fixed it for you. LOLits only apparent if you understand what's going on .
I never dealt with timer guts before. I always thought pre-scaling and post-scaling were what the fish looked like when my mom prepared them.
Oh and I don't like fish.
Robert
you have to toggle your led at the correct place in the loop
the interrupt runs at 4x the speed required (because of high fosc not chip type ) for timing so the post scaler divides it by 4
ClockCount:
@ RELOAD_TIMER ; Reload TIMER1
T1Post = T1Post + 1
Robert toggle your pin here eg latd.0=!latd.0 for 2.5mS
IF T1Post = T1PS THEN
T1Post = 0
Ticks = Ticks + 1
Robert toggle your pin here eg latd.1=!latd.1 for 10mS
IF Ticks = 100 THEN
Ticks = 0
Seconds = Seconds + 1
SecondsChanged = 1
IF Seconds = 60 THEN
Seconds = 0
Minutes = Minutes + 1
MinutesChanged = 1
ENDIF
IF Minutes = 60 THEN
Minutes = 0
Hours = Hours + 1
HoursChanged = 1
ENDIF
IF Hours = 24 THEN
Days = Days + 1
DaysChanged = 1
Hours = 0
ENDIF
ENDIF
ENDIF
@ INT_RETURN ; Restore context and return from interrupt
I disagree. This is the first time I have a specialized need for a timer and it requires knowing how long a tick really is. I want to debounce using interrupts, so I press a button, look how long it takes for the contact to close and open again, take an arbitrary average and add maybe 25%, that's my debounce in mSeconds.
I know others use timers in what I consider a more complicated way, I have no clue how a preload value works and can never remember if the timer counts up or down from there (I have a hard time remembering little details like that). To them it's easier, I prefer the elapsed timer approach.
I turn a LED on and off, check the interval on the Saleae probe (I should get a commission every time I typed that), and that's it. Ticks=10mS is stuck in my brain ever since I first saw it on Darrel's include. I just count the ticks until I get my interval.
When you think about it, if we were that concerned with accuracy, we'd program in assembler.
Robert
![]()
I started by making my version of the Elapsed include and adding 2 variables at the end of the timer calc:
Before Main of my program I added:Code:... ' -------------- calc timer reload Constants ------------------------------- ASM T1PS = 1 ; start with 1:1 postscaler TimerConst = ((OSC*1000000)/4/100) ; how many timer ticks will it take while TimerConst > 65400 ; if it's more than the timer can count T1PS = T1PS * 2 ; double the postscaler TimerConst = TimerConst / 2 ; halve the count endw TimerConst = 65536 - TimerConst + 8 ; final reload value ; ---------------------------- DEBUG SCALER -------------------------------- DebugT1PS = T1PS DebugTC = TimerConst ; xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx ...
Right now I'm wiring up a LCD to display the 2 variables.Code:DebugT1PS CON EXT DebugTC CON EXT
Am I on the right track to look at them?
I've never tried to display something from inside Darryl's includes before. My plan was to copy them into 2 words and then displaying the lower and upper bytes on the LCD.
My Creality Ender 3 S1 Plus is a giant paperweight that can't even be used as a boat anchor, cause I'd be fined for polluting our waterways with electronic devices.
Not as dumb as yesterday, but stupider than tomorrow!
probably not if yours fails try thisAm I on the right track to look at them?
Code:DISABLE DEBUG ; syntax = Handler IntSource, Label, Type, ResetFlag? DEFINE Elapsed_Handler TMR1_INT, _ClockCount, asm, yes ; the above define can be used in the INT_LIST macro, if desired (optional) Ticks VAR BYTE ; Counts timer Overflows T1Post VAR BYTE ; Timer1 postscaler Seconds VAR BYTE Minutes VAR BYTE Hours VAR BYTE Days VAR WORD DebugT1PS var byte DebugTCL var byte DebugTCh var byte SecondsChanged VAR BIT ; idicates that the value has changed MinutesChanged VAR BIT HoursChanged VAR BIT DaysChanged VAR BIT GOSUB ResetTime ; initialize the Elapsed Timer Goto OverElapsed ; skip over the routines ' -------------- calc timer reload Constants ------------------------------- ASM T1PS = 1 ; start with 1:1 postscaler TimerConst = ((OSC*1000000)/4/100) ; how many timer ticks will it take while TimerConst > 65400 ; if it's more than the timer can count T1PS = T1PS * 2 ; double the postscaler TimerConst = TimerConst / 2 ; halve the count endw TimerConst = 65536 - TimerConst + 8 ; final reload value _DebugT1PS =T1PS _DebugTCH=TimerConst /256 _DebugTCL = TimerConst - _DebugTCH*256 ; ----------------- ADD TimerConst to TMR1H:TMR1L ------------------------- ADD2_TIMER macro
Actually, it worked.
I deleted my debug include 'cause I can work without it.
And I get:Code:... ;T1PS CON EXT ' Already defined in include TimerConst CON EXT varT1PS var word varTC var word varT1PS = T1PS varTC = TimerConst Lcdout $fe, 1, "Timer 1" Lcdout $fe, $94, "PS:", BIN8 varT1PS.byte1, " ", BIN8 varT1PS.byte0 Lcdout $fe, $D4, "TC:", BIN8 varTC.byte1, " ", BIN8 varTC.byte0 MainProgram:
PS:00000000 00000001
TC:01100011 11001000 <--- Dec=25544
EDIT: Woooops, still using OSC 16, BRB.
My Creality Ender 3 S1 Plus is a giant paperweight that can't even be used as a boat anchor, cause I'd be fined for polluting our waterways with electronic devices.
Not as dumb as yesterday, but stupider than tomorrow!
OSC 64 (16 + PLL)
PS:00000000 00000100 <--- Dec=4
TC:01100011 11001000 <--- Dec=25544
I had same results manually this afternoon.
Robert
My Creality Ender 3 S1 Plus is a giant paperweight that can't even be used as a boat anchor, cause I'd be fined for polluting our waterways with electronic devices.
Not as dumb as yesterday, but stupider than tomorrow!
ok next whats in T1CON ?
Looking at the datasheet for 18F44K22, timer 1 has a 2 bit prescaler.
4 (100) takes 3 bits.
Gonna try timer 2.
...
13.0 TIMER2/4/6 MODULE p.175
...
• 8-bit Timer and Period registers (TMRx and PRx,
respectively)
• Readable and writable (both registers)
• Software programmable prescaler (1:1, 1:4, 1:16)
• Software programmable postscaler (1:1 to 1:16)
...
EDIT: Darn, DT Elapsed include only has Timer1...
Robert
Last edited by Demon; - 23rd December 2014 at 03:31.
My Creality Ender 3 S1 Plus is a giant paperweight that can't even be used as a boat anchor, cause I'd be fined for polluting our waterways with electronic devices.
Not as dumb as yesterday, but stupider than tomorrow!
Was looking at T1CON register and noticed this:
So that is 2 bits.TxCKPS<1:0>: Timer1/3/5 Input Clock Prescale Select bits
11 = 1:8 Prescale value
10 = 1:4 Prescale value
01 = 1:2 Prescale value
00 = 1:1 Prescale value
T1CON=00000000Code:bit 7-6 TMRxCS<1:0>: Timer1/3/5 Clock Source Select bits 11 =Reserved. Do not use. 10 =Timer1/3/5 clock source is pin or oscillator: If TxSOSCEN = 0: External clock from TxCKI pin (on the rising edge) If TxSOSCEN = 1: Crystal oscillator on SOSCI/SOSCO pins 01 =Timer1/3/5 clock source is system clock (FOSC) 00 =Timer1/3/5 clock source is instruction clock (FOSC/4) bit 5-4 TxCKPS<1:0>: Timer1/3/5 Input Clock Prescale Select bits 11 = 1:8 Prescale value 10 = 1:4 Prescale value 01 = 1:2 Prescale value 00 = 1:1 Prescale value bit 3 TxSOSCEN: Secondary Oscillator Enable Control bit 1 = Dedicated Secondary oscillator circuit enabled 0 = Dedicated Secondary oscillator circuit disabled bit 2 TxSYNC: Timer1/3/5 External Clock Input Synchronization Control bit TMRxCS<1:0> = 1X 1 = Do not synchronize external clock input 0 = Synchronize external clock input with system clock (FOSC) TMRxCS<1:0> = 0X This bit is ignored. Timer1/3/5 uses the internal clock when TMRxCS<1:0> = 1X. bit 1 TxRD16: 16-Bit Read/Write Mode Enable bit 1 = Enables register read/write of Timer1/3/5 in one 16-bit operation 0 = Enables register read/write of Timer1/3/5 in two 8-bit operation bit 0 TMRxON: Timer1/3/5 On bit 1 = Enables Timer1/3/5 0 = Stops Timer1/3/5 Clears Timer1/3/5 Gate flip-flop
Robert
Last edited by Demon; - 23rd December 2014 at 03:42.
My Creality Ender 3 S1 Plus is a giant paperweight that can't even be used as a boat anchor, cause I'd be fined for polluting our waterways with electronic devices.
Not as dumb as yesterday, but stupider than tomorrow!
ITS NOT using the prescaler those bits need to be 00 ie 1:1
@64mhz with a preload of 25544 you get a tmr1 int every 2.5mS dt's int routine inc's the tips counter till its 4 then inc's the elapsed time clock I count ie once every 10mS
next step after confirming t1con is ok is to toggle a pin in the int routine as per what Sheldon suggested and verify 2.5mS ints are occurring
In the Elapsed include:
Darryl talks about a post-scaler. Timers 1, 3 and 5 have none for a 18F44K22?Code:... ' -------------- calc timer reload Constants ------------------------------- ASM T1PS = 1 ; start with 1:1 postscaler TimerConst = ((OSC*1000000)/4/100) ; how many timer ticks will it take while TimerConst > 65400 ; if it's more than the timer can count T1PS = T1PS * 2 ; double the postscaler TimerConst = TimerConst / 2 ; halve the count endw TimerConst = 65536 - TimerConst + 8 ; final reload value ...
Neither does Timer 0, only Timers 2,4 and 6 have pre and post-scalers.
Robert
My Creality Ender 3 S1 Plus is a giant paperweight that can't even be used as a boat anchor, cause I'd be fined for polluting our waterways with electronic devices.
Not as dumb as yesterday, but stupider than tomorrow!
t1con looks good should be 0 or 1 (on or off) depending on what the int routine is up to
Bookmarks