Forum: Compiler & IDEs AVR mega32 uart empfang geht nicht


von tino (Gast)


Lesenswert?

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 ?

von tino (Gast)


Lesenswert?

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 

von Marian (Gast)


Lesenswert?

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

von Oliver (Gast)


Lesenswert?

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

von Falk (Gast)


Lesenswert?

@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


von Marian (Gast)


Lesenswert?

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

von Marian (Gast)


Lesenswert?

Nachtrag: Ich meine natürlich OSCCAL und nicht OSSCAL...sorry.

von Rahul, der Trollige (Gast)


Lesenswert?

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

von Falk (Gast)


Lesenswert?

@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


von tino (Gast)


Lesenswert?

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

von Falk (Gast)


Lesenswert?

@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

von Marian (Gast)


Lesenswert?

@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

von Rahul, der Trollige (Gast)


Lesenswert?

>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
Noch kein Account? Hier anmelden.