Crazy things


Results 1 to 3 of 3

Thread: Crazy things

Threaded View

  1. #3
    Join Date
    Jul 2006
    Location
    Lazio, Italy
    Posts
    44


    Did you find this post helpful? Yes | No

    Default

    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
    Last edited by ScaleRobotics; - 4th February 2011 at 22:33. Reason: added code tags

Members who have read this thread : 0

You do not have permission to view the list of names.

Posting Permissions

  • You may not post new threads
  • You may not post replies
  • You may not post attachments
  • You may not edit your posts