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.
könnte es eventuell nützlich sein für ein Eingabegerät, also z.B. eine Taste, zumindest einen Eingang zu haben?
vielleicht ist die deutsche Übersetzung von OUTPUT nicht bekannt? Kommt vermutlich erst nach Arduino programmieren :)
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
Gast
#4744849
Bianca R. schrieb: > if(4 == HIGH) ... ersatzweise könntest du auch schreiben
1 | |
Groschen gefallen? Das ist natürlich nur die halbe Miete. Die andere Hälfte hat mein Vorredner schon genannt.
Gast
#4744860
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?
Gast
#4744880
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.
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);
}
}
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.
schön festgelegt und was sollen die Varibalen tun ? int taster = 4; int led = 8; Und was ist 12 == HIGH ???
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!
Gast
#4744917
Das tut jetzt aber schon weh!
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.
Gast
#4744922
wie wäre es mit if (digitalRead(4) == HIGH) ?
Gast
#4744923
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?
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.
Gast
#4744928
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/
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?
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?
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!
Gast
#4744937
Bianca R. schrieb: > Warum genau (1 == 10)? Oder auch
1 | |
Das wäre von der Funktion auch gleichwertig.
Gast
#4744946
Bilde dir doch mal ein Satz daraus:
1 | |
2 | |
3 | |
Das wird aber nie eintreffen, weil 4 nicht gleich 1 werden kann. Du vergleichst da die Zahl mit der Zahl eins. Nun aber:
1 | |
2 | |
3 | |
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.
Arduinoquäler schrieb: > Oder auch > if (1 == 39731) Hmm. Wie kommt man auf die zahl 10 bzw. 39731?
Gast
#4744956
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 :-)
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 | |
2 | |
3 | |
> 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.
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.
Gast
#4744978
Hier mal ein Link dazu: http://www.physical-computing.de/blog/2008/04/digitaler-input-einstieg/
Gast
#4745027
Christian M. schrieb: > If-Schleife Dazu siehe: http://www.if-schleife.de/
Gast
#4745031
Ich glaube ganz einfach dass diese Generation ne Arduino App benötigt. Weil ohne App geht da heute nix mehr ;-)
Arduino F. schrieb: > Christian M. schrieb: >> If-Schleife > Dazu siehe: http://www.if-schleife.de/ Korrekt, sorry.
Gast
#4745069
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.
Gast
#4745075
Hallo Bianca, funcktioniert das "Button"-Beispiel bei Dir?:
1 | |
2 | |
3 | |
4 | |
5 | |
6 | |
7 | |
8 | |
9 | |
10 | |
11 | |
12 | |
13 | |
14 | |
15 | |
16 | |
17 | |
18 | |
19 | |
20 | |
21 | |
22 | |
23 | |
24 | |
Gast
#4745076
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.
Gast
#4745088
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?
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.
Gast
#4745103
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.
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?
Gast
#4745136
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.
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.
Gast
#4745164
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 ;-)
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.
Gast
#4745229
@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);
}
}
Gast
#4745237
@Bianca hier noch einen tollen Link für Anfänge: http://fff2.at/drupal/content/lernvideo-auf-deutsch-zum-arduino-auf-windows-7
Gast
#4745241
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.
Gast
#4745267
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.
Gast
#4745276
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 | |
2 | |
3 | |
4 | |
5 | |
6 | |
7 | |
8 | |
9 | |
10 | |
11 | |
12 | |
13 | |
14 | |
15 | |
16 | |
17 | |
18 | |
19 | |
20 | |
21 | |
22 | |
23 | |
24 | |
25 | |
26 | |
27 | |
28 | |
29 | |
30 | |
31 | |
32 | |
33 | |
34 | |
35 | |
36 | |
37 | |
38 | |
39 | |
40 | |
41 | |
42 | |
43 | |
44 | |
45 | |
46 | |
47 | |
48 | |
49 | |
50 | |
51 | |
So: Und jetzt möge man mir den Kopf abreißen!
Arduino F. schrieb: > state=__LINE__; return; case __LINE__: Schöner kann man C nicht vergewaltigen. Dieser Thread macht mich fertig.
Großartig! Und wer den Code formatiert, um ihn zu verstehen, guckt erst mal blöd. Du solltest ein Buch über Joberhaltungs-Strategien schreiben.
Gast
#4745317
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.
Gast
#4745323
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.
Gast
#4745326
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);
}
}
}
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 | |
2 | |
3 | |
4 | |
5 | |
6 | |
7 | |
8 | |
9 | |
10 | |
11 | |
12 | |
13 | |
14 | |
15 | |
16 | |
17 | |
18 | |
19 | |
20 | |
21 | |
22 | |
23 | |
24 | |
25 | |
26 | |
27 | |
28 | |
29 | |
30 | |
31 | |
32 | |
Gast
#4745334
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 | |
2 | |
3 | |
4 | |
5 | |
6 | |
7 | |
8 | |
9 | |
10 | |
11 | |
12 | |
13 | |
14 | |
15 | |
16 | |
17 | |
18 | |
Und das ist doch schon etwas übersichtlicher... (sieht zumindest von weitem so aus)
Gast
#4745337
Eric B. schrieb: > Lesbar geht so: Dein Blinken ist blockierend. No, das ist nicht schön.....
Gast
#4745419
Eric B. schrieb: > Ausserdem, was soll dieser Unfug: > >> while(!blinkAnforderung) return; // warte auf Blinkanforderung
1 | |
2 | |
3 | |
> while(!blinkAnforderung) return;
Solange keine Blinkanforderung, verschwinde von hier!
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.
Gast
#4745435
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....
Arduino F. schrieb: > Vielleicht solltest du mal ein C/C++ Buch lesen.... Oh ja. ;-)
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...
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.
Gast
#4745519
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
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?
Gast
#4745525
>Das ist ja toll.
Gell. Und es ist sogar eine State-Machine.
Gast
#4745624
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.
Gast
#4745712
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.
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".
Gast
#4745881
Joe F. schrieb: > Dort hängen schon 207 vergoldete Rahmen > mit "Welle/Teilchen zum II". ;-)
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.
Es funktioniert. Ich hatte einen echt dummen Verdrahtungsfehler beim Taster....
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.
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.
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.
Gast
#4746136
>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.
Gast
#4746212
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.
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.
Gast
#4746289
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.
Gast
#4746332
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…
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.
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
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/
Hm, ich meine natürlich
1 | |
und nicht _LINE_ Die dappische Foren-Software verhunzt das wieder mal.
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.
@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.
Gast
#4746545
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.
Gast
#4746793
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 :-(
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.
Antwort schreiben
Bitte melde dich an, um einen Beitrag zu schreiben.

