www.mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik UART empfängt nicht vorhandene Daten


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

Bewertung
0 lesenswert
nicht lesenswert
Hi,

ich habe zwei identische Geräte ATMEGA 32 über UART mit einander 
verbunden (GND, RX, TX gekreuzt), allerdings TTL-Pegel, also ohne RS232 
Treiber. Immer sobald ich das Kabel (wenige Zentimeter lang) angesteckt 
habe, schlägt kontinuierlcih der USART_RXC Interrupt zu. Eigentlich 
benutze ich die Lib für die UART schon recht lange und hatte auch kein 
Probleme bis jetzt, was nicht heißen soll, dass kein Fehler enthalten 
ist. Ich vermute ja, das bei der Zusammenschaltung was faul ist.

Gruß, Alex

Initialisierung im Anhang (Initialisiert habe ich beide Geräte 9600, 
8N1)

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

Bewertung
0 lesenswert
nicht lesenswert
UCSRB |= (1<<RXCIE)|(1<<TXEN)|(1<<RXEN); //receiver, transmitter enable


Und die ISR dazu sieht wie aus?
Du hast nicht zufällig das eigentliche Abholen aus dem UDR 
auskommentiert? Denn dann kommt der Interrupt ständig. Das ist eine der 
Ausnahmen: das Interrupt Flag wird erst beim Auslesen aus UDR gelöscht 
und nicht wie bei anderen Interrupts durch das Aufrufen der ISR

Autor: Stefan B. (stefan) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ich würde versuchsweise mal einen schwachen Pull-Up (10K oder höherer 
Wert) an jeder RX Leitung anbringen. Eventuell RXD auf Eingang 
konfigurieren und internen Pull-Up für diesen Pin aktivieren - spart den 
externen Pull-Up.

Aber: TTL im laufenden Betrieb umstecken... hätte ich doch zu viel 
Schiss vor ESD-Schäden. Mindestens sicherstellen, dass GND vor den 
beiden Signalleitungen Kontakt hat z.B. durch spezielle Stecker/Buchsen 
mit einem längeren Pin für GND.

Autor: Alex (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
so:

ISR(USART_RXC_vect)
{
  uart_in_buf[uart_in_wr ++] = UDR;
  if(uart_in_wr == BUFLENGTH) uart_in_wr = 0;
  uart_in_cnt ++;
  if(uart_in_cnt == BUFLENGTH) uart_in_cnt = 0;
}

Autor: Alex (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Danke allen Schreibern

ich werde erstmal den Pull-up testen. Ich hab die Möglichkeit, die 
Geräte erst zu verbinden und dann gemeinsam einzusschalten.

Alex

Autor: Alex (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@ Stefan B.

die Idee mit dem internen Pull-up war gut, hat geklappt.
So richtig kann ich mir das aber noch nicht erklären. Der TX-Ausgang 
sollte doch bei verbundenen Geräten dafür soregn, das der Pegel stimmt 
und nicht zappelt. Kannst Du mir das erklären?

Gruß, Alex

Autor: gtf (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@ Alex (Gast),
verstehe zwar nur zu 10% C, aber ich kann bei dir keine I/O 
Initialisierung erkennen.
Trotz das die I/O’s vom UART überschrieben werden, würde ich die Pins 
vorher in die entsprechenden Richtungen setzten.

Beipiel:
1)  I/O Initialisieren
Sbi  DDRB, PD1    // TX- Ausgang
Cbi  DDRB, PD0    // RX- Input

; disable pullups
Cbi  PortB, PD0              // TX- Out pullup disable
Cbi  PortB, PD1              // RX- In pullup disable

2)  USART Initialisieren

Bei mir hat’s bis jetzt immer geklappt.
Das würde mich jetzt interessieren ob’s bei dir nach meinem Beispiel 
auch klappt.

Autor: Alex (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo gtf,

ich hab es nochmal schnell ohne Pull-up probiert, aber mit explizitem 
Setzen des Pins als Eingang, extra für quasi ;-)
Selbes Phänomen
Sind die Ports nicht eh default auf Eingang?

Gruß, Alex

Autor: Stefan B. (stefan) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ja die sind nach dem RESET auf Eingang, aber die internen Pull-Ups sind 
nicht aktiviert.

Der Pull-Up an RX zieht die Leitung auf TTL High, d.h. auf den 
Ruhepegel. Eine Übertragung zieht mit dem Startbit die Leitung runter 
und die UART startet den Empfang.

Bei einer frei bambelnden Leitung ohne Pull-Up hat dein RX keinen 
definierten Logikpegel. Die Wahrscheinlichkeit, dass die Leitung 
zufällig auf HIGH geht und dann LOW und die UART meint ein Startbit zu 
erkennen ist gering.

Wenn du allerdings mit deinem Datenstecker Stecker plus Signal von der 
TX der Gegenseite ankommst, sieht das anders aus! Das Stecken der 
ankommenden TX Leitung mit High-Pegel ist nicht 
schwupp-vorher-nix-und-jetzt-high. Der Steckvorgang wird Prellen. Und 
das Prellen wird als Startbit plus irgendwas interpretiert...

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

Bewertung
0 lesenswert
nicht lesenswert
> uart_in_cnt ++;
>   if(uart_in_cnt == BUFLENGTH) uart_in_cnt = 0;

Bist Du Dir sicher, daß das der korrekte Umgang mit dem Fifofüllstand 
ist?

Hier verwirfst Du den gesamten Fifo-Inhalt, wenn der Fifo überläuft.
Sinnvoller ist es sicherlich, den Fifofüllstand nur nicht weiter 
ansteigen zu lassen.

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

Bewertung
0 lesenswert
nicht lesenswert
Stefan B. schrieb:

> schwupp-vorher-nix-und-jetzt-high. Der Steckvorgang wird Prellen. Und
> das Prellen wird als Startbit plus irgendwas interpretiert...

So würde ich das auch erwarten.
Aber er schreibt ja:

> Immer sobald ich das Kabel (wenige Zentimeter lang) angesteckt
> habe, schlägt kontinuierlcih der USART_RXC Interrupt zu

koninuierlich. Wenn da ein Geisterzeichen auftaucht, würde ich das 
verstehen. Aber koninuierlich ohne das wer sendet? Seltsam.

Autor: Alex (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@ Rufus: Danke für den Tip, werde versuchen, das günstiger zu lösen.
@ Stefan B: das Phänomen tritt auch auf, wenn die UARTs verbunden sind. 
Deshalb dacht ich ja, der TX sollte für klare Pegel sorgen.

Gruß, Alex

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.