Hallo Wie kann ich es am besten machen das der ATMEGA2560 nach Aufgabe A nicht Aufgabe B macht sondern zwischendrine Aufgabe Z mache und dann zu Aufgabe B springt ? Ich habe was von Interrupts gelesen die entweder nach zeit oder nach Pin Pegel wechsel steuern beides ist nicht ganz was ich mir vorstelle. Und Z überall einfügen würde schnell den speicher sprengen. Mal ein beispiel:(ja ich weiß ist müll aber zum zeigen reichts) void loop() { A digitalWrite(xx, HIGH); A delay(1000); Wechsel zu Z Weiter mit B B digitalWrite(xx, LOW); B delay(1000); Wechsel zu Z Weiter mit C C digitalWrite(xx, HIGH); C delay(1000); Wechsel zu Z Weiter mit D D digitalWrite(xx, LOW); D delay(1000); } void z Vielen dank.
Gast
#4890429
bedingter sprung, "if…", funktionen definieren. c (oder jede andere programmiersprache) basics halt die man sich zusammengoogeln kann.
Gast
#4890430
Jede aufgabe als funktion definieren und in deiner hauptschleife dann einen entsprechenden ablaufplan abarbeiten...
Gast
#4890434
Das riecht irgendwie nach einer Statemachine https://de.wikipedia.org/wiki/Endlicher_Automat
Danke euch! TestX Deine Idee klingt gut nur kann ich mir das nicht ganz vorstellen wie würde das etwa aussehen ?
im Interrupt, Timer oder PIN Change setzt du ein Flag if(!ich_soll_Z_machen) ich_soll_Z_machen = 1; in der loop if(ich_soll_Z_machen) z(); // in z() bevor es raus geht ich_soll_Z_machen=0;
Gast
#4890582
DAVID -. schrieb: > Wie kann ich es am besten machen das der ATMEGA2560 nach Aufgabe A nicht > Aufgabe B macht sondern zwischendrine Aufgabe Z mache und dann zu > Aufgabe B springt ? Du kannst zwischen A und B einfach einen Aufruf von Z einbauen. Bisher
1 | |
2 | |
3 | |
4 | |
5 | |
Mit Z
1 | |
2 | |
3 | |
4 | |
5 | |
6 | |
Was willst du wirklich genau?
hmm ok danke dir meinst du das so ?
void setup() {
pinMode(13, OUTPUT);
pinMode(10, OUTPUT);
if(Test LED);
digitalWrite(10, HIGH = 0;
delay(1000);
digitalWrite(10, LOW = 0;
delay(1000);
}
void loop() {
digitalWrite(13, HIGH);
delay(1000);
}
if(Test LED))
z(=1);
{
digitalWrite(13, LOW);
delay(1000);
}
DAVID -. schrieb: > if(Test LED)) > z(=1); > { > digitalWrite(13, LOW); > delay(1000); > } wenn z 1 werden soll dann mache ein Zuweisung so: z=1; wenn z wirklich nur die LED anmachen soll dann lasse die LED gleich in der ISR angehen dann brauchst du nicht mehr, kein FLAG, kein Unterprogramm und keine Abfrage und keinen Sprung, vergiss das doofe Delay oder merke dir die Zeit von ON und wenn die abgelaufen ist in der loop schalte wieder aus.
hallo wie gesagt die LED Sache sollte nur für mich zum verstehen sein gehen tut es um was anderes anderes. Es werden Sensoren abgefragt es werden Spannungen gemessen es werden Displays angesteuert und Daten auf ein Ethernet schilt gesendet welches kein int Pin rausgeführt hat. Problem dabei ist aber der ganze Durchlauf dauert um die 10 sek und da ist keine sinnvolle Ethernet Verbindung mehr möglich.
ohne delay programmieren! schau dir alternativen an.
Antwort schreiben
Bitte melde dich an, um einen Beitrag zu schreiben.