PDA

View Full Version : Time logic



Scampy
- 26th October 2013, 23:07
My current project is not performing very well. It relies on matching the values in two variables to the converted BDC format from a battery backed up 1307 RTC. My idea is to use a variable to store the current time in minutes from midnight, so in theory it should have a value between 0 and 1439. The idea then is to convert the time the LEDs come on into a numerical value and the use the "if then " statement to determine if the LEDs should be on in the event of a power cut. For example if the on time was from 14:00 to 18:00 hrs then the values would be => then 840 but =< 1080, so if there was a power cut and power was resumed at say 15:00 hrs then as the time would be converted to 900 and the logic would then check the value against the programmed value and thus turn the LEDs on. This is my proposed code (with some of the RTC variables not included for simplicity)



Counter 1 var byte
counter 2 var byte
counter 3 var byte

TimeH var byte ' Variable to store current hour
TimeM var Byte ' Variable to store current minutes


Main:

I2CRead SDApin,SCLpin,$D0,$00,[RTCSec,RTCMin,RTCHour,RTCWDay,RTCDay,RTCMonth,RTCY ear,RTCCtrl] ; read DS1307 chip

timeH=(RTCHour>>4) 'convert the BCD format of the hours register and store in variable timeH
timeH=(timeH &$03)*10
timeH=timeH+(RTCHour&$0F)

timeM=(RTCMin>>4)
timeM=(timeM &$07)*10
timeM=timeM+(RTCMin&$0F) 'convert the BCD format of the mins register and store in variable timeM

If TimeH = 0 and timeM = 0 then
couner 3 = 0
endif

If TimeH <1 then counter 1 = 0
If timeH >0 then counter 1 = Time H * 60
Counter 3 = counter1 + TimeM
Endif
endif


Would welcome comments

richard
- 27th October 2013, 06:45
to get minutes from midnight.

whats this about ????? (timeH=(timeH &$03)*10)

would it not be :-
timeH=(RTCHour>>4) 'convert the BCD format
timeH=timeH *10
timeH=timeH+(RTCHour&$0F) ' to binary hours


timeM=(RTCMin>>4) ' bcd minutes to binary minutes

timeM=timeM *10
timeM=timeM+(RTCMin&$0F)



minutes_from_midnite =(timeh*60)+timem


i'm sure its a typo but
Counter 1 var byte
counter 2 var byte
counter 3 var byte

looks a bit dodgy to have a space in a var name

Amoque
- 27th October 2013, 13:39
I am reading / replying on phone; please understand the difficulty of studying closely your code. It would appear to me that counter variables may exceed byte value assigned? Var WORD to take values greater than 254.

I too am recently working with clock and found it complex and clumsy to work between decimal and BCD; perhaps you too would find it simpler to make the conversion only when reading/ writing registers and therefore all other interactions are simplified by being common value without effort?

Scampy
- 27th October 2013, 20:15
Thanks for the comments guys and yes it should be word to get the 1440 minutes in a day. The code for the conversion from BDC came from a sample code written by Melenie, which I've used in other projects so couldn't see any reason to change it.

richard
- 27th October 2013, 20:30
I have found it unnecessary to mask off the unused bits with genuine ds1307 chips , if the time is ok they are always 0.
however PCF8563 chips need every unused bit masked off . so maybe scampy's bcd2bin conversion code is the safest option
cheers

Amoque
- 28th October 2013, 13:40
My current project is not performing very well. It relies on matching the values in two variables to the converted BDC format from a battery backed up 1307 RTC. My idea is to use a variable to store the current time in minutes from midnight, so in theory it should have a value between 0 and 1439. The idea then is to convert the time the LEDs come on into a numerical value and the use the "if then " statement to determine if the LEDs should be on in the event of a power cut. For example if the on time was from 14:00 to 18:00 hrs then the values would be => then 840 but =< 1080, so if there was a power cut and power was resumed at say 15:00 hrs then as the time would be converted to 900 and the logic would then check the value against the programmed value and thus turn the LEDs on. This is my proposed code (with some of the RTC variables not included for simplicity)

Would welcome comments

I thought to take another look benefited by the large screen, as I did not understand well your explanation of what was to happen here. Perhaps I still do not... curiosity begs to ask: What is the purpose of this?

Typically I refrain from asking, but in this case I try only to understand for my own satisfaction whether I am slow to comprehend the text... or the purpose. If the clock is battery-backed, the time will be always correct then yes? Should it not then be correct to calculate the LED's status from the current time always? Why then to store the minutes from midnight (rather than calculate)? And, if the clock is not correct, then how can the minutes from midnight be the right number and the LED's status correctly resolved?

Also, if the "start" of the counter is always midnight, could you not avoid any calculation at all by maintaining a count as the minutes pass similar to:

If OldMinute <> NewMinute then
MinituesSinceMidnight = MinutesSinceMidnight +1
OldMinute = NewMinute
Endif

starting at midnight?

Scampy
- 28th October 2013, 14:40
Your logic seems sound, and I guess I could then use the logic thus:

If MinutessinceMidnight => LightsOn and <= LightsOff then turn lights on
Endif

so for example, if the lighton value was 720 and lightsoff value was 800 then LEDs would be on just between these "times"

I just need to get my DS1307 working now (see other thread !)