mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik USART ansteuern


Autor: Adrian Badertscher (Gast)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
Hallo Leute,

Ich habe eine Frage, seit einiger Zeit quäle ich mich mit einem USART
Problem herum. Der wohl allen bekannte Bufferüberlauf hat auch bei mir
zugeschlagen. Mein Projekt handelt sich darum, mit einem PIC 18LF873A
(Selber Baustein wie 18F873A nur Stromsparender und teurer), ein
Funkmodul anzusteuern, und auf einen gewissen String der empfangen
werden muss, einen anderen String auszusenden.

Leider ist es jetzt so, dass mit den Standart Bibliotheken von meinem
CSS Compiler, dieses Problem unlösbar scheint, da der Befehl getc(),
irgend einmal zu hängen beginnt, weil der Buffer überläuft. Diesem
Problem wollte ich Herr werden, in dem ich die USART selber ansteuere,
das habe ich bereits getan, und es läuft super. Bis auf etwas, und zwar
wieder dieser lästige Bufferüberlauf. Laut Datenblatt soll man bei einem
Überlauf das CREN Bit neu setzen. Das Funktioniert zwar super, nur
leider bringt mir das nichts, da der String so nicht mehr ganz
empfangen werden kann, da der Buffer während des Empfanges verloren
geht, da der String (11 Zeichen lang), wohl die Buffergrösse
übersteigt.

Kann mir jemand einen Tip geben? Das wäre nett, mein Chef wartet
nämlich schon sehnlichst darauf.

Mit freundlichen Grüssen

pheak

Autor: Adrian Badertscher (Gast)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
Einen Fehler konnte ich erruieren. Die Funktion
"Funkmodulempfangen()", darf nicht vor dem Empfang ausgeführt werden.
Dafür habe ich diese jetzt am Ende jeder Sende Aktion ausgeführt.

Nun sendet mein PIC auch die Daten, aber leider nur 2 Mal, danach ist
der Buffer wieder voll.
Ich kann mir das nicht so ganz erklären, und bin auf Hilfe angewiesen.

Vielen Dank!

Autor: Peter Dannegger (peda)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Nutze das main, denn dazu ist es ja da.

D.h. ziehe alle zeitraubenden Sachen aus den Interrupts raus und mache
sie gemütlich im main.

Also die ganzen delays und das Senden im Polling mode.

In CPU-Zyklen gerechnet, dauern diese Sachen Jahre.
Kein Wunder, wenn die CPU dann andere Sachen nicht mehr schafft.


Peter

Autor: Adrian Badertscher (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Habe festgestellt, dass es sich gar nicht um ein Zeitliches Problem
handelt, sondern darum, dass ich ein Echo auf der RX Leitung habe. Das
heisst, während des sendens, kommt ein Teil wieder auf der RX Leitung
zurück, so dass der Interrupt wieder ausgeführt wird.

Leider kann ich mir nicht erklären woher dieses Echo stammt. Denn
dadurch wird das Senden unterbrochen, und das Funkmodul, da es im Sende
Modus ist, kann nichts empfangen.

Peter: Danke für die Antwort, leider müssen diese Dinge aber gleich
darauf folgend passieren. Das Senden und Empfangen sollte
schlussendlich nicht mehr als 10ms beanspruchen.

Gruss Adrian

Autor: Peter Dannegger (peda)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
"Leider kann ich mir nicht erklären woher dieses Echo stammt."

Das sogenannte Halb-Duplex ist sehr gebräuchlich.

Beim 8051 gibt es extra dafür das REN-Bit (receive enable), mit dem
kann man dann den Empfang während des Sendens sperren.


Peter

Autor: Adrian Badertscher (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Herzlichen Dank! Ich werde mich danach umsehen!

Aber etwas scheint mir seltsam, steuere ich den PIC über den Rechner
an, funktioniert das Programm einwandfrei, ohne das Echo, schalte ich
aber wieder um auf das Funkmodul, so existiert dieses Echo.

Das Problem daran ist, dass dieses Echo nicht gesendet werden sollte,
sonst wird mein Telegramm verfälscht, und das wäre nicht meine
Absicht.

Gruss Adrian

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.