Acetronics Thanks for your interest, of course I have adapted the settings to the new pic, by the way I enclose the listing:
Code:' Olympic Timer ' ============= ' Melanie Newman ' 05/Aug/2004 ' Topical Program demonstrates use of Interrupt ' Driven Background TIMER, to time events down to ' one one-hundredth of a Second (1/100 Sec). ' Bonus CALIBRATION Feature allows simple adjustments ' in 360mS steps per hour. This calibration adjustment ' range is limited to +/- 36 seconds per Hour. ' This program is for 4MHz clock (1uS Timer Ticks). ' PIC Defines ' =========== @ __CONFIG _CONFIG1H,_OSCS_OFF_1H & _XT_OSC_1H @ __CONFIG _CONFIG2L,_BOR_ON_2L & _PWRT_ON_2L @ __CONFIG _CONFIG2H,_WDT_ON_2H @ __CONFIG _CONFIG3H,_CCP2MX_OFF_3H @ __CONFIG _CONFIG4L,_STVR_OFF_4L & _LVP_OFF_4L DEFINE OSC 4 ' Clock a 4 Mhz DEFINE ADC_BITS 8 ' Set number of bits in result DEFINE ADC_CLOCK 3 ' Set clock source (3=rc) DEFINE ADC_SAMPLEUS 50 ' Set sampling time in uS DEFINE LCD_BITS 4 'NUMERO LINEE DI COMANDO 4 O 8 DEFINE LCD_DREG PORTB 'PORTA ChE GESTISCE LCD DEFINE LCD_DBIT 4 'BIT INIZIALE BUS DEFINE LCD_RSREG PORTC 'PORTA CHE GESTISCE RS DEFINE LCD_RSBIT 5 'BIT CHE GESTISCE RS DEFINE LCD_EREG PORTB 'PORTA CHE GESTISCE E DEFINE LCD_EBIT 3 'PIN CHE GESTISCE IL SEGNALE E DEFINE LCD_LINES 2 'NUMERO LINEE LCD Define LCD_COMMANDUS 2000 ' Command Delay (uS) Define LCD_DATAUS 50 ' Data Delay (uS) ' Control Buttons/Lines ' --------------------- ButStart var PortB.0 ' Take this pin low momentarily to START timing ButStop var PortB.1 ' Take this pin low momentarily to STOP timing ButReset var PortB.2 ' Take this pin low momentarily to RESET clock ' Hold the RESET Button pressed for at least FIVE seconds ' to jump into CALIBRATION Mode ' Software Defines ' ---------------- BannerOffset var BYTE ' Variable holding start address of Banner Display CounterA var BYTE ' Just a Counter CounterB var BYTE ' Just a Counter CounterC var BYTE DataA var BYTE Hours var BYTE Hundredths var BYTE Minutes var BYTE OverflowError var BIT RunningFlag var BIT Seconds var BYTE SetupTimeOut var WORD ' Timeout counter for Calibration/Set-Up Mode TMR1Cal var BYTE ' Calibration Value TMR1CalAR var Byte ' Calibration 0=ADVANCE, 1=RETARD TMR1RunOn var WORD ' variable holding TMR1 Run-On value ' EEPROM Presets ' -------------- Data @0,0 ' Advance/Retard Indicator Data 0 ' Calibration Value Data "Olympic Timer Powered by MeLabs PICBasic Pro" ' Software Constants ' ------------------ TMR1CalMax con 100 ' Maximum adjustment (+/-100uS per 10mS interrupt) TMR1Preset con $D910 ' 10mS Timer Reload value, offset by 20uS ' to allow for TMR1 Setting Calculations ' Start Program ' ============= ' Initialise Processor ' -------------------- TRISA=%00000000 TRISB=%00000111 TRISC=%00000000 ADCON0=%11000000 ADCON1=%00000111 ' OPTION_REG.7=0 ' Enable Pull-Up's RunningFlag=0 ' Disable actual Interrupt Time-Keeping Pause 1000 ' Pause for LCD to initialise ' Silly Intro Banner just for Fun ' ------------------------------- LCDOut $FE,1 ' Clear LCD BannerOffset=2:Gosub DisplayBanner Pause 2000 For CounterA=0 to 30 BannerOffset=2+CounterA Gosub DisplayBanner Pause 150 Next CounterA Pause 1000 ' Initialise TMR1 Interrupts ' -------------------------- Gosub SetTimer ' Set the Timer for next 10mS Interrupt On Interrupt goto TickCount PIE1.0=1 ' Enable TMR1 Interrupts INTCON.6=1 ' Enable all unmasked Interrupts INTCON.7=1 ' Enable Global Interrupts ' ----------------------------------------------------- ' Following the above "On Interrupt", no Basic Command ' is allowed that takes more than 10mS to execute ' otherwise the 10mS Interrupt interval is compromised. ' ----------------------------------------------------- ' Reset Timer Variables for Start ' ------------------------------- DisplayReset: LCDOut $FE,1 ' Clear LCD Read 0,TMR1CalAR ' Read Calibration Advance/Retard Indicator Read 1,TMR1Cal ' Read Calibration Value Hundredths=0 ' Reset Timer Counter variables Seconds=0 Minutes=0 Hours=0 OverflowError=0 ' Main Program Loop ' ================= Enable DisplayLoop: If ButStart=0 then RunningFlag=1 If ButStop=0 then RunningFlag=0 LCDOut $FE,$80,DEC2 Hours,":",DEC2 Minutes,":",DEC2 Seconds,".",DEC2 Hundredths If OverflowError=1 then If Seconds.0=1 then LCDOut $FE,$8C,"ERR" else LCDOut $FE,$8C," " endif endif If RunningFlag=1 then goto DisplayLoop If ButReset=1 then goto DisplayLoop Disable ' Reset Clock ' =========== ' Momentarily Press the Reset Button for RESET action. ' Continue holding the Reset Button for MORE than 5 seconds ' to jump into Calibration/Set-Up Mode ResetClock: LCDOut $FE,1,"Reset OK" Pause 1000 Seconds=1 While Seconds < 5 Pause 1000 If ButReset=1 then goto DisplayReset Seconds=Seconds+1 Wend ' Calibration Adjustment ' ====================== ' If No Button is Pressed for 20 Seconds, then the program ' will automatically exit Calibration/Set-Up Mode WITHOUT saving ' any new values. SetUpTimeout=0 Calibration: LCDOut $FE,1,"Calibrate: " While ButReset=0:Wend ' Wait for User to release finger CalibrationLoop: LCDOut $FE,$8B If TMR1Cal=0 then LCDOut " " else If TMR1CalAR=0 then LCDOut "+" else LCDOut "-" endif endif LCDOut #TMR1Cal," " ' ---------------------------------------------------------- ' Press Start Button to ADVANCE (speed-up) Clock ' Press STOP Button to RETARD (slow-down) Clock ' Press RESET Button to SAVE new Calibration Setting ' ---------------------------------------------------------- ' Remember each Calibration 'tick' will advance or ' retard the Timing by 1uS in every 10mS period - that's ' 360mS/Hour per setting. Example: A setting of +8 will ' SPEED-UP the Timer by 2.88 Seconds (8 x 360mS) in an Hour. ' ---------------------------------------------------------- If TMR1CalAR=0 then If ButStart=0 then Gosub CalAdvance If ButStop=0 then Gosub CalRetard else If ButStart=0 then Gosub CalRetard If ButStop=0 then Gosub CalAdvance endif If ButReset=0 then Write 0,TMR1CalAR Write 1,TMR1Cal LCDOut $FE,1,"Have a Nice Day" Pause 1000 Goto DisplayReset endif SetupTimeout=SetupTimeout+1 If SetupTimeout>200 then goto DisplayReset Pause 100 Goto CalibrationLoop ' Subroutine Increments Calibration Value ' --------------------------------------- CalAdvance: SetupTimeout=0 If TMR1Cal=>TMR1CalMax then TMR1Cal=TMR1cALmAX TMR1CalAR=TMR1CalAR^1 else TMR1Cal=TMR1Cal+1 endif Return ' Subroutine Decrements Calibration Value ' --------------------------------------- CalRetard: SetupTimeout=0 If TMR1Cal=0 then TMR1Cal=1 TMR1CalAR=TMR1CalAR^1 else TMR1Cal=TMR1Cal-1 endif Return ' Subroutine Displays Banner Intro ' -------------------------------- DisplayBanner: CounterC=BannerOffset+15 LCDOut $FE,$80 For CounterB=BannerOffset to CounterC Read CounterB,DataA LCDOut DataA Next CounterB Return ' Subroutine Loads TMR1 values ' ============================ SetTimer: T1CON.0=0 ' Stop the Clock TMR1RunOn.Highbyte=TMR1H ' Load the Run-On (Over-Run) value (if any) TMR1RunOn.Lowbyte=TMR1L TMR1RunOn=TMR1Preset+TMR1RunOn ' Calculate the New (adjusted) value for TMR1 If TMR1CalAR=0 then ' Calibration ADVANCE (add) or RETARD (subtract) TMR1RunOn=TMR1RunOn+TMR1Cal else TMR1RunOn=TMR1RunOn-TMR1Cal endif TMR1H=TMR1RunOn.Highbyte ' Save new values to TMR1 TMR1L=TMR1RunOn.Lowbyte T1CON.0=1 ' Restart the Clock PIR1.0=0 ' Reset TMR1's Interupt Flag Return ' Timer Interrupt Handler ' ======================= TickCount: Gosub SetTimer ' Set the Timer for next 10mS Interrupt If RunningFlag=1 then ' If timing actually enabled... then... Hundredths=Hundredths+1 ' Increment 10mS Seconds Counter If Hundredths>99 then Hundredths=0 Seconds=Seconds+1 ' Increment the Seconds If Seconds>59 then Seconds=0 Minutes=Minutes+1 ' Increment the Minutes If Minutes>59 then Minutes=0 Hours=Hours+1 ' Increment the Hours If Hours>99 then ' Handle any Overflow Hours=0 OverFlowError=1 endif endif endif endif endif Resume End




Bookmarks