Forum: Mikrocontroller und Digitale Elektronik Probleme mit If-Schleife


Announcement: there is an English version of this forum on EmbDev.net. Posts you create there will be displayed on Mikrocontroller.net and EmbDev.net.
von heike (Gast)


Bewertung
-5 lesenswert
nicht 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)


Bewertung
3 lesenswert
nicht 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)


Bewertung
-1 lesenswert
nicht 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)


Bewertung
0 lesenswert
nicht 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. (Firma: Thomas Eckmann Informationst.) (thomase)


Bewertung
0 lesenswert
nicht 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)


Bewertung
0 lesenswert
nicht 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)


Bewertung
0 lesenswert
nicht 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)


Bewertung
0 lesenswert
nicht 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)


Bewertung
0 lesenswert
nicht 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)


Bewertung
0 lesenswert
nicht 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)


Bewertung
2 lesenswert
nicht 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

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.