Forum: Compiler & IDEs Variable zwischen zwei Uhrzeiten auf 1 setzen, sonst 0


von Balou B. (baloubaer)


Lesenswert?

Ich muss noch einmal stören ;).

ich möchte gern eine Variable in einer Zeit von 22:30 bis 5:30 Uhr auf 1 
setzen. würde das so gehen? Die Zeiten bekomme ich über eine DCF77 RTC. 
Daher ist das Testen sonst sehr zeit aufwendig ^^. Die Uhrzeit wird alle 
15 Minuten vom uC bei der RTC abgefragt. ES sind alles Globale 
Variablen!
1
if ( wartezeitRTCabfrage = 15 );
2
{
3
  stunde = RTC_stunde ( ) ;
4
  minute = RTC_minute ( ) ;
5
  nachtruhe ( ) ;
6
}
7
8
void nachtruhe ( void )
9
{
10
  if ( ( stunde >= STUNDENACHTRUHE ) | ( stunde <=STUNDEAUFSTEHEN ) )
11
  {
12
    if ( ( minute >= MINUTENACHTRUHE ) | ( minute <= MINUTEAUFSTEHEN ) )
13
    {
14
      Nachtruhe = 1 ;
15
      grundposition ( );
16
    }
17
    else
18
    {
19
      Nachtruhe = 0 ;
20
    }
21
  }
22
}

ich bedanke mich für euere Hilfe und verbleibe

mit freundlichen Grüßen

Balou Baer

von Volker (Gast)


Lesenswert?

1. | -> ||

2. Was passiert wenn bereits die 1. Bedingung falsch ist?

von holger (Gast)


Lesenswert?

if ( wartezeitRTCabfrage = 15 );
{
...
}

Zwei Fehler in einer Zeile;)

von Tim T. (tim_taylor) Benutzerseite


Lesenswert?

Versuchs mal damit (ungetestet).
1
if (wartezeitRTCabfrage == 15)
2
{
3
  zeit = 60 * RTC_stunde();
4
  zeit += RTC_minute();
5
  nachtruhe();
6
}
7
8
9
void nachtruhe(void)
10
{
11
  if ((zeit >= 60 * STUNDENACHTRUHE + MINUTENACHTRUHE) || (zeit <= 60 * STUNDEAUFSTEHEN + MINUTEAUFSTEHEN))
12
  {
13
    Nachtruhe = 1;
14
    grundposition();
15
  }
16
  else
17
  {
18
    Nachtruhe = 0;
19
  }
20
21
}

: Bearbeitet durch User
von Balou B. (baloubaer)


Lesenswert?

Danke TIM

werde ich versuchen.


@ Holger

ich danke dir für deine nicht wirkliche Hilfreiche Aussage. Vielleicht 
markierst du die Fehler einmal, du brauchst sie ja nicht kommentieren.
Nimm dir ein beispiel an Volker, wenn du schon schreibfaul bist.  ;)

Mit freundlichen Grüßen

Balou Baer

von Tim T. (tim_taylor) Benutzerseite


Lesenswert?

Er spielt auf den Vergleichsoperator == und das abschließende Semikolon 
an. Durch das einfache Gleich ist es eine Zuweisung, die Bedingung ist 
immer erfüllt und das Semikolon beendet die Bedingung. Der Block danach 
wird immer ausgeführt.
Beides Anfängerfehler und relativ offensichtlich...

: Bearbeitet durch User
von C C C (Gast)


Lesenswert?

Was du suchst ist das Konzept der "Unit-Tests".
Dein Problem ist ein Paradebeispiel dafür. Einfach bei Google / 
Wikipedia suchen...
Grüße!

von Tim T. (tim_taylor) Benutzerseite


Lesenswert?

Versuch einfach mal deine Quelltexte mit -Wall zu kompilieren, das 
hilft.

PS: Wäre dieser Thread nicht besser im PC-Programmierung Unterforum 
aufgehoben?

: Bearbeitet durch User
von Peter D. (peda)


Lesenswert?

Balou Baer schrieb:
> Daher ist das Testen sonst sehr zeit aufwendig ^^.

4 Vergleiche 8Bit sind überhaupt nicht zeitaufwendig.
Das vorher multiplizieren ist deutlich aufwendiger.

von Karl H. (kbuchegg)


Lesenswert?

Peter Dannegger schrieb:
> Balou Baer schrieb:
>> Daher ist das Testen sonst sehr zeit aufwendig ^^.
>
> 4 Vergleiche 8Bit sind überhaupt nicht zeitaufwendig.
> Das vorher multiplizieren ist deutlich aufwendiger.

