Clock


Results 1 to 5 of 5

Thread: Clock

Threaded View

  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.

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 : 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