Clock


Closed Thread
Results 1 to 5 of 5

Thread: Clock

  1. #1
    Join Date
    Jan 2008
    Location
    Sweden
    Posts
    187

    Default Clock

    The following code only work with a 4 Mhz crystal, how can i get it to work with a 20Mhz crystal?

    DEFINE OSC 20 does´t help, the clock ticks to fast whit a 20Mhz crystal

    I use PicBasic Pro 2.50a

    EDIT: I think i can change the number of "ticks" from 61 to something higher but how do i calculate the right value for the tick?



    Code:
    ' LCD clock program using On Interrupt
    '  Uses TMR0 and prescaler.  Watchdog Timer should be
    '  set to off at program time and Nap and Sleep should not be used.
    '  Buttons may be used to set hours and minutes
    
    Define  LCD_DREG        PORTD   ' Define LCD connections
    Define  LCD_DBIT        4
    Define  LCD_RSREG       PORTE
    Define  LCD_RSBIT       0
    Define  LCD_EREG        PORTE
    Define  LCD_EBIT        1
    
    hour    var     byte    ' Define hour variable
    dhour   var     byte    ' Define display hour variable
    minute  var     byte    ' Define minute variable
    second  var     byte    ' Define second variable
    ticks   var     byte    ' Define pieces of seconds variable
    update  var     byte    ' Define variable to indicate update of LCD
    i       var     byte    ' Debounce loop variable
    
            ADCON1 = 7      ' PORTA and E digital
            Low PORTE.2     ' LCD R/W low = write
            Pause 100       ' Wait for LCD to startup
    
            hour = 0        ' Set initial time to 00:00:00
            minute = 0
            second = 0
            ticks = 0
    
            update = 1      ' Force first display
    
    ' Set TMR0 to interrupt every 16.384 milliseconds
            OPTION_REG = $55        ' Set TMR0 configuration and enable PORTB pullups
            INTCON = $a0            ' Enable TMR0 interrupts
            On Interrupt Goto tickint
    
    
    ' Main program loop - in this case, it only updates the LCD with the time
    mainloop:
            PORTB = 0       ' PORTB lines low to read buttons
            TRISB = $f0     ' Enable all buttons
    
            ' Check any button pressed to set time
            If PORTB.7 = 0 Then decmin
            If PORTB.6 = 0 Then incmin      ' Last 2 buttons set minute
            If PORTB.5 = 0 Then dechr
            If PORTB.4 = 0 Then inchr       ' First 2 buttons set hour
    
            ' Check for time to update screen
    chkup:  If update = 1 Then
                    Lcdout $fe, 1   ' Clear screen
    
                    ' Display time as hh:mm:ss
                    dhour = hour    ' Change hour 0 to 12
                    If (hour // 12) = 0 Then
                            dhour = dhour + 12
                    Endif
    
                    ' Check for AM or PM
                    If hour < 12 Then
                            Lcdout dec2 dhour, ":", dec2 minute, ":", dec2 second, " AM"
                    Else
                            Lcdout dec2 (dhour - 12), ":", dec2 minute, ":", dec2 second, " PM"
                    Endif
    
                    update = 0      ' Screen updated
            Endif
    
            Goto mainloop   ' Do it all forever
    
    
    ' Increment minutes
    incmin: minute = minute + 1
            If minute >= 60 Then
                    minute = 0
            Endif
            Goto debounce
    
    ' Increment hours
    inchr:  hour = hour + 1
            If hour >= 24 Then
                    hour = 0
            Endif
            Goto debounce
    
    ' Decrement minutes
    decmin: minute = minute - 1
            If minute >= 60 Then
                    minute = 59
            Endif
            Goto debounce
    
    ' Decrement hours
    dechr:  hour = hour - 1
            If hour >= 24 Then
                    hour = 23
            Endif
    
    ' Debounce and delay for 250ms
    debounce: For i = 1 to 25
            Pause 10        ' 10ms at a time so no interrupts are lost
            Next i
    
            update = 1      ' Set to update screen
    
            Goto chkup
    
    
    ' Interrupt routine to handle each timer tick
            disable         ' Disable interrupts during interrupt handler
    tickint: ticks = ticks + 1      ' Count pieces of seconds
            If ticks < 61 Then tiexit       ' 61 ticks per second (16.384ms per tick)
    
    ' One second elasped - update time
            ticks = 0
            second = second + 1
            If second >= 60 Then
                    second = 0
                    minute = minute + 1
                    If minute >= 60 Then
                            minute = 0
                            hour = hour + 1
                            If hour >= 24 Then
                                    hour = 0
                            Endif
                    Endif
            Endif
    
            update = 1      ' Set to update LCD
    
    tiexit: INTCON.2 = 0    ' Reset timer interrupt flag
            Resume
    
            End
    Last edited by Fredrick; - 31st January 2008 at 17:42.

  2. #2
    Join Date
    Oct 2003
    Location
    holland
    Posts
    251


    Did you find this post helpful? Yes | No

    Default

    Add this into your program !!

    Code:
    @ DEVICE PIC16F873,XT_OSC
    @ DEVICE PIC16F873,HS_OSC		
    
    DEFINE	OSC 20
    It's an example for a PIC16F873, if you have another chip than replace it.

  3. #3
    Join Date
    Oct 2004
    Location
    North Norfolk UK
    Posts
    146


    Did you find this post helpful? Yes | No

    Default

    Hi

    Mister e has very kindly provided a calculator PICMultiCalc for just this sort of thing.

    not quite sure how to provide link to a previous post on this forum, but a quick search should get you there


    HTH

    Duncan

  4. #4
    Join Date
    Sep 2007
    Location
    USA, CA
    Posts
    271


    Did you find this post helpful? Yes | No

    Default

    This section...
    ' Set TMR0 to interrupt every 16.384 milliseconds
    OPTION_REG = $55 ' Set TMR0 configuration and enable PORTB pullups
    INTCON = $a0 ' Enable TMR0 interrupts
    On Interrupt Goto tickint

    ...sets the interrupt frequency, based on a clock timer. When you change the clock speed, the interrupts still happen at the same number of clock cycles. The multicalc program that Mr. E has will help you calculate how often it is going now (documented at 16mS), and help you get there with the clock * 5.

  5. #5
    Join Date
    Mar 2006
    Location
    Pennsylvania, USA.
    Posts
    130


    Did you find this post helpful? Yes | No

    Default

    Steve's Multi-Calc program is at;
    http://www.mister-e.org/pages/utilitiespag.html
    Just click on the download button and follow the directions. Then join the rest of us in saying 'Thanks Steve!'

    Jerry.
    If your oscilloscope costs more than your car...

Similar Threads

  1. Single digit 7 Seg LED clock - PIC16F88
    By thirsty in forum Code Examples
    Replies: 4
    Last Post: - 17th July 2009, 08:42
  2. Clock using Instant Interrupts
    By PICpocket in forum mel PIC BASIC Pro
    Replies: 3
    Last Post: - 16th February 2009, 21:43
  3. EM4095 Chip, get Clock and Data signals?
    By mindthomas in forum mel PIC BASIC Pro
    Replies: 14
    Last Post: - 19th August 2008, 06:27
  4. Shiftout/in
    By BobEdge in forum mel PIC BASIC Pro
    Replies: 5
    Last Post: - 23rd August 2007, 11:48
  5. Help with sound command in 2 programs
    By hyperboarder in forum mel PIC BASIC Pro
    Replies: 4
    Last Post: - 5th July 2007, 20:36

Members who have read this thread : 1

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