Einsteigerfrage Example "Blink"

Hallo,

ich habe vor einen Sketch fuer eine bestimmte Funktion zu entwickeln. Als Anfänger habe ich zuerst mal versucht eines der Beispiele (Blink) zum Laufen zu bringen. Aber leider scheitere ich schon dabei. Die LED blinkt nicht! Weder die eingebaute an Pin 13, noch eine andere an jedem beliebigen Pin. Die LEDs leuchten dauernd.
Hardware: Arduiono Uno Rev. 3
Software : Arduino 1.0 unter SuSE Linux 12.1

Hier mal der Code aus dem Beispiel "Blink", der nicht so funktioniert wie er sollte:

/*
  Blink
  Turns on an LED on for one second, then off for one second, repeatedly.
 
  This example code is in the public domain.
 */

void setup() {                
  // initialize the digital pin as an output.
  // Pin 13 has an LED connected on most Arduino boards:
  pinMode(13, OUTPUT);     
}

void loop() {
  digitalWrite(13, HIGH);   // set the LED on
  delay(1000);              // wait for a second
  digitalWrite(13, LOW);    // set the LED off
  delay(1000);              // wait for a second
}

Dann habe ich 2 serielle Ausgaben eingefuegt, um im Serial Monitor zu sehen ob ueberhaupt ein programmablauf stattfindet:

/*
  Blink
  Turns on an LED on for one second, then off for one second, repeatedly.
 
  This example code is in the public domain.
 */

void setup() {                
  Serial.begin(9600); 
  // initialize the digital pin as an output.
  // Pin 13 has an LED connected on most Arduino boards:
  pinMode(13, OUTPUT);     
}

void loop() {
  digitalWrite(13, HIGH);   // set the LED on
  delay(1000);              // wait for a second
  Serial.println("Eingeschaltet");  
  digitalWrite(13, LOW);    // set the LED off
  delay(1000);              // wait for a second
  Serial.println("Ausgeschaltet");  
}

Und nun, oh Wunder, es funktioniert. Die LEDs blinken und die Ausgabe im Serial Monitor (Eingeschaltet/Ausgeschaltet) ist auch korrekt. Es ist ja schön, das es funktioniert, aber ich wuerde das Ganze dann doch gerne verstehen.
Deshalb meine Frage:
Kann mir jemand sagen, wo mein Fehler ist?

Gruß
Christoph

Der erste Sketch sollte eigentlich auch funktionieren. Bist Du sicher, das der korrekt übertragen wurde? Wie hast Du denn die "externe" LED angeschlossen?

mkl0815 hat recht.

Der erste Sketch Funktioniert, habe den Code 1:1 kopiert und kurz auf einen Uno V3 gespielt, die interne LED (Pin 13) blinkt.
Lass Dich nicht von solchen Dingen runterziehen, versuchs doch nochmal.

PS: Dein zweiter Sketch schreibst du besser so, dann stimmt auch der Text zu der LED:

/*
  Blink
  Turns on an LED on for one second, then off for one second, repeatedly.
 
  This example code is in the public domain.
 */

void setup() {                
  Serial.begin(9600); 
  // initialize the digital pin as an output.
  // Pin 13 has an LED connected on most Arduino boards:
  pinMode(13, OUTPUT);     
}

void loop() {
  digitalWrite(13, HIGH);   // set the LED on
  Serial.println("Eingeschaltet");  
  delay(1000);              // wait for a second
  digitalWrite(13, LOW);    // set the LED off
  Serial.println("Ausgeschaltet");  
  delay(1000);              // wait for a second
}

:slight_smile:

Gruss Kay

Ich meine, ich hätte mal gehört, dass es unter Linux Probleme mit der delay()-Funktion geben kann (abhängig von der Compiler-Version und der Version der Libraries). Allerdings treten die nicht auf, wenn zusätzlicher Code zum Blink-Sketch dazugepackt wird.

Siehe auch: Arduino auf Fedora 15 einrichten - Shredzone

@Ketchup: Hast du den ersten Blink-Sketch unter Windows oder unter einem Linux ausprobiert?

Wolfgang

