Forum: Mikrocontroller und Digitale Elektronik Unterschiedliche Baudrate


von Christian J. (wernerle)


Lesenswert?

hallo zusammen,

ich probiere gerade über eine serielle Schnittstelle Daten zu senden.
Momentan will ich die Daten zum PC schicken aber später weiter in eine 
SPS.

Nun mein Problem:
Ich habe an meinen atmega32, am stk500 Port mit ex. 16MHz Quarz, die 
richtige Baudrate eingestellt (UBRRL auf Port ausgegeben). Wenn ich 
jetzt am PC die Daten empfange (programm: HTerm) bekomme ich mit der 
gleichen Baudrate wie am µC nicht die richtigen Daten. Wenn man dann 
probiert kommt man drauf, dass (aber nicht immer) mit einer anderen 
Baudrate (bei 9600 am µC-> 2400 am PC) die Daten richig empfängt und 
sendet.

Ich weiß nicht was ich da falsch mache, aber die Initialisierung müsste 
stimmen:
1
#include <avr/io.h>
2
#include <avr/interrupt.h>
3
4
#define F_CPU 16000000
5
#define BAUD 9600
6
#include <util/setbaud.h>
7
#include <util/delay.h>
8
9
volatile unsigned char x=0;
10
11
void seriel_init(void)
12
{
13
  UBRRH = UBRRH_VALUE;
14
  UBRRL = UBRRL_VALUE;  
15
  UCSRC = (1<<URSEL)|(1<<UCSZ0)|(1<<UCSZ1);
16
  UCSRB = (1<<RXEN)|(1<<TXEN);
17
  UCSRB |= (1<<RXCIE);
18
}
19
20
int main(void)
21
{
22
   seriel_init();
23
   sei();
24
   DDRB=0xff;
25
   PORTB=UBRRL;
26
   while(1)
27
   {
28
      if (UCSRA & (1<<UDRE))
29
      UDR=x;
30
      _delay_ms(10);
31
   }
32
}
33
34
ISR(USART_RXC_vect)
35
{
36
  x=UDR;
37
}
ich habe auch schon vermutet, dass es am Kabel liegen könnte (gekreutzt, 
nicht gekreutzt) aber sonst würd ich ja nicht manchmal die Richigen 
Zeichen empfangen...
Auf der PC-Schnittstelle, unter Gerätemanager, hab ich auch schon 
probiert die Baudrate zu verstellen-> jedoch bleibt das Problem...

: Bearbeitet durch User
von Arno (Gast)


Lesenswert?

Ist der Faktor zwischen "geplanter" (9600) und "funktionierender" (2400) 
Baudrate immer gleich?

Läuft der uC wirklich mit 16MHz (Fuse-Bits) oder hast du nur einen 
16MHz-Quarz drangehängt und der uC läuft trotzdem noch mit dem internen 
R/C-Oszillator oder teilt die 16MHz herunter?

MfG, Arno

von Robert D. (d0rni)


Lesenswert?

Also es sind 2 Fehler möglich:

1. du hast die Fuse CKDIV8 noch gesetzt. Dann hättest du bei 
eingestellten 8MHz nur 2MHz. Ist standardmäßig z.Bsp. beim ATtiny2313 
zum spritsparen gesetzt.

2. du hast die Start-UP time zu gering gewählt und dein externer 
Oszillator hatte nicht genug Zeit sich einzuschwingen.

Siehe: Beitrag "ATmega8515: Änderung der Taktfrequenz durch MKII?"

Braucht man eigentlich noch "#define TAKT 16000000UL"?

Edit:// hast du einen Baudratenquarz eingesetzt?

Gruss Robert

: Bearbeitet durch User
von Karl H. (kbuchegg)


Lesenswert?

Das erste was ich an deiner Stelle tun würde, ist erst mal 
sicherstellen, dass die Taktfrequenz tatsächlich die ist, die du 
glaubst.

Das ist nicht weiter schwer. Am Port B scheinst du eine Anzeige zu haben 
(LEDs?).

Die kannst du benutzen.
1
#define F_CPU 16000000
2
3
#include <avr/io.h>
4
#include <util/delay.h>
5
6
int main(void)
7
{
8
  DDRB = 0xff;
9
10
  while(1)
11
  {
12
    PORTB = 0xFF;
13
    _delay_ms( 1000 );
14
    PORTB = 0x00;
15
    _delay_ms( 1000 );
16
  }
17
}

wie du siehst, wird am Port B abwechselnd das Muster 0xFF und 0x00 
ausgegeben, mit jeweils (und das ist der springende Punkt) einem Delay 
von 1 Sekunde dazwischen. Genau auf letzteres sind wir aus. Denn die 
Zeit stimmt nur dann, wenn die F_CPU Angabe tatsächlich mit der realen 
Taktfrequenz des Prozessors übereinstimmt. Läuft der Mega mit 16Mhz, 
dann stimmen auch die 1 Sekunde Pausen. Läuft der Mega beispielsweise 
mit 8Mhz, dann wechselt die Anzeige alle 2 Sekunden. Läuft er mit 4 Mhz, 
dann sind es 4 Sekunden. Und läuft der Mega nur mit 1Mhz dann wechseln 
die Ausgänge alle 16 Sekunden den Pegel.
Das sind Zeiten, die kann man auch mit freiem Auge noch gut 
unterscheiden.

Solange diese 1 Sekunde nicht da ist, stimmt etwas mit deiner Fuse 
Einstellung nicht und er Mege läuft nicht mit 16Mhz, wie du in deinem 
Programm angegeben hast.

Das ist der erste Schritt. Solange der nicht erfolgreich absolviert ist, 
brauchst du dich um die UART erst mal nicht weiter kümmern. Denn die 
korrekte Taktfrequenz ist die Basis für die USART.

von Bernie (Gast)


Lesenswert?

CKDIV - das ist kein mega-Feature, findet man mehr bei den
Tiny's.

Der vergessene interne Oszillator statt Quarz klingt schon
plausibler.

Baudratenquarz? Ist oft nur was für Angsthasen, oder solche,
die nicht rechnen können. ;-)  Mit 16 MHz lässt sich jede
Standardbaudrate < 115k genau genug einstellen.

Hatte noch nie Probleme mit meinen Software-UARTs bis
38,2 kBd auf diversen Tiny-µCs mit 8 MHz-Quarz.

von spess53 (Gast)


Lesenswert?

Hi

>CKDIV - das ist kein mega-Feature, findet man mehr bei den
>Tiny's.

Findet man bei allen neueren ATMegas.

MfG Spess

von Christian J. (wernerle)


Lesenswert?

Muss mich mal herzlichst bedanken an alle!

Ich hab das noch nicht ganz mitbekommen, dass es da noch so Fuses zum 
einstellen gibt, die dann über den Takt bestimmen....aber ich glaub das 
merk ich mir jz das ganze Leben lang XD. Alles funktioniert so wie ich 
es will!!!


noch ne andere Frage: ist das normal, das die stk500 am Eingang wo man 
die Versorgung einspeißt angenehme Temperaturen bekommt und das bei den 
12V?

: Bearbeitet durch User
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.