Forum: Mikrocontroller und Digitale Elektronik Timer oder Interrupt oder beides?


von Pascal M. (cyrax)


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?

von Matthias L. (Gast)


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...

von Pascal M. (cyrax)


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.

von Hannes L. (hannes)


Lesenswert?

> unabhängge Tasteneingabe

Dann schau mal hier Entprellung und verfolge die Links, da landest 
Du bei einer wunderbaren Tastenabfrage von Peter Dannegger, die keine 
Wünsche offen lässt und sich leicht an eigene Bedürfnisse anpassen 
lässt.

...

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.