PIC 18F4620 RPM and Elapsed Time interrupts

Thread Starter

Tobias

Joined May 19, 2008
158
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.

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
 
Top