Arduino Mega

OP #7278418
Lesenswert?

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
Angehängte Dateien:
OP #7278473
Lesenswert?

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);

}
Gast #7278524
Lesenswert?

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.
#7278553
Lesenswert?

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.
(Firma: CIA) #7278840
Lesenswert?

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...?
#7278852
Lesenswert?

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.
(Firma: CIA) #7278865
Lesenswert?

> 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.
Gast #7278897
Lesenswert?

>>> 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.
#7278930
Lesenswert?

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 ...
Gast #7278942
Lesenswert?

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.
Gast #7278990
Lesenswert?

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)
Gast #7279047
Lesenswert?

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.
Gast #7279050
Lesenswert?

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.
Gast #7279103
Lesenswert?

> 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.
Gast #7279115
Lesenswert?

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.
Gast #7279172
Lesenswert?

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.
Gast #7279291
Lesenswert?

> 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).
))
Gast #7279337
Lesenswert?

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.
(Firma: CIA) #7279664
Lesenswert?

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?
#7279741
Lesenswert?

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.
Gast #7279750
Lesenswert?

> 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).
Gast #7279831
Lesenswert?

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.
(Firma: CIA) #7279837
Lesenswert?

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.
Gast #7279839
Lesenswert?

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.
(Firma: CIA) #7279849
Lesenswert?

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.
Gast #7280165
Lesenswert?

> 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.
#7280196
Lesenswert?

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?

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren