Forum: Mikrocontroller und Digitale Elektronik mehrere Sachen gleichzeitig prüfen


von Fabian F. (fabiii9)


Lesenswert?

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

von Kai (Gast)


Lesenswert?

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.

von Dietrich L. (dietrichl)


Lesenswert?

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

von Peter D. (peda)


Lesenswert?

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.

von Paule H. (stk500-besitzer)


Lesenswert?

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

von Dietrich L. (dietrichl)


Lesenswert?

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

von Nosnibor (Gast)


Lesenswert?

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.

von Bernie (Gast)


Lesenswert?

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