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