Forum: Mikrocontroller und Digitale Elektronik ATmega328 UART Baudratenproblem


von Markus (Gast)


Angehängte Dateien:

Lesenswert?

Ich möchte ein einfaches Zeichen über den UART senden und dieses mit 
einem Terminalprogramm anzeigen. Das Ganze funktioniert auch wenn ich 
als Baudrate 9600 verwende.
Bei jeder anderen Baudrate bekomme ich nur Mist.(habe sie auch immer im 
Terminal entsprechend angepasst) Vieleicht kann mir jemand helfen.
Danke

Controller: ATmega 328 P
Takt: Externer 16Mhz Quarz
Programmierumgebung: Atmel Studio 6.0
Einstellung der Fuses siehe Anhang
1
#include <avr/io.h>
2
#define F_CPU 16000000UL    
3
#include <util/delay.h>
4
5
6
7
//Daten für Uart Kommunikation
8
#define FOSC 16000000 // Clock Speed
9
#define BAUD 9600
10
#define MYUBRR FOSC/16/BAUD-1
11
12
void USART_Init( unsigned int ubrr)
13
{
14
  /*Set baud rate to 9600 */
15
  UBRR0H = (unsigned char)(ubrr>>8);
16
  UBRR0L = (unsigned char)ubrr;
17
  /*Enable receiver and transmitter */
18
  UCSR0B = (1<<RXEN0)|(1<<TXEN0);
19
  UCSR0A = (1<<UDRE0);
20
  /* Set frame format: 8data, 1stop bit */
21
  //UCSR0C = (1<<USBS0)|(3<<UCSZ00);
22
  UCSR0C =  (1 << UCSZ01) | (1 << UCSZ00);    // Set frame: 8data, 1 stp
23
}
24
25
26
27
28
int main(void)
29
{
30
  
31
  USART_Init(MYUBRR);
32
  
33
    while(1)
34
    {    
35
    UDR0 = 'k';
36
    _delay_ms(500);            
37
    }  
38
  
39
}

von Peter II (Gast)


Lesenswert?

teste mal mit

#define FOSC 16000000UL // Clock Speed

warum überhaupt 2 mail die clock festlegen, warum nicht gleich F_CPU 
verwenden? Noch besser F_CPU in makefile/projekt festlegen und aus der 
Datei entfernen.

von Markus (Gast)


Lesenswert?

Ja stimmt schon, nur löst das nicht mein Problem.
Bitte weiter um Hilfe

von Uwe (de0508)


Lesenswert?

Hallo Markus,

da musst du dir den Baudratenfehler ausrechnen.

16MHz @9600Baud Fehler 0,16%
16MHz @19200Baud Fehler 0,16%

es gilt diese Formel für Ganzezahlen

Baudratengenerator = F_CPU  16  Baudrate -1

Steht alles im Datenblatt deines µC.

Vielleicht schneller über diesen Link:

http://www.kreatives-chaos.com/artikel/baudraten-tabelle-fuer-avrs

von Markus (Gast)


Lesenswert?

Danke für die schnelle Antwort
Der Baudratenfehler liegt laut Datenblatt für 9600 und auch für 19200 
baud bei 0.2%
Wenn ich 9600 verwende funktioniert die Kommunikation bei 19200 
allerdings nicht

von Michael D. (nospam2000)


Lesenswert?

Markus schrieb:
> #define F_CPU 16000000UL
> #define FOSC 16000000 // Clock Speed

Der Screenshot deiner Fuses sagt, dass du einen 8Mhz Quarz eingestellt 
hast. Das passt nicht zu diesen Zahlen.

  Michael

von Markus (Gast)


Lesenswert?

Hab aber keine Möglichkeit einen 16Mhz Quarz auszuwählen. Wie lautet die 
korrekte Fuse - Einstellung?

von Markus (Gast)


Lesenswert?

Wenn ich eine LED mit delay im Sekundentakt blinken lasse, so 
funktioniert dies bestens. Bei falschen Fuse Settings müsste dann ja 
auch die delay Funktion falsch arbeiten oder?
Die ganzen Fuse Settings waren schon eingestellt, da ich den Atmega von 
einem Arduino Uno verwende und diesen mit einem ISP Programmer nun vom 
Atmel Studio aus Progrmmiere.
Das Arduino Board wurde auch mit einem 16Mhz Quarz getaktet.

von Spess53 (Gast)


Lesenswert?

Hi

>Der Screenshot deiner Fuses sagt, dass du einen 8Mhz Quarz eingestellt
>hast. Das passt nicht zu diesen Zahlen.

