Timer oder Interrupt oder beides?

OP #847325
Lesenswert?

Ich stehe gerade vor der Aufgabe, dass ich meinen Mega8515 mehrere 
Sachen gleichzeitig machen lassen möchte.

Momentan läuft eine Displayausgabe und der UART parallel. Nun soll er 
aber noch auf Inputs von Tastern warten und dann eventuell ein Menü 
aufrufen während der UART weiter läuft. Dann soll er eine Schleife 
durchlaufen in der der UART zig Datensätze verschickt. Das soll 
allerdings per Tastendruck auch wieder jeder Zeit stopbar sein.

Als Anfänger stehe ich jetzt etwas dumm dar. Die Schleife lässt sich 
wohl am besten mit einem Timer lösen zwecks des Timings eben bei dieser. 
Die Tastenabfrage bzw. das warten darauf dann per Interrupt?

Ich habe das Tutorial schon einige male gelesen, genau wie das 
Datenblatt, aber richtig ersichtlich war das nicht wie ich das 
realisieren kann.

Habt ihr da eventuell tipps für mich?
Gast #847326
Lesenswert?

Ja, da brauchst du etwas, was man Konzept nennt ;-)

Hm.. Mal überlegen:
Ich würde alles in (erstmal) unabhängige Teilaufgaben zerlegen:
- UART Ausgabe
- Tastenauswertung
- DIsplayansteuerung

DIese Teile müssen erstmal ausprogrammiert werden, am Besten mit 
Funktionen. Etwa sowas für uart senden:
void uart_send( ANzahl Daten, Ptr auf Daten )
{...}
 DIese Funktion schreibt die zu sendenden Daten in ein globalen 
IFO-Puffer.
 ALso die Funktion wird aufgerufen, kopiert Daten und wird sofort wieder
 beendet. Eine ISR (UART_Data_Reg_Empty) "guckt" permanent dort rein und
 sendet Zeichen für Zeichen, bis der Puffer leer ist.
void uart_stop ()
{...}
 Diese Funktion löscht den FIFO Puffer => die ISR (UART_Data_Reg_Empty)
 sieht einen leeren Puffer und macht nichts..

sowas für display:
 void showDisplay ( Was und Wohin)
{...}
 Die Fkt schickt die Daten direkt zum Display, da ich davon ausgehe,
 dass das schnell geht.

weiterhin gibt es einen ISR (Overflow TimerX), der die Tasten entprellt 
und auswertet. Das Ergebnis (also welche Taste ist gedrückt) kann zB 
über die
Fkt IsBtnPressed ( Welche Taste) abgefragt werden.

Dann gibt es noch die main, die, abgesehen von der Initialisierung von 
uart, timer,..., etwa so aussehen könnte:

main
{
 if ( IsBtnPressed (Taste1) )
 {
   showDisplay (irgendwas)
   uart_send ( irgendwas anderes)
 }
 if ( IsBtnPressed (Taste23) )
 {
    uart_stop();
 }
...
}

das natürlich in einer Endlosschleife


So etwa würde ich das wohl aufziehen...
OP #847443
Lesenswert?

Super, danke für deine Hilfe!
Also das Display und den UART steuere ich mit den Librarys von Peter 
Fleury. Die laufen also schon unabhängig parallel von einander. Mein 
Problem ist eher momentan die unabhängge Tasteneingabe und die Prozesse 
die ich dann starten möchte.

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren