Forum: Mikrocontroller und Digitale Elektronik Arduino Blinkprogramm


von Bianca R. (kagome)


Lesenswert?

Hi,
momentan haben wir in der Schule das Thema Arduino.
Ich habe wohl ein Verständnis Problem und komme weder im Internet noch 
in Büchern weiter.
Die Aufgabe war mit einem Arduino Uno eine LED 5 mal im Abstand von 2 
Herz Blinken zu lassen, wenn ein Taster betätigt wird. Wird der Taster 
nicht gedrückt, soll nichts passieren.

So wie ich alles verstanden habe, habe ich versucht ein Programm zu 
schreiben, aber Blinken tut nichts wenn ich auf den Taster drücke.

void setup()
{
  pinMode(8, OUTPUT);
  pinMode(4, OUTPUT);

}

void loop()
{
  digitalWrite(4, HIGH);

  if(4 == HIGH)
  {
    digitalWrite(8, HIGH);
    delay(500);
    digitalWrite(8, LOW);
    delay(500);
   }

  else
 {
   digitalWrite(8, LOW);

 }
}

Ich weiß nicht was ich falsch mache..
Danke schon mal im voraus für jede Hilfe.

von Frank L. (hermastersvoice)


Lesenswert?

könnte es eventuell nützlich sein für ein Eingabegerät, also z.B. eine 
Taste, zumindest einen Eingang zu haben?

von Joachim B. (jar)


Lesenswert?

vielleicht ist die deutsche Übersetzung von OUTPUT nicht bekannt?

Kommt vermutlich erst nach Arduino programmieren :)

von Jonas S. (heftie)


Lesenswert?

Deine Pin Definition ist falsch wenn du einen Taster abfragen möchtest 
musst du auch den Pin als INPUT definieren. Desweiteren musst du zum 
Auslesen des Pins auch digitalRead(PIN) nutzen. Ich empfehle erstmal ein 
grundlegendes Einlesen auf Arduino.cc dort findest du auch mehrere 
Beispiel.

Hier mal der Link zu den Reference, wo du alle Befehle findest.
https://www.arduino.cc/en/Reference/HomePage

von Arduinoquäler (Gast)


Lesenswert?

Bianca R. schrieb:
> if(4 == HIGH)

... ersatzweise könntest du auch schreiben
1
if (1 == 10)

Groschen gefallen?

Das ist natürlich nur die halbe Miete. Die andere
Hälfte hat mein Vorredner schon genannt.

von Sepp Huber (Gast)


Lesenswert?

Ich würde mal vermuten das Pin 4 der INPUT ist und auch als INPUT 
konfiguriert werden sollte. pinMode(4, INPUT) ?

if(4 == HIGH)   das wird wohl niemals TRUE sein wenn HIGH als 1 
definiert ist, vermutlich gibt es da so was wie digitalRead(4) welches 
HIGH oder LOW zurücklifert?

von aSma>> (Gast)


Lesenswert?

Bianca R. schrieb:
> So wie ich alles verstanden habe, habe ich versucht ein Programm zu
> schreiben, aber Blinken tut nichts wenn ich auf den Taster drücke.

Du hast aber keinen Taster hier, sondern nur Ausgänge.

von Bianca R. (kagome)


Lesenswert?

Ich habe den Text jetzt etwas umgeschrieben, sodass ich den digitalRead 
mit benutzte.
Funktionieren tut es trotzdem nicht...


int taster = 4;
int led = 8;
int i = 0;


void setup()
{
   pinMode(8, OUTPUT);
   pinMode(4, INPUT);
}

void loop()
{
   digitalRead(4);

    if(12 == HIGH)
    {
       for (int i = 0; i < 5; i++);

       digitalWrite(8, HIGH);
       delay(500);
       digitalWrite(8, LOW);
       delay(500);
      }
}

von Uwe C. (Firma: privat) (olmuk)


Lesenswert?

Wie immer und schon tausend mal beschrieben ist Delay böse da es den AVR
anhält. Mag bei einer LED nicht interessieren und wird aber in den 
Büchern immer wieder beschrieben und die Leute verwenden es.

Wenn Du schon dely benutzt ist das zweite überflüssig da Du nach LOW 
nochmal 500 mS bis zum nächsten LOW wartest.

von Uwe C. (Firma: privat) (olmuk)


Lesenswert?

schön festgelegt und was sollen die Varibalen tun ?
int taster = 4;
int led = 8;

Und was ist 12 == HIGH ???

von Peter D. (peda)


Lesenswert?

Bianca R. schrieb:
> if(12 == HIGH)

Schreib mal als Kommentar dahinter, was Du von dieser Zeile erwartest.
Und ja, auch Anfänger dürfen Kommentare in das Programm schreiben!

von Aua (Gast)


Lesenswert?

Das tut jetzt aber schon weh!

von Bianca R. (kagome)


Lesenswert?

Uwe C. schrieb:
> schön festgelegt und was sollen die Varibalen tun ?
> int taster = 4;
> int led = 8;

Wenn ich das richtig verstanden habe geb ich den PIN´s namen und kann 
z.B. statt: digitalWrite(4, HIGH) sagen digitalWrite(taster, HIGH).

Habe ich jetzt hier nicht gemacht aber sollte keine Auswirkung auf das 
Programm haben.

von Sepp Huber (Gast)


Lesenswert?

wie wäre es mit
if (digitalRead(4) == HIGH)
?

von Arduinoquäler (Gast)


Lesenswert?

Bianca R. schrieb:
> Wenn ich das richtig verstanden habe

Ich wiederhole nochmal:

Arduinoquäler schrieb:
> ... ersatzweise könntest du auch schreiben
> if (1 == 10)

Nix kapiert?

von Bianca R. (kagome)


Lesenswert?

Aua schrieb:
> Das tut jetzt aber schon weh!

Es wäre schön wenn du mir sagst was weh tut. Wie ich geschrieben habe, 
ich habe ein Verständnis Problem und ich frage hier um Hilfe um 
herauszufinden wo ich meinen Denkfehler habe.

von Werner P. (Gast)


Lesenswert?

Bianca R. schrieb:
> Wie ich geschrieben habe,
> ich habe ein Verständnis Problem und ich frage hier um Hilfe um
> herauszufinden wo ich meinen Denkfehler habe.

Es wäre auch schön bei so einfachen Sachen das Internet zu bemühen. Nach 
der Eingabe "Arduino Taster anschließen" kommt z.B.:

http://coptermagazin.de/arduino-grundlagen-teil-10-taster-arduino-anschliessen/

von Bianca R. (kagome)


