Forum: Mikrocontroller und Digitale Elektronik Probleme mit UART bei Atmega 32


von Dennis (Gast)


Angehängte Dateien:

Lesenswert?

Guten Tag zusammen,

ich habe einen Atmega32 (1MHz interner Oszillator) über die Spare-RS232 
des STK500 an meinen PC angeschlossen und lasse vom Controller eine Zahl 
(z.B. 1) an den PC senden. Die RS232 am Computer steuere ich mit HTERM.
Im Anhang dazu zwei Bilder:
FREQ.PNG zeigt die in AVR Studio ausgewählte Prozessorfrequenz
HTERM.PNG zeigt die Einstellung in HTERM.

Zu Beginn lege ich zwei Konstanten fest, um später den Teiler für die 
Baudrate zu ermitteln. Die Funktion putch sendet das Zeichen.
Konfiguriert wird asynchrone Betriebsart, keine Parität, 1 Stoppbit, 8 
Datenbits
1
#define TAKT       1000000ul
2
#define BAUD       9600ul
3
4
void putch(unsigned char x);
5
6
void putch(unsigned char x)
7
{
8
  while(!(UCSRA & (1 << UDRE)));
9
  UDR = x;
10
}
11
12
int main (void)
13
{
14
  UBRRL = (TAKT / (16ul * BAUD)) - 1ul;// Baudrate mit TAKT und BAUD
15
  UCSRB |= (1 << TXEN) | (1 << RXEN);// Sender und Empfänger ein
16
  UCSRC |= (1 << URSEL) | (1 << UCSZ1) | (1 << UCSZ0); // UART, keine Parität, 1 Stoppbit, 8 Datenbits
17
18
  x = UDR;  // Empfänger leeren
19
  putch(1); //Zeichen senden
20
21
while(1)
22
{
23
24
}
25
26
}

Es wird also beim Neustart des Controllers eine 1 an COM4 gesendet.

Problem:

HTERM empfängt Schrott. Siehe Bild HTERM02.PNG (Einmal wurde die 1 
gesendet, das zweite Mal eine Zwei).
Der empfangene Wert ist immer um 128 zu hoch, das MSB steht immer auf 1.

Ich habe drei verschiedene Controller ausprobiert. Das Verhalten ist 
stets exakt gleich. Damit kann ich einen Defekt ausschließen.

Hat hier jemand eine Idee, wo hier der Hund begraben liegt?


Viele Grüße

Dennis

von Ingo (Gast)


Lesenswert?

Versuch mal putchar('1')

von Dennis (Gast)


Lesenswert?

Ingo schrieb:
> Versuch mal putchar('1')

Gleiches Verhalten. HTERM empfängt dezimal 177, als0 128 höher als "1".

von Ingo (Gast)


Lesenswert?

Schalte dein HTERM mal auf ASCII

von René B. (reneb)


Lesenswert?

Dein interner Oszillator will wohl nicht so richtig (ist einfach sehr 
fehlerbehaftet). Tweake den Baudratenteiler mal vorsichtig um 1..2 hoch 
oder runter vom idealen Wert und geh noch weiter runter in der Baudrate 
(2400, 4800).
Außerdem kannst du mal ne Endlosschleife schreiben und alle sek. ein 
Zeichen raushauen. Billiglösung ist _delay_ms(millisekunden);

: Bearbeitet durch User
von Dennis (Gast)


Angehängte Dateien:

Lesenswert?

Ingo schrieb:
> Schalte dein HTERM mal auf ASCII

Das habe ich. Schau Dir das Bild an.

von Bernhard S. (dl9rdw)


Lesenswert?

Schaut doch aus als hätte das was mit dem Vorzeichenbit zu tun.
Wenn immer das linke Bit gesetzt ist riecht das irgendwie danach.

: Bearbeitet durch User
von Dennis (Gast)


Lesenswert?

René B. schrieb:
> Dein interner Oszillator will wohl nicht so richtig (ist einfach sehr
> fehlerbehaftet). Tweake den Baudratenteiler mal vorsichtig um 1..2 hoch
> oder runter vom idealen Wert und geh noch weiter runter in der Baudrate
> (2400, 4800).

Klasse! Mit 4800 geht es auch ohne Optimierung....Das erklärt auch, 
warum das Problem erst heute auftrat, obwohl das in der Vergangenheit 
schon funktioniert hat....unglaublich....

von Dennis (Gast)


Lesenswert?

Vielen Dank!

von Ingo (Gast)


Lesenswert?

Benutz doch einfach die Routine im Tutorial, die rechnet für dich den 
Fehler aus und erspart dir ne Menge Ärger

von Dennis (Gast)


Lesenswert?

Ingo schrieb:
> Benutz doch einfach die Routine im Tutorial, die rechnet für dich den
> Fehler aus und erspart dir ne Menge Ärger

Welches Tutorial?!

von Ingo (Gast)


Lesenswert?

Das hier im Forum?!

von Falk B. (falk)


Lesenswert?


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.