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 needed to modify Taylors ET 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.
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 returnCode:Taylors ET Code '**************************************************************** '* Name : ELAPSED.PBP * '* Author : Darrel Taylor * '* Notice : Copyright (c) 2003 * '* Date : 12/16/2003 * '* Notes : * '**************************************************************** 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
Bookmarks