I see the 18F4620 has a couple 16 bit timers. I have RPM going into C2/CCP1. So if I have the code set up right I should be getting RPM. I am not though. I did have this code working just fine on a 16F877A.
I found some code using Timer1 to do elapesed time. I needed to modify the code to use Timer3. This code works just fine using Timer1 but then when I change the code around for Timer3 its not working.
Any ideas? I am hoping I just have a couple lines of code setting up flags incorrectly and I will be able to use the ET and RPM at the same time.
I found some code using Timer1 to do elapesed time. I needed to modify the code to use Timer3. This code works just fine using Timer1 but then when I change the code around for Timer3 its not working.
Any ideas? I am hoping I just have a couple lines of code setting up flags incorrectly and I will be able to use the ET and RPM at the same time.
Rich (BB code):
RPM Code
DEFINE OSC 20
Prefix con $FE ' needed before each command
LcdCls CON $51 ' clear LCD (use PAUSE 5 after)
CursorPS con $45 'Cursor Position
Capture VAR PIR2.0 ' CCP1 capture flag
Overflow VAR PIR2.1 ' Timer1 overflow flag
RPM var word
period var Word
TotalTime var word 'Holds seconds and tics
LCD VAR PortC.6 'LCD output
Gate1 Var PortC.1
Gate2 var PortD.1
Gate3 var PortD.2
Gate4 var PortD.3
Gate5 var PortD.6
Gate6 var PortD.7
Gate7 var PortD.5
Gate8 var PortD.4
WOT var PortB.0
ADCON0 =0
ADCON1.3=1
ADCON1.2=1
ADCON1.1=1
ADCON1.0=1
TRISE.0=1
TRISE.1=1
T1CON.7=1 'enable timer 16 bit `
T1CON.6=1 'Timer1 OSC
T1CON.5=1 '1:4 prescaler
T1CON.4=0 '1:4 prescaler
T1CON.3=1 'Timer1 OSC enabled
T1CON.2=0 'sychro clock
T1CON.1=1 'external clock
T1CON.0=0 'stop timer
pause 100
SEROUT2 LCD,84, [Prefix, LcdCls]
Include "modedefs.bas" ' Mode definitions for Serout
Loop:
TMR1H = 0
TMR1L = 0
capture = 0
Start:
If Capture = 0 then
Goto Start
endif
'code doesn't make it this far..assuming waiting for Cpature =1
T1CON.0=1
Capture = 0
CaptureLoop:
If Capture = 0 then
Goto CaptureLoop
endif
period.LowByte=CCPR1L
period.HighByte=CCPR1H
RPM = 10000
RPM = RPM * RPM ' 100,000,000
RPM = DIV32 period ' 100,000,000 / RevCount
RPM = RPM * 60 ' Per minute
RPM = DIV32 398 '400
RPM = (RPM*5)
pause 10
SEROUT2 LCD,84, [Prefix,CursorPS,0,"RPM ",dec5 RPM, " ", #Period]
T1Con.0=0
Gosub ClearTimer1
Goto Loop
ClearTimer1:
If Capture = 0 then
goto ClearTimer1
endif
TMR1H = 00
TMR1L = 0
Capture = 0
Overflow = 0
return
Rich (BB code):
ET Code
disable debug
Define INTHAND _ClockCount ' Tell PBP Where the code starts on an interrupt
Include "ASM_INTS-18.bas" ' ASM Interrupt Stubs
Ticks var Word ' 1/1000th of a second
Seconds var byte
Minutes var byte
Hours var byte
Days var word
R0save var word
R1save var word
R4save var word
SecondsChanged var bit
MinutesChanged var bit
HoursChanged var bit
DaysChanged var bit
SecondsChanged = 1
MinutesChanged = 1
Goto OverElapsed
' ------------------------------------------------------------------------------
Asm
IF OSC == 4 ; Constants for 100hz interrupt from Timer1
TimerConst = 0D8F7h ; Executed at compile time only
EndIF
If OSC == 8
TimerConst = 0B1E7h
EndIF
If OSC == 10
TimerConst = 09E5Fh
EndIF
If OSC == 20
TimerConst = 0EC80h
EndIF
If OSC == 40
TimerConst = 03CB7h
EndIF
; ----------------- ADD TimerConst to TMR1H:TMR1L
ADD2_TIMER macro
CHK?RP T3CON
BCF T3CON,TMR3ON ; Turn off timer
MOVLW LOW(TimerConst) ; 1
ADDWF TMR3L,F ; 1 ; reload timer with correct value
BTFSC STATUS,C ; 1/2
INCF TMR3H,F ; 1
MOVLW HIGH(TimerConst) ; 1
ADDWF TMR3H,F ; 1
endm
; ----------------- ADD TimerConst to TMR1H:TMR1L and restart TIMER1
RELOAD_TIMER macro
ADD2_TIMER
BSF T3CON,TMR3ON ; 1 ; Turn TIMER1 back on
CHK?RP PIR2
bcf PIR2, TMR3IF ; Clear Timer1 Interrupt Flag
endm
; ----------------- Load TimerConst into TMR1H:TMR1L
LOAD_TIMER macro
EndAsm
T3CON.0 = 0 ; Turn OFF Timer1
TMR3L = 0
TMR3H = 0
Asm
ADD2_TIMER
endm
EndAsm
' ------[ This is the Interrupt Handler ]---------------------------------------
ClockCount: ' Note: this is being handled as an ASM interrupt
@ INT_START
@ RELOAD_TIMER ; Reload TIMER1
R0save = R0 ; Save 2 PBP system vars that are used during
R1save = R1 ; the interrupt
R4save = R4
Ticks = Ticks + 1
if Ticks = 1000 then
Ticks = Ticks-1000
Seconds = Seconds + 1
SecondsChanged = 1
if Seconds = 60 then
Minutes = Minutes + 1
MinutesChanged = 1
Seconds = 0
endif
if Minutes = 60 then
Hours = Hours + 1
HoursChanged = 1
Minutes = 0
endif
if Hours = 24 then
Days = Days + 1
DaysChanged = 1
Hours = 0
endif
endif
R4 = R4save ; Restore the PBP system vars
R1 = R1save
R0 = R0save
@ INT_RETURN ; Restore context and return from interrupt
'-----====[ END OF TMR1 Interrupt Handler ]====---------------------------------
StartTimer:
T3CON.1 = 0 ; (TMR1CS) Select FOSC/4 Clock Source
T3CON.3 = 0 ; (T1OSCEN) Disable External Oscillator
PIR2.0 = 0 ; (TMR1IF) Clear Timer1 Interrupt Flag
PIE2.0 = 1 ; (TMR1IE) Enable TMR1 overflow interrupt
INTCON.6 = 1 ; (PEIE) Enable peripheral interrupts
INTCON.7 = 1 ; (GIE) Enable global interrupts
T3CON.0 = 1 ; (TMR1ON) Start TIMER1
@ if OSC == 40
T3CON.5 = 0 ; Prescaler = 1:2
T3CON.4 = 1
@ endif
return
; -----------------
StopTimer:
T3CON.0 = 0 ; Turn OFF Timer1
return
; -----------------
ResetTime:
R0save = T3CON.0 ; Save TMR1ON bit
T3CON.0 = 0 ; Turn OFF Timer1
TMR3L = 0
TMR3H = 0
@ LOAD_TIMER ; Load TimerConst
T3CON.0 = R0save ; Restore TMR1ON bit
Ticks = 0
Seconds = 0
Minutes = 0
Hours = 0
Days = 0
SecondsChanged = 1
return
OverElapsed:
enable debug