Forum: Compiler & IDEs USART Baudrate berechnungsfehler - Mega8


von Nick M. (nickma)


Angehängte Dateien:

Lesenswert?

Hallo,

Meine Baudrate wird falsch berechnet.
Und zwar kommt bei folgendem Code (wo ja wohl 9600 rauskommen sollte), 
eine Baudrate von 19200; Partity None; 8 Data Bits; 1 Stop Bit raus.

Und ich weiß nicht wo der fehler liegt.
-) Atmega8
-) Ext. XTAL 4MhZ
-) Datenübertragung generell geht... hald nur mit 19200 Baud
C-File im Anhang.
1
#ifndef F_CPU
2
#define F_CPU 4000000
3
#endif
4
#define UART_BAUD_RATE 9600
5
// Hilfsmakro zur UBRR-Berechnung ("Formel" laut Datenblatt) 
6
#define UART_UBRR_CALC(BAUD_,FREQ_) ((FREQ_)/((BAUD_)*16L)-1)
7
8
unsigned char get;
9
10
11
void init_uart(void)
12
{
13
  UCSRA &= (0<<U2X);
14
  UCSRB |= (1<<TXEN);  //Transmitter Enabled
15
  UCSRC |= (1<<URSEL) | (3<<UCSZ0);  //Asynchron 8N1
16
  
17
  UCSRB |= (1<<RXEN);  //Emfpang enabl
18
19
  UBRRH=(uint8_t) (UART_UBRR_CALC(UART_BAUD_RATE,F_CPU)>>8);
20
  UBRRL=(uint8_t)UART_UBRR_CALC(UART_BAUD_RATE,F_CPU);
21
  //UBRRH=0;
22
  //UBRRL= 25;  //19200 -> 25,0416
23
}
24
25
26
27
int uart_putc(unsigned char c)
28
{
29
  while (!(UCSRA & (1<<UDRE))); // wait for empty (UartDataRegisterEmpty) transmit buffer
30
  UDR = c; // put data into buffer, sends the data
31
  return 0;
32
}


Nehme an dass es irgend was banales sein wird... -.-

Greez
Nick

von Johannes M. (johnny-m)


Lesenswert?

Mal mit
1
#define F_CPU 4000000UL
versucht? Ist auch wirklich ein 4 MHz-Takt eingestellt?

von Stefan B. (stefan) Benutzerseite


Lesenswert?

1/ Folgendes kann dir in AVRStudio einen Vogel zeigen:
(ganz aktuell siehe Beitrag "Dringendes Problem mit UART+Baudrate.")

#ifndef F_CPU
#define F_CPU 4000000
#endif

2/ Welchen Wert haben die Fuses? Hoffentlich nicht Interner RC-Oszi bei 
8 MHz...

von Karl H. (kbuchegg)


Lesenswert?

Das hier

>  UCSRA &= (0<<U2X);

macht nicht das was du denkst das es tun sollte.

Sollte allerdings keine grosse Rolle spielen, da U2X
per Default ja ausgeschaltet ist.

Aber probieren kann erst mal nicht schaden.
Korregier das mal zu

  UCSRA &= ~(1<<U2X);

von Nick M. (nickma)


Lesenswert?

Hallo

Habe jetzt
1
#define F_CPU 4000000UL
eingestellt, ohne Veränderung.

Die Fuses sind wie folgt gesetzt:
CKSEL= 0111    SUT= 01
Sollte als ein "Ext. RC Osc. 3.0MHz - 8.0MHz; Start-up time: 18CK + 4ms; 
sein.
Und Extern hängt ein 4.0 MHz Quarz

1
UCSRA &= ~(1<<U2X);
Das habe ich auch nur zur kontrolle eingespielt, weil es eben per 
Default aus 0 sein müsste. Habe es ausgebessert, ohne Erfolg.

von Nick M. (nickma)


Lesenswert?

OK, PROBLEM GEFUNDEN:
Auf anregung von "Stefan B." (Danke auf dem Weg) habe ich mich im 
Beitrag: Beitrag "Dringendes Problem mit UART+Baudrate." umgesehen.

Die Fuses waren für meinen externen XTAL 4.0 MHz (STK500) nicht richtig 
gesezt.
VORHER:
CKSEL= 0111    SUT= 01
Ext. RC Osc. 3.0MHz - 8.0MHz; Start-up time: 18CK + 4ms;
JETZT (richtig):
CKSEL= 1111    SUT= 01
Ext. Crystal/Resonator High Freq.; Start-up time: 16K CK + 0ms

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.