mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik Problem: mit 2 Uarts gleichzeitig empfangen


Autor: Hans (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo, ich habe folgendes Problem: ich nutze beide UARTS des AT90CAN128 
um Strings zu empfangen. Bei dem String der über UART0 (115600 BAUD) 
empfangen wird fehlt allerdings ab und zu ein Byte. Der String von UART1 
(19200 BAUD) ist komplett richtig. Ist der UART1 ausgeschaltet empfängt 
auch der UART0 alle Bytes. Ich nutze jeweils den jeweiligen RX-Interrupt 
zum Empfang eines Bytes.

Autor: Lothar Miller (lkmiller) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hans schrieb:
> Ich nutze jeweils den jeweiligen RX-Interrupt zum Empfang eines Bytes.
Lass mal deinen Code sehen, was da sonst noch alles in der ISR gemacht 
wird...

In der Interruptroutine solltest du nur das Zeichen abholen und in einen 
Fifo schreiben. Irgendwer/-was in der Hauptschleife holt sich dann die 
Zeichen aus dem Fifo ab.

Autor: Klaus2m5 (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Bei 115600 Baud kommt alle 86,5 µs ein Byte (bei 8n1). UDR vom RX kann 
nur 2 Bytes puffern. Wahrscheinlich brauchen Deine ISRs mehr Zeit, wenn 
beide USARTS aktiv sind. Zur Bestätigung kannst Du Data Overrun für 
USART 0 auswerten! Testweise UART0 mit niedrigerer Baudrate betreiben.

Autor: Hans (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
vielen Dank für die Tips. Ich habe die UART-Interrupt-Rountine wie oben 
empfohlen umgebaut, jetzt funktioniert alles. Problem war, das in der 
UART1 Routine noch auf ein weiteres Byte gewartet wurde. Währenddessen 
wurden Daten die per UART0 kamen ignoriert

Autor: Henrik (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
In der ISR warten ist immer schlecht.
Gut, dass du das Problem behoben hast. :)

Autor: Falk Brunner (falk)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@  Henrik (Gast)

>In der ISR warten ist immer schlecht.

Eben, siehe Interrupt und Multitasking.

MfG
Falk

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Falk Brunner schrieb:
> @  Henrik (Gast)
>
>>In der ISR warten ist immer schlecht.
>
> Eben, siehe Interrupt und Multitasking.

Bzw. das was jedem der es hören will, bzw. nicht hören will, seit Jahr 
und Tag hier im Forum gepredigt wird :-)

In einer ISR wird nicht gewartet
ISR so lang wie notwendig aber so kurz wie möglich

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.