Quote Originally Posted by longpole001 View Post
each 100th is 10ms on the i/o debug section btw
My output pin changes state every 2.5ms at 64MHz.

Code:
'***************************************************************************
'*  Name    : Elapsed_INT-18.bas                                           *
'*  Author  : Darrel Taylor                                                *
'*  Date    : JUL 11, 2006 : 7/11/2010                                     *
'*  Version : 1.2                                                          *
'*  Notes   : Must have DT_INTS-18.bas loaded first                        *
'*   ver 1.2: Now works at any OSC frequency without using the prescaler   *
'***************************************************************************
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)

EL_Ticks            VAR BYTE   ; Counts timer Overflows
EL_100th            VAR BYTE
;T1Post           VAR BYTE   ; Timer1 postscaler
EL_Seconds          VAR BYTE
EL_Minutes          VAR BYTE
EL_Hours            VAR BYTE
EL_Days             VAR WORD

EL_100thChanged     VAR BIT
EL_SecondsChanged   VAR BIT    ; idicates that the value has changed
EL_MinutesChanged   VAR BIT
EL_HoursChanged     VAR BIT
EL_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
  
  
; -----------------  ADD TimerConst to TMR1H:TMR1L -------------------------
ADD2_TIMER   macro
    BCF     T1CON,TMR1ON, 0       ;  1 Turn off timer
    MOVLW   LOW(TimerConst)       ;  1
    ADDWF   TMR1L,F, 0            ;  1    
    BTFSC   STATUS,C              ;  1/2
    INCF    TMR1H,F, 0            ;  1
    MOVLW   HIGH(TimerConst)      ;  1
    ADDWF   TMR1H,F, 0            ;  1
    endm

; -----------------  ADD TimerConst to TMR1H:TMR1L and restart TIMER1 ------
RELOAD_TIMER  macro
    ADD2_TIMER
    BSF     T1CON,TMR1ON, 0       ;  1   Turn TIMER1 back on  (8 cycles)
    endm

; -----------------  Load TimerConst into TMR1H:TMR1L ----------------------
LOAD_TIMER  macro
    MOVE?CT  0, T1CON,TMR1ON
    MOVE?CB  0, TMR1L
    MOVE?CB  0, TMR1H
    ADD2_TIMER
    endm
ENDASM

' ------[ This is the Interrupt Handler ]-----------------------------------
T1PS  CON EXT
ClockCount:
@ RELOAD_TIMER                   ; Reload TIMER1
EL_Ticks = EL_Ticks  + 1    ; each tick is 2.5ms 
       IF LATD.3 = 0 THEN           ' debug 
          LATD.3 = 1
       ELSE 
          LATD.3 = 0
       ENDIF   
  if EL_ticks // T1PS = 0  THEN      ' if modulas of tips (4) = 0 
       IF LATD.3 = 0 THEN           ' debug 
          LATD.3 = 1
       ELSE 
          LATD.3 = 0
       ENDIF   
          EL_100th = EL_100th + 1 
          EL_100thChanged = 1
          IF EL_100TH  = 100 THEN
              EL_100TH = 0
              EL_Seconds = EL_Seconds + 1      
              EL_SecondsChanged = 1
              IF EL_Seconds = 60 THEN
                 EL_Seconds = 0
                 EL_Minutes = EL_Minutes + 1
                 EL_MinutesChanged = 1
              eNDIF
              IF EL_Minutes = 60 THEN
                 EL_Minutes = 0
                 EL_Hours = EL_Hours + 1
                 EL_HoursChanged = 1
              ENDIF
              IF EL_Hours = 24 THEN
                 EL_Hours = 0 
                 EL_Days = EL_Days + 1
                 EL_DaysChanged = 1
              ENDIF
          eNDIF
      endif
'    Ticks = Ticks + 1
'    IF Ticks = 100 THEN
'       Ticks = 0
'       T1Post = T1Post + 1
'       IF T1Post = T1PS THEN
'           T1Post = 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

'-----====[ END OF TMR1 Interrupt Handler ]====-----------------------------

StartTimer:
    T1CON = 1                    ; 1:1, FOSC4, TMR1ON
RETURN

; --------------------------------------------------------------------------
StopTimer:
    T1CON.0 = 0                  ; Turn OFF Timer1
RETURN

; --------------------------------------------------------------------------
BitSave  VAR  BIT

ResetTime:
    BitSave = T1CON.0            ; Save TMR1ON bit
@   LOAD_TIMER                   ; Load TimerConst
    T1CON.0 = BitSave            ; Restore TMR1ON bit
;    T1Post = 0                   ; clear the postscaler
    EL_Ticks = 0
    EL_100th = 0
    EL_Seconds = 0
    EL_Minutes = 0
    EL_Hours = 0
    EL_Days = 0
    EL_100thChanged = 1
    EL_SecondsChanged = 1           ; indicate everything has changed
    EL_MinutesChanged = 1           ; so that 00:00:00 is processed
    EL_HoursChanged = 1
    EL_DaysChanged = 1
RETURN


OverElapsed:
ENABLE DEBUG