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


von Alex (Gast)


Angehängte Dateien:

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)

von Karl H. (kbuchegg)


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

von Stefan B. (stefan) Benutzerseite


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.

von Alex (Gast)


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;
}

von Alex (Gast)


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

von Alex (Gast)


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

von gtf (Gast)


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.

von Alex (Gast)


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

von Stefan B. (stefan) Benutzerseite


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...

von Rufus Τ. F. (rufus) Benutzerseite


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.

von Karl H. (kbuchegg)


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.

von Alex (Gast)


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

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.