Lesenswert?

Sepp Huber schrieb:
> wie wäre es mit
> if (digitalRead(4) == HIGH)
> ?

Klingt besser als meins aber es klappt trotzdem nicht...

Arduinoquäler schrieb:
> Bianca R. schrieb:
>> Wenn ich das richtig verstanden habe
>
> Ich wiederhole nochmal:
>
> Arduinoquäler schrieb:
>> ... ersatzweise könntest du auch schreiben
>> if (1 == 10)
>
> Nix kapiert?

Warum genau (1 == 10)?
Also was bedeutet das genau in diesem Fall?

von Peter D. (peda)


Lesenswert?

Bianca R. schrieb:
> Wenn ich das richtig verstanden habe geb ich den PIN´s namen

Nein, Du legst eine Variable an und initialisierst sie.
Der Compiler erlaubt beides, eine Variable oder einen konstanten Wert 
als Argument für den Funktionsaufruf.

Bianca R. schrieb:
> Habe ich jetzt hier nicht gemacht

Das ist aber grob unhöflich, ungenutzten Füllcode zu erzeugen. Willst Du 
den Leser absichtlich verwirren?

von Joachim B. (jar)


Lesenswert?

Bianca R. schrieb:
> Wie ich geschrieben habe,
> ich habe ein Verständnis Problem und ich frage hier um Hilfe um
> herauszufinden wo ich meinen Denkfehler habe.

das fing mit Taster auf (4) output an, aber das wurde ja nicht 
verstanden!

Etwas später kam dann INPUT

Bianca R. schrieb:
> digitalRead(4);

wird keiner Variablen zugewiesen und auch mit nichts verglichen!

normalerweise wäre es snnvoll den PIN abzufragen und mit high oder low 
zu vergleichen, aber einen Plan deiner Verschaltung fehlt ja auch, liegt 
der Taster an + oder an GND, high aktiv oder low aktiv?
Sind pullups oder pulldowns verschaltet?

http://www.elektronik-kompendium.de/public/schaerer/pullr.htm

Da fehlen noch Grundlagen und nicht nur im Programmieren!

von Arduinoquäler (Gast)


Lesenswert?

Bianca R. schrieb:
> Warum genau (1 == 10)?

Oder auch
1
if (1 == 39731)

Das wäre von der Funktion auch gleichwertig.

von Draco (Gast)


Lesenswert?

Bilde dir doch mal ein Satz daraus:
1
if( 4 == 1) //High ist ja gleich 1
2
3
//Wenn 4 gleich 1 dann tue folgendes

Das wird aber nie eintreffen, weil 4 nicht gleich 1 werden kann. Du 
vergleichst da die Zahl mit der Zahl eins.

Nun aber:
1
if(inputRead[4] == 1)
2
3
//Wenn der gelesene Eingang gleich eins ist

Damit vergleichst du ob der Eingang auf eins (high) geschaltet ist... 
und somit wird es wahr (true) und geht in die Schleife sobald der 
Eingang gedrückt wurde.

Mal so ganz grob.

von Bianca R. (kagome)


Angehängte Dateien:

Lesenswert?

Arduinoquäler schrieb:
> Oder auch
> if (1 == 39731)

Hmm. Wie kommt man auf die zahl 10 bzw. 39731?

von Manfred (Gast)


Lesenswert?

Bianca R. schrieb:
> Klingt besser als meins aber es klappt trotzdem nicht...
Wie ist der Taster angeschlossen, nach GND oder Plus?
Ist ein PullDown-Widerstand dran?
Kannst Du mit einem Multimeter prüfen, ob das Signal an (4) tatsächlich 
wechselt?

Werner P. schrieb:
> Es wäre auch schön bei so einfachen Sachen das Internet zu bemühen. Nach
> der Eingabe "Arduino Taster anschließen" kommt z.B.:
> http://coptermagazin.de/arduino-grundlagen-teil-10-taster-arduino-anschliessen/
Jou, da ist es sehr gut beschrieben, fertig zum Abmalen :-)

von Christian M. (krusti)


Lesenswert?

Bianca R. schrieb:
> Arduinoquäler schrieb:
>> Oder auch
>> if (1 == 39731)
>
> Hmm. Wie kommt man auf die zahl 10 bzw. 39731?

Diese Beispiele sollen dir nur zeigen, dass es egal ist was du einsetzt. 
Egal welche Zahl du mit welcher vergleichst, es wird nie eintreten weil 
du eben zwei feste konstante Werte miteinander vergleichst. Du kannst 
von -unendlich bis 0 und von 2 bis unendlich jede Zahl nehmen, die if 
wird nie funktionieren bzw aufgerufen, da zwei unterschiedliche 
Konstanten verglichen werden.
Bei 1 == 1 würde die If-Schleife jedesmal funktionieren.

Bei einer If vergleicht man z.B. eine Konstate mit einer Variablen. Wie 
bereits von Draco als Text-Code erklärt.
Draco schrieb:
1
if(inputRead[4] == 1)
2
 
3
//Wenn der gelesene Eingang gleich eins ist
> Damit vergleichst du ob der Eingang auf eins (high) geschaltet ist...
> und somit wird es wahr (true) und geht in die Schleife sobald der
> Eingang gedrückt wurde.
>
> Mal so ganz grob.

: Bearbeitet durch User
von Peter D. (peda)


Lesenswert?

Werner P. schrieb:
> Es wäre auch schön bei so einfachen Sachen das Internet zu bemühen. Nach
> der Eingabe "Arduino Taster anschließen" kommt z.B.:
>
> http://coptermagazin.de/arduino-grundlagen-teil-10-taster-arduino-anschliessen/

Und jetzt muß es der Fragesteller einfach nur noch lesen.
Und dabei auch gleich lernen, wie man den eigenen Code kommentiert.

von Sepp Huber (Gast)


Lesenswert?


von Einer K. (Gast)


Lesenswert?


von Werner P. (Gast)


Lesenswert?

Ich glaube ganz einfach dass diese Generation ne Arduino App benötigt. 
Weil ohne App geht da heute nix mehr ;-)

von Christian M. (krusti)


Lesenswert?

Arduino F. schrieb:
> Christian M. schrieb:
>> If-Schleife
> Dazu siehe: http://www.if-schleife.de/
Korrekt, sorry.

von Einer K. (Gast)


Lesenswert?

Werner P. schrieb:
> Ich glaube ganz einfach dass diese Generation ne Arduino App benötigt.
> Weil ohne App geht da heute nix mehr ;-)

Na na na ....

