PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Abfrage der Uhrzeit für Schaltvorgänge



martin66119
14.01.2007, 10:01
Einen schönen Sonntag euch allen!

Ich bin dabei oder besser versuche eine Heizungssteuerung zu programmieren.

Mit folgendem Code, den ich hier gefunden habe ist eine Uhr auf meinem Controller implementiert.

Hierzu habe ich zwei Fragen:
1) Was ist die '$lib "ds1307rtc.lib" und wo finde ich diese?
2) In der Datumsanzeige sind sonderzeichen drin, die ich so nicht haben möchte. Wie und wo kann ich diese ändern (z.B. dass es so aussieht
14-01-07).

Neben den obigen Fragen habe ich noch eine weitere.
Um Schaltvorgänge zu bestimmten Uhrzeiten zu realisieren muss ich in bestimmten Zeitintervallen die Uhrzeit abfragen. Z.B. Wenn später wie 22:00 dann ausschalten. Wenn später wie 06:00 dann einschalten. Wie macht man sowas am besten.



$regfile = "m8def.dat"
$crystal = 8000000
$baud = 9600

Config Lcd = 16 * 2
Config Lcdpin = Pin , Rs = Portd.2 , E = Portd.3 , Db4 = Portd.4 , Db5 = Portd.5 , Db6 = Portd.6 , Db7 = Portd.7
Config Lcdbus = 4
Config Lcdmode = Port

Config Sda = Portc.4
Config Scl = Portc.5
Cls


$lib "mcsbyte.lbx" ' for smaller code
'$lib "ds1307rtc.lib" ' modified lib

'address of ds1307
Const Ds1307w = &HD0 ' Addresses of Ds1307 clock
Const Ds1307r = &HD1

Config Clock = User ' this will dim the bytes automatic
'dim other needed variables
Dim Weekday As Byte
'Locate 1 , 1
'Lcd "DS1307"
'Waitms 100
' assigning the time will call the SetTime routine
Time$ = "23:22:30" ' to watch the day changing value
Date$ = "13.01.07" ' 13 november 2002
Cls
Do
Locate 1 , 1
Lcd Date$ ;
Locate 2 , 1
Lcd Time$
Waitms 500
Loop

End

'called from ds1307clock.lib
Getdatetime:
I2cstart ' Generate start code
I2cwbyte Ds1307w ' send address
I2cwbyte 0 ' start address in 1307

I2cstart ' Generate start code
I2cwbyte Ds1307r ' send address
I2crbyte _sec , Ack
I2crbyte _min , Ack ' MINUTES
I2crbyte _hour , Ack ' Hours
I2crbyte Weekday , Ack ' Day of Week
I2crbyte _day , Ack ' Day of Month
I2crbyte _month , Ack ' Month of Year
I2crbyte _year , Nack ' Year
I2cstop
_sec = Makedec(_sec) : _min = Makedec(_min) : _hour = Makedec(_hour)
_day = Makedec(_day) : _month = Makedec(_month) : _year = Makedec(_year)
Return

Setdate:
_day = Makebcd(_day) : _month = Makebcd(_month) : _year = Makebcd(_year)
I2cstart ' Generate start code
I2cwbyte Ds1307w ' send address
I2cwbyte 4 ' starting address in 1307
I2cwbyte _day ' Send Data to SECONDS
I2cwbyte _month ' MINUTES
I2cwbyte _year ' Hours
I2cstop
Return

Settime:
_sec = Makebcd(_sec) : _min = Makebcd(_min) : _hour = Makebcd(_hour)
I2cstart ' Generate start code
I2cwbyte Ds1307w ' send address
I2cwbyte 0 ' starting address in 1307
I2cwbyte _sec ' Send Data to SECONDS
I2cwbyte _min ' MINUTES
I2cwbyte _hour ' Hours
I2cstop
Return


Danke für die Hilfe an alle!

Martin

mx3
14.01.2007, 20:06
Neben den obigen Fragen habe ich noch eine weitere.
Um Schaltvorgänge zu bestimmten Uhrzeiten zu realisieren muss ich in bestimmten Zeitintervallen die Uhrzeit abfragen. Z.B. Wenn später wie 22:00 dann ausschalten. Wenn später wie 06:00 dann einschalten. Wie macht man sowas am besten.



if Stunde = 6
if Minute=0
if Sekunde =0
then ...."Heizung ein"...
wait 1 ' 1 Sekunde warten
end if
end if
end if



Wäre eine Möglichkeit

mfg,MX3

martin66119
14.01.2007, 20:15
Danke für den Vorschlag

Das ist auch die einzige Möglichkeit die mir einfällt

Martin

Stromi
14.01.2007, 22:39
Die Lib kannst du, wenn du dich angemeldet hast, im Forum von Mscelec runterladen. Einfach in die Suchfunktion den Namen der Lib eintragen.
MfG

for_ro
14.01.2007, 22:50
Hallo,
in meiner Heizungsregelung benutze ich die laufende Minute am Tag, also 9:00 morgens ist dann 540. Der Brenner wird dann freigegeben, wenn die aktuelle Minute größer als 540 und er wird erst eingeschaltet, wenn noch einige andere Bedingungen zutreffen. In dem obigen Beispiel würde die Heizung überhaupt nicht eingeschaltet, wenn die Befehlszeile wegen eines Interrupts z.B. nicht genau um 6:00:00 ausgeführt wird. Du müsstest also zumindest fragen, ob die Zeit größer als Stunde 6 Minute 0 und Sekunde 0 ist. Ebenso wieder fürs Ausschalten. Ist aber Geschmacksache, mir erschien es mit der fortlaufenden Minute einfacher.

Gruß Rolf

Hanni
14.01.2007, 23:20
In dem obigen Beispiel würde die Heizung überhaupt nicht eingeschaltet, wenn die Befehlszeile wegen eines Interrupts z.B. nicht genau um 6:00:00 ausgeführt wird. Du müsstest also zumindest fragen, ob die Zeit größer als Stunde 6 Minute 0 und Sekunde 0 ist.

Also wenn deine Interrupts so lange dauern, hast du nen ziemlichen Wurm in deinem Programm drin! Vor allem dann, wenn man bedenkt das so ein Mikrocontroller mehrere Millionen Operationen pro Sekunde durchführen kann.

Grüße,
Hanni

for_ro
15.01.2007, 11:06
Millionen klingt gut, aber alleine ein GetRC5 blockiert die Kiste für 150ms. Da sind schon die ersten Millionen weg.
Na ja, mir ging's halt generell darum, dass ich nicht auf eine feste Zeit abfragen würde. Ich will ja schließlich die Heizung auch nicht nur um Punkt 6.00 Uhr laufen haben, sondern normalerweise zwischen 6.00 und 23.00 Uhr z.B. Und dann sollte auch die Abfrage so sein. Man kann ja mal versuchen, eine Abfrage mit Stunden und Minuten so zu machen, dass sie zwischen 6:30 und 22:30 an ist. Ist schon recht aufwendig.

Gruß Rolf