Forum: Mikrocontroller und Digitale Elektronik UART Interrupt gesteuert?


von Karsten L. (kongs)


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.

von cazy horse (Gast)


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.

von Karsten L. (kongs)


Angehängte Dateien:

Lesenswert?

Danke für die Antwort,

ich benutze Codevision AVR, ich habe obigen Codeschnipsel von CVAVR.
Das so aufgebaut wie gesagt hast. Frage ist wo bring ich mein eigenen
Code unter in der ISR selbst? Und wie kann ich die Abfragezeit
einstellen? Mit einem TIMER overflow interrupt?

von cazy horse (Gast)


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.

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.