Probleme mit UART bei Atmega 32

Gast #3514670
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
Angehängte Dateien:
#3514684
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);
Gast #3514694
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....

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren