Setting RTC with buttons

super_moose

New Member
Hi all,

I'm trying to make a clock using an lcd screen and an rtc. I am using a DS1390 rtc because I want to display milliseconds. I can read from the rtc and display the time on the lcd but i'm having trouble figuring out how to use buttons to set the time. What I tried sort of works, it increases the minutes until they go above 9. Then the minutes turn into symbols. Any help would be appreciated, I don't know too much about what I'm doing I have been looking at the example code for the commands and trying it out.

Code:
[color=Blue]pause [/color][color=Navy]1000[/color]

[color=Black]init:[/color]
[color=Blue]high [/color][color=Navy]7[/color]
[color=Blue]serout [/color][color=Navy]7 [/color][color=Black],[/color][color=Blue]T9600_8[/color][color=Black],[/color][color=Blue]([/color][color=Navy]$FE[/color][color=Black],[/color][color=Navy]$58[/color][color=Blue])

pause [/color][color=Navy]500[/color]
[color=Blue]serout [/color][color=Navy]7 [/color][color=Black],[/color][color=Blue]T9600_8[/color][color=Black],[/color][color=Blue]([/color][color=Navy]$FE[/color][color=Black],[/color][color=Navy]$51[/color][color=Blue])
pause [/color][color=Navy]500[/color]
[color=Blue]serout [/color][color=Navy]7 [/color][color=Black],[/color][color=Blue]T9600_8[/color][color=Black],[/color][color=Blue]([/color][color=Navy]$FE[/color][color=Black],[/color][color=Navy]$59[/color][color=Black],[/color][color=Navy]3[/color][color=Blue])[/color]
[color=Black]Flash:[/color]
[color=Blue]serout [/color][color=Navy]7 [/color][color=Black],[/color][color=Blue]T9600_8[/color][color=Black],[/color][color=Blue]([/color][color=Navy]$FE[/color][color=Black],[/color][color=Navy]$44[/color][color=Blue])
serout [/color][color=Navy]7 [/color][color=Black],[/color][color=Blue]T9600_8[/color][color=Black],[/color][color=Blue]([/color][color=Navy]$FE[/color][color=Black],[/color][color=Navy]$54[/color][color=Blue])

pause [/color][color=Navy]500[/color]


[color=Blue]hspisetup spimode01[/color][color=Black], [/color][color=Blue]spimedium [/color]



[color=Black]main:[/color]

[color=Blue]low [/color][color=Navy]6             [/color][color=Green];seconds[/color]
[color=Blue]hspiout ([/color][color=Navy]$01[/color][color=Blue])
hspiin  ([/color][color=Purple]b0[/color][color=Blue])
high [/color][color=Navy]6[/color]
[color=Blue]pause [/color][color=Navy]5[/color]


[color=Blue]bcdtoascii [/color][color=Purple]b0[/color][color=Black],[/color][color=Purple]b1[/color][color=Black],[/color][color=Purple]b2[/color]



[color=Blue]low [/color][color=Navy]6              [/color][color=Green];mins  [/color]
[color=Blue]hspiout ([/color][color=Navy]$02[/color][color=Blue])
hspiin  ([/color][color=Purple]b3[/color][color=Blue])
high [/color][color=Navy]6[/color]
[color=Blue]pause [/color][color=Navy]5[/color]

[color=Blue]bcdtoascii [/color][color=Purple]b3[/color][color=Black],[/color][color=Purple]b4[/color][color=Black],[/color][color=Purple]b5[/color]

[color=Blue]low [/color][color=Navy]6               [/color][color=Green];hours[/color]
[color=Blue]hspiout ([/color][color=Navy]$03[/color][color=Blue])
hspiin ([/color][color=Purple]b6[/color][color=Blue])
high [/color][color=Navy]6[/color]

[color=Blue]bcdtoascii [/color][color=Purple]b6[/color][color=Black],[/color][color=Purple]b7[/color][color=Black],[/color][color=Purple]b8[/color]

[color=Blue]low [/color][color=Navy]6                [/color][color=Green];milliseconds[/color]
[color=Blue]hspiout ([/color][color=Navy]$00[/color][color=Blue])
hspiin ([/color][color=Purple]b9[/color][color=Blue])
high [/color][color=Navy]6[/color]

[color=Blue]bcdtoascii [/color][color=Purple]b9[/color][color=Black],[/color][color=Purple]b10[/color][color=Black],[/color][color=Purple]b11[/color]


[color=Blue]serout [/color][color=Navy]7 [/color][color=Black],[/color][color=Blue]T9600_8[/color][color=Black],[/color][color=Blue]([/color][color=Navy]$FE[/color][color=Black],[/color][color=Navy]$47[/color][color=Black],[/color][color=Navy]3[/color][color=Black],[/color][color=Navy]1[/color][color=Blue])   [/color][color=Green];set screen to 2 blocks in[/color]
[color=Blue]serout [/color][color=Navy]7 [/color][color=Black],[/color][color=Blue]T9600_8[/color][color=Black],[/color][color=Blue]([/color][color=Purple]b7[/color][color=Black],[/color][color=Purple]b8[/color][color=Blue])
serout [/color][color=Navy]7 [/color][color=Black],[/color][color=Blue]T9600_8[/color][color=Black],[/color][color=Blue]([/color][color=Red]":"[/color][color=Blue])
serout [/color][color=Navy]7 [/color][color=Black],[/color][color=Blue]T9600_8[/color][color=Black],[/color][color=Blue]([/color][color=Purple]b4[/color][color=Black],[/color][color=Purple]b5[/color][color=Blue])
serout [/color][color=Navy]7 [/color][color=Black],[/color][color=Blue]T9600_8[/color][color=Black],[/color][color=Blue]([/color][color=Red]":"[/color][color=Blue])
serout [/color][color=Navy]7 [/color][color=Black],[/color][color=Blue]T9600_8[/color][color=Black],[/color][color=Blue]([/color][color=Purple]b1[/color][color=Black],[/color][color=Purple]b2[/color][color=Blue])
serout [/color][color=Navy]7 [/color][color=Black],[/color][color=Blue]T9600_8[/color][color=Black],[/color][color=Blue]([/color][color=Red]":"[/color][color=Blue])
serout [/color][color=Navy]7 [/color][color=Black],[/color][color=Blue]T9600_8[/color][color=Black],[/color][color=Blue]([/color][color=Purple]b10[/color][color=Black],[/color][color=Purple]b11[/color][color=Blue])

if [/color][color=Purple]pinB.5 [/color][color=DarkCyan]= [/color][color=Navy]1 [/color][color=Blue]then
pause [/color][color=Navy]100 [/color]
[color=Blue]inc [/color][color=Purple]b3[/color]
[color=Blue]low [/color][color=Navy]6[/color]
[color=Blue]hspiout ([/color][color=Navy]$82[/color][color=Blue])
hspiout ([/color][color=Purple]b3[/color][color=Blue])
high [/color][color=Navy]6[/color]
[color=Blue]endif






goto [/color][color=Black]main:[/color]
 

inglewoodpete

Senior Member
Can you tell us which PICAXE chip you are planning to use? The capability of the chip can determine which options you can use for scanning a key pad.
 

westaust55

Moderator
Hi all,
What I tried sort of works, it increases the minutes until they go above 9. Then the minutes turn into symbols.
You have not provided the entire code incorporating the part for adjusting the time.

Your statement suggests that you have not taken into account the ASCII codes.
If you look at an ASCII code table you will see that after 0 to 9 comes the symbols : ; < = > etc.
is that what you are seeing?

If your value for say minutes is held in two byte variables as tens and units then when you increment and reach ten for the units you need to increment the tens and change the units to 0.

If you are holding the entire minutes value in a single byte variable then it could be how you are breaking it out to display on the LCD.
are you using the BCDtoASCII command ? you may need to be using BINtoASCII command instead to breakout the tens and units digits for sending the ASCII characters code to the LCD.
 

johnlong

Senior Member
Hi
Could you work the following in I used it to set the ds1307

Code:
symbol UP =pinB.4
symbol DWN=pinB.7
symbol RTN=pinB.5
symbol mins=b10
symbol minbcd=b12
symbol AXE133=C.2
outpinsB=%00001000
	dirsB=%00001000
do
		serout AXE133, N2400, (254,128,"MIUTES=", #mins," ",32,#minbcd,"  ",cr,lf )
	 	if UP=1  then:pauseus 50: inc mins
		elseif DWN=1  then:pauseus 50: dec mins			 
	endif	
	minbcd = mins / 10 * 6 + mins'Hippy's solution for dec to bcd  use this in a gosub to set the clock via the relivent hicout command
	if mins<0 or mins>=60 then:mins=0:endif 	 		
	loop until RTN=1
regards john
 

super_moose

New Member
Im using the 28x2 picaxe.

I am reading the rtc and converting into ascii for displaying on the screen but at the bottom I tried with b3 which should be the bcd number for minutes to increment the value. For some reason this doesnt seem to work.
Thanks john. Ill see if I can figure out how to make this work for me
 

westaust55

Moderator
The problem you are experiencing relates to trying to do the maths (increment and decrement) on a BCD encoded value.
The simplest would be to
1. read the BCD value from the RTC,
2. Covert the BCD value to a binary value
3. Use the standard math to increment and decrement the hours/mins/secs
( use BINtoASCII to create the characters to send to the LCD display)
4. When you have the value desired convert back the BCD format
5. Write back to the RTC
 

johnlong

Senior Member
Hi Supermoose

If you place # before the variable you want to display it will display the Ascii value
so just convert your BCD back to dec with the following code segment by Hippy
Code:
 mins = minbcd / 16 * $FA + minbcd'Hippys conversion for BCD to dec
 serout AXE133, N2400, (LCDon,128,"Minutes=", #mins," " )
Using the # does what westaust55 has covered in his point 3 with BintoAscii but understand
thats what is actually happening and is an important step so do look
at the command and have a go with both
regards
john
 

super_moose

New Member
I have attempted to use your examples johnlong and this is what I have come up with
Code:
[color=Blue]pause [/color][color=Navy]1000[/color]
[color=Blue]symbol [/color][color=Purple]bcdmins [/color][color=DarkCyan]=[/color][color=Purple]b3[/color]
[color=Blue]symbol [/color][color=Purple]mins [/color][color=DarkCyan]=[/color][color=Purple]b4[/color]
[color=Blue]symbol [/color][color=Purple]bcdhours [/color][color=DarkCyan]=[/color][color=Purple]b6[/color]
[color=Blue]symbol [/color][color=Purple]hours [/color][color=DarkCyan]=[/color][color=Purple]b7[/color]
[color=Blue]symbol [/color][color=Purple]minup [/color][color=DarkCyan]=[/color][color=Purple]pinB.5[/color]


[color=Black]init:[/color]
[color=Blue]high [/color][color=Navy]7[/color]
[color=Blue]serout [/color][color=Navy]7 [/color][color=Black],[/color][color=Blue]T9600_8[/color][color=Black],[/color][color=Blue]([/color][color=Navy]$FE[/color][color=Black],[/color][color=Navy]$58[/color][color=Blue])

pause [/color][color=Navy]500[/color]
[color=Blue]serout [/color][color=Navy]7 [/color][color=Black],[/color][color=Blue]T9600_8[/color][color=Black],[/color][color=Blue]([/color][color=Navy]$FE[/color][color=Black],[/color][color=Navy]$51[/color][color=Blue])
pause [/color][color=Navy]500[/color]
[color=Blue]serout [/color][color=Navy]7 [/color][color=Black],[/color][color=Blue]T9600_8[/color][color=Black],[/color][color=Blue]([/color][color=Navy]$FE[/color][color=Black],[/color][color=Navy]$59[/color][color=Black],[/color][color=Navy]3[/color][color=Blue])[/color]
[color=Black]Flash:[/color]
[color=Blue]serout [/color][color=Navy]7 [/color][color=Black],[/color][color=Blue]T9600_8[/color][color=Black],[/color][color=Blue]([/color][color=Navy]$FE[/color][color=Black],[/color][color=Navy]$44[/color][color=Blue])
serout [/color][color=Navy]7 [/color][color=Black],[/color][color=Blue]T9600_8[/color][color=Black],[/color][color=Blue]([/color][color=Navy]$FE[/color][color=Black],[/color][color=Navy]$54[/color][color=Blue])

pause [/color][color=Navy]500[/color]


[color=Blue]hspisetup spimode01[/color][color=Black], [/color][color=Blue]spimedium [/color]



[color=Black]main:[/color]

[color=Blue]low [/color][color=Navy]6             [/color][color=Green];seconds[/color]
[color=Blue]hspiout ([/color][color=Navy]$01[/color][color=Blue])
hspiin  ([/color][color=Purple]b0[/color][color=Blue])
high [/color][color=Navy]6[/color]
[color=Blue]pause [/color][color=Navy]5[/color]


[color=Blue]bcdtoascii [/color][color=Purple]b0[/color][color=Black],[/color][color=Purple]b1[/color][color=Black],[/color][color=Purple]b2[/color]



[color=Blue]low [/color][color=Navy]6              [/color][color=Green];mins  [/color]
[color=Blue]hspiout ([/color][color=Navy]$02[/color][color=Blue])
hspiin  ([/color][color=Purple]bcdmins[/color][color=Blue])
high [/color][color=Navy]6[/color]
[color=Blue]pause [/color][color=Navy]5[/color]
[color=Purple]mins [/color][color=DarkCyan]= [/color][color=Purple]bcdmins [/color][color=DarkCyan]/ [/color][color=Navy]16 [/color][color=DarkCyan]* [/color][color=Navy]$FA [/color][color=DarkCyan]+ [/color][color=Purple]bcdmins[/color]

[color=Blue]low [/color][color=Navy]6               [/color][color=Green];hours[/color]
[color=Blue]hspiout ([/color][color=Navy]$03[/color][color=Blue])
hspiin ([/color][color=Purple]bcdhours[/color][color=Blue])
high [/color][color=Navy]6[/color]
[color=Purple]hours [/color][color=DarkCyan]= [/color][color=Purple]bcdhours [/color][color=DarkCyan]/ [/color][color=Navy]16 [/color][color=DarkCyan]* [/color][color=Navy]$FA [/color][color=DarkCyan]+ [/color][color=Purple]bcdhours[/color]


[color=Blue]low [/color][color=Navy]6                [/color][color=Green];milliseconds[/color]
[color=Blue]hspiout ([/color][color=Navy]$00[/color][color=Blue])
hspiin ([/color][color=Purple]b9[/color][color=Blue])
high [/color][color=Navy]6[/color]

[color=Blue]bcdtoascii [/color][color=Purple]b9[/color][color=Black],[/color][color=Purple]b10[/color][color=Black],[/color][color=Purple]b11[/color]


[color=Blue]serout [/color][color=Navy]7 [/color][color=Black],[/color][color=Blue]T9600_8[/color][color=Black],[/color][color=Blue]([/color][color=Navy]$FE[/color][color=Black],[/color][color=Navy]$47[/color][color=Black],[/color][color=Navy]3[/color][color=Black],[/color][color=Navy]1[/color][color=Blue])   [/color][color=Green];set screen to 2 blocks in[/color]
[color=Blue]serout [/color][color=Navy]7 [/color][color=Black],[/color][color=Blue]T9600_8[/color][color=Black],[/color][color=Blue]([/color][color=Black]#[/color][color=Purple]hours[/color][color=Blue])
serout [/color][color=Navy]7 [/color][color=Black],[/color][color=Blue]T9600_8[/color][color=Black],[/color][color=Blue]([/color][color=Red]":"[/color][color=Blue])
serout [/color][color=Navy]7 [/color][color=Black],[/color][color=Blue]T9600_8[/color][color=Black],[/color][color=Blue]([/color][color=Black]#[/color][color=Purple]mins[/color][color=Blue])
serout [/color][color=Navy]7 [/color][color=Black],[/color][color=Blue]T9600_8[/color][color=Black],[/color][color=Blue]([/color][color=Red]":"[/color][color=Blue])
serout [/color][color=Navy]7 [/color][color=Black],[/color][color=Blue]T9600_8[/color][color=Black],[/color][color=Blue]([/color][color=Purple]b1[/color][color=Black],[/color][color=Purple]b2[/color][color=Blue])
serout [/color][color=Navy]7 [/color][color=Black],[/color][color=Blue]T9600_8[/color][color=Black],[/color][color=Blue]([/color][color=Red]":"[/color][color=Blue])
serout [/color][color=Navy]7 [/color][color=Black],[/color][color=Blue]T9600_8[/color][color=Black],[/color][color=Blue]([/color][color=Purple]b10[/color][color=Black],[/color][color=Purple]b11[/color][color=Blue])

if [/color][color=Purple]minup [/color][color=DarkCyan]=[/color][color=Navy]1 [/color][color=Blue]then goto [/color][color=Black]minincrease:

minincrease:[/color]

[color=Blue]if [/color][color=Purple]minup [/color][color=DarkCyan]=[/color][color=Navy]1 [/color][color=Blue]then[/color][color=Black]:[/color][color=Blue]pauseus [/color][color=Navy]50[/color][color=Black]: [/color][color=Blue]inc [/color][color=Purple]mins [/color][color=Blue]endif[/color]
[color=Purple]bcdmins [/color][color=DarkCyan]= [/color][color=Purple]mins [/color][color=DarkCyan]/ [/color][color=Navy]10 [/color][color=DarkCyan]* [/color][color=Navy]6 [/color][color=DarkCyan]+ [/color][color=Purple]mins[/color]
[color=Blue]if [/color][color=Purple]mins[/color][color=DarkCyan]<[/color][color=Navy]0 [/color][color=DarkCyan]or [/color][color=Purple]mins[/color][color=DarkCyan]>=[/color][color=Navy]60 [/color][color=Blue]then[/color][color=Black]:[/color][color=Purple]mins[/color][color=DarkCyan]=[/color][color=Navy]0[/color][color=Black]:[/color][color=Blue]endif               
low [/color][color=Navy]6[/color]
[color=Blue]hspiout ([/color][color=Navy]$82[/color][color=Blue])
hspiout ([/color][color=Purple]bcdmins[/color][color=Blue])
high [/color][color=Navy]6[/color]



[color=Blue]goto [/color][color=Black]main:[/color]
it sort of works. I have only tried to get the minutes to work for now and pressing the button works to increase them but it goes to 80 before getting back to zero.
Also I think there is something wrong in here
Code:
[color=Blue]if [/color][color=Purple]minup [/color][color=DarkCyan]=[/color][color=Navy]1 [/color][color=Blue]then goto [/color][color=Black]minincrease:

minincrease:[/color]

[color=Blue]if [/color][color=Purple]minup [/color][color=DarkCyan]=[/color][color=Navy]1 [/color][color=Blue]then[/color][color=Black]:[/color][color=Blue]pauseus [/color][color=Navy]50[/color][color=Black]: [/color][color=Blue]inc [/color][color=Purple]mins [/color][color=Blue]endif[/color]
[color=Purple]bcdmins [/color][color=DarkCyan]= [/color][color=Purple]mins [/color][color=DarkCyan]/ [/color][color=Navy]10 [/color][color=DarkCyan]* [/color][color=Navy]6 [/color][color=DarkCyan]+ [/color][color=Purple]mins[/color]
[color=Blue]if [/color][color=Purple]mins[/color][color=DarkCyan]<[/color][color=Navy]0 [/color][color=DarkCyan]or [/color][color=Purple]mins[/color][color=DarkCyan]>=[/color][color=Navy]60 [/color][color=Blue]then[/color][color=Black]:[/color][color=Purple]mins[/color][color=DarkCyan]=[/color][color=Navy]0[/color][color=Black]:[/color][color=Blue]endif               
low [/color][color=Navy]6[/color]
[color=Blue]hspiout ([/color][color=Navy]$82[/color][color=Blue])
hspiout ([/color][color=Purple]bcdmins[/color][color=Blue])
high [/color][color=Navy]6[/color]
I think it is writing to the rtc all the time because the clock seems to run oddly and the minutes are stuck. My understanding is minincrease should only do something if minup is high? or have I got that wrong?


Thanks.
 

hippy

Technical Support
Staff member
To increment a BCD value with range 0 to 59 ...

Code:
Symbol bcdMins = b2
Symbol binMins = b3

Do
  binMins = bcdMins / 16 * $FA + bcdMins
  binMins = binMins + 1 // 60
  bcdMins = binMins / 10 * 6 + binMins
  Pause 500  
Loop
 

oracacle

Senior Member
westy do you mean >=59 same goes for seconds. I've never seen a clock display 60 mins (baring the odd leap minute or second)
 

westaust55

Moderator
No it's is >= 60 or just > 59

If you are at 58 and increment to 59 then it is still valid as mins or seconds.

If you are at 59 and increment to 60 then you need to reset to 0
If you test for >= 59 then when incrementing from 58 to 59 it meets the >=59 criteria (= 59) and you revert to 0 a minute/second too early
 

hippy

Technical Support
Staff member
59 or 60 ?

It really depends on whether the comparison test is done before or after incrementing -

1) If mins >= 59 Then : mins = 0 : Else : mins = mins + 1 : End If

2) mins = mins + 1 : If mins >= 60 Then : mins = 0 : End If

In both cases ">=" could be replaced by "=", but adding the ">" is a common "defensive coding" technique. A variable should never get above that value, but it handles the case if it ever does. Its intent is to ensure 'least amount of damage' should things ever go bad.

Using "mins = mins + 1 // 60" is (almost) the same as the second, will be providing mins never goes out of range due to a bug somewhere.
 

bobladell

New Member
Here's a soft clock written for an 08M2 using the PICAXE "time" 1 second counter - see manual "Variables - System" and the following pages "Variables - Special function". Should run on an M2 but not X2 without code changes. It was designed as a stop watch with output every 5 seconds, hence the +5 in the code. It drifts quite a lot but suited my rough timing purposes without using an external RTC. Hopefully will help illustrate the minute / hour boundary coding - and not confuse...........

lp:
;SoftRTC
Secs = time ;* 3 ; adjust time for real time
If Secs >= 60 then
time = 0
Mins = Mins + 1
endif
if Mins >= 60 then
Hours = Hours + 1
Mins = 0
Mins2 = 1
endif
If Hours = 24 then ; Or just let the hours count up to 99 and roll over
Hours = 0
endif
;EndSoftRTC
if Secs <> Secs2 then ; calc RTC, wait for 5s interval to sample and send
goto lp
endif

Secs2 = Secs + 5 ; set next sample time - 5S

if Secs2 >= 60 then ; reset for the minute boundary
Secs2 = 0
endif
 
Top