Das ist die Einstellung für >=8MHz. Passt also.

MfG Spess

von Markus (Gast)


Lesenswert?

Woran kann mein Problem nun also noch liegen?

von Karlheinz (Gast)


Lesenswert?

Hallo,

probier mal

  UBRR0 = (F_CPU  8  BAUD - 1) / 2;

steht nahezu überall in den Beispielprogrammen so !!!

von Jim M. (turboj)


Lesenswert?

Michael Dreher schrieb:
> Der Screenshot deiner Fuses sagt, dass du einen 8Mhz Quarz eingestellt
> hast.

Heisst "ExtOSC" nicht "externer Oszillator"? Dann würde es mit einem 
Quarz gar nicht tun.

Für einen Quarz muss da was mit "Crystal" stehen IIRC.

von Karlheinz (Gast)


Lesenswert?

Nochmal,

jetzt ist da was blödes passiert ???
Es muss lauten:

> UBRR0=(F_CPU/8/baud-1)/2;

von Markus (Gast)


Lesenswert?

Hab ich mir auch schon gedacht, funktioniert aber

von Markus (Gast)


Lesenswert?

Bezüglich der Fuse Settings

von Markus (Gast)


Lesenswert?

Hallon nochmal

Habe nun mit der Einstellung UBRR0=(F_CPU/8/baud-1)/2 versucht und 
erhalte dasselbe Resultat.

Einzig und allein die 9600 baud funktionieren, jede andere Baudrate 
nicht
Bitte um Hilfe

von Peter II (Gast)


Lesenswert?

jetzt trage doch mal direkt die Werte aus der Baudraten-Tabelle in

UBRR0H und
UBRR0L

ein.

von Spess53 (Gast)


Lesenswert?

Hi

>Heisst "ExtOSC" nicht "externer Oszillator"? Dann würde es mit einem
>Quarz gar nicht tun.

>Für einen Quarz muss da was mit "Crystal" stehen IIRC.

Es heißt: EXTXOSC_8MHZ_XX_16KCK_14CK_65MS und das bedeutet:

Ext. Crystal Osc. 8.0- MHz; Start-up time PWRDWN/RESET: 16K CK/14 CK + 
65 ms

MfG Spess

von ... (Gast)


Lesenswert?

Baudratenquarz verwenden.

von Toff (Gast)


Lesenswert?

Zeig doch mal deinen Schaltplan und sage uns wie die Schaltung am PC 
angeschlossen ist.

von Wolfgang (Gast)


Lesenswert?

... schrieb:
> Baudratenquarz verwenden.

Und warum soll es damit besser gehen?
Mit 16MHz-Quarz ergibt sich für 9k6 und 19k2 Baud der selbe Fehler von 
0.2%. Für die Flanke des Stop-Bits liegt der Fehler also unter 2% der 
Symboldauer. Der Baudratenfehler ist in dem Fall also allenfalls von 
theoretischem Interesse.

von Markus (Gast)


Lesenswert?

Hallo Peter

Hab ich auch schon versucht mit dem gleichen Ergebnis.
Baudratenquarz schön und gut, aber warum funktioniert dann der UART am 
Arduino der ebenfalls mit einem 16Mhz Quarz getaktet wird in den 
verschiedensten Baudraten?
Bin am verzwiefeln

von Wolfgang (Gast)


Lesenswert?

Markus schrieb:
> Bin am verzwiefeln

Hast du denn jetzt mal die im Datenblatt angegebenen Werte aus Tab. 20-7 
direkt in die BR-Register geschrieben.

von holger (Gast)


Lesenswert?

>Die ganzen Fuse Settings waren schon eingestellt, da ich den Atmega von
>einem Arduino Uno verwende und diesen mit einem ISP Programmer nun vom
>Atmel Studio aus Progrmmiere.
>Das Arduino Board wurde auch mit einem 16Mhz Quarz getaktet.

Und der Atmega sitzt jetzt wo? Auf einem Steckbrett?
Zeig deinen Aufbau doch mal. Abblockkondensatoren vorhanden?

Ohne weitere Infos kann man nur noch ins blaue raten.
Falsche HEX Datei gebrannt?

von Markus (Gast)


Lesenswert?

Hallo

Problem gelöst.

Möchte mich bei euch entschuldigen war mein Fehler.

Ich empfange die Daten vom Atmega mit einem Arduino Board und gebe sie 
von dort aus auf dem Terminal aus. Hab die Baud im Terminalprogramm zwar 
immer entsprechend geändert, jedoch nicht im Arduino Programm.

Sorry und trotzdem Danke für die hilfreichen Antworten

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.