16F18877
Program:
Code:#CONFIG __config _CONFIG1, _FEXTOSC_OFF & _RSTOSC_HFINT32 & _CLKOUTEN_OFF & _CSWEN_OFF & _FCMEN_ON __config _CONFIG2, _MCLRE_ON & _PWRTE_OFF & _LPBOREN_OFF & _BOREN_ON & _BORV_LO & _ZCD_OFF & _PPS1WAY_OFF & _STVREN_ON & _DEBUG_OFF __config _CONFIG3, _WDTCPS_WDTCPS_11 & _WDTE_OFF & _WDTCWS_WDTCWS_7 & _WDTCCS_LFINTOSC __config _CONFIG4, _WRT_OFF & _SCANE_available & _LVP_OFF __config _CONFIG5, _CP_OFF & _CPD_OFF #ENDCONFIG ;--- Interrupts ---------------------------------------------------------------- ;--- Defines ------------------------------------------------------------------- DEFINE OSC 32 RA4PPS = 0 ' Disable CCP5 RB0PPS = 0 ' Disable CCP4 RB5PPS = 0 ' Disable CCP3 RC1PPS = 0 ' Disable CCP2 RC2PPS = 0 ' Disable CCP1 ANSELA = %00000000 ANSELB = %00000000 ANSELC = %00000000 ANSELD = %00000000 ANSELE = %00000000 ;--- Setup Port directions ----------------------------------------------------- TRISA = %00000000 TRISB = %00000000 TRISC = %00000000 TRISD = %00000000 TRISE = %00001000 INCLUDE "Elapsed_DN_32MHz.bas" ; Elapsed Timer Routines Days = 0 ' set initial time Hours = 0 Minutes = 0 Seconds = 1 LatB.5 = 0 GOSUB StartTimer LatB.5 = 1 Main: IF Ticks > 100 THEN LatB.5 = 0 ENDIF GOTO Main end
Elapsed DN, with 32MHz mod:
Code:'**************************************************************** '* Name : ELAPSED.PBP * '* Author : Darrel Taylor * '* Notice : Copyright (c) 2003 * '* Date : 12/16/2003 * '* Notes : * '**************************************************************** Define INTHAND _ClockCount ' Tell PBP Where the code starts on an interrupt Include "ASM_INTS.bas" ' ASM Interrupt Stubs Ticks VAR BYTE ' 1/100th of a second Seconds VAR BYTE Minutes VAR BYTE Hours VAR BYTE Days VAR WORD R0save VAR WORD R1save VAR WORD ZERO VAR BIT CountDown VAR BIT SecondsChanged VAR BIT MinutesChanged VAR BIT HoursChanged VAR BIT DaysChanged VAR BIT CountDown = 0 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 = 03CB7h EndIF If OSC == 32 ; T1CON TimerConst = 063C7h ; TMR1CS bits 7-6, 00 = FOSC/4 EndIF ; T1CKPS bits 5-4, 01 = 1:2 Prescale value ; ----------------- ADD TimerConst to TMR1H:TMR1L ADD2_TIMER macro CHK?RP T1CON BCF T1CON,TMR1ON ; Turn off timer MOVLW LOW(TimerConst) ; 1 ADDWF TMR1L,F ; 1 ; reload timer with correct value BTFSC STATUS,C ; 1/2 INCF TMR1H,F ; 1 MOVLW HIGH(TimerConst) ; 1 ADDWF TMR1H,F ; 1 endm ; ----------------- ADD TimerConst to TMR1H:TMR1L and restart TIMER1 RELOAD_TIMER macro ADD2_TIMER BSF T1CON,TMR1ON ; 1 ; Turn TIMER1 back on CHK?RP PIR1 bcf PIR1, TMR1IF ; Clear Timer1 Interrupt Flag endm ; ----------------- Load TimerConst into TMR1H:TMR1L LOAD_TIMER macro EndAsm T1CON.0 = 0 ; Turn OFF Timer1 TMR1L = 0 TMR1H = 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 Ticks = Ticks + 1 if Ticks = 100 then Ticks = 0 IF CountDown THEN IF Seconds > 0 THEN Seconds = Seconds - 1 SecondsChanged = 1 IF Seconds = 0 THEN IF Days = 0 THEN IF Hours = 0 THEN IF Minutes = 0 THEN GOSUB StopTimer ; Zero reached ZERO = 1 ENDIF ENDIF ENDIF ENDIF ELSE IF Minutes > 0 THEN Minutes = Minutes - 1 Seconds = 59 SecondsChanged = 1 MinutesChanged = 1 ELSE IF Hours > 0 THEN Hours = Hours - 1 Minutes = 59 Seconds = 59 SecondsChanged = 1 MinutesChanged = 1 HoursChanged = 1 ELSE IF Days > 0 THEN Days = Days - 1 Hours = 23 Minutes = 59 Seconds = 59 SecondsChanged = 1 MinutesChanged = 1 HoursChanged = 1 DaysChanged = 1 ELSE ; Zero already reached, shouldn't get here GOSUB StopTimer ZERO = 1 ENDIF ENDIF ENDIF ENDIF ELSE ; Counting Up 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 ENDIF R1 = R1save ; Restore the PBP system vars R0 = R0save @ INT_RETURN ; Restore context and return from interrupt '-----====[ END OF TMR1 Interrupt Handler ]====--------------------------------- StartTimer: IF NOT ZERO THEN T1CON.1 = 0 ; (TMR1CS) Select FOSC/4 Clock Source T1CON.3 = 0 ; (T1OSCEN) Disable External Oscillator PIR1.0 = 0 ; (TMR1IF) Clear Timer1 Interrupt Flag PIE1.0 = 1 ; (TMR1IE) Enable TMR1 overflow interrupt INTCON.6 = 1 ; (PEIE) Enable peripheral interrupts INTCON.7 = 1 ; (GIE) Enable global interrupts T1CON.0 = 1 ; (TMR1ON) Start TIMER1 ENDIF return ; ----------------- StopTimer: T1CON.0 = 0 ; Turn OFF Timer1 return ; ----------------- ResetTime: ZERO = 0 R0save = T1CON.0 ; Save TMR1ON bit T1CON.0 = 0 ; Turn OFF Timer1 TMR1L = 0 TMR1H = 0 @ LOAD_TIMER ; Load TimerConst T1CON.0 = R0save ; Restore TMR1ON bit Ticks = 0 Seconds = 0 Minutes = 0 Hours = 0 Days = 0 SecondsChanged = 1 return OverElapsed:
ASM_INTS.bas:
Code:'**************************************************************** '* Name : ASM_INTS.PBP * '* Author : Darrel Taylor * '* Notice : Copyright (c) 2003 * '* Date : JAN 4, 2003 * '**************************************************************** wsave var byte $20 SYSTEM ' location for W if in bank0 ' --- IF any of these three lines cause an error ?? Simply Comment them out to fix the problem ---- wsave1 var byte $A0 SYSTEM ' location for W if in bank1 wsave2 var byte $120 SYSTEM ' location for W if in bank2 wsave3 var byte $1A0 SYSTEM ' location for W if in bank3 ' ------------------------------------------------------------------------------ ssave var byte BANK0 SYSTEM ' location for STATUS register psave var byte BANK0 SYSTEM ' location for PCLATH register fsave var byte BANK0 SYSTEM ' location for FSR register Asm INT_START macro IF (CODE_SIZE <= 2) movwf wsave ; copy W to wsave register swapf STATUS,W ; swap status reg to be saved into W clrf STATUS ; change to bank 0 regardless of current bank movwf ssave ; save status reg to a bank 0 register movf PCLATH,w ; move PCLATH reg to be saved into W reg movwf psave ; save PCLATH reg to a bank 0 register EndIF movf FSR,W ; move FSR reg to be saved into W reg movwf fsave ; save FSR reg to a bank 0 register endm EndAsm Asm INT_RETURN macro MOVF fsave,W ; Restore the FSR reg MOVWF FSR Movf psave,w ; Restore the PCLATH reg Movwf PCLATH swapf ssave,w ; Restore the STATUS reg movwf STATUS swapf wsave,f swapf wsave,w ; Restore W reg Retfie ; Exit the interrupt routine endm EndAsm
For starters, I'm just trying to get a 100tick interval on the Logic Probe with LatB.5.




Bookmarks