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.
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
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?
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.
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!
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.
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.
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!
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.
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
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.
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.
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.
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.
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?
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.
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.
@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);
}
}
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.
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.
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
constbytetaster=4;// Taster zwischen Pin und GND
2
constbyteled=13;// Led zwischen Pin und GND
3
constunsignedlonginterval=500;// ms
4
constbytezyklen=5;// Anzahl Blinker
5
6
boolblinkAnforderung=false;// Merker für Blink Anforderung
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.
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.
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
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
Taskblink()
2
{
3
staticbytei=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)
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.
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....
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.
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?
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.
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".
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.
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.
>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.
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.
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.
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/
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.
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.
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.