voithian:
@Ketchup: Hast du den ersten Blink-Sketch unter Windows oder unter einem Linux ausprobiert?

In Windows.
Linux habe ich nicht zum Testen.

Kay

Ketchup:
In Windows.

Könnte also daran liegen, dass mx55 SuSE-Linux verwendet und dieses Problem nur bei der Linux-Compiler/Library-Version (und da eventuell auch nur bei Arduino 1.0) auftritt.

Doofe Frage: Aber wie genau hast du die LED angeschlossen?

wenn er sie auf pin 13 angeschlossen hat müsste doch der vorwiderstand der internen led reichen

Das Gerücht hält sich hartnäckig. Auf PIN 13 ist seit dem Arduino Diecimila inbegriffen kein Widerstand mehr!!!! Wenn Du dort eine LED ohne Vorwiderstand anschließt machst Du praktisch einen Kurzschluß der weder der LED noch dem ATmega auf die Dauer gut bekommt.
Grüße Uwe

Hallo,
zuerst einmal danke fuer die Antworten.
Ich werde mal versuchen zusammenfassend zu antworten.
Ich habe natuerlich verschiedene Versuche angestellt.
Zuerst der Originalcode aus dem Example. Ohne zusätzlich angeschlossene Led.
Resultat: Die eingebaute Led zeigt Dauerlicht.
Dann habe ich eine zusätzliche LED (ueber einen 1 KOhm Widerstand) auch an Pin 13 angeschlossen.
Resultat: Beide Leds zeigen Dauerlicht.
Nun habe ich den Code dahingehend abgeändert, das nicht mehr Pin 13, sondern Pin 10 geschaltet wird und dort die externe LED (mit Vorwiderstand) angeschlossen.
Resultat: Die eingebaute Led ist aus (wie es ja auch sein sollte). Die externe LED zeigt Dauerlicht.
Nun habe ich die beiden Ausgaben eingefuegt.

Serial.println("Eingeschaltet");
Serial.println("Ausgeschaltet");

Habe aber vergessen im Setup nachfolgendes einzufuegen:

  Serial.begin(9600);

Anfängerfehler. Interessanterweise wurde das aber ohne Fehlermeldung kompiliert.
Resultat: Die externe LED blinkt. Allerdings keine Ausgabe auf dem Serial Monitor (wie zu erwarten). Diesen Fehler habe ich dann aber recht schnell gefunden.
Ich werde mir jetzt mal den oben angegebenen Link anschauen. Weiterhin habe ich hier noch ein Win XP in einer virtuellen Maschine (Virtual Box). Dort werde ich morgen Arduino installieren und schauen was passiert, wenn ich das Example von dort aus uploade.

Gruß
Christoph

Hallo,

ich habe nun ein paar Tests durchgefuehrt und es scheint sich wirklich um ein Problem mit dem Cross-Compiler und/oder den Binutils unter Linux zu handeln.
Analog zu dem workaround hier:
http://arduino.cc/forum/index.php/topic,68512.0.html
sieht mein (funktionierender) "Blink"-Code nun so aus:

/*
  Blink
  Turns on an LED on for one second, then off for one second, repeatedly.
 
  This example code is in the public domain.
 */
int Pin13 = 13;
void setup() {                
  // initialize the digital pin as an output.
  // Pin 13 has an LED connected on most Arduino boards:
  pinMode(Pin13, OUTPUT);     
}

void loop() {
  digitalWrite(Pin13, HIGH);   // set the LED on
  delay(1000);              // wait for a second
  digitalWrite(Pin13, LOW);    // set the LED off
  delay(1000);              // wait for a second
}

Wenn ich die Pinnummer in einer globalen Variable speichere und dann diese benutze, funktioniert alles wie beabsichtigt.

Gruß
Christoph

Also ich würde da nicht pauschal von "Linux" reden,
unter Ubuntu 12.04 (64-bit) blinkt dein Ursprungssketch nämlich munter vor sich hin ...

Grüßle Bernd

BerndJM:
Also ich würde da nicht pauschal von "Linux" reden,
unter Ubuntu 12.04 (64-bit) blinkt dein Ursprungssketch nämlich munter vor sich hin ...

Diese Version ist ja auch ziemlich neu. Mag sein, dass hier irgendwie eine andere/neuere/schönere/bessere Version der Libraries/Compiler/binutils installiert wird. Darin liegt ja das Problem wohl generell.

Gruß
Wolfgang

Hallo,

BerndJM:
Also ich würde da nicht pauschal von "Linux" reden,
unter Ubuntu 12.04 (64-bit) blinkt dein Ursprungssketch nämlich munter vor sich hin ...

da hast du sicher recht, war eine unzulässige Pauschalisierung von mir.
Ich berichtige also:
Unter opensuse 12.1, Linux 3.1.10-1.9-desktop #1 SMP PREEMPT Thu Apr 5 18:48:38 UTC 2012 (4a97ec8) i686 GNU/Linux (Ausgabe von uname -srvmo) funktioniert es nicht so wie erwartet.
Und nun gehe ich mich wieder mit dem Arduino beschäftigen, das Teil ist nämlich eine wirklich interessante Sache.

Gruß
Christoph

Dann guck dir doch gleich das "Blink without delay()" Beispiel an, damit du dir delay() gar nicht erst angewöhnst... :wink:

Arduino mit loop - Zeiten im Millisekunden - Bereich oder schneller ist einfach besser.

Hallo,

michael_x:
Dann guck dir doch gleich das "Blink without delay()" Beispiel an

danke fuer den Hinweis. Eigentlich wollte ich ja gar nicht "blinken". Ich habe nur dieses Beispiel fuer einen ersten Test ausgewählt, da es mir simpel erschien. Und schon das hat nicht funktioniert, war etwas frustrierend.
Zum Beispiel "Blink without delay()":
Das interessanteste ist wahrscheinlich, das dadurch nicht der ganze Programmablauf aufgehalten wird.
Problematisch finde ich allerdings, das nach 24 Tagen, 20 Stunden, 31 Minuten, 3 Sekunden und 647 Millisekunden Laufzeit des Arduino ein Fehler auftreten wird. Denn dann tritt ein Ueberlauf der Variable "previousMillis" auf. Warum diese, im Gegensatz zu "currentMillis", als "long" und nicht "unsigned long" definiert wurde, habe ich nicht verstanden. Denn dann wäre, denke ich, die Zeit bis zum Ueberlauf doppelt so lang.
Fuer das Beispiel mag es nicht von Bedeutung sein, ob die LED ca. alle 3,5 Wochen etwas länger oder kuerzer an oder aus ist. Sollten mit diesem Code jedoch andere Vorgänge zeitgesteuert werden, könnten hier Probleme auftreten.

Gruß
Christoph

Der Überlauf tritt nach 49 und etwas Tagen auf ( die Variable millis() ist vom Typ unsigned long). Dieser kann bei geschickter Abfrage in der if Anweisung abgefangen werden und somit zu keinen Fehlzeiten führen. Somit sind "Wartezeiten" bis über 49 Tage möglich.

Zu Beispiel blink without delay hast Du recht
long previousMillis = 0;
wäre richtiger und besser als
unsigned long previousMillis = 0;
deklariert.
Dieser Fehler bringt das Programm nach 24 und etwas Tagen durcheinander.

Grüße Uwe

Ein Überlauf ist gar nicht schlimm.
Eine Differenz zwischen zwei unsigned int ( oder long ) ist übrigens immer noch richtig, so lange der Ergebnis-Wert im möglichen Bereich bleibt.

Beispiel:

unsigned int lastmilli = 65530; // = 0 - 6, kurz vor dem Überlauf
unsigned int newmilli = 4;

unsigend int differenz = newmilli - lastmilli; // = 10, Überlauf ist kein Problem

Hallo,

gerade habe ich die neuesten Versionen von Arduino (Vers. 1.0-5.1), crosscompiler etc. meiner Distribution (opensuse 12.1) installiert.
Im Änderungsprotokoll steht folgendes:

  • work around a bug in binutils 2.22 which causes the trivial
    example sketches ("Blink" for example) to fail

"blink" funktioniert jetzt also auch mit opensuse 12.1.
Ich bleibe aber trotzdem bei "blink without delay".

Gruß
Christoph