Guten Tag,
Ich habe hier ein kleineres Problem, und hoffe mir kann jemand helfen.
Ich würde gerne mit 2 Tastern 2 Leds ansteuern:
---------------------------------------------------------------------
Taster 1 wird gedrück ----> Led 1 blinkt ---> Taster 1 wird erneut
gedrückt
------> Led 1 geht aus
Taster 2 wird gedrückt ----> Led 2 blinkt ---> Taster 2 wird erneut
gedrückt
------> Led 2 geht aus
----------------------------------------------------------------------
Leider weiß ich nicht wie ich das machen soll ohne dass man einen der
Taster
nur 1 mal drücken muss. Deshalb habe ich jetzt das ganze jetzt einfach
mit
2 if und while Schleifen gemacht - geht nicht ;/
Hier der Code :
1
intTasterR=12;
2
intTasterL=11;
3
intLedL=13;
4
intLedR=10;
5
6
voidsetup(){
7
pinMode(TasterR,INPUT);
8
pinMode(TasterL,INPUT);
9
pinMode(LedL,OUTPUT);
10
pinMode(LedR,OUTPUT);
11
}
12
13
voidloop(){
14
15
if(digitalRead(TasterL)==HIGH){
16
while(digitalRead(TasterL)==HIGH){
17
digitalWrite(LedL,HIGH);
18
delay(500);
19
digitalWrite(LedL,LOW);
20
delay(500);
21
digitalWrite(LedL,HIGH);
22
delay(500);
23
digitalWrite(LedL,LOW);
24
delay(500);
25
}
26
}
27
28
if(digitalRead(TasterL)==LOW){
29
while(digitalRead(TasterL)==LOW){
30
digitalWrite(LedL,LOW);
31
delay(500);
32
}
33
}
34
35
//-----------------------------------------------
36
37
if(digitalRead(TasterR)==HIGH){
38
while(digitalRead(TasterR)==HIGH){
39
digitalWrite(LedR,HIGH);
40
delay(500);
41
digitalWrite(LedR,LOW);
42
delay(500);
43
digitalWrite(LedR,HIGH);
44
delay(500);
45
digitalWrite(LedR,LOW);
46
delay(500);
47
}
48
}
49
50
if(digitalRead(TasterR)==LOW){
51
while(digitalRead(TasterR)==LOW){
52
digitalWrite(LedR,LOW);
53
delay(500);
54
}
55
}
56
57
}
Es passiert einfach nichts wenn ich einen der Taster drücke ...
Wenn ich allerdings den 1 Teil alleine benutze geht es (über //--- ...)
Ich hoffe mir kann jemand helfen ^^
Danke !
Ostfront schrieb:> Es passiert einfach nichts wenn ich einen der Taster drücke ...
Wenn Du auf das Drücken der Taster reagieren möchtest, dann mußt Du
nicht auf den Status des Tasters an sich reagieren, sondern auf eine
Statusänderung.
Arbeite dazu das Arduino StateChangeDetection-Beispiel durch!
In der Arduino-Software zu finden unter:
Datei - Beispiele - 02.Digital - StateChangeDetection
Immitsch Berater fragte:
>> Ist das die einzige "Hilfe", die Du geben kannst?>Nein.
Na -nicht so einsilbig! Gib eine vernünftige Hilfe, so ein blöder Link
nützt dem TO soviel wie Fußpilz.
Immitsch Berater schrieb:> "if-Abfrage" rotzte einen Link hin....>> Ist das die einzige "Hilfe", die Du geben kannst? Armes Schwein!
deine leistung ist eher geringer zu bewerten, denn obige hatte
wenigstens Informationsgehalt was deinem Beitrag nicht entnehmbar ist.
Also klage der Armselige nicht über Armut Anderer.
Back to topic
Du musst zusätzlich den gegenwärtigen zustand verarbeiten und die
Tastenabfrage unabhängig vom Blinken also auch während der Blinkroutine
erledigen.
wenn du also keine Interrupts benutzen willst solltest du Flags, welche
welche den Tastenstatus und den zustand der LEDS zwischenspeichern.
Beachte, dass während des Blinkens in deinem jetzigen Programm nichts
anderes passieren kann.
Winfried schrieb:
>Also klage der Armselige nicht über Armut anderer.
Entschuldige gleich mehrfach, großer Meister...
Mir geht nur immer dann der Hut hoch, wenn schulmeisternde Nicht-helfer
in Gang kommen.
Immitsch Berater schrieb:> Immitsch Berater fragte:>>> Ist das die einzige "Hilfe", die Du geben kannst?>>Nein.>> Na -nicht so einsilbig! Gib eine vernünftige Hilfe, so ein blöder Link> nützt dem TO soviel wie Fußpilz.
Das ist Basiswissen. Dagegen enthalten deine Beiträge, Immitsch Berater,
überhaupt keine Hilfe und ziehen vollkommen richtige Beiträge auch noch
runter.
Immitsch Berater schrieb:> Gib eine vernünftige Hilfe, so ein blöder Link nützt dem TO soviel> wie Fußpilz.
Du denkst etwas kurz.
Erstmal nützt es den anderen, wenn er damit in die Lage versetzt wird,
einen weniger unsinnigen Titel für seinen Thread zu wählen. Und damit
nützt er sich selbst, weil dann vielleich nicht so viele, von seiner
eigentlichen Frage abweichenden Beiträge kommen.
Während die beiden sich weiter streiten ...
Meine Antwort war auch etwas kurz:-)
Leider weiß ich nicht, wie Du die Taster angeschlossen hast. "Üblich"
ist ein interner Pullup-Widerstand am Taster-Pin (wie im Beispiel-Link)
mit Schalten gegen GND.
Wenn Du das so machst, kannst Du den Beispiel-Code (erstmal für einen
Taster) nahezu unverändert übernehmen. Nur das Blinken muss noch
ermöglicht werden (Kommentare entfernt ...):
void loop()
{
if (digitalRead(switchPin) == LOW)
{
delay(100);
running = !running;
}
if (running)
{
digitalWrite(LEDpin, HIGH);
delay(500);
digitalWrite(LEDpin, LOW);
delay(500);
}
}
Sinngemäß kannst Du jetzt 2 "running"-Variablen für 2 Taster und 2 LEDs
einrichten ...
Dieter Frohnapfel schrieb:> Sinngemäß kannst Du jetzt 2 "running"-Variablen für 2 Taster und 2 LEDs> einrichten ...
Warum soll er es für die andere Taste machen, wenn der Code für die
erste schon nicht funktioniert.
.. aber hast recht, soll er seine Hausaufgaben selber machen.
omg schrieb:> Warum soll er es für die andere Taste machen, wenn der Code für die> erste schon nicht funktioniert.
Wäre nicht schlecht, wenn Du liest bevor Du hier "rumgrätzt". Meine
Aussage bezog sich auf den von mir angegeben Link zur Nutzung boolscher
Variablen. Wenn er das übernimmt und den Code wie angegeben anpasst
sollte das Ganze schonmal für eine LED und einen Taster funktionieren.
Jetzt kannst Du Dich gerne darüber aufregen, wieso kein Interrupt
genutzt wird ... :-)
Ostfront schrieb:> delay(500);
Ich habe die Ursache aller Probleme entdeckt. Mit einem delax()
vernichtet man einfach teure Rechenzeit.
Sieh dir mal die Funktion millis() an. Sie ist (zusammen mit einer
Zustandsvariablen) die Lösung deiner Probleme. Denk mal drüber nach: die
Hauptschleife läuft ständig mit maximaler Geschwindigkeit durch. Und
abhängig von einem Tastendruck merkst du dir in einer Variablen, was
gerade für ein Zustand aktuell ist und reagierst darauf...
Dieter Frohnapfel schrieb:> omg schrieb:>> Warum soll er es für die andere Taste machen, wenn der Code für die>> erste schon nicht funktioniert.>> Wäre nicht schlecht, wenn Du liest bevor Du hier "rumgrätzt". Meine> Aussage bezog sich auf den von mir angegeben Link zur Nutzung boolscher> Variablen. Wenn er das übernimmt und den Code wie angegeben anpasst> sollte das Ganze schonmal für eine LED und einen Taster funktionieren.
Der hilft eigentlich gar nicht. Das Problem sind, wie Lothar schon
schreibt, die Delays, die für's Blinken benutzt werden. Die sind bei
deiner Lösung immer noch da.
> Jetzt kannst Du Dich gerne darüber aufregen, wieso kein Interrupt> genutzt wird ... :-)
Die wären allerdings eine Lösung. Man kriegt es zur Not auch ohne
Interrupt, nur mit einem Timer hin, aber mit Interrupt ist es eigentlich
einfacher. Wichtig ist halt, die Delays loszuwerden, da die halt alles
blockieren. Wärend eines Blinkzyklus wird halt keine Taste abgefragt,
und eine zweite LED noch parallel zu handhaben, wird damit auch nicht
besser.
Immitsch Berater schrieb:> Mir geht nur immer dann der Hut hoch, wenn schulmeisternde Nicht-helfer> in Gang kommen.
Merkst aber leider nicht, daß du selbst einer davon bist. Du belehrst
andere, wie sie zu antworten haben, bringst aber selbst exakt 0 Hilfe.
Immitsch Berater schrieb:> Ist das die einzige "Hilfe", die Du geben kannst? Armes Schwein!
Von dir kam noch weniger, und das muss man erstmal schaffen.
Rolf Magnus schrieb:
>Wichtig ist halt , die Delays loszuwerden, da die halt alles>blockieren. Wärend eines Blinkzyklus wird halt keine Taste abgefragt,>und eine zweite LED noch parallel zu handhaben, wird damit auch nicht>besser.
Du regst Dich über "Delay" auf, verwendest aber in 2 Sätzen 3x "Halt".
Da steht ja das Programm nur noch...
Immitsch Berater schrieb:> Rolf Magnus schrieb:>>Wichtig ist halt , die Delays loszuwerden, da die halt alles>>blockieren. Wärend eines Blinkzyklus wird halt keine Taste abgefragt,>>und eine zweite LED noch parallel zu handhaben, wird damit auch nicht>>besser.>> Du regst Dich über "Delay" auf, verwendest aber in 2 Sätzen 3x "Halt".> Da steht ja das Programm nur noch...
Oh wie lustig, ein richtiger Droll.
Ist ja wirklich konstruktiv hier ...
O.K. - mein letzter Vorschlag war nicht so prall (schlecht abgeleitet
vom einfachen Ein- / Ausschalten) - aber wie nachstehend sollte es in
Arduino-Kreisen (nicht unbedingt meine Welt) funktionieren:
unsigned long LedR_time = Millis();
unsigned long Blink_time = 500;
void loop()
{
if (digitalRead(TasterR) == LOW)
{
delay(100);
runningR = !runningR;
LedR_time = Millis();
if (runningR)
digitalWrite(LedR, HIGH);
else
digitalWrite(LedR, LOW);
}
if (runningR)
{
if((Millis() - LedR_time) > Blink_time)
{
if (digitalRead(LedR) == LOW)
digitalWrite(LedR, HIGH);
else
digitalWrite(LedR, LOW);
LedR_time = Millis();
}
}
}
Das geht sicher noch viel eleganter (mit "richtigen Timern und
Interrupts" und ordentlicher Entprell-Routine) :-) sollte aber in dieser
Form (mit dem impliziten Millis()-Interrupt) wenigstens funktionieren.
Dieter Frohnapfel schrieb:> Das geht sicher noch viel eleganter (mit "richtigen Timern und> Interrupts" und ordentlicher Entprell-Routine) :-)
Es geht ganz ohne jegliches Delay noch wesentlich einfacher. Ich
verwende hier einfach zwei Zustandsautomaten mit Namen Blinken1 und
BLinken2:
1
unsignedlongtiAkt;
2
unsignedlongtiBlinken1;
3
unsignedlongtiBlinken2;
4
intBlinken1;// 0 = nicht Blinken // ungleich 0 --> Blinken
5
intBlinken2;// das LSB zeigt den Pegel für die LED an:
6
// ungerade Zahl => LED an, Gerade Zahl => LED aus
7
voidloop()
8
// die für diese Schleife gültige Zeit ein einziges Mal am Schleifenanfang abholen
9
tiAkt=millis();
10
11
// Taster 1
12
if(digitalRead(Taster1)==HIGH)// Taster 1 nicht betätigt
13
tiEntprelle1=tiAkt+20;
14
if(tiAkt>tiEntprelle1){// Timout => Taster 1 min. 10ms betätigt
15
tiBlinken1=tiAkt;
16
tiEntprelle1=ti.Akt+20000;// Gebastelt: wird schon keiner den Taster 20 Sekunden lang drücken... ;-)
17
if(Blinken1!=0)// sind wir mit Blinken beschäftigt?
18
Blinken1=0;// ja: ausschalten
19
else
20
Blinken1=1;// nein: mit dem Blinken anfangen
21
}
22
if(Blinken1==0){// müssen wir überhaupt Blinken?
23
digitalWrite(Led1,LOW);// nein: LED ausschalten
24
}else{
25
if(tiAkt>tiBlinken1){// ja: Zeit für nächsten Pegelwechsel?
26
if(Blinken1&1)// LSB abfragen (gerade/ungerade)
27
digitalWrite(Led1,HIGH);
28
else
29
digitalWrite(Led1,LOW);
30
Blinken1++;// LSB umschalten
31
tiBlinken1=tiAkt+500;// nächste Aktion in 500ms
32
}
33
}
34
35
// Taster 2
36
if(digitalRead(Taster2)==HIGH)// Taster 2 nicht betätigt
37
tiEntprelle1=tiAkt+20;
38
if(tiAkt>tiEntprelle2){// Timeout => Taster 2 min. 10ms betätigt
39
tiBlinken2=tiAkt;
40
tiEntprelle2=ti.Akt+20000;// Gebastelt: wird schon keiner den Taster 20 Sekunden lang drücken... ;
41
if(Blinken2!=0)// sind wir mit Blinken beschäftigt?
42
Blinken2=0;// ja: ausschalten
43
else
44
Blinken2=1;// nein: zu Blinken anfangen
45
}
46
if(Blinken2==0){// müssen wir überhaupt Blinken?
47
digitalWrite(Led2,LOW);// nein: LED ausschalten
48
}else{
49
if(tiAkt>tiBlinken2){// ja: Zeit für nächsten Pegelwechsel?
50
if(Blinken2&1)// LSB abfragen (gerade/ungerade)
51
digitalWrite(Led2,HIGH);
52
else
53
digitalWrite(Led2,LOW);
54
Blinken2++;// LSB umschalten
55
tiBlinken2=tiAkt+500;// nächste Aktion in 500ms
56
}
57
}
58
59
// Sonstige Zustandsautomaten
60
// ...
61
}
Weit&breit kein delay(). Und nur der impilizite Interrupt für millis().
Man könnte den Trick mit dem Hochzählen von Blinken1/2
selbstverständlich auch entkoppeln, und eine richtige Flankenerkennung
einbauen, um "verständlicheren" Code zu erhalten:
1
intBlinken1;// 0 = nicht Blinken // 1 = Blinken
2
intOnOff1;// 0 = LED aus // 1 = LED an
3
intTaste1Alt;// für Flankenerkennung
4
5
voidloop()
6
// die für diese Schleife gültige Zeit ein einziges Mal am Schleifenanfang abholen
7
tiAkt=millis();
8
9
// Taster 1
10
if(digitalRead(Taster1)==HIGH){// Taster 1 nicht betätigt
11
tiEntprelle1=tiAkt+20;
12
Taste1Alt=HIGH;
13
}
14
if(tiAkt>tiEntprelle1){// Timout => Taster 1 min. 10ms betätigt
15
if(Taste1Alt==HIGH){// Flanke?
16
Taste1Alt=LOW;
17
tiBlinken1=tiAkt;
18
Blinken1=!Blinken;// Zustand "Blinken" umschalten
19
OnOff=1;
20
}
21
}
22
if(Blinken1==0){// müssen wir überhaupt Blinken?
23
digitalWrite(Led1,LOW);// nein: LED ausschalten
24
}else{
25
if(tiAkt>tiBlinken1){// ja: Zeit für nächsten Pegelwechsel?
26
if(OnOff1==1){// Zustand abfragen
27
digitalWrite(Led1,HIGH);
28
OnOff1=0;
29
}else{
30
digitalWrite(Led1,LOW);
31
OnOff1=1;
32
}
33
tiBlinken1=tiAkt+500;// nächste Aktion in 500ms
34
}
35
36
// Taster 2 entsprechend
37
//...
38
39
// Sonstige Zustandsautomaten
40
// ...
Der Trick bei diesem Programmierstil ist, dass es schnurzegal ist, in
welcher Reihenfolge die Automaten berechnet werden, sie sind unabhängig
voneinander. Und es ist sogar schnurzegal, in welcher Reihenfolge die
if-Abfragen kommen. Dieser Code wird genausogut funktionieren:
1
unsignedlongtiAkt;
2
unsignedlongtiBlinken1;
3
unsignedlongtiBlinken2;
4
intBlinken1;// 0 = nicht Blinken // ungleich 0 --> Blinken
5
intBlinken2;// das LSB zeigt den Pegel für die LED an:
6
// ungerade Zahl => LED an, Gerade Zahl => LED aus
7
voidloop()
8
// die für diese Schleife gültige Zeit ein einziges Mal am Schleifenanfang abholen
9
tiAkt=millis();
10
11
// Sonstige Zustandsautomaten
12
// ...
13
14
// Taster 1
15
if(Blinken1==0){// müssen wir überhaupt Blinken?
16
digitalWrite(Led1,LOW);// nein: LED ausschalten
17
}else{
18
if(tiAkt>tiBlinken1){// ja: Zeit für nächsten Pegelwechsel?
19
if(Blinken1&1)// LSB abfragen (gerade/ungerade)
20
digitalWrite(Led1,HIGH);
21
else
22
digitalWrite(Led1,LOW);
23
Blinken1++;// LSB umschalten
24
tiBlinken1=tiAkt+500;// nächste Aktion in 500ms
25
}
26
}
27
if(tiAkt>tiEntprelle1){// Timout => Taster 1 min. 10ms betätigt
28
if(Taste1Alt==HIGH){// Flanke?
29
Taste1Alt=LOW;
30
tiBlinken1=tiAkt;
31
Blinken1=!Blinken;// Zustand "Blinken" umschalten
32
}
33
}
34
if(digitalRead(Taster1)==HIGH){// Taster 1 nicht betätigt
Lothar Miller schrieb:> noch wesentlich einfacher
Ob das nun so ist - oder auch nicht liegt im Ermessen des Betrachters.
Nur um zwei LEDs mit Taster zum Blinken zu bringen reicht die
"Billig-Lösung" :-) - denke ich - auch aus. Die 200 mS "Verlust" sind in
diesem Fall sicher zu verschmerzen.
Wenn da noch mehr hinzukommt wird der TO andere Wege gehen müssen. Aber
dazu gibt es ja auch X Tutorials und Beispiele ...
Dieter Frohnapfel schrieb:> Ob das nun so ist - oder auch nicht liegt im Ermessen des Betrachters.
Es ist wesentlich einfacher, wenn man sich die SPS-Automaten-Denkweise
mal angeeignet hat:
Einlesen (Eingänge und Zeitstempel in Variablen, die sich während der
Verarbeitung nicht ändern)
Verarbeiten (schnellstmögliche Berechung der aktiven Zustände mit
lokalen Variablen)
Ausgabe (aus den Zustandsvariablen an die Ausgänge)
Idealerweise wird im Verarbeitungsteil keine EA direkt manipuliert.
Und dass dieses Verfahren gut funktioniert beweisen zigmilliarden SPS,
die von jedem angelernten Schlosser (bitte nicht persönlich nehmen!)
programmiert werden können. Und zwar so, dass der Rest der Anlage
unverändert funktioniert.
Dieter Frohnapfel schrieb:> Wenn da noch mehr hinzukommt wird der TO andere Wege gehen müssen.
Das ist der Witz beim obigen Prinzip: er muss es einfach irgendwo
dazubauen, weil die anderen Schritte auch in der Reihenfolge komplett
unabhängig sind.
Lothar Miller schrieb:> Es ist wesentlich einfacher, wenn man sich die SPS-Automaten-Denkweise> mal angeeignet hat:
Da ich mich beruflich damit beschäftige ist mir das EVA-Prinzip durchaus
geläufig. Trotzdem erlaube ich mir eine eigene Denkweise :-) (nicht böse
gemeint ...).
Es geht hier um ein Led an / Led aus Spielchen eines vermeintlichen
Anfängers, der sich ja nicht weiter äußert (lacht sich vielleicht über
die Beiträge kaputt ?).
Wir können jetzt auch über Multitasking, Multithreading und andere
interessante Ansätze debattieren - das führt aber, glaube ich, zu weit.
Übrigens wollte ich mal Schreiner werden (nach Astronaut, Chemiker und
...) hat sich aber im Laufe meines Lebens anders ergeben :-)
chris_ schrieb:> Man könnte das Problem natürlich auch mit meinem Programm Sequencer> lösen:
Oder ein Mulitasking OS aufsetzen...
> Man könnte das Problem natürlich auch mit meinem Programm Sequencer> lösen:
Ich würde dort die Zeit aber auf stabilere Beine als auf ein delay(1)
stellen...
Dieter Frohnapfel schrieb:> void loop()> {> if (digitalRead(TasterR) == LOW)> {> delay(100);> runningR = !runningR;> LedR_time = Millis();>> if (runningR)> digitalWrite(LedR, HIGH);> else> digitalWrite(LedR, LOW);> }>> if (runningR)> {> if((Millis() - LedR_time) > Blink_time)> {> if (digitalRead(LedR) == LOW)> digitalWrite(LedR, HIGH);> else> digitalWrite(LedR, LOW);> LedR_time = Millis();> }> }> }
Wow jetz hast du es ja noch schlechter gemacht.
Dieter Frohnapfel schrieb:> Da ich mich beruflich damit beschäftige ist mir das EVA-Prinzip durchaus> geläufig. Trotzdem erlaube ich mir eine eigene Denkweise :-) (nicht böse> gemeint ...).
Hoffentlich bekomme ich nie ein Produkt das du erdacht hast.
Dieter Frohnapfel schrieb:> Es geht hier um ein Led an / Led aus Spielchen eines vermeintlichen> Anfängers, der sich ja nicht weiter äußert
Das offensichtlich viel zu kompliziert für Deine Denkweise ist.
Er hat genau geschrieben das er das Blinken mit einem Tastendruck an
bzw abgeschaltet haben möchte.
Du bietest ihm dagegen einen Code der wie wild das Blinken an und
abschaltet solange eine Taste gedrückt ist oder nicht.
Dieter Frohnapfel schrieb:> Meine Aussage bezog sich auf den von mir angegeben Link zur Nutzung >boolscher
Variablen.
Wenn du schon ein Beispiel bringst, sollte die Variable auch irgendwo
herkommen, und beinhalten wo die Variable herkommt. Auf jeden Fall ein
miserables Beispiel, oder soll es ein Zufallergebniss bringen?
Dieter Frohnapfel schrieb:> Wenn er das übernimmt und den Code wie angegeben anpasst> sollte das Ganze schonmal für eine LED und einen Taster funktionieren.
Ebend genau nicht, weil dein Code der Tastenerkennung absoluter Schrot
ist und absolut gar nichts mit der Aufgabenstellung zu tun hat. Du
toggelst deine undefinierte "boolsche Variable", nur einfach dumm rum,
solange eine Taste gedrückt ist oder nicht gedrückt ist(ka welche Logik
seine Tasten haben).
Den Code wie man blinken lässt hatte er ja schon selber.
Vielleicht solltest du die das Posting des TO einfach mal durchlesen
und versuchen seine Aufgabe die er lösen möchte zu verstehen.
Dieter Frohnapfel schrieb:> Wir können jetzt auch über Multitasking, Multithreading und andere> interessante Ansätze debattieren
Das ist doch hier keinesfalls das Thema. Und auch der Einsatz eines
komplexen Schedulers macht eine Aufgabe nicht automatisch einfach. Es
ist nur so, dass viele Anfänger (auch ich damals!) die delay()
Geschichte noch kapieren, EVA dann aber als "Eingabe, Verarbeitung,
Ausgabe" verstehen, und gleich mal auf die Eingabe warten.
Siehe das da:
http://www.inf-schule.de/programmierung/imperativeprogrammierung/konzepteimp/programme/konzept_eva
EVA auf dem uC bedeutet aber "Einlesen, Verarbeiten, Ausgeben" oder
markanter "Eingänge, Verarbeitung, Ausgänge". Dann ist klar, wann was zu
passieren hat. Und EVA passiert auch nicht nur einmal, sondern ständig
in einer Schleife. Pro Sekunde mindestens 1000 mal.
Auf jeden Fall ist mir ein Programm, in dem wertvoll gekaufte und
versorgte Rechenzeit mit einem delay() vernichtet wird, von vorn herein
suspekt. Denn evtl. brauche ich diese Rechenzeit später mal dringend für
eine Erweiterung. Und dann geht es los: Ist dieses delay() hier wichtig,
oder darf ich es rausmachen?
Dieter Frohnapfel schrieb:> Es geht hier um ein Led an / Led aus Spielchen eines vermeintlichen> Anfängers, der sich ja nicht weiter äußert
Es ist egal ob er sich äussert. Andere werden diesen Thread finden...
Und es sind doch genau diese einfachen LED Spielchen, an denen man das
saubere Programmieren lernen sollte/müsste/könnte. Oder darf man so
"simple" Sachen als Anfänger ruhig schlampig machen, richtig komplexe
Sachen dann aber bitteschön schon sauber?
Lothar Miller schrieb:> Oder darf man so> "simple" Sachen als Anfänger ruhig schlampig machen, richtig komplexe> Sachen dann aber bitteschön schon sauber?
Dann hast Du Dein erstes Led an/aus wahrscheinlich mit Multitasking oder
Zustandsautomat etc. programmiert? Kann ich nicht glauben ... aber
nichts ist unmöglich ...
Lothar Miller schrieb:> in dem wertvoll gekaufte und> versorgte Rechenzeit
häh - auf einem Arduino? Leben wir im gleichen Universum?
Lothar Miller schrieb:> Und EVA passiert auch nicht nur einmal, sondern ständig> in einer Schleife. Pro Sekunde mindestens 1000 mal.
Und wo steht das geschrieben? Interessant, muss ich mir merken, als
feste Größe.
Wenn ich Dir auf den Schlips getreten habe - sorry, wollte ich nicht.
Brauchst Dich auch gar nicht über mich aufzuregen - schon eher über die
unsachlichen Beiträge, die hier sonst noch so auftauchen. Da wir die
beiden einzigen Namentlichen (außer Winfried J.) in diesem anonymen
Gewurschtel sind ist es sowieso lächerlich.
Ist für mich jetzt erledigt, da der TO sowieso unsichtbar ist. Habe auch
nicht gerade eine Privat-Fehde mit Dir am laufen ...
Lothar Miller schrieb:> Oder darf man so> "simple" Sachen als Anfänger ruhig schlampig machen, richtig komplexe> Sachen dann aber bitteschön schon sauber?
Oh, da fällt mir noch eine hübsche Analogie ein, die ich noch loswerden
möchte.
Du hast den Schlosser angesprochen. Der feilt im ersten Lehrjahr
ordentlich an irgendwelchen Werkstücken rum - mit ganz primitiven
Mitteln (einer Feile) - um das Handwerk zu erlernen. Später nutzt er
auch Maschinen - auch Computer-gesteuert (hier kommt der Hilfs-Schlosser
mit der SPS-Programmierung ins Spiel).
Aber ohne die Grundlagen - in diesem Fall Feilen - läuft da nichts. Man
muss erstmal ein Gefühl für ein "Werkstück" bekommen ...
Die Spielerei mit Leds etc. sehe ich ähnlich.
Jetzt bin ich ruhig :-)
Dieter Frohnapfel schrieb:> Lothar Miller schrieb:>> Oder darf man so>> "simple" Sachen als Anfänger ruhig schlampig machen, richtig komplexe>> Sachen dann aber bitteschön schon sauber?> Dann hast Du Dein erstes Led an/aus wahrscheinlich mit Multitasking oder> Zustandsautomat etc. programmiert? Kann ich nicht glauben ... aber> nichts ist unmöglich ...Wie schon Lothar Miller schrieb:>> dass viele Anfänger ( *auch ich damals!* ) die delay() Geschichte noch>> kapieren, EVA dann aber als "Eingabe, Verarbeitung, Ausgabe" verstehen,>> und gleich mal auf die Eingabe warten.
Das bedeutet, dass auch ich erst mal lernen musste, ohne
Millisekunden-lange Delays auszukommen.
> Lothar Miller schrieb:>> in dem wertvoll gekaufte und versorgte Rechenzeit> häh - auf einem Arduino?
Auch dort. Kann ja gut sein, dass ein Arduino-Programmierer später mal
was anderes macht...
> Leben wir im gleichen Universum?
Ja, ein Arduino besteht aus einem AVR und wird mit einem C Derivat
programmiert. Genau das selbe machen "Profis" auch. Nur evtl. mit einer
anderen IDE...
> Lothar Miller schrieb:>> Und EVA passiert auch nicht nur einmal, sondern ständig>> in einer Schleife. Pro Sekunde mindestens 1000 mal.> Und wo steht das geschrieben?
In der Zeile vor deiner Frage... ;-)
Im Ernst: wenn ich eine Hauptschleife programmiere, dann kommt dort ein
Performance-Zähler rein (kein Aufwand: nur ein Funktionsaufruf), der die
durchschnittliche und die maximale Schleifenzeit ermittelt. Und wenn die
Schleifenzeit über eine ms ansteigt, ist das für mich ein Warnsignal und
ich sehe mir die Ursache schon mal genauer an.
> Wenn ich Dir auf den Schlips getreten habe
Keine Sorge, die Diskussion ist sehr sachlich (mal von ein paar verbalen
Fouls [omg] abgesehen).
> Übrigens wollte ich mal Schreiner werden (nach Astronaut, Chemiker und> ...) hat sich aber im Laufe meines Lebens anders ergeben :-)
Da hatte ich es leicht: ich wollte schon mit 10 Jahren Ingenieur werden.
Weil nämlich dieser dämliche Detektorempfänger aus dem "Werkbuch für
Jungen" ums Verrecken nicht funktioniert hat. Wobei, da fällt mir ein:
auch andere Dinge daraus haben nicht so richtig funktioniert... :-/
Dieter Frohnapfel schrieb:> Aber ohne die Grundlagen - in diesem Fall Feilen - läuft da nichts.
Richtig, man muss am Code herumfeilen. Man darf schon mal ein delay()
reinprogrammieren, dann muss aber die Frage kommen: Brauche ich das
wirklich? Möchte ich Rechenzeit vernichten? Wie kann ich das umgehen?
Was meinst du, wie schnell ein PC wäre, wenn alle delay() sauber
herausprogrammiert worden wären?
(Klar kann da bei einem delay() ein Taskwechsel kommen, wenn das OS es
kann, aber den gibts auch nicht für lau...)
Ich denke: wir würden uns wundern...
Lothar Miller schrieb:> "Werkbuch für> Jungen"
Hanni Thöne (oder so ähnlich) - auch für mich "Zukunftsweisend" :-)
Falsch - jetzt fällt es mir ein "Was Jungen basteln" kommt von "Hanni
Thöne" oder so ähnlich ... Scheinst in etwa mein Jahrgang (ü50) zu sein.
Ich (wie wahrscheinlich viele Andere) bin hier nur Hobby-mässig
unterwegs. Ich verdiene mein Geld weder mit Arduino- noch mit anderer
Programmierung (omg - wer auch immer das sein mag - kann aufatmen :-))