Hallo zusammen, jetzt habe ich doch nochmal eine Frage. UNd zwar geht es darum mehrere Sachen gleichzeitig zu prüfen mit einem Atmega8. Ich habe jetzt schon was von Multitasking gelesen, aber das ist mir noch nicht ganz klar und ich bin nicht sicher ob des für meine Aufgabe ausreicht. Ich habe 4 Eingänge an meinem Atmega8. Diese 4 Eingänge müssen immer immer geprüft werden ob da einer aktiv ist. Dies werde ich mit if Abfrage formulieren und diese in einer while Schleife. So jetzt ist aber das Problem, dass wenn jetzt einer Aktiv ist wird eine Variable1 um +1 erhöht. Jetzt wird am ende dieser ganzen Tasterabfragen noch abgefragt ob eine der Variablen größer als 0 ist. WEnn dies der Fall sein sollte, müsste jetzt eigentlich das Programm ein Art "weiteres" Programm aufrufen, was dann etwas ablaufen lässt. Das Problem ist nun, dass dieses weitere Programm an die 2 Minuten dauert und wenn innerhalb der zwei Minuten aber ein Taster gedrückt wird, muss dies der Atmega8 realisieren und die Variable um +1 erhöhen. Jetzt ist die Frage, wie mach ich so etwas. 2 Atmega8, die dann irgendwie kommunizieren? Aber wie? Oder gibt es eine Möglichkeit mehrere Sachen gleizeitig auszuführen? Wie? Oder brauche ich ein Quantenrechenr? :D :D :D :D Oder ist soetwas gar nicht möglich? Wäre super dankbar für Hilfe! Vielen Dank! Gruß Fabi
nur eins hoch zählen wenn aktiv geht nicht, das würde sehr schnell sehr hoch zählen. Du musst also zwischendrin schauen ob es auch mal wieder inaktiv war. Wie auch immer, 2 µCs nimmt man natürlich nicht -- die zu Koppeln wäre ja noch komplizierter. Man legt einfach Teilaufgaben auf Interrupts, z.B. könnte man einen Timer so einstellen, dass dieser alle x ms eine kleine Tastaturcheckroutine ausführt. Diese kümmert sich dann um die Zähler, und im Hauptprogramm wird dann entweder gewartet oder etwas entsprechend abgearbeitet. Kann man auch genau anders rum machen, oder sich Threads programmieren und per Timer Interrupt verteilen usw., da gibt es sehr viele Möglichkeiten.
Fabian Müller schrieb: > Jetzt ist die Frage, wie mach ich so etwas. Ich würde einen Timer-Interrupt nehmen und in der ISR die Tasten abfragen und die Variablen weiterzählen. Da kannst Du die Taster bei Bedarf auch gleich entprellen. Die >0 Abfrage kannst Du nun auch in der ISR machen und dann ein Flag setzen, das in der Hauptschleife den Funktionsaufruf bewirkt, oder die Abfrage machst Du direkt in der Hauptschleife. Gruß Dietrich
Fabian Müller schrieb: > Das Problem ist nun, dass dieses weitere Programm an die 2 Minuten > dauert und wenn innerhalb der zwei Minuten aber ein Taster gedrückt > wird Solche langen Routinen macht man besser mit einer Statemaschine. Vermutlich sind da viele lange Delays drin, die macht man dann mit einem Timer. Sobald der Timer abläuft, geht man in den nächsten State, der startet die nächste Delayzeit, macht was und geht wieder zum Main zurück. Das Main kann dann bequem die entprellte Taste auswerten, die Statemaschine abbrechen, ne andere Statemaschine starten usw.
Dietrich L. schrieb: > Ich würde einen Timer-Interrupt nehmen und in der ISR die Tasten > abfragen und die Variablen weiterzählen Benurtzt man nicht sowieso eine Timer-Routine, um Tasten zu entprellen und dann abzufragen? ;)
Paule H. schrieb: > Benurtzt man nicht sowieso eine Timer-Routine, um Tasten zu entprellen > und dann abzufragen? ;) Ja sicher, darum schrieb ich ja auch: Dietrich L. schrieb: > Da kannst Du die Taster bei Bedarf auch gleich entprellen. Aber wie genau Fabian Müller die Tasten auswerten will, hat er nicht gesagt. Allerdings vermute ich mal, dass er Flankenerkennung und entprellen brauchen wird, und dann sind wir auch gleich bei PeDa: Beitrag "Universelle Tastenabfrage" Gruß Dietrich
Die Frage ist doch, was passieren soll, wenn eine zweite Taste gedrückt wird, während das "Programm" für die erste noch läuft: - startet dann sofort das "Programm" der zweiten Taste? Dann ist Multitasking nötig, d.h. die "Programme" müssen als Zustandsmaschinen formuliert werden. - soll das zweite "Programm" erst loslaufen, wenn das erste fertig ist? Dann tut es eine Interruptroutine, die für jede Taste ein Flag setzt, wenn sie gedrückt wird. Das Hauptprogramm testet die Flags und springt bei gesetztem Flag in das entsprechende Unterprogramm. Wenn man das Zurücksetzen der Flags zu einem geschickt gewählten Zeitpunkt im Unterprogramm macht, kann man sich ausdrückliches Entprellen sparen.
Mir fiele da nur ein angemessen oft aufgerufener Timer IRQ ein. 100...1000 mal pro Sekunde müsste reichen. Da man für eine Display-Steuerung etc. sowieso einen Zeitgeber braucht, wäre es kaum Mehraufwand. Alle 4 Eingänge einlesen (wenn sie am selben Port sind, geschieht das sogar parallel!) Dann alle Eingangsbits prüfen: Wenn Taste offen, die Variable TASTE_X (X=0...3) auf NULL setzen. Wenn Taste aktiv, TASTE_X um EINS erhöhen - tritt dabei ein Überlauf auf (EQUAL-Flag), wieder um EINS erniedrigen (somit max 255 und keine falsche NULL). Wenn der jeweilige Zählerstand einen Mindestwert überschritten hat (Entprellung), wird in einer weiteren Variablen TASTEN_IN noch für Taste 0...3 das Bit 0...3 auf EINS gesetzt. Im Hauptprogramm wird die Variable TASTEN_IN geprüft. Ist sie NULL, gibts nix zu tun. Ansonsten wird je nach gesetztem Bit in die zugehörige Bearbeitung gesprungen, wo zum Schluss dieses Bit wieder auf NULL gesetzt wird. Alle anderen Tastendrücke sind danach noch in TASTEN_IN abrufbar.
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.