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
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.
µ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.
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
µ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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.