Hallo, ich hab ein Problem mit dem Uartempfang beim mega 32. Das send geht, aber das empfangen nicht. Das Programm ist das einfachste, das reproduzierbar nicht funktioniert. Hab auch schon vieles andere ausprobiert, aber empfangen geht nicht. Hab mittlerweile auch mehrer bsp Programme von hier und anderswo probiert - immer das gleiche : senden geht empfangen nicht. Auch mit Interrupt gehts nicht. Es liegt wohl daran, dass das Bit RXC nicht 1 wird und deshalb die while Schleife while( ! (UCSRA & (1<<RXC))) nie verlassen wird, was auch erklaert warum bei anderen Versuchen kein Interrupt erfolgt. Aber RXC wird doch durch HW gesetzt wenn ein Zeichen ankommt, oder ?
Dateianhang ist nicht mitgekommen deshalb hier das Prog // Device ATmega32 @ 4 MHz // // in PonyProg markierte ConfigBytes : // JTAGEN CKOPT BOOTSZ1 BOOTSZ0 SUT0 // CKSEL3 CKSEL2 // ==> 4 Mhz interner RC osc // #include <avr/io.h> #define bit(x) (1<<(x)) // Bit Position #define setBit(r, b) ((r) |= bit(b)) // set bit<b> in byte <r> #define clrBit(r, b) ((r) &= ~ bit(b)) // clr bit<b> in byte <r> #define uart_tx(data) {while ( ! (UCSRA & (1<<UDRE)));UDR = data;} char x; uint8_t i = 0; void uart_init(void){ setBit(DDRD,1); // TXD output clrBit(DDRD,0); // RXD input UCSRB |= (1<<TXEN); // UART TX einschalten UCSRB |= (1<<RXEN); // UART RX einschalten UCSRC |= (1<<URSEL) |(1<<USBS) | (3<<UCSZ0);// asynchron 8Daten 0Par 2Stop // UCSRB |= (1<<RXCIE) ; // Rx Complete Interrupt Inable // Baudrate einstellen UBRRH = 0x00; UBRRL = 0x1a; // = 26 ==> Baudrate = 9600 @ 4 MHz }// - end - usart_init void init(void){ DDRB = 0xff; // Port B output uart_init(); } char uart_rx(void){ // diese Schleife wird nie verlassen ,weil RXC NIE 1 wird while ( ! (UCSRA & (1<<RXC))){ PORTB = 0xf0; // das ist das lezte was passiert } return UDR; } int main(void){ init(); // DI/DO, usart uart_tx('A'); // als test ==> geht auch for(;;){ uart_tx(i); // als test ==> geht auch 1 mal i = 0 x = uart_rx(); PORTB = x; uart_tx(x); i++; } }// - end - main // E O F
Du nutzt doch den internen Takt des Atmega32 oder? Ich habe jetzt auf Anhieb keinen Fehler in deinem Programm gesehen aber ich würde mal testen, ob es vielleicht daran liegt, das du den OSSCAL-Wert nicht explizieht im Programm setzt. Das war auch mal bei mir eine Fehlerquelle, weswegen mein Uart nicht funktioniert hat. Hier Beitrag "Re: USART Atmega32" kannst du das gerne nachlesen wenn du möchtest, da ist auch alle über den OSCCAL-Wert erklärt. Ich hoffe, das hilft dir weiter. Gruß, Marian
Hast du noch externe Hardware dran? Ich weiss aus leidvoller Erfahrung, daß z.B. ein Max232, bei dem die Spannungsversorgung nicht stimmt oder ganz fehlt, auch diesen Effekt haben kann. Oliver
@Marian >Du nutzt doch den internen Takt des Atmega32 oder? >Ich habe jetzt auf Anhieb keinen Fehler in deinem Programm gesehen aber >ich würde mal testen, ob es vielleicht daran liegt, das du den >OSSCAL-Wert nicht explizieht im Programm setzt. Das war auch mal bei mir Und jetzt schreibst du einhundert mal "Ich muss für UARTkommunikation immer einen Quarz als Taktquelle verwenden" MfG Falk
@Falk: Da muss ich dir widersprechen. Man kann auch eine UARTkommunikation ohne einen externen Quarz betreiben. Wie ich in dem anderen Thread schon geschrieben habe, hat die Kommunikation auch mit dem internen Takt funktioniert. Nachdem ich den OSSCAL Wert im Programm gesetzt hatte, konnte ich auch mit dem internen Takt den UART betreiben.
Nachtrag: Ich meine natürlich OSCCAL und nicht OSSCAL...sorry.
>Nachdem ich den OSSCAL Wert im Programm gesetzt hatte, konnte ich auch >mit dem
internen Takt den UART betreiben.
Und das soll ein Anfänger auch machen? Herzlichen Glückwunsch!
@Marian >@Falk: Da muss ich dir widersprechen. Man kann auch eine Das ist dein gutes Recht und dazu ist dieses Forum auch da. ;-) >UARTkommunikation ohne einen externen Quarz betreiben. Wie ich in dem Ich kann auch ohne Sturzhelm und Versicherung Moped fahren. Die Frage ist, wie sicher ist das ganze. Und bei Elektronik im allgemeinen und dem AVR im speziellen ist die Frage immer: Wie (temperatur)stabil ist das Ganze?. Und da scheidet der interne Oszillator schlicht und ergreifend aus. Siehe Datenblatt, das Ding schwankt gut und gern +/-3% im gesamten Temperatur- und Versorgungsspannungsbereich. Dazu kommt der prinzipbedingte Fehler bei der Baudratengenerierung (8MHz ist keine "UART"Frequenz), der bei höheren Baudraten schon mal an knapp ein Prozent herranreichen kann (bei 8 MHz und 14400 Baud -0,8%). Nochmal, es geht NICHT darum, dass es bei einer Person an einem schönen Tag mal läuft, sondern darum, dass es sicher und problemlos von tausenden Leuten von Sibirien bis in die Sahara nachgebaut werden kann und auch läuft. Und gerade Anfänger tun gut daran, den UART erstmal nur mit Quarz zu betreiben. Und auch die Leute die wissen wie der Hase läuft werden selten in die Verlegenheit kommen, den UART mit internem Oszillator zu betreiben. MfG Falk
Hallo , erstmal danke fuer die Hilfe... Hab es mittlerweile hingekriegt. Dummer Fehler. Ich hatte noch eine LED gegen Masse am RX Pin, ohne ging es dann. Als externe HW ist ein Max202 dran. OSCCAL Wert hatte ich nicht gesetzt und geht jetz auch ohne. Ich hab auch die erfahrung gemacht ,dass es auch ohne Quarz ganz gut geht. Klar mit is besser, aber normalerweise funktioniert die Uart auch bei kleinen Abweichungen in der Baudrate... Tino
@tino >Klar mit is besser, aber normalerweise funktioniert die Uart auch bei >kleinen Abweichungen in der Baudrate... Bis zum nächsten Aufschrei "UART GEHT NICHT!". Lernresistenz ist auch so ein Plage . . . MFG Falk
@Rahul, der Trollige: Klar wieso nicht? Ich war damals (und bin es noch heute) auch blutiger Anfänger und habe dies getan. Das ist ja nun wirklich nicht schwer, wenn man den anderen Threa gelesen hat, denn da wurde mir das lang und breit erklärt, woran man auch erkennt, dass ich extremer Anfänger war. @Falk: Ja das weiß ich auch, dass es mit nem richtigen Quarz besser funktioniert als mit dem internen aber darum ging es ja bei seinem Problem nicht oder? Vielleicht hat er, wie ich damals auch, keinen Quarz zur Hand und muss das so hinbekommen. Da würde es ihm wenig bringen, wenn ich ihm sage das geht "nur" mit dem externen Quarz. Man kann ihn nett darauf hinweisen, das es mit dem externen wesentlich stabiler läuft und man damit dann auch die richtig hohen Baudraten erreicht aber von vorne herein sagen, das geht nicht, finde ich nicht gut. Mich wundert nur, dass es ohne diesen OSCCAL-Wert geht, da es damals bei mir daran lag und ich auch nen Atmega32 hatte. Is schon komisch diese ganze Angelegenheit. Naja, schönen Abend noch! Gruß, Marian
>Das ist ja nun wirklich nicht schwer, wenn man den anderen Threa gelesen >hat,
Genau da liegt das Problem: Wer liest schon Threads im Forum?
Ich will den internen Oszillator nicht verteufeln, aber es ist meiner
Meinung nach für einen Anfänger einfacher, wenn er mit einem externen
Quarz (-oszillator) wie im Tutorium beschrieben anfängt.
Ich benutze Baudratenquarze einfach deswegen, weil es damals als ich mit
Controllern anfing, keine internen Oszillatoren gab (kennt jemand noch
"Fifth"?).
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.