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