PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : wie alarmzeiten o.ä. programmieren?



ssalbach
13.06.2005, 23:14
Ich nutze einen RTC am Mega8 und will damit die Beleuchtung, Bodenheizung etc. von meinem Gewächshaus steuern. Er zeigt mir die Uhrzeit an und er regelt schon die Bodentemp nur halt noch nicht abhängig von der Zeit.
Wie sagt man nun dem Prog das es um 23Uhr auf die Procedure Nachttemperatur wechseln soll und um 8 Uhr morgends wieder auf Tagetemperatur.
Ich schreibe zwar alles in Pascal aber Beispiele in C würden mir sicher auch weiterhelfen, beser wäre natürlich auch in Pascal.
Anbei der derzeitige Stand.
So funzt es nicht.


{--------------------------------------------------------------}
{ Const Declarations }
const einschalttemperatur_tag : Word = 26; //26
abschalttemperatur_tag : Word = 28; //28
einschalttemperatur_nacht : Word = 14; //2
abschalttemperatur_nacht : Word = 16; //28

{--------------------------------------------------------------}
{ Var Declarations }
{$IDATA}
var
a : WORD;
b : BOOLEAN;
seconds, minutes, hours : byte;
second, minute, hour: string[2];
{--------------------------------------------------------------}
{ functions }
procedure InitPorts;
begin
DDRB:= %11111111;
end InitPorts;

Procedure RTC;
BEGIN
I2Cout($50, 2);
second:=I2Cinp($50, Seconds);
I2Cout($50, 3);
minute:=I2Cinp($50, Minutes);
I2Cout($50, 4);
hour:=I2Cinp($50, hours);
second:=bytetohex (seconds);
minute:=bytetohex (minutes);
hour:=bytetohex (hours);
LCDCLR;
LCDxy(1,0);
write (LCDOut,'Aktuelle Zeit');
LCDxy(3,1);
write (LCDOut,hour);
LCDxy(5,1);
write (LCDOut,':');
LCDxy(6,1);
write (LCDOut,minute);
LCDxy(8,1);
write (LCDOut,':');
LCDxy(9,1);
write (LCDOut,second);
mdelay(20);
end;

Procedure Temperatur_messen;
BEGIN
a:= GetAdc ;
a:= a-390;
a:= a * 17;
a:= a div 100;
end;

Procedure Tagestemperatur;
BEGIN
LCDCLR;
LCDxy(2,0);
write (LCDOut, 'Lufttemp:');
LCDXY(12,0);
write (LCDOut ,IntToStr(a));
If a < einschalttemperatur_tag THEN // Wenn Temperatur unter 26°, einschalten.
PortB:=%11111111;
b:= TRUE; // Heitzung 'an' Flag setzen.
endif;

If a >= abschalttemperatur_tag THEN // Wenn Temperatur um 28°, ausschalten.
PortB:=%00000000;
b:= FALSE; // Heitzung 'aus' Flag setzen.
endif;
If b = TRUE THEN
LCDXY(0,1);
write (LCDOut, 'Bodenheizung:an');
ELSE
LCDXY(0,1);
write (LCDOut, 'Bodenheizung:aus');
endif;
mdelay(100);

end;

Procedure Nachttemperatur;
BEGIN
LCDCLR;
LCDxy(2,0);
write (LCDOut, 'Lufttemp:');
LCDXY(12,0);
write (LCDOut ,IntToStr(a));
If a < einschalttemperatur_nacht THEN // Wenn Temperatur unter 26°, einschalten.
PortB:=%11111111;
b:= TRUE; // Heitzung 'an' Flag setzen.
endif;

If a >= abschalttemperatur_nacht THEN // Wenn Temperatur um 28°, ausschalten.
PortB:=%00000000;
b:= FALSE; // Heitzung 'aus' Flag setzen.
endif;
If b = TRUE THEN
LCDXY(0,1);
write (LCDOut, 'Bodenheizung:an');
ELSE
LCDXY(0,1);
write (LCDOut, 'Bodenheizung:aus');
endif;
mdelay(100);

end;
{--------------------------------------------------------------}
{ Main Program }
{$IDATA}
begin
InitPorts;
EnableInts;
//I2Cout($50, 2, $00); // Sekunden stellen
//I2Cout($50, 3, $05); // Minuten stellen
//I2Cout($50, 4, $20); // Stunden stellen
loop
RTC;
mdelay (1000);
Temperatur_messen;
If hour = 23 THEN
Nachttemperatur;
mdelay(1000);
IF hour = 08 THEN
Tagestemperatur;
mdelay(1000);
ENDIF;
ENDIF;
endloop;
end Tutor01.

lekro
14.06.2005, 10:52
Ich versteh dein Problem nicht ganz. :/

Ohne den Code jetzt angesehen zu haben, zu zählst doch bestimmt irgendwo die Uhrzeit hoch (mind. jede einmal pro Sekunde). Hier könntest du doch einfach ein if einbauen und die aktuelle Zeit mit der gespeicherten Alarmzeit vergleichen?

Klaus_0168
14.06.2005, 11:34
Hi ssalbach,

wenn ich das Program richtig verstanden habe, dann funktioniert es nur von 23:00 bis 23:59 mit dem Nachtprogramm und von 8:00 bis 8:59 mit dem Tagprogramm. Dies sind die einzigen Zeiten, in denen Du mit den If - Befehlen vom Hauptprogramm in die Unterroutinen verzweigst.

Besser wäre es, das Tagprogramm von Stunde 8 bis incl. Stunde 22 zu starten und den Rest des Tages das Nachtprogramm zu aktivieren. Der If - Befehl in der Hauptroutine müsste dann


If ((hour > 7) and (hour < 23)) then
Tagtemperatur
else
Nachttemperatur;
lauten. Von 8:00h bis 22:59 sollte dann die Tagtemperatur aktiv sein, und zu jeder anderen Zeit die Nachttemperatur.

Ich hoffe, das ich die Syntax eingehalten habe. Pascal benutzt ich nur mit Delphi.

Grüße Klaus

ssalbach
18.06.2005, 20:17
so, bin im e-lab fprum auf die lösunng gekommen :-)
Es muss heissen If hour = $23
ich dödel habe das $ nicht geschrieben und der RTC 8583 arbeitete doch ´mit BCD Code

Klaus_0168
20.06.2005, 08:59
hi ssalbach,

im Moment gezweifle ich noch, das Dein Programm auch auserhalb der 8. und 23. Stunde korrekt arbeitet. Hast Du das mit ausgetestet ??

Gruß Klaus

pc-gott70
20.06.2005, 14:43
also mit dem $ allein sollte Dein Problem eigentlich auch micht gelöst sein,- es sei denn ich interpretiere Dein Programm falsch. Ich komme nämlich zum selben Ergebnis wie:



...funktioniert es nur von 23:00 bis 23:59 mit dem Nachtprogramm und von 8:00 bis 8:59 mit dem Tagprogramm. Dies sind die einzigen Zeiten, in denen Du mit den If - Befehlen vom Hauptprogramm in die Unterroutinen verzweigst.


Gruß David