Bis Frau, oder auch Mann, egal, ordentlich programmieren kann, gehen 
Jahre ins Land.

Und in der Arduino Welt schlagen nun mal Unmengen unbedarfte Anfänger 
ein.
Das ist so! Und wird sich auch erstmal nicht ändern.

Zwischen Arduino Anfänger und versiertem 
Schaltungsentwickler/Programmierer dürften ca 5 Jahre intensive Arbeit 
liegen.


Provokation:
Wer Arduino Anfänger wegen ihrer Unbedarftheit erniedrigt, schlägt auch 
kleine Kinder, wenn sie laufen lernen und das am ersten Tag noch nicht 
richtig klappt.

von Markus (Gast)


Lesenswert?

Hallo Bianca,

funcktioniert das "Button"-Beispiel bei Dir?:
1
const int buttonPin = 4;     // the number of the pushbutton pin
2
const int ledPin =  13;      // the number of the LED pin
3
4
int buttonState = 0;         // variable for reading the pushbutton status
5
6
void setup() {
7
  pinMode(ledPin, OUTPUT);
8
9
  pinMode(buttonPin, INPUT);
10
}
11
12
void loop() {
13
  buttonState = digitalRead(buttonPin);
14
15
  // check if the pushbutton is pressed.
16
  // if it is, the buttonState is HIGH:
17
  if (buttonState == HIGH) {
18
    // turn LED on:
19
    digitalWrite(ledPin, HIGH);
20
  } else {
21
    // turn LED off:
22
    digitalWrite(ledPin, LOW);
23
  }
24
}

von Arduinoquäler (Gast)


Lesenswert?

Werner P. schrieb:
> Ich glaube ganz einfach dass diese Generation ne Arduino App benötigt.

Manche (nicht auf diesen speziellen Fall bezogen) bräuchten
auch eine Steckbrett App.

von Werner P. (Gast)


Lesenswert?

Arduino F. schrieb:
> Provokation:
> Wer Arduino Anfänger wegen ihrer Unbedarftheit erniedrigt, schlägt auch
> kleine Kinder, wenn sie laufen lernen und das am ersten Tag noch nicht
> richtig klappt.

ok, ok.

Mich wundert einfach dass viele keine Ausdauer haben. Dieses Beispiel 
ist typisch.

Dabei braucht es nur ein paar Sucheingaben in Google und ich werde mit 
Arduino Beispielen erschlagen. Da ist alles dabei:

Was brauche ich um Taster anzuschließen. Wie frage ich Taster ab. Alles 
komplett und auch noch mit Video wenn es sein muss.

Entweder können viele heute nicht mehr suchen oder sie wollen einfach 
nicht. Ist ja einfacher in einem Forum zu fragen. Werden schon genügend 
da sein die mir Lösungen bringen.

Wenn ich mich mit was Neuem auseinandersetzen muss, dann suche ich mir 
die Informationen zusammen. Sei es im Internet oder durch Bücher. Und 
wenn ich damit nicht weiter komme dann kann ich ja jemanden fragen. Aber 
ich muss halt davon ausgehen dass derjenige von mir erwartet dass ich 
mich vorher ausgiebig informiert habe. Und den Respekt verdient er auch.

Was machen die später im Berufsleben? Den Chef per Email Fragen stellen 
und auf Lösungen warten?

von Joachim B. (jar)


Lesenswert?

Werner P. schrieb:
> ok, ok.
>
> Mich wundert einfach dass viele keine Ausdauer haben. Dieses Beispiel
> ist typisch.

ich wollte ja nichts mehr schreiben, mich ärgert nur das beim Tippen 
kein verstehendes Lesen einsetzt:

Bianca R. schrieb:
> void setup()
> {
>   pinMode(8, OUTPUT);

LED ist klar

>   pinMode(4, OUTPUT);
>
> }

aber was soll ein Taster ausgeben?

Darf man nicht mal mehr anmerken das OUTPUT auf deutsch eine Bedeutung 
hat?
Dafür kassiert man -3 Bewertung, derdiedas TO gönne ich 10 + für 
effektive Aufgabenlösung ohne Eigeninitiative.

von Werner P. (Gast)


Lesenswert?

Joachim B. schrieb:
> Dafür kassiert man -3 Bewertung

schon mies. Ich war es nicht. Außerdem sollte man das Bewertungssystem 
abschaffen. Ich sehe nicht wozu das gut sein sollte.

von Joachim B. (jar)


Lesenswert?

Werner P. schrieb:
> Außerdem sollte man das Bewertungssystem
> abschaffen. Ich sehe nicht wozu das gut sein sollte.

ganz meine Meinung, ich habe auch schon nicht lesenswert kassiert bei 
Nennung von Lieferanten für spezielle Bauteile, so ist das 
Bewertungssystem doch NICHTS wert und das wird immer wieder hier 
angemerkt!

Klar verständlich das andere Wissende auch Lieferanten kennen, auch 
andere als ich nannte, aber deswegen negativ bewerten oder sagen wir 
nicht lesenswert?

von eins (Gast)


Lesenswert?

Werner P. schrieb:
> Joachim B. schrieb:
>> Dafür kassiert man -3 Bewertung
>
> schon mies. Ich war es nicht. Außerdem sollte man das Bewertungssystem
> abschaffen. Ich sehe nicht wozu das gut sein sollte.

Fast alle Beiträge von "jar" sind doch die reine unkonstruktive 
Provokation. Schon die zweite Antwort hier zeigt das doch.
Man darf sich auch mal als "erfahrender" Forum-User und Programmierer 
die Frage stellen, ob man irgendwelche Provokationen posten muss oder ob 
man einfach gar nichts schreibt, wenn man die Art und Weise der 
Fragestellung unsinnig und beleidigend findet.

von Joachim B. (jar)


Lesenswert?

eins schrieb:
> Fast alle Beiträge von "jar"

wie war mal ein Spruch, viel Feind viel Ehr? manche haben es echt nötig 
und so schön anonym, ich kann mir denken wer es war, einer der 
vermutlich ALLES weiss und immer Recht hat, äh haben will.

Wenn ich irre, eiere ich nicht rum und kann das eingestehen, schafft 
eben nicht jeder ;)

Na ja die meisten Moderatoren machen einen guten Job und löschen derlei 
Schmähpostings obwohl das eigentlich unnötig sein sollte.

: Bearbeitet durch User
von eins (Gast)


Lesenswert?

Schön geblubbert aber von Selbstreflexion keine Spur. Kein Wunder das 
die negativen Bewertungen nicht nochvollzogen werden können.