Allerdings müsste er dann die Vergleiche richtig machen. Dann sind es 
ein paar mehr Vergleiche. Noch nichts dramatisches, aber immerhin.

@Balou Baer

Ich benutze auch meistens die Version des Ausrechnens der Minuten seit 
Mitternacht. Die Vergleichszeiten kann man gleich so speichern, dann 
muss man die nicht dauernd umrechnen und die aktuelle Uhrzeit ändert 
sich ja nur jede Minute.

Aber wenn du schon Zeiten einzeln vergleichst, dann musst du das auch 
richtig machen. Eine Zeit A ist kleiner als eine andere Zeit B, wenn
* die Stunde von A kleiner als die Stunde von B ist
* Oder aber, wenn die beiden gleich sind, die Minuten von A kleiner als 
die Minuten von B sind
1
  if( StundenA < StundenB || ( StundenA == StundenB && MinutenA < MinutenB ) )
Es ist wichtig, dass der Minutenvergleich nur dann eine Aussagekraft 
hat, wenn die Stunden gleich sind! 09:25 ist nun mal nicht "kleiner" als 
08:40, selbst wenn 25 kleiner als 40 ist.

Und nein. Du kannst da nicht 2 Zeitvergleiche in der Art und Weise 
zusammenmischen wie du das getan hast. Leg in deinen Abfragen mal die 
Nachtruhezeit auf 22:30, die Aufstehzeit auf 06:20 und dann probierst du 
mal mit einer aktuellen Zeit von 23:25 was du für ein Ergebnis kriegst 
(mal vorausgesetzt du hast den korrekten logischen Oder-Operator || 
genommen).

: Bearbeitet durch User
von jois3 (Gast)


Lesenswert?

Hi Balou,

ich möchte mich C C C anschließen - versuche bitte, Deine Funktion als 
Funktion zu schreiben.
Sprich:
Alles, was Du prüfst, ist eine Funktionsvariable und wird übergeben, das 
Ergebnis als int (0 oder 1) zurückgegeben.

Also in der Art:
1
private int testeEinenWert(int zahl, int limit)
2
{
3
   if (zahl > limit)
4
   {
5
      return 0;
6
   }
7
   return 1;
8
}
Warum? Ganz einfach:
Du schreibst ein paar Tests, nach dem Motto:
1
int testA = testeEinenWert(1,2);
2
int testB = testeEinenWert(3,5);
3
int testC = testeEinenWert(-1,128373);
Durch die Werte weißt Du (Du hast die Funktion konzipiert), was 
herauskommen soll. Du prüfst testA, testB usw. auf die korrekten 
Ergebnisse, und notierst dies in einer Testfunktion, die Du spätestens 
immer dann ausführst, wenn Du die Funktion angefasst hast (idealerweise 
bei jedem Compile-Lauf). Das nennt man dann Unit-Test und spart jede 
Menge Kopfschmerzen ;-)

Gruß, jois3

: Bearbeitet durch User
von Route_66 H. (route_66)


Lesenswert?

Tim T. schrieb:
> if (wartezeitRTCabfrage == 15)
> {
>   zeit = 60 * RTC_stunde();
>   zeit += RTC_minute();
>   nachtruhe();
> }

Hallo!
Wichtig ist, dass bei obigem Vergleich das Lesen von RTC_stunde() und 
RTC_minute() atomar sein muss.
Wenn RTC_Stunde() 22 liefert, und danach RTC-Minute 0, kann es 22:00 
oder 23:00 sein!!!

Lösung: beides zweimal auslesen und entsprechend bewerten.

: Bearbeitet durch User
von Pink S. (pinkshell)


Lesenswert?

> if (wartezeitRTCabfrage == 15)

und es ist besserer Stil, zu schreiben:

if (wartezeitRTCabfrage >= 15)

ist zwar unwahrscheinlich, dass die Bedingung eine Minute lang nicht 
geprüft wird. Aber falls man aus irgendeinem Grund erst bei 16 prüft, 
dann ist Ende mit der Nachtschaltung.

von Rolf M. (rmagnus)


Lesenswert?

Peter Dannegger schrieb:
> Balou Baer schrieb:
>> Daher ist das Testen sonst sehr zeit aufwendig ^^.
>
> 4 Vergleiche 8Bit sind überhaupt nicht zeitaufwendig.
> Das vorher multiplizieren ist deutlich aufwendiger.

Das nicht, aber das Warten bis 22:30 und danach bis nach 5:30, um zu 
sehen, ob die Abfrage auch das gewünschte Ergebnis bringt.

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.