Forum: Compiler & IDEs arduino zwischendrine zu andren Anweisungen springen und dann weiter machen.


von DAVID B. (bastler-david)


Lesenswert?

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.

von c.m. (Gast)


Lesenswert?

bedingter sprung, "if…", funktionen definieren. c (oder jede andere 
programmiersprache) basics halt die man sich zusammengoogeln kann.

von TestX (Gast)


Lesenswert?

Jede aufgabe als funktion definieren und in deiner hauptschleife dann 
einen entsprechenden ablaufplan abarbeiten...

von Kaj (Gast)


Lesenswert?

Das riecht irgendwie nach einer Statemachine
https://de.wikipedia.org/wiki/Endlicher_Automat

von DAVID B. (bastler-david)


Lesenswert?

Danke euch!
TestX Deine Idee klingt gut nur kann ich mir das nicht ganz vorstellen 
wie würde das etwa aussehen ?

von Joachim B. (jar)


Lesenswert?

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;

: Bearbeitet durch User
von SCNR (Gast)


Lesenswert?

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
void loop()
2
{
3
  Aufgabe_A();
4
  Aufgabe_B();
5
}

Mit Z
1
void loop()
2
{
3
  Aufgabe_A();
4
  Aufgabe_Z();
5
  Aufgabe_B();
6
}

Was willst du wirklich genau?

von DAVID B. (bastler-david)


Lesenswert?

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

von Joachim B. (jar)


Lesenswert?

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.

: Bearbeitet durch User
von DAVID B. (bastler-david)


Lesenswert?

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.

von Flip B. (frickelfreak)


Lesenswert?

ohne delay programmieren! schau dir alternativen an.

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
Noch kein Account? Hier anmelden.