mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik UART Interrupt gesteuert?


Autor: Karsten Libenow (kongs)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: cazy horse (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Karsten Libenow (kongs)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht 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?

Autor: cazy horse (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.