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.
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; }
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
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.