Vielleicht mal selber fragen, ob man die Postings so auch im "echten" 
Leben gemacht hätte, wenn ein im programmieren unerfahrenes 
Kind/Jugendlicher die selbe Frage gestellt hätte. Wenn man soziel nicht 
ein totales Wrack ist, kommt man da zur Antwort "Nein" und daher kommen 
dann auch die negativen Bewertungen der anderen User.

Nur mal als Denkanstoß nicht anonymer Joachim B. aka jar  ;-)

von Joachim B. (jar)


Lesenswert?

eins schrieb:
> Schön geblubbert aber von Selbstreflexion keine Spur.

oh doch manchmal reflektiere ich mich auch selber, nimm die Finger von 
der Tastatur, man kann mir auch eine Mail schicken, man kann 
Meinungsverschiedenheiten ausdiskutieren oder auch mal 5 gerade sein 
lassen oder eben den anderen nehmen wie er ist.

Nicht jeder ist jeden Tag gleich gut drauf, auch damit kann ich bei mir 
und anderen leben. Dann reicht man sich (hier virtuell) die Hände und 
gut ist.
Andere trinken ein virtuelles Bierchen zusammen und das passt das 
wieder.

Wer ständig aus der Deckung schiesst auch noch anonym nun ja, OHNE 
Kommentar mögen andere darüber urteilen.

von Klaus (Gast)


Lesenswert?

@Bianca R.

Porbier das mal aus.

int taster = 4;
int led = 8;
int i = 0;
int SchalterZusatand;

void setup()
{
   pinMode(led, OUTPUT);
   pinMode(taster, INPUT);
}

void loop()
{
   i = digitalRead(taster);

    if(SchalterZusatand == 1)
    {
       for (i = 0; i < 5; i++);

       digitalWrite(led, HIGH);
       delay(500);
       digitalWrite(led, LOW);
       delay(500);
      }
}

von Klaus (Gast)


Lesenswert?

@Bianca

hier noch einen tollen Link für Anfänge:

http://fff2.at/drupal/content/lernvideo-auf-deutsch-zum-arduino-auf-windows-7

von Cyborg (Gast)


Lesenswert?

Werner P. schrieb:
> Entweder können viele heute nicht mehr suchen oder sie wollen einfach
> nicht. Ist ja einfacher in einem Forum zu fragen. Werden schon genügend
> da sein die mir Lösungen bringen.

Statt das ein Schüler oder eine Schülerin den Lehrer fragt und ich
war eigentlich immer der Meinung, dass das ja sein bezahlte Funktion
ist, wird ein Verständnisproblem einfach in ein Forum ausgelagert.
Da wird erst gar nicht gegoogelt um nach Lösungen zu suchen.
Gibt ja genug Nerds, die glauben, genug Ahnung zu haben und sich mit
stolzer Brust hier selbstbeweihräuchern und dann einen auf dicke
Hose machen wenn man widerspricht.
Problem ist, dass hier alle anonym sind und was die fachlichen
Fähigkeiten angeht, oft nicht überzeugen können.
Hauptsache dabeisein ist alles.

Hier muss dem Admin auch mal der Vorwurf gemacht werden, diesen Zustand
sowohl herbeigeführt zu haben, als auch kein Interesse zu haben, dass
mal zu ändern, z.B. durch UserProfile.
Das hilft der TO zwar nicht, aber sie soll sich halt mit ihrem Problem
an den Lehrer wenden.

von Guest (Gast)


Lesenswert?

Klaus schrieb:
> Porbier das mal aus.

+++ BULLSHIT+++

1. Wie ist jetzt das mit der Variable "SchalterZusatand" (sic! Typo)
Warum wird digitalRead in die Variable "i" gelesen und dann aber 
(richtigerweise) in der Bedingung die Variable "SchalterZusatand" gegen 
HIGH verglichen?

2. Wo sind die geschweiften Klammern für die For Schlaufe?, was macht 
das Semikolon am Ende der For Definition?

3. Des weiteren verstehe ich nicht, wozu die ganzen Variablen mit 
Ausnahme von "i" überhaupt deklariert werden? Um RAM zu vergeuden. Das 
geht doch auch eleganter mit einem #DEFINE
Mir ist klar, dass das hier in diesem Beispiel keine Rolle spielt, mit 
der Zeit werden aber Projekte aufwändiger und da ist man auf einem 
kleinen Controller um jedes gesparte Bit im RAM oder Flash froh.

von Einer K. (Gast)


Lesenswert?

Cyborg schrieb:
> oft nicht überzeugen können.
Das geht mir auch so....
Alleine mein NickName reicht schon um keinen überzeugen zu können.
Und um mit Schmähungen überschüttet zu werden.

Damit keinem der Stoff ausgeht, stelle ich hier mal meine "Arduino" 
Version von Biancas Problem vor.
Die Lösung ist sicherlich nicht sonderlich Anfänger gerecht.
Aber doch stecken da einige Features drin.
1. kein delay(), ist also nicht blockierend
2. der Taster wird nur abgefragt, wenn nötig.
3. das Blinken erfolgt per endlichem Automaten
1
const byte taster            = 4;   // Taster zwischen Pin und GND
2
const byte led               = 13;  // Led zwischen Pin und GND
3
const unsigned long interval = 500; // ms
4
const byte zyklen            = 5;   // Anzahl Blinker
5
6
bool blinkAnforderung        = false; // Merker für Blink Anforderung
7
8
void blink() // Blink Task
9
{
10
  static unsigned long timestamp = 0;  // lokaler Zeitmerker
11
  static unsigned int  state     = 0;  // Wiedereintrittspunkt der FSM
12
  static byte          i         = 0;  // Wiederholungszaehler
13
  switch(state)
14
  {
15
    case 0 :  // Startpunkt
16
    while(!blinkAnforderung) return; // warte auf Blinkanforderung
17
18
    // Tastendruck wurde erkannt
19
    for(i=0;i<zyklen;i++)
20
    {
21
      // Hellphase
22
      timestamp = millis(); // Zeitpunkt merken
23
      digitalWrite(led, HIGH); // leuchte an
24
      state=__LINE__; return; case __LINE__:
25
      while(millis()-timestamp<interval) return;
26
27
      // Dunkelphase
28
      timestamp = millis(); // Zeitpunkt merken
29
      digitalWrite(led, LOW); // leuchte aus
30
      state=__LINE__; return; case __LINE__:
31
      while(millis()-timestamp<interval) return;
32
    } 
33
    
34
    // Endzustand, gehe wieder zu start
35
    blinkAnforderung = false ; // Anforderung konsumieren
36
    state = 0; // FSM auf Start setzen
37
  }  
38
}
39
40
41
void setup()
42
{
43
  pinMode(led, OUTPUT);
44
  pinMode(taster,INPUT_PULLUP);
45
}
46
47
void loop()
48
{
49
  blinkAnforderung = blinkAnforderung || !digitalRead(taster); // short circuit boolean expression evaluation
50
  blink();
51
}

So:
Und jetzt möge man mir den Kopf abreißen!

von Joe F. (easylife)


Lesenswert?

Arduino F. schrieb:
> state=__LINE__; return; case __LINE__:

Schöner kann man C nicht vergewaltigen.
Dieser Thread macht mich fertig.

von Markus F. (mfro)


Lesenswert?

Großartig!

Und wer den Code formatiert, um ihn zu verstehen, guckt erst mal blöd.

Du solltest ein Buch über Joberhaltungs-Strategien schreiben.

von Einer K. (Gast)


Lesenswert?

Joe F. schrieb:
> Schöner kann man C nicht vergewaltigen.
Danke für die Blumen!

Markus F. schrieb:
> Und wer den Code formatiert, um ihn zu verstehen, guckt erst mal blöd.
Normalerweise steckt der Kram in Macros, dann sieht das viel 
aufgeräumter aus. Und formatieren bringt dann auch kein Durcheinander.

Hier habe ich es mit Absicht ausgerollt.

von Klaus (Gast)


Lesenswert?

Guest schrieb:
> 1. Wie ist jetzt das mit der Variable "SchalterZusatand" (sic! Typo)
> Warum wird digitalRead in die Variable "i" gelesen und dann aber
> (richtigerweise) in der Bedingung die Variable "SchalterZusatand" gegen
> HIGH verglichen?

Hopsala da hat sich ein Fehler eingeschlichen du hast recht.

SchalterZusatand = digitalRead(taster); sollte es heißen.

So ist es jetzt hoffentlich besser.

int taster = 4;
int led = 8;
int i = 0;
int SchalterZusatand;

void setup()
{
   pinMode(led, OUTPUT);
   pinMode(taster, INPUT);
}

void loop()
{
   SchalterZusatand = digitalRead(taster);

    SchalterZusatand = digitalRead(taster);
    {
       for (int i = 0; i < 5; i++)
       {

         digitalWrite(led, HIGH);
         delay(500);
         digitalWrite(led, LOW);
         delay(500);
       }
      }
}

Guest schrieb:
> 3. Des weiteren verstehe ich nicht, wozu die ganzen Variablen mit
> Ausnahme von "i" überhaupt deklariert werden? Um RAM zu vergeuden. Das
> geht doch auch eleganter mit einem #DEFINE
> Mir ist klar, dass das hier in diesem Beispiel keine Rolle spielt, mit
> der Zeit werden aber Projekte aufwändiger und da ist man auf einem
> kleinen Controller um jedes gesparte Bit im RAM oder Flash froh.

Denke daran jeder hat mal klein Angefangen!
Nicht jeder ist so ein Profi wie du?
Von dir kam bis jetzt nur gemotze aber keine hilfe.

von Klaus (Gast)


Lesenswert?

Korrektur *seufz
void loop()
{
   SchalterZusatand = digitalRead(taster);

    if ( SchalterZusatand == 1)
    {
       for (int i = 0; i < 5; i++)
       {

         digitalWrite(led, HIGH);
         delay(500);
         digitalWrite(led, LOW);
         delay(500);
       }
      }
}

von Eric B. (beric)


Lesenswert?

Arduino F. schrieb:
> Damit keinem der Stoff ausgeht, stelle ich hier mal meine "Arduino"
> Version von Biancas Problem vor.

Heiliger Strohsack. Das wird Bianca doch absolut nicht nachvollziehen 
können!

Ausserdem, was soll dieser Unfug:

>     while(!blinkAnforderung) return; // warte auf Blinkanforderung

Eine while wo du nur direkt wieder rausspringst??

und diese:
>       state=__LINE__; return; case __LINE__:
...
>   blinkAnforderung = blinkAnforderung || !digitalRead(taster);
>    // short circuit boolean expression evaluation

Ist das hier ein IOCCC Einrtag? (http://www.ioccc.org/)

Lesbar geht so:
1
// pin definitions
2
#define LED    8
3
#define BUTTON 4
4
5
#define BLINKCOUNT 5
6
7
/* LED must blink with 2Hz, so 2x on and 2x off in one second
8
   --> each phase is 250 msec */
9
#define BLINKDELAY 250
10
11
void setup()
12
{
13
  pinMode(LED, OUTPUT);
14
  pinMode(BUTTON,INPUT_PULLUP);
15
}
16
17
loop()
18
{
19
  // button pushed?
20
  if(digitalRead(BUTTON) == HIGH)
21
  { 
22
    // ...then blink
23
    for(int i=0; i < BLINKCOUNT; i++)
24
    {
25
      digitalWrite(LED, HIGH);
26
      delay(BLINKDELAY);
27
28
      digitalWrite(LED, LOW);
29
      delay(BLINKDELAY);
30
    }
31
  }
32
}

von Einer K. (Gast)


Lesenswert?

Markus F. schrieb:
> Du solltest ein Buch über Joberhaltungs-Strategien schreiben.

Hmmm ...
(werde ich drüber nachdenken....)

Die kompakte (Macro getriebene) Form möchte ich euch nicht vor 
enthalten:
1
Task blink() 
2
{
3
  static byte i = 0;  // Wiederholungszaehler
4
  taskBegin();
5
  while(1)
6
  {
7
    taskWaitFor(blinkAnforderung);
8
    for(i=0;i<zyklen;i++)
9
    {
10
      digitalWrite(led, HIGH); // leuchte an
11
      taskPause(interval);
12
      digitalWrite(led, LOW); // leuchte aus
13
      taskPause(interval);
14
    }
15
    blinkAnforderung = false ; // Anforderung konsumieren
16
  }
17
  taskEnd();
18
}
Und das ist doch schon etwas übersichtlicher...
(sieht zumindest von weitem so aus)

von Einer K. (Gast)


Lesenswert?

Eric B. schrieb:
> Lesbar geht so:
Dein Blinken ist blockierend.
No, das ist nicht schön.....

von Einer K. (Gast)


Lesenswert?

Eric B. schrieb:
> Ausserdem, was soll dieser Unfug:
>
>>     while(!blinkAnforderung) return; // warte auf Blinkanforderung
1
while  == solange, während
2
!      == not, kein, nicht
3
return == gehe raus, verschwinde, zurück


> while(!blinkAnforderung) return;
Solange keine Blinkanforderung, verschwinde von hier!

von Joe F. (easylife)


Lesenswert?

Ein "if" wäre hier wohl lesbarer.

Was allerdings wirklich unschön ist (und ich bin mir auch nicht sicher, 
wie das überhaupt funktionieren soll):

die beiden
"case __LINE__:"

sind im case 0, und auch noch in der Schleife eingebettet.
Das kann eigentlich nicht funktionieren. Zumindest macht es keinen Sinn.

von Einer K. (Gast)


Lesenswert?

Joe F. schrieb:
> Das kann eigentlich nicht funktionieren.
Doch, tut es.

Joe F. schrieb:
> Zumindest macht es keinen Sinn.
Doch, das tut es.

Vielleicht solltest du mal ein C/C++ Buch lesen....

von Joe F. (easylife)


Lesenswert?

Arduino F. schrieb:
> Vielleicht solltest du mal ein C/C++ Buch lesen....

Oh ja. ;-)

von Klaus H. (klummel69)


Lesenswert?

Ich muss es einfach sagen: Lob! Hut ab vor Arduino Fanboy.
Glatte 1 für abgef.ckten Code.

Das kommt in meine Liste der Dinge die man absolut niemals Denken oder 
Programmieren darf...

von Joe F. (easylife)


Angehängte Dateien:

Lesenswert?

Die Idee von Fanboy mit der Statemachine ist ja nicht schlecht, und
trotz der kleinen Pampigkeitsanflüge möchte ich ihm nicht vorenthalten,
wie eine solche Statemachine üblicherweise aussieht.
Ganz ohne eklige Makros und lesbar.
Ach, und ich habe mir erlaubt einen weiteren State hinzuzufügen, der
dafür sorgt, dass die Taste erstmal losgelassen werden muss, bevor es
wieder anfängt zu blinken.

von chris_ (Gast)


Lesenswert?

Ein Blink-Programm ist wie Autofahren: jeder kann mitreden.

Das Blink without delay gibt es schon in den Beispielen:
https://www.arduino.cc/en/Tutorial/BlinkWithoutDelay

von Joe F. (easylife)


Lesenswert?

chris_ schrieb:
> Ein Blink-Programm ist wie Autofahren: jeder kann mitreden.
>

Sogar die Rollstuhlfahrer.

> Das Blink without delay gibt es schon in den Beispielen:
> https://www.arduino.cc/en/Tutorial/BlinkWithoutDelay

Das ist ja toll.
Dann muss man ja nur noch dazu programmieren, dass der Tastendruck 
ausgewertet wird, und dass es jeweils nur 5x blinkt.
Fällt dir was auf?

von chris_ (Gast)


Lesenswert?

>Das ist ja toll.

Gell. Und es ist sogar eine State-Machine.

von Einer K. (Gast)


Lesenswert?

Joe F. schrieb:
> Dieser Thread macht mich fertig
ÖÖhhmmm...
Man könnte das auch noch mit Hilfe von Gotos etwas übersichtlicher 
gestalten.
Nur "etwas" übersichtlicher, nicht "viel" übersichtlicher.

von Lonsome Cowboy (Gast)


Lesenswert?

Hinweis: Echauffiert Euch nicht mehr so sehr, die TO hat um 13:08 Uhr 
aufgegeben. Seid stolz auf Euch, super Leistung der Galerie der 
schönsten Selbstdarsteller. Druckt Euch den Thread aus und hängt ihn im 
verchromten Rahmen über die Chaiselongue.

von Joe F. (easylife)


Lesenswert?

Lonsome Cowboy schrieb:
> Druckt Euch den Thread aus und hängt ihn im
> verchromten Rahmen über die Chaiselongue.

Da ist leider kein Platz mehr. Dort hängen schon 207 vergoldete Rahmen 
mit "Welle/Teilchen zum II".

von Einer K. (Gast)


Lesenswert?

Joe F. schrieb:
> Dort hängen schon 207 vergoldete Rahmen
> mit "Welle/Teilchen zum II".

;-)

von Eric B. (beric)


Lesenswert?

Arduino F. schrieb:
> Eric B. schrieb:
>> Lesbar geht so:
> Dein Blinken ist blockierend.
> No, das ist nicht schön.....

Und wem juckt das? Der uC hat in diesem Fall eh nix anderes zu tun und 
der Code ist für einen Anfänger komplett nachvollziehbar. Darum geht's.
Wenn die Aufgabe "Blink 5x wenn Taster gedrückt" Teil wäre von einem 
größeren Projekt, worin zB auch noch ein Display angesteuert werden 
soll, ADCs ausgelesen usw, dannn muss die Sache anders angegangen 
werden; das ist klar.
Aber einem Anfänger soll man dein Code nicht antun.

von Bianca R. (kagome)


Lesenswert?

Es funktioniert.
Ich hatte einen echt dummen Verdrahtungsfehler beim Taster....

von Rene K. (xdraconix)


Lesenswert?

Bianca R. schrieb:
> Es funktioniert.
> Ich hatte einen echt dummen Verdrahtungsfehler beim Taster....

Ja, jetzt... sieht man auf dem Breadboard Aufbau :-D Du hast ihn mit 
Pullup auf High gelegt und hast ihn auf High schalten lassen. Mit jeden 
Tastendruck hast du das gesamte System kurzgeschlossen.

Eric B. schrieb:
> // pin definitions
> #define LED    8
> #define BUTTON 4
>
> #define BLINKCOUNT 5
>
> /* LED must blink with 2Hz, so 2x on and 2x off in one second
>    --> each phase is 250 msec */
> #define BLINKDELAY 250
>
> void setup()
> {
>   pinMode(LED, OUTPUT);
>   pinMode(BUTTON,INPUT_PULLUP);
> }
>
> loop()
> {
>   // button pushed?
>   if(digitalRead(BUTTON) == HIGH)
>   {
>     // ...then blink
>     for(int i=0; i < BLINKCOUNT; i++)
>     {
>       digitalWrite(LED, HIGH);
>       delay(BLINKDELAY);
>
>       digitalWrite(LED, LOW);
>       delay(BLINKDELAY);
>     }
>   }
> }

Der Code funktioniert und ist gut lesbar, die delays sind nicht schön 
und könnten den - sollte das Programm mal erweitert werden - Ablauf sehr 
stören, da diese den Prozessor quasi während des Delay "gefangen" 
halten. Für dein angestrebtes Ziel aber völlig ausreichend.

von Peter D. (peda)


Lesenswert?

Joe F. schrieb:
> Arduino F. schrieb:
>> state=__LINE__; return; case __LINE__:
>
> Schöner kann man C nicht vergewaltigen.

Stimmt.
Sowas macht einfach kein Programmierer, der seinen Beruf ernst nimmt.
Als Programmierer sollte man immer so schreiben, daß auch ein anderer 
der Code weiter pflegen kann.

von Bianca R. (kagome)


Lesenswert?

Rene K. schrieb:
> Der Code funktioniert und ist gut lesbar, die delays sind nicht schön
> und könnten den - sollte das Programm mal erweitert werden - Ablauf sehr
> stören, da diese den Prozessor quasi während des Delay "gefangen"
> halten. Für dein angestrebtes Ziel aber völlig ausreichend.

Wie man das delay umschreibt, das habe ich noch nicht verstanden.
Da informieren ich mich nochmal ausgiebig drüber.

von Markus (Gast)


Lesenswert?

>Wie man das delay umschreibt, das habe ich noch nicht verstanden.
>Da informieren ich mich nochmal ausgiebig drüber.

Da ist hier das richtige Beispiel:
https://www.arduino.cc/en/Tutorial/BlinkWithoutDelay

Vielleicht kann man die Funktion vereinfacht so beschreiben: Man nutzt 
quasi die eingebaute Arduino Uhr mit der Funktion

int zeit;

zeit = millis();

und schaut dann in einer Schleife immer wieder auf die Uhr. Wenn eine 
bestimmte Zeit abgelaufen ist, schaltet man dann die Leuchtdiode.
Man kann dann auch gucken, ob ein Schalter gedrückt ist.

von Einer K. (Gast)


Angehängte Dateien:

Lesenswert?

Peter D. schrieb:
> Joe F. schrieb:
>> Arduino F. schrieb:
>>> state=__LINE__; return; case __LINE__:
>>
>> Schöner kann man C nicht vergewaltigen.
>
> Stimmt.
> Sowas macht einfach kein Programmierer, der seinen Beruf ernst nimmt.
> Als Programmierer sollte man immer so schreiben, daß auch ein anderer
> der Code weiter pflegen kann.

No!
Einspruch!
Das halte ich für ein zu schnelles und zu vernichtendes Urteil.


1.
Hast du evtl. die besser lesbare Version, aber inhaltlich identische 
Version über sehen?

2.
Tausende ernstzunehmende Programmierer machen das genau so!
(wissen es nur oft nicht)
Das hier von mir präsentierte Verfahren ist das, was auch bei den 
Protothreads verwendet wird. Fast gleich. Zumindest sehr sehr ähnlich.
Siehe: http://dunkels.com/adam/pt/index.html


Also, deine Aussage, frei übertragen:
Jeder, welcher die Protothreads nutzt, ist kein ernst zu nehmender 
Programmierer.
Wenn das dann ernst gemeint ist, dann reihe ich mich gerne bei den 
Stümpern und Pfuschern ein. Denn ich verwende dieses schon seit vielen 
vielen Jahren. Habe es allerdings erst kürzlich von "Goto" getrieben, 
auf "switch-case" getrieben umgebaut. Und aufs Arduino Umfeld angepasst.

Einfacher, Uebersichtlicher  und schlanker bekommt man kooperatives 
Multitasking und Ablaufsteuerungen nicht auf einen AVR gebrannt.
Im Anhang, eine nutzbare, für den Arduino angepasste Version. Ein paar 
Beispiele sind auch im Paket.


Danke für deine Aufmerksamkeit.

von Joe F. (easylife)


Lesenswert?

Arduino F. schrieb:
> Tausende ernstzunehmende Programmierer machen das genau so!
> (wissen es nur oft nicht)

Mir persönlich fällt es schwer, einen Programmierer ernst zu nehmen, der 
oft nicht weiss was er tut.

von Einer K. (Gast)


Lesenswert?

Ich halte Programmierer, welche von sich behaupten "Ich habe noch nie 
eine von anderen geschriebene Lib in meine Projekte übernommen." für 
unglaubwürdig. Und wenn glaubwürdig, dann sind sie wohl nicht sehr 
produktiv in ihrer Arbeit.

Ein paar solche Einzelkämpfer mag es geben.....

Der übliche Weg ist wohl:
Man verwendet fertige Bausteine, so weit wie möglich. Der Rest wird dann 
selber geschrieben.
Und das ist völlig unabhängig von Sprache, oder zu dem Grunde liegendem 
System.

von KosmosK (Gast)


Lesenswert?

Arduino F. schrieb:
> Einfacher, Uebersichtlicher  und schlanker bekommt man kooperatives
> Multitasking und Ablaufsteuerungen nicht auf einen AVR gebrannt.
> Im Anhang, eine nutzbare, für den Arduino angepasste Version. Ein paar
> Beispiele sind auch im Paket.

(Wir kapern Biancas Threat…Übrigends Lob an Bianca, dass sie sich von 
uns Klugscheissern nicht abschrecken lässt!)

Dunkels Code ist natürlich witzig, aber das Problem mit solchen Dingen 
ist das Kleingedruckte!
* Bei Anwendung der Makros kann eine weitere "switch" Anweisungen in der 
Funktion nicht mehr genutzt werden!
* Ein versehentliches '}' zerlegt die komplette Struktur, da die Makros 
in sich die Klammerungen nicht abschliessen. Sowas kann bei der 
Fehlersuche sehr lustig werden. (und verstößt gegen diverse 
Codierstandards, z.B. MISRA)
* Multitasking ist es nur für verschiedene Funktionen. Ich kann keine 
zwei Tasks auf Basis der gleichen Funktion starten.

>Tausende ernstzunehmende Programmierer machen das genau so!
>(wissen es nur oft nicht)
Du sagst es… haben sie das Kleingedruckte gelesen?

Jeder Code hat Vor- und Nachteile. Er ist durchaus sehr lesbar, aber die 
versteckten Nachteile sind mir persönlich zu gefährlich.  Aber um aus 
einem AVR das letzte zu holen…

von Peter D. (peda)


Lesenswert?

Arduino F. schrieb:
> Tausende ernstzunehmende Programmierer machen das genau so!

Dann zeig mir bitte mal einen Link, wo "case __LINE__:" noch benutzt 
wird.
Bisher hat sich jeder Programmierer scheckig gelacht, dem ich das 
gezeigt hab.
Selbst ein case innerhalb einer weiteren Kontrollstruktur unterhalb des 
zugehörenden switch ist schon arg grenzwertig.
Die meisten Programmierer verwenden switch/case/break so wie es sich 
gehört. Und das tun sie aus Erfahrung heraus.

C erlaubt viele Syntax-Schweinereien, die man besser nicht nachmachen 
sollte.

: Bearbeitet durch User
von Mark B. (markbrandis)


Lesenswert?

Arduino Fanboy, man verwendet für die Zustände einer State Machine 
Bezeichner, die selbstsprechend sind. Und das ist eine 
Compiler-Konstante wie _LINE_ nun mal nicht.

Besser wäre so etwas wie zum Beispiel:
LIGHT_ON
LIGHT_OFF

von Mark B. (markbrandis)


Lesenswert?

Peter D. schrieb:
> C erlaubt viele Syntax-Schweinereien, die man besser nicht nachmachen
> sollte.

Aber für den IOCCC ist die Verwendung von _LINE_ doch eine schöne 
Sache. :-)

http://www.ioccc.org/

von Mark B. (markbrandis)


Lesenswert?

Hm, ich meine natürlich
1
__LINE__

und nicht _LINE_

Die dappische Foren-Software verhunzt das wieder mal.

von Peter D. (peda)


Lesenswert?

Arduino F. schrieb:
> Ich halte Programmierer, welche von sich behaupten "Ich habe noch nie
> eine von anderen geschriebene Lib in meine Projekte übernommen." für
> unglaubwürdig.

Keine Ahnung, gegen wen das gehen soll.
Ich habe z.B. vom Kollegen die Ethernet-Lib includiert und er von mir 
z.B. die Tastenentprellung und Encoderauslesung.

von Peter D. (peda)


Lesenswert?

@Arduino F.

Ich hab mir Dein TaskMacro.zip mal angesehen. Ganz verstanden hab ich es 
nicht, aber ungefähr ne Ahnung, was es machen soll.
Ich glaub nicht, daß es ernsthaft in professionellen Projekten Anwendung 
finden könnte. Dazu haben die Macros zuviele Seiteneffekte.
Für Anfänger würde ich es auch nicht empfehlen. Man versaut sich damit 
nur den Programmierstil, wenn die Projekte mal größer werden sollen.
Für den IOCCC ist es aber wunderbar geeignet. Und zum Schmunzeln, was 
man mit dem Präprozessor so alles machen kann.

von Einer K. (Gast)


Lesenswert?

Danke für die "Durchsicht".

Peter D. schrieb:
> Und zum Schmunzeln, was
> man mit dem Präprozessor so alles machen kann.
Dann habe ich ja eins der Ziele erreicht!
Programmieren, muss auch etwas Spaß machen....

Und das Zweite vielleicht auch:
Arduino Leute werden hier gerne runter gemacht, weil sie alle keine 
Ahnung von ihrer Programmierumgebung haben. Vielleicht ist das Vorurteil 
jetzt etwas aufgeweicht.

Peter D. schrieb:
> Ich glaub nicht, daß es ernsthaft in professionellen Projekten Anwendung
> finden könnte. Dazu haben die Macros zuviele Seiteneffekte.
Ja, mit meinem Kram, werde ich nicht die Welt erobern. Das haben die 
Protothreads schon genug getan. Und die haben genau die gleichen 
Probleme mit Seiteneffekten.
Die Seiteneffekte lassen sich, mit ein wenig Disziplin, vermeiden.

Die nächste Stufe ist dann sowas wie RTOS. Das vermeidet die Probleme, 
ist aber auch erheblich Speicherhungriger, da für jede Task ein Stack 
bereit gestellt werden muss.

Peter D. schrieb:
> Für Anfänger würde ich es auch nicht empfehlen.
Ja, zumindest wenn es ans Debuggen geht, wirds problematisch. Das geht 
nicht ohne die Macros verstanden zu haben.

Peter D. schrieb:
> Man versaut sich damit
> nur den Programmierstil, wenn die Projekte mal größer werden sollen.
Da bin ich wiederum nicht so sicher.
Denn der Stil, wie ein solcher Task geschrieben wird, hat schon etwas 
Ähnlichkeit mit den Verfahren bei echten Multitasking Systemen.

Peter D. schrieb:
> Für den IOCCC ist es aber wunderbar geeignet.
;-)
Insbesondere der Output, wenn der Präprozessor damit durch ist. Das 
sieht dann doch schon etwas komisch aus.

Der erzeugte Assembler Code ist dagegen schon eher gut lesbar und recht 
kompakt.

von Manfred (Gast)


Lesenswert?

Rene K. schrieb:
> Bianca R. schrieb:
>> Es funktioniert.
>> Ich hatte einen echt dummen Verdrahtungsfehler beim Taster....
> Ja, jetzt... sieht man auf dem Breadboard Aufbau :-D Du hast ihn mit
> Pullup auf High gelegt und hast ihn auf High schalten lassen.
Die Frage nach Anschluss des Tasters / Pegel messen hatte ich gestellt, 
wurde scheinbar ignoriert.

Diese Fotos von Steckbrettern (auch in div. Arduino-Foren) verursachen 
bei mir immer Kackreiz und Fluchtreflexe! Ich will einen klassischen 
Stromlauf sehen, diese Spielebretter kenne ich nicht und habe sie in 
meinem (gewerblichen) Umfeld noch nie gesehen.

Markus schrieb:
> Vielleicht kann man die Funktion vereinfacht so beschreiben: Man nutzt
> quasi die eingebaute Arduino Uhr mit der Funktion
> int zeit;
> zeit = millis();
> und schaut dann in einer Schleife immer wieder auf die Uhr.
Und nach 32s (37268ms) stellte meine Regelung ihre Funktion ein bzw. 
machte dummes Zeug. Variablen wurden erschaffen, um programmierende 
Bastler zu ärgern :-)

Arduino F. schrieb:
> Der übliche Weg ist wohl:
> Man verwendet fertige Bausteine, so weit wie möglich. Der Rest wird dann
> selber geschrieben.
Und erzählt anschließend "Den Fehler kann ich nicht beheben, weil er in 
der Library xxx enthalten ist" - Softwerker im realen Leben :-(

von Peter D. (peda)


Lesenswert?

Arduino F. schrieb:
> Insbesondere der Output, wenn der Präprozessor damit durch ist. Das
> sieht dann doch schon etwas komisch aus.

Ja, die Reaktionen hast Du ja gesehen. Wenn man nicht weiß, daß Macros 
dahinter stecken, denkt man wirklich, was hat der denn geraucht.

Vielleicht könnte man anstelle des __LOOP__ den Programmcounter in eine 
Variable laden. Dann könnte man das switch weglassen und müßte das 
Sprungziel nicht erst berechnen.

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.