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

Eine eigene Frage? Dieser Thread ist über 20 Jahre alt. Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.

Neuen Thread starten

Eine Lösung, Ergänzung oder Rückmeldung zu diesem Thread? Dann antworte hier.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.