Hallo ich möchte im 2Sekunden Takt mit meinem Arduino MEGA 5V ausgeben. Die Leitung schließe ich bei Digital 25 an und habe folgenden Code void setup() { pinMode(25, OUTPUT); void loop(){ digitalWrite(25, HIGH); delay(2000); digitalWrite(25, LOW); delay(2000); } Mit dem Multimeter kann ich die 5V allerdings nicht messen. Bzw. es werden keine 5V ausgegeben
Sebastian M. schrieb: > Mit dem Multimeter kann ich die 5V allerdings nicht messen. Bzw. es > werden keine 5V ausgegeben Das sollte es aber. Falscher Steckverbinder? Schwarzes Kabel vom Multimeter nicht an GND? Versuch es mal mit Pin D13, dort ist auch die on-board Led angeschlossen. LG, Sebastian
Ok Pin 13 Macht nichts dass das ein PWM Pin ist oder? Stimmt geschweifte Klammer habe ich
Sebastian M. schrieb: > void setup() { > > pinMode(25, OUTPUT); > > void loop(){ Wenn das Programm derart fehlerhaft ist, dann bricht die Kompilierung ab und es wird kein Programm hochgeladen. Das ist das zu erwartende Verhalten. Tipp: Die Meldungen aufmerksam lesen.
Habe es nur falsch hierrein kopiert. Software technisch kommen keine Meldungen. Den Pin 25 den ich als OUTPUT deklariere ist doch D25 oder was dann? Ist digital ground mit analog ground intern verbunden?
Doch, hast recht, müsste passen. Die PIN Nummerierung ist manchmal verwirrend, bei den ESP jedenfalls.
Eigentlich sollte dies so banal sein aber mein Arduino gibt die 5V niemals aus. Hier mein ganzer Code. #include <LiquidCrystal.h> LiquidCrystal lcd(8, 9, 4, 5, 6, 7); double voltagesensor = 0; double current = 0; double zero = 2.5; double deltaVpA = 0.066; void setup() { pinMode(25, OUTPUT); lcd.begin(16, 2); //Initialise 16*2 LCD lcd.print("Voltage Monitor"); lcd.setCursor(0, 1); lcd.print(" for EV "); delay(2000); lcd.clear(); } void loop() { float Cell_1 = analogRead(A8) * (5.0 / 1023.0); //Measure 1st cell voltage lcd.print("C1:"); lcd.print(Cell_1); float Cell_2 = analogRead(A9) * (5.0 / 1023.0); //Measure 2nd cell voltage lcd.print(" C2:"); lcd.print(Cell_2); lcd.setCursor(0, 1); float Cell_3 = analogRead(A10) * (5.0 / 1023.0); //Measure 3rd cell voltage lcd.print("C3:"); lcd.print(Cell_3); float Cell_4 = analogRead(A11) * (5.0 / 1023.0); //Measure 4th cell voltage lcd.print(" C4:"); lcd.print(Cell_4); delay(4000); lcd.clear(); lcd.setCursor(0, 0); delay(2000); lcd.clear(); digitalWrite(25, HIGH); delay(2000); digitalWrite(25, LOW); delay(2000); }
:
Bearbeitet durch User
forum cop schrieb: > Sebastian M. schrieb: >> Hier mein ganzer Code. > > Bitte Regeln zum Posten von Code beachten! Arduino-Nutzer gelten als Personen mit besonderen Bedürfnissen und sind daher von solchen Regeln befreit. Inklusion ist das Stichwort.
Bist Du dir denn sicher, dass Dein Programm beim Portgewackel überhaupt ankommt und nicht vorher irgendwo hängen bleibt? Nutz doch die Serielleausgabe für Debugmeldungen, midnest an der Steller wo nicht das erwartete passiert.
Hallo, dein Sketch funktioniert erstmal.
1 | const byte taktPin {25}; |
2 | const unsigned int pause {2000}; |
3 | |
4 | void setup() |
5 | {
|
6 | pinMode(taktPin, OUTPUT); |
7 | }
|
8 | |
9 | void loop() |
10 | {
|
11 | digitalWrite(taktPin, HIGH); |
12 | delay(pause); |
13 | digitalWrite(taktPin, LOW); |
14 | delay(pause); |
15 | }
|
Wenn du an GND und D25 misst, könnte es sein das dein Multimeter zu langsam misst. Vergrößer einmal die Pause auf 5s. Im Anhang noch ein schöneres Pinout.
Cyblord -. schrieb: >> Bitte Regeln zum Posten von Code beachten! > > Arduino-Nutzer gelten als Personen mit besonderen Bedürfnissen und sind > daher von solchen Regeln befreit. Inklusion ist das Stichwort. :-) Du solltest Politiker werden.
Thomas H. schrieb: > Cyblord -. schrieb: >>> Bitte Regeln zum Posten von Code beachten! >> >> Arduino-Nutzer gelten als Personen mit besonderen Bedürfnissen und sind >> daher von solchen Regeln befreit. Inklusion ist das Stichwort. > > :-) Du solltest Politiker werden. Gibt's dafür schon Armbinden?
Stefan F. schrieb: > Percy N. schrieb: >> Gibt's dafür schon Armbinden? > > Fast Die Ähnlichkeit ist unverkennbar.
Du willst im 2 Sekundentakt die Ausgabe am Port 25 wechseln, hast aber ein delay(4000) und noch ein delay(2000) im loop, in denen Dein Prozessor "schläft". Finde den Fehler ;)
> Wenn du an GND und D25 misst, könnte es sein das dein Multimeter zu > langsam misst. Vergrößer einmal die Pause auf 5s. Im Anhang noch ein > schöneres Pinout. Danke perfekt. Das war der Fehler dass das Intervall zu gering war
MCUA schrieb: >> delay(2000); > CPU-Blockierer. Arduino Nichtversteher. Die delay() Funktion blockiert die CPU nicht. Kannst du ja mal mit einem ESP8266 ausprobieren. Oder einfach mal in den Quelltext gucken.
Stefan F. schrieb: > MCUA schrieb: >>> delay(2000); >> CPU-Blockierer. > > Arduino Nichtversteher. > > Die delay() Funktion blockiert die CPU nicht. Kannst du ja mal mit einem > ESP8266 ausprobieren. Oder einfach mal in den Quelltext gucken. Nun bin ich aber auch als Arduino- und _delay vermeider neugierig. Wie arbeite ich den andere Codesequenzen ab, währen ein _delayxx(y) fleißig zählt...?
Thomas H. schrieb: > Nun bin ich aber auch als Arduino- und _delay vermeider neugierig. Wie > arbeite ich den andere Codesequenzen ab, währen ein _delayxx(y) fleißig > zählt...? Interrupts.
Thomas H. schrieb: >> Die delay() Funktion blockiert die CPU nicht. Kannst du ja mal mit einem >> ESP8266 ausprobieren. Oder einfach mal in den Quelltext gucken. > > Nun bin ich aber auch als Arduino- und _delay vermeider neugierig. Wie > arbeite ich den andere Codesequenzen ab, währen ein _delayxx(y) fleißig > zählt...? Man kann auch andere Funktion abarbeiten lassen, während _delay() läuft, dazu gibt es die yield() Funktion. Das hab ich aber im Detail auch noch nicht getan.
Falk B. schrieb: > dazu gibt es die yield() Funktion. Und man kann Interrupt-Routinen ihren Dienst tun lassen.
> Man kann auch andere Funktion abarbeiten lassen, während _delay() läuft, > dazu gibt es die yield() Funktion. Das hab ich aber im Detail auch noch > nicht getan. Ok, verstehe. Das geht in Richtung RTOS. Die Aussage das die _delayxx(y) aus der avr lib, aus der sie entliehen sind nicht die MCU blockiert ist trotzdem nicht richtig.
Falk B. schrieb: > Das hab ich aber im Detail auch noch > nicht getan. einfach überschreiben, das vordefinierte "yield" ist ein weak symbol. z.B. zum Stromsparen am AVR:
1 | void yield() { |
2 | set_sleep_mode(SLEEP_MODE_IDLE); |
3 | sleep_mode(); |
4 | }
|
(Wird durch den systick/millis()-Timer wieder aus dem idle geweckt, d.H. verschläft nicht)
>>> delay(2000); >> CPU-Blockierer. > Arduino Nichtversteher. Von wegen. Kindergarten. Kein Mensch in der Industrie program. solch Verzögerungen über so'n Delay! Diese Funktion hängt ja schon per Definition an einer Stelle fest. Was soll das werden, wenn es 20..30 OUTs sind, die unterschiedlich verzögert werden müssen? Willst du dann beim 2. OUT abwarten, bis die Zeit vom 1. OUT abgelaufen ist? ..Und beim 3. OUT abwarten, bis die vom 1. u. 2. OUT abgelaufen sind? ..Und beim 4. OUT abwarten, bis die vom 1. u. 2. u. 3. OUT abgelaufen sind? Das ist Kindergarten.
Es war der größte Fehler, das "Hallo Welt" Blink Program der Newbie Gemeinde mit der delay() Funktion vozustellen. Viel zu spät kam das BlinkWithoutDelay in die Arduino Beispielbibliothek. Ausserdem ist dieses Beispiel überfrachtet mit Comments und deswegen unleserlich. Naja, man wollte halt auch die <10 Jahre Babies bedienen ...
Thomas H. schrieb: > Nun bin ich aber auch als Arduino- und _delay vermeider neugierig. Wie > arbeite ich den andere Codesequenzen ab, währen ein _delayxx(y) fleißig > zählt...? Du meinst delay(x) !?!? Auch Interrupts möglich, aber nicht nur. Avr Arduino kennen yield() um die Delay Zeit zu nutzen. Arduino ähnliche mit FreeRTOS, spenden die delay Zeit an andere Tasks.
> Avr Arduino kennen yield() um die Delay Zeit zu nutzen.
Glaub es.
Jemand der in nem Programm 'delay(x)' oder Ähnliches benutzt, sitzt im
Kindergarten.
(ich nenn jetzt keine Namen)
Ach herrje... Wieder das übliche Arduino Bashing. Ist das das ein gutes Gefühl, wenn man Anfänger in die Pfanne haut? Was spürt man da? Stolz? Glück? Und natürlich glaube ich dir das! Ich glaube alles! (bin aber nicht sonderlich gut, in glauben)
Ne, das hat nicht unbedingt nur was mit Arduino zu tun. Das ist Prinzip. Hinweis: Scheduler!
MCUA schrieb: > Hinweis: Scheduler! Oder wissen, wie das mit dem Yield funktioniert. Die Macher hinter Arduino sind meist gar nicht so blöd. Im Gegensatz zu den Makern davor.
Thomas H. schrieb: > Ok, verstehe. Das geht in Richtung RTOS. Die Aussage das die > _delayxx(y) aus der avr lib, aus der sie entliehen sind nicht die MCU > blockiert ist trotzdem nicht richtig. Das stimmt nicht. Dies ist die "originale" delay() implementierung für AVR:
1 | void delay(unsigned long ms) |
2 | {
|
3 | uint32_t start = micros(); |
4 | |
5 | while (ms > 0) { |
6 | yield(); |
7 | while ( ms > 0 && (micros() - start) >= 1000) { |
8 | ms--; |
9 | start += 1000; |
10 | }
|
11 | }
|
12 | }
|
Nicht zu übersehen, dass hier yield() aufgerufen wird. Dies wiederum ist eine leere weak Funktion, die du durch eine eigene ersetzen kannst. Und da kannst du dann machen was du willst, während dealyed() wird. Zum Beispiel könnte man da prima einen Endlichen Automaten unterbringen, der ganz viele spannende Sachen macht. Mit RTOS hat das relativ wenig zu tun. Es ist eine simple und gängige Methode, kooperatives Multitasking zu implementieren.
MCUA schrieb: > Das ist Kindergarten. Du hast die Funktion auch nicht verstanden. Delay() ist sogar reentrant. Das Multitasking von Windows 3.11 funktionierte nach dem selben Prinzip. Da gab es einige blockierende API Funktionen, die in ihrer Warteschleife yield() aufriefen, damit man während dessen noch etwas Sinnvolles tun konnte.
> Du hast die Funktion auch nicht verstanden. Delay() ist sogar reentrant. > Nicht zu übersehen, dass hier yield() aufgerufen wird. Man braucht nicht eine 'yield()'-Fkt aufrufbar (..fähig) zu machen, um eine völlig unsinnige 'delay()'-Fkt zu übertünchen. (Und schreibe das mal auf für die genannten 20..30 OUTs) Kein Mensch implemen. so einen Scheduler. Hier sitzen einige im Kindergarten, die sich selbst ans Bein pinkeln. > Das Multitasking von Windows 3.11 funktionierte nach dem selben Prinzip. Völliger Quatsch. Von ASM hast du scheinbar Null Ahnung.
MCUA schrieb: > Und schreibe das mal auf für die genannten 20..30 OUTs Das mache ich ganz bestimmt nicht, weil Delay in solchen Anwendungen nur alles unnötig kompliziert macht.
MCUA schrieb: > Jemand der in nem Programm 'delay(x)' oder Ähnliches benutzt, sitzt im > Kindergarten. Kindergarten ist hier, dass Sebastian im Eröffnungsposting ein Programm gezeigt hat, was er offenbar nicht in den Mega eingespielt hat. Das entspricht, bis auf Portnummer, Zeit und der fehlenden Klammer dem Blink.ino, was die A*-IDE mitbringt. Und es hätte funktioniert! Auch in seinem Gesamtablauf spricht nichts gegen die Verwendung von Delay: Er schreibt 4 Messwerte ins Display, macht die LED an und wieder aus und holt neue Werte ins Display, da stört die 'Blockierung' nicht. Die delay 4000 / 2000 sind natürlich Unfug, aber die Zeiten und wann Display clear Sinn macht, kann er simpel umbauen.
MCUA schrieb: >> Das Multitasking von Windows 3.11 funktionierte nach dem selben Prinzip. > Völliger Quatsch. > Von ASM hast du scheinbar Null Ahnung. Was hat Windows 3.11 mit "ASM" zu tun? Völliger Quatsch. Von Windows hast Du scheinbar Null Ahnung. Auch von Windows 3.11.
> weil Delay in solchen Anwendungen nur alles unnötig kompliziert macht. Nein, weil 'Delay' da völliger UNFUG ist (und so auch garnicht zu machen ist). Denn die nach 'Delay 2000' kommende Funktion wird doch erst 2000 ms später ausgeführt; also blockierst (!) du doch damit für (den riesigen Zeitbereich von) 2000 ms (!) weitere Ausführungen (auf dieser Programm-Ebene). Was soll denn da sinnvolles rauskomen? ----------------------------------------- ----------------------------------------- (( > Was hat Windows 3.11 mit "ASM" zu tun? Was hat das mit der Sache hier zu tun? Gar nichts! Schwachsinn! Redest zusammenhang-Losen Blödsinn und hast kein blassen Schimmer, worum es hier überhaupt geht (von ASM ganz zu schweigen). ))
MCUA schrieb: > Denn die nach 'Delay 2000' kommende Funktion wird doch erst 2000 ms > später ausgeführt; also blockierst (!) du doch damit für (den riesigen > Zeitbereich von) 2000 ms (!) weitere Ausführungen (auf dieser > Programm-Ebene). Bist Du nun verbohrt, ein Ignorant oder nur mental überfordert? Wir wissen, dass delay eine blockierende Funktion ist, auch Stefanus. Das hindert aber niemanden daran, es trotzdem zu verwenden, wenn eine kurze Blockade zulässig ist. Auch, wenn ich mich wiederhole: Für den Ablauf des TO stellt delay kein Problem dar! Wenn er später auf die Idee kommt, weitere Funktionen wie z.B. einen Schalter hinzuzufügen, wird er natürlich auf's Maul fallen und auf Timer (blink ohne delay) umstellen müssen. Aber immer schön langsam, C++ ist keine angeborene Fähigkeit, das dauert.
Stefan F. schrieb: > Nicht zu übersehen, dass hier yield() aufgerufen wird. Dies wiederum ist > eine leere weak Funktion, die du durch eine eigene ersetzen kannst. Und > da kannst du dann machen was du willst, während dealyed() wird. Zum > Beispiel könnte man da prima einen Endlichen Automaten unterbringen, der > ganz viele spannende Sachen macht. > > Mit RTOS hat das relativ wenig zu tun. Es ist eine simple und gängige > Methode, kooperatives Multitasking zu implementieren. Ok, verstehe. Mit Arduino hab ich eben nichts zu tun. Aber nur um Missverständnissen vorzubeugen. Ich rede von der _delayms() und Du von delay(), ich gehe davon aus, das wir hier von zwei verschiedenen Implementirungen reden. 1x AVR lib und das andere eine Arduino Implementierung. Richtig?
Hallo, wenn ihr euch durch falsche Schreibweisen selbst durcheinander bringt müsst ihr euch über kontroverse Diskussionen nicht wundern. Bei Arduino lautet diese delay(x). _delay(x) und _delayms() gibts nicht. Weder bei Arduino noch in der avr Lib. Wenn dann <util/delay.h> _delay_ms(x). Kein Wunder das hier alle durcheinander reden. Nur mit Arduino delay() gibts den Ausweg mittels yield(). Und der Thread dreht sich ja eindeutig um Arduino.
> Bist Du nun verbohrt, ein Ignorant oder nur mental überfordert? Nein. Von mir aus kannst du dich 24h am Tag selbst blockieren. > ... wird er natürlich auf's Maul fallen Also gibst du damit diese völligen Blöd(Schwach)sinn doch selbst zu. Nichts anderes ist das. Man programmiert doch nicht Etwas, bei dem man schon bei kleiner Erweiterung selbst hinfällt! > wenn eine kurze Blockade zulässig ist. Solch Blödsinn kann nur ein Hochsprachen-Fritze schreiben. Denn 2000 ms sind bei CPU (oder ProgrammEbene) eine halbe Ewigkeit. 'kurz' sind höchstens ein paar ASM (oder NOP) Befehle (die du scheinbar nicht kennst).
Thomas H. schrieb: > Ich rede von der _delayms() Dann bist du im falschen Zug. Auf dem richtigen Zug steht dick und fett Arduino. MCUA schrieb: > Man programmiert doch nicht Etwas, bei dem man schon bei kleiner > Erweiterung selbst hinfällt! Doch, Anfänger tun das. Man kann nicht das Programmieren lernen, indem man mit der Komplexität beginnt, die erfahrene Programmierer drauf haben. Noch ist kein Meister vom Himmel gefallen.
Stefan F. schrieb: > Nicht zu übersehen, dass hier yield() aufgerufen wird. Dies wiederum ist > eine leere weak Funktion, die du durch eine eigene ersetzen kannst. Und > da kannst du dann machen was du willst, während dealyed() wird. Zum > Beispiel könnte man da prima einen Endlichen Automaten unterbringen, der > ganz viele spannende Sachen macht. Klingt nach einer "wackligen" Sache. Was ist wenn man auf die Idee kommt in die yield() delay's zu packen oder die yield() für ihren Task länger braucht das das parent delay()? So oberflächlich betrachtet kann man da nichts wirkliches Zeitkritisches mit machen.
Thomas H. schrieb: > Was ist wenn man auf die Idee kommt in die yield() delay's zu packen Es funktioniert. Wie ich bereits schrieb, ist die delay() Funktion reentrant. > oder die yield() für ihren Task länger braucht das das parent delay()? Dann dauert das Delay halt länger. Dieser Haken ist beim kooperativen Multitasking nicht neu. Selbst im aktuellen Windows und Linux musst du ebenfalls jederzeit damit rechnen, dass ein delay() oder sleep() länger dauert als vorgegeben.
Stefan F. schrieb: > Das Multitasking von Windows 3.11 funktionierte nach dem selben Prinzip. > Da gab es einige blockierende API Funktionen, die in ihrer Warteschleife > yield() aufriefen, damit man während dessen noch etwas Sinnvolles tun > konnte. Ja z.b. der Eieruhr zuschauen :-)
Stefan F. schrieb: > Thomas H. schrieb: >> Was ist wenn man auf die Idee kommt in die yield() delay's zu packen > > Es funktioniert. Wie ich bereits schrieb, ist die delay() Funktion > reentrant. > >> oder die yield() für ihren Task länger braucht das das parent delay()? > > Dann dauert das Delay halt länger. Dieser Haken ist beim kooperativen > Multitasking nicht neu. > Wie ich schrieb, nichts für zeitkritische Sachen. Da ändert dann auch die hübsche Bezeichnung nichts dran. Aber vermutlich macht man so was mit Arduino nicht.
Thomas H. schrieb: > Ja z.b. der Eieruhr zuschauen :-) Jo, ich kann mich auch noch gut dran erinnern. Es gab aber schon ein paar Sachen die weiter liefen. Zum Beispiel der Drucker und Winamp.
Stefan F. schrieb: > Thomas H. schrieb: >> Ich rede von der _delayms() > > Dann bist du im falschen Zug. Auf dem richtigen Zug steht dick und fett > Arduino. Nun wie vermutlich alle hier, bis auf die Fragesteller leide ich grade an Langeweile und da steigt man auch mal in einen Zug ein in den man sich sonst nicht setzten würde um Zeit totzuschlagen.
Stefan F. schrieb: > Thomas H. schrieb: >> Ja z.b. der Eieruhr zuschauen :-) > > Jo, ich kann mich auch noch gut dran erinnern. > > Es gab aber schon ein paar Sachen die weiter liefen. Zum Beispiel der > Drucker und Winamp. Stimmt...
> Doch, Anfänger tun das. Wieviel Jahre soll man Anfänger sein? So'n Blockierungs-Quatsch merkt man in der 1. Minute. > Dann dauert das Delay halt länger. Dieser Haken ist beim kooperativen > Multitasking nicht neu. Einige kapieren es nie. Kooperatives Multitasking hat nichts (!) mit Verwendung von 'Delay' zu tun.
MCUA schrieb: > Kooperatives Multitasking hat nichts (!) mit Verwendung von 'Delay' zu > tun. Es hat mit yield() zu tun, welches innerhalb von delay() aufgerufen wird. https://www.google.com/search?q=kooperatives+multitasking+yield()
MCUA schrieb: > Kindergarten MCUA schrieb: > Kein Mensch MCUA schrieb: > Das ist Kindergarten. MCUA schrieb: > sitzt im Kindergarten MCUA schrieb: > Kein Mensch MCUA schrieb: > Hier sitzen einige im Kindergarten MCUA schrieb: > Völliger Quatsch MCUA schrieb: > völliger UNFUG MCUA schrieb: > völligen Blöd(Schwach)sinn MCUA schrieb: > Solch Blödsinn kann nur ein Hochsprachen-Fritze schreiben. Haben wir gerade Dunning-Kruger-Gedächtniswoche?
> Es hat mit yield() zu tun, welches innerhalb von delay() aufgerufen > wird. Nein. > Haben wir gerade Dunning-Kruger-Gedächtniswoche? Ja. Damit du es (irgentwann) kapierst.
Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.