Forum: Mikrocontroller und Digitale Elektronik Probleme mit If-Schleife


von heike (Gast)


Lesenswert?

Hei Ich bin Anfängerin und wollte mal einen einfachen Sketch mit der 
if-schleife machen:
...
void loop() {
//sas = 1
  if ( sas == true ){
    fal = millis();}
    if (fal>3000){
      fal =0;}
 Serial.println( fal );
delay(1000);
}

Meine Problem ist aber, dass im Seriellen-Monitor nach der zurücksetzung 
auf 0 in der zweiten if-Schleife die Var. sas auf 0 bleibt und später 
sie einen negativen Wert bekomment.
Ich hatte erwartet das dieser Sketch die Var. von 0-3 Sek. laufen lässt 
und dass sich immer wiederholt?!
Scheinbar ist das nicht so einfach wie ich gedacht habe aber wo liegt 
denn das Problem?

LG heike

von Kai (Gast)


Lesenswert?

heike schrieb:
> Scheinbar ist das nicht so einfach wie ich gedacht habe aber wo liegt
> denn das Problem?

Hier ist eine Erläuterung dazu:
http://if-schleife.de/

von heike (Gast)


Lesenswert?

http://blog.ebene7.com/2010/01/15/und-es-gibt-sie-doch-if-schleifen-so-wird-es-nicht-gemacht/

Hehe...nein nur Spaß.
Ok gut, aber trotz dessen sollte sie doch funktionieren?!

heike

von npn (Gast)


Lesenswert?

heike schrieb:
> Ich hatte erwartet das dieser Sketch die Var. von 0-3 Sek. laufen lässt
> und dass sich immer wiederholt?!

Wie soll das funktionieren? Du änderst doch gar nichts an der Variablen 
sas. Du fragst sie nur ab. Dadurch kann sie sich nie ändern.

von Thomas E. (thomase)


Lesenswert?

heike schrieb:
> Ok gut, aber trotz dessen sollte sie doch funktionieren?!

Tut sie ja auch. Offensichtlich macht sie nur nicht das, was du 
erwartest.

Zeig das ganze Programm und rück den Code vernünftig ein.

von heike (Gast)


Lesenswert?

heike schrieb:
> in der zweiten if-Schleife die Var. sas auf 0 bleibt
entschuldige hier meinte ich natür. die Var. fal.

in der zweiten if-Abfrage setze ich ja fal auf 0 so fällt sie doch aus 
der Abfrage in die erste if-Abfrage und bekommt wieder millis() 
zugeteilt?!

heike

von Md M. (Firma: Potilatormanufaktur) (mdma)


Lesenswert?

Bist du dir sicher, was wann gesetzt wird? Tip: Serial.println öfter 
verwenden, an den Stellen, an denen du genauer hingucken möchtest. Um 
die verschiedneen Stellen im Serial-Monitor unterscheiden zu können:

Serial.print("Stelle A: ");
Serial.println(fal);

Serial.print("Stelle B: ");
Serial.println(fal);

: Bearbeitet durch User
von Rolf M. (rmagnus)


Lesenswert?

heike schrieb:
> Meine Problem ist aber, dass im Seriellen-Monitor nach der zurücksetzung
> auf 0 in der zweiten if-Schleife die Var. sas auf 0 bleibt

Das hätte ich auch erwartet, denn so hast du es in deinem Code 
hingeschrieben.

> und später sie einen negativen Wert bekomment.

Von welchem Typ ist die Variable denn? Ich wette, es ist int, und nach 
ca. 32 Sekunden wird sie negativ.

> Ich hatte erwartet das dieser Sketch die Var. von 0-3 Sek. laufen lässt
> und dass sich immer wiederholt?!

Warum sollte es? Du hast doch gesagt, dass, wann immer millis() mehr als 
3000 zurückgibt, die Variable auf 0 gesetzt werden soll.

heike schrieb:
> 
http://blog.ebene7.com/2010/01/15/und-es-gibt-sie-doch-if-schleifen-so-wird-es-nicht-gemacht/
>
> Hehe...nein nur Spaß.
> Ok gut, aber trotz dessen sollte sie doch funktionieren?!

PHP version not supported

The requested PHP version is not supported on this server.
------------------------------------------------------------------------
Die gewählte PHP Version ist auf dem Server nicht verfügbar.

von Michael U. (amiga)


Lesenswert?

Hallo,

sieht nach Arduino aus...
millis() liefert die Anzahl Millisek nach Programmstart zurück, ist also 
3s nach Start größer als 3000 und erhöht sich mit jeder ms um 1.

Was soll es also bezwecken?

Gruß aus Berlin
Michael

von Patrick J. (ho-bit-hun-ter)


Lesenswert?

Hi

Bitte jetzt nicht schlagen, aber wie funktioniert dieses Programm?
Wenn setup() und loop() Funktionen sind, passiert da doch akut ... 
Nichts.
Wenn diese 'Blöcke' (warum auch immer) abgearbeitet werden, spätestens 
nach dem Ende von loop() ebenfalls Nichts mehr.
Und Das sollte binnen 3 Sekunden zu schaffen sein.

Eigentlich müsste ich doch bei Programmstart die setup() aufrufen und 
dann in einer Endlos-Schleife die loop()-Funktion.

Glaub, ich bleibe bei Assembler ... da kann ich mir sicher sein, daß der 
Fehler auch weiterhin vor dem Bildschirm sitzt.

MfG

von Joe F. (easylife)


Lesenswert?

heike schrieb:
> Ich hatte erwartet das dieser Sketch die Var. von 0-3 Sek. laufen lässt
> und dass sich immer wiederholt?!

millis() zählt nicht nur von 0-3000.
Du musst relative Zeitmessungen also einen Startzeitpunkt nehmen 
(t_start), und dann diesen Startzeitpunkt von der aktuellen Zeit (t_now) 
abziehen.

Wenn du bei 3 Sekunden angelangt bis, schiebst du den Startzeitpunkt um 
3 Sekunden nach vorne, und bist dadurch wieder auf 0.

Dein delay(1000) ist nicht besonders günstig, denn durch die 
Ausführungszeit der restlichen Instruktionen vor dem delay() wird 
insgesamt immer etwas mehr als 1000 ms vergehen, deine Ausgabe ist also 
etwas langsamer als 1x pro Sekunde.

Deswegen ist folgende Vorgehensweise besser:

Du bastelst dir eine Zeitmessung für genau 1 Sekunde, und zählst dann 
einen weiteren Zähler von 0..2 hoch.
1
unsigned long t_now;
2
unsigned long t_start;
3
unsigned long t_delta;
4
int seconds = 0;
5
6
void setup()
7
{
8
  t_start = millis();
9
}
10
11
void loop() 
12
{
13
  t_now = millis();
14
  t_delta = t_now - t_start;
15
  
16
  if (t_delta >= 1000) // 1 second has passed
17
  {
18
    t_start += 1000;
19
    
20
    seconds += 1;      // could also be 1000 for counting in milliseconds
21
    if (seconds >= 3)  // could also be 3000 for counting in milliseconds
22
      seconds = 0;
23
      
24
    Serial.println(seconds);
25
  }
26
}

Patrick J. schrieb:
> Bitte jetzt nicht schlagen, aber wie funktioniert dieses Programm?
> Wenn setup() und loop() Funktionen sind, passiert da doch akut ...
> Nichts.

Das ist eine Besonderheit der Arduino "Sketches".
Es fehlt im Prinzip dieser Code hier:
1
main()
2
{
3
  setup();
4
  while(1)
5
  {
6
    loop();
7
  }
8
}
wobei die Variablen in loop glaube ich alle static werden. Frag mich 
nicht, mit welcher Schweinerei das erreicht wurde.
Ich hatte so einen Arduino noch nie in der Hand, aber hier kommen 
inzwischen so viele Fragen dazu, dass man das einfach mal so akzeptiert 
;-)

Ach ne, die Variablen in loop() sind nicht static. main() kann man sich 
hier angucken:
https://github.com/arduino/Arduino/blob/master/hardware/arduino/avr/cores/arduino/main.cpp

: Bearbeitet durch User
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.