Forum: Mikrocontroller und Digitale Elektronik Frage zur Programmabarbeitung Arduino..


von µC-Neuling (Gast)


Lesenswert?

Hab eine grundlegende Frage zu Arduino und der Programmabarbeitung..
bin in der Sache absoluter Neuling!

ich schreibe z.B. (natürlich nicht als Klartext..)


wenn Eingang 1 = low
Warte 5sex
schalte Ausgang 10 = high

wenn Eingang 2 = low
schalte Ausgang 9 = high

Wie wird dieses Programm jetzt abgearbeitet..

ist dies -zeilenorientiert-?
also: eingang1 = low -- Wartezeit 5 sec -- Ausgang schalten
und dann erst mit Eingang 2 weiter,

oder liest die CPU das ganze Programm durch und schaltet dann beide
Ausgänge unabhängig von der Wartezeit ein?

was ja eigentlich Sinn macht..

Danke für einen kurzen Tip

von Mathias O. (m-obi)


Lesenswert?

Zeile für Zeile vom Sinn her. Sonst machen Waits oder _delay_ms und so 
keinen Sinn. Das hat übriegens nichts mit Arduino zutun, da der ja auch 
nur einen AVR hat.

von Karl H. (kbuchegg)


Lesenswert?

µC-Neuling schrieb:

> ist dies -zeilenorientiert-?

Ja

> oder liest die CPU das ganze Programm durch und schaltet dann beide
> Ausgänge unabhängig von der Wartezeit ein?

Nein.
Die CPU macht das was du ins Programm geschrieben hast. Und zwar genau 
das.

> was ja eigentlich Sinn macht..
Das mag schon sein, das das für dich Sinn macht, ist aber nicht das was 
passiert. Wenn du programmierst, dass die CPU 5 Sekunden Däumchen drehen 
soll, dann dreht die auch 5 Sekunden Däumchen und macht sonst nichts 
anderes. Interrupts kommen noch durch, aber abgesehen davon wird 
Däumchen gedreht.

Wenn du etwas anderes willst, dann musst du das prorammieren oder ein 
entsprechendes Framework benutzen.

Nur so als Anregung. Du hast geschrieben
1
wenn Eingang 1 = low
2
  Warte 5sex
3
....
wie ist das denn jetzt? Beginnt die Wartezeit jedesmal wieder neu von 
vorne, wenn der Eingang low ist? Bedenke, dass dein Arduino viele 
tausend mal pro Sekunde den Eingang überwacht. D.h. wenn der Pin eine 
halbe Stunde auf Low liegt, wie ist das dann mit der Wartezeit? Beginnt 
jetzt praktisch die Wartezeit erst dann, wenn der Pin wieder auf High 
gegangen ist? Oder fängt das an, wenn das erste mal Low detektiert wird? 
Oder wie?
Was ist wenn während der Wartezeit der Pin auf High und dann wieder auf 
Low geht? Beginnen die 5 Sekunden dann wieder von vorne?
Was ist wenn nach Ablauf der Wartezeit der Pin immer noch auf Low liegt? 
Was soll dann passieren?
Fragen über Fragen. Der einzige, der sie beantworten kann, das ist der 
Programmierer. Der muss sich diesen Fragen stellen und entsprechend im 
Programm berücksichtigen.

PS: Wenn du erst mal ein wenig mehr Erfahrung hast, dann wirst du 
schnell merken, dass ein "Warte x Sekunden" sowieso Mist ist. Das Um und 
Auf, damit ein Programm scheinbar mehrere Dinge gleichzeitig machen 
kann, besteht darin eben keine derartigen Däumchen-Dreh Aktionen zu 
machen. Dazu gibt es andere Techniken.

von Gerald B. (gerald_b)


Lesenswert?

kommt darauf an, wie du programmierst ;-)
Verwendest du millis, dann geht in dieser Zeit garnichts mehr und er 
wartet, bis die Pause um ist, ehe er wieder Eingänge abfragt etc. delay 
1000 - eine Sekunde Siesta.
Mit Schleifen reagiert er auch zwischendurch. Millis gibt dir die Zeit, 
wie lange er seit dem Einschalten in Betrieb ist. Schleife, im ersten 
Durchlauf millis als Variable abspeichern, im nächsten Durchlauf 
vergleichen - wenn Variable + 1000 kleiner als aktuelle millis, dann ist 
ne Sekunde um und er reagiert trotzdem.
Googeln und das Arduinoforum 
http://forum.arduino.cc/index.php/board,31.0.html
Helfen dir auch bei ersten Gehversuchen.
"Die elektronische Welt mit Arduino entdecken"
von Erik Bartmann ist auch recht anschaulich und locker geschrieben. 
Dort wird auch von Seiten der Elektronik beim "Urschleim" angefangen :-)

Gruß Gerald

von Jürgen S. (jurs)


Lesenswert?

µC-Neuling schrieb:
> Wie wird dieses Programm jetzt abgearbeitet..
>
> ist dies -zeilenorientiert-?
> also: eingang1 = low -- Wartezeit 5 sec -- Ausgang schalten
> und dann erst mit Eingang 2 weiter,

Das Programm wird so abgearbeitet wie Du es programmierst.

Wenn Du programmierst "warte 5 Sekunden", dann wartet das Programm an 
der Stelle 5 Sekunden und macht gar nichts.

Wenn das Programm "mehrere Dinge gleichzeitig" tun soll, ist "delay" ein 
verbotener Befehl, den Du nicht verwenden darfst.

Die Arduino-Software stellt Dir einen "millis()" Timer zur Verfügung und 
Du müßtest ein Programm dass "in den Wartezeiten etwas tun soll" stets 
so programmieren, dass es verzögerungsfrei arbeitet und mit dem Stand 
des Timers arbeitet. Zum Beispiel:

1. Wenn Eingang-1 low, dann Zählerstand merken und Ausgang schalten

2. Wenn Ausgang geschaltet und Zählerstand minus gemerkter Zählerstand 
größer 5 Sekunden, dann Ausgang abschalten

Diese Programmlogik kannst Du dann locker um weitere Eingänge, gemerkte 
Zählerstände und Ausgänge erweitern und alles läuft quasi gleichzeitig 
ab.

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.