UART Interrupt gesteuert?

OP #267882
Lesenswert?

Hallo  zusammen,

ich benutze das STK500 mit einem ATMEGA16L µC. Ich habe ein Programm
welches ein String mit einem einem anderen String vergleicht(strcmp)
und dann eine Antwort über UART sendet . Soweit gut funzt alles. Das
problem ist das die Funktion gets() unbedingt auf eine eingabe wartet
und somit mein Hauptprogramm unterbrochen wird. Wie kann  ich das
realisieren das dies parallel läuft? Über Interrupt vielleicht? Kann
mir jemand vielleicht ein Codebeispiel zeigen?
Danke im Voraus.
Gast #267883
Lesenswert?

Klar, Interrupt ist die Lösung.
Die ISR schreibt die empfangenen Zeichen in einen Ringbuffer, Grösse
nach zu erwratendem Datenaufkommen und geplanter Abfragezeit. Verwaltet
über einen Schreib- und einen Lesezeiger, dazu einer Variablen, die bei
jedem in den Buffer geschriebenen Zeichen incrementiert, bei jedem
gelesenen decrementiert wird.
Lesen kannst du dann immer was, wenn rx_counter>0.
Gast #267885
Lesenswert?

Du brauchst gar keine Abfragezeit einstellen, und an den ISRs brauchst
du auch nichts machen, alles fertig.
irgendwo hast du ja eine main-Funktion, und die wird normalerweise
zyklisch durchlaufen, und dabei alles abgearbeitet, was zu tun ist.
Im einfachsten Fall sieht das dann so aus:

void main (void){
if (rx_counter) serielle_daten_verarbeiten();
if (timer_tic) display_aktualisieren();
.
.
.
}
Gibt noch andere Ansätze (ich z.B. synchronisiere die main mit einem
Timerinterrupt, um konstante Ausführungszeiten auch nach
Programmänderungen zu haben) oder eine echte taskverarbeitung (jede
task bekommt einen Zeitschlitz zugewiesen, Rückkehr in die main, wenn
die AUfgabe fertig oder die max. task-zeit abgelaufen ist) erfordert
ziemlich hohen Aufwand für die Verwaltung und verbraucht auch einiges
an Ressourcen. Ich habs noch nicht gebraucht.

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