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.
Code:
{--------------------------------------------------------------}
{ 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.