mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik UART 16550 Interrupt


Autor: Dexter (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi

ich hab ein verständnisproblem zwecks der Interrupts beim 16550
und zwar habe ich einen Treiber geschrieben(linux) mit einem 
Software-Fifo

nach der Initialisierung und dAnmeldung des Interrupts im BS geht er in 
einer endlosschleife in read und liest 8 Zeichen ein aber nur wenn ein 
Empfangsinterrupt kommt danach soll er sie wieder ausgeben somit geht er 
in Write routine und schreibt sie wieder in den Sendepuffer aber nur 
wenn ein Sendeinterrupt ausgelöst wird dies macht er aber irgendwie 
nicht. kann mir jemand erklären wie das genau mit dem Sendeinterrupt 
funktioniert?

nochmal zur übersicht

in funktion Read-->
Interrupt kommt
zeichen wird in Empfangspuffer geschrieben
zeichen wird aus Empfangspuffer gelesen und in Anwendungsbereich 
gebracht

in funktion write

zeichen wird in Sendefifo geschrieben und sobald Sendeinterrupt kommt 
wird es
zum UART übertragen indem aus aus dem Sendefifo gelesen wird.


mfg dexter

Autor: nop(); (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Endlosschleife ? Was soll das ?

Aus dem UART liest man nicht 8 byte, sondern soviele wie da sind. Man 
kann das in der Fifotiefe einstellen. Die Fifotiefe als 4, 7 oder 14, 
glaub ich.

Den UART TX interrupt muss man natuerlich enablen. Wenn's ein PC ist, 
ist da noch was mit einem externen gate, hab ich aber vergessen. Der 
TxInterrupt kommt wenn das THR leer ist. Schau dir das Datenblatt an.

Autor: Rufus Τ. Firefly (rufus) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Nicht die Fifotiefe wird eingestellt, sondern der Füllstand, bei dem der 
Interrupt ausgelöst wird.
Allerdings wird der Interrupt auch ausgelöst, wenn der Füllstand nicht 
erreicht ist, aber eine gewisse Zeit verstreicht.

Somit muss im Interrupthandler der aktuelle Füllstand abgefragt werden, 
da sowohl weniger als auch mehr Zeichen vorhanden sein können, als der 
Triggerpegel für den Interrupt beschreibt.

BTW: Warum für Linux das Rad neu erfinden? 16c550 ist die Standard-UART 
jedes PCs, und jedes PC-Linux hat bombenstabile Devicetreiber gerade 
für diese UART.

Autor: nop(); (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ja. Genau. Der Trigger zum Fifo wird eingestellt. Meist falsch, da die 
Leute das zuwenig verstehen. Die Leute denken, wenn sie den Trigger hoch 
setzen bekommen sie weniger interrupts. Ja. moeglicherweise zuwenige. 
Wenn das System stark belastet ist sollte der Triggerwert bei hohen 
Baudraten klein sein. Dies, da in der Zeit, wo der interrupt ansteht, 
und bis das UART ausgelesen wird etwas Zeit verstreichen kann, und 
nochmals ein parr Zeichen kommen koennen.

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.