mikrocontroller.net

Forum: Compiler & IDEs UART Receive ohne dass Prozessor blockiert ist?


Autor: Martial (Gast)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
Hallo zusammen

meine UART läuft inzwischen einigermassen, doch die von mir verwendete
Receive Funktion wartet immer bis Daten ankommen.
Wenn ich eine serielle Verbindung haben möchte, bei welcher der
Prozessor auf gewisse Anfragen entsprechend antwortet, ist es ziemlich
ungünstig wenn er immer in dieser "while(!(UCSRA & (1<<RXC)))" hängen
bleibt.

Gibt es irgend eine Möglichkeit diese Receive Funktion anders zu
gestalten? Ich habe schon versucht, die while Schleife durch ein if zu
ersetzen. Doch dann werden die Daten nicht mehr korrekt empfangen...

Meine Routine für den ATMEGA32 ist im file uart.c angehängt.

Besten Dank und Gruss Martial

Autor: OldBug (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ja, mach es Interrupt driven.

Entsprechende Bits in den USART-Registern setzen und einen
Interrupthandler (SIGNAL(SIG_UART_RECEIVE) o.ä.) dafür schreiben. Nach
Empfangenem Zeichen entweder ein Flag setzen, welches in der
"main-loop" ausgewertet wird, oder in einen Ringbuffer schreiben und
in der "main-loop" regelmäßig nachschauen, ob etwas im Ringbuffer
steht.

Autor: Martial (Gast)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
... ich hab das jetzt mal mit dem Interrupt versucht. Doch leider
klappts noch nicht ganz.
Solange ich über der IF Bedingung eine forever Schleife habe,
funktionierts. Der Interrupt setzt ein flag, welches dort überprüft
wird. Doch wenn ich die forever Schleife wegnehme (und nur noch die
forever Schleife des mains vorhanden ist), geht gar nichts mehr.
Natürlich dauert es dann viel länger bis er wieder an dieser IF
Bedingung vorbeikommt, ist das ein Problem?

Ich habe auch mal versucht das "temp = UDR" und
"USART_Transmit(temp)" direkt in den Interrupthandler zu nehmen, doch
auch das funktioniert nicht.

Gruss Martial

Autor: mthomas (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Wird so eher nichts, doch ein "wenig zu einfach". Als "Inspiration"
vielleicht mal P. Fleurys uart-lib, die UART-Komponente aus der Procyon
AVRLIB oder diverse Libraries fuer UART in avrfreaks.net/user-projects
ansehen.
So die Hauptschleife "schnell ist", kann man auch einfach statt der
warte-while-Schleife fuer "RXC" ein "if" einbauen
(="Data-Avail.?") und nur dann wenn Daten anliegen den UDR auslesen
und verarbeiten.

Autor: Marcus M. (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo Martial,

schau Dir mal das hier an - als Inspiration - :

http://www.mikrocontroller.net/attachment.php/1157...

Gruß Marcus

Autor: Martial (Gast)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
Hallo zusammen,

ich habe mir die Beispiele mal angeschaut und mir daraus ein Stück
eigenen Code zusammengebastelt.
Es soll ein ganzer String empfangen und dann mit dem String "test"
verglichen werden. Falls der Vergleich true ist, soll "test ok"
zurückgesendet werden.
Ein Teil davon funktioniert auch. Der Interrupt wird ausgelöst, aber
dann wird statt einem ganzen String nur immer das erste Zeichen
empfangen. D.h. für Einzeichen-strings funktioniert der Code, nicht
aber für richtige Strings.
Er scheint also nach einem Zeichen schon wieder aus der while- Schleife
herauszufallen... Aber im Beispiel fon Marcus wird das ja eigentlich
genau gleich gemacht, oder???


Besten Dank und Gruss Martial

P.S.: Code ist im uart_interrupt.c angehängt

Autor: OldBug (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Kurz überflogen: das uart_recv-Flag muss in die if-abfrage auf 0x0d
0x0a.
Da muss das Flag gesetzt werden, weil erst dann der String vollständig
ist...

Habs aber nur überflogen...

Autor: Martial (Gast)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
... ja da hast Du natürlich recht! Und das Ganze kann auch nur
funktionieren wenn ich mit "test\r\n" vergleiche. Aber es wird
immer noch nur ein Zeichen empfangen...

Autor: Martial (Gast)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
Ich habs! Nach etlichen Versuchen läuft mein UART endlich mit Interrupt!
Es sind gleich zwei Versionen entstanden, wobei die erste die schönere
ist. Die zweite bleibt hängen, wenn kein CR/LF empfangen wird!
Für die Nachwelt habe ich meine Lösung mal angehängt...


Gruss Martial

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.