ATmega328 UART Baudratenproblem

Gast #3236870
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
}
Angehängte Dateien:
Gast #3236893
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.
Gast #3237044
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
Gast #3237084
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.
Gast #3237145
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
Gast #3237156
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
Gast #3237181
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.
Gast #3237187
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
Gast #3237202
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?
Gast #3237206
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

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