PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : UART einstellung falsche baudrate???



ricola
03.01.2008, 17:15
Hallo,

ich möchte mit meinem ATmega169 Zeichen über die serielle
Schnittstelle ausgeben. Ich will dazu 19200 als Baudrate einstellen,
aber wenn ich mir die Zeichen am Terminal ansehe kommt nur
Quatsch raus, außerdem sind die Bits am Oszy nur 400µs lang, also
eine Baudrate von 2400.....



#define MYF_CPU 8000000UL
#define BAUDRATE 19200UL
#define MYUBRR MYF_CPU/16/BAUDRATE-1

uint16_t ubrr = MYUBRR;


static void initUSART(void)
{

UBRRH = (uint8_t) (ubrr>>8);
UBRRL = (uint8_t) (ubrr);

// UART start receiver and transmitter
// data mode 8N1, asynchronous
UCSRB = (1 << RXEN) | (1 << TXEN);
UCSRC = (1 << UCSZ1) | (1 << UCSZ0);

// flush receive-buffer
do
{
UDR;
}
while (UCSRA & (1 << RXC));
}


static inline int sendChar (const uint8_t c)
{
// wait for uart -> ready
while (!(UCSRA & (1 << UDRE)))
;

// write/send char
UDR = c;

return 1;
}


Idee? Danke!

RICOLA

liggi
03.01.2008, 17:21
baudrate-1 bei #define MYUBRR MYF_CPU/16/BAUDRATE-1 muss in klammer oder ist das so gedacht, das zum schluss eins abgezogen wird?? Kenn mich nicht mit uart aus.

mfg liggi

ricola
03.01.2008, 17:26
so stehts im datenblatt, aber auch mit klammer selbes problem

PicNick
03.01.2008, 17:35
Schau die mal da die Baudraten definition genau an ( das "L" bei "16" ist wichtig)

#define USART_BAUD_SELECT (F_CPU/(USART_BAUD_RATE*16L)-1)

die funktioniert definitiv (wenn die Quartzeinstellung/fuses stimmt, logo)

radbruch
03.01.2008, 17:40
Hallo

Meine Formel für einen 8MHz-ATMega32:

#define BAUD 38400 // 38400 Baud
#define UBRR_BAUD ((F_CPU/(16*BAUD))-1)

Und das Init für 8n1:

UBRRH = UBRR_BAUD >> 8; // UART 38400 Baud
UBRRL = (uint8_t) UBRR_BAUD;
UCSRA = 0x00;
UCSRC = (1<<URSEL)|(1<<UCSZ1)|(1<<UCSZ0);
UCSRB = (1 << TXEN) | (1 << RXEN) | (1 << RXCIE);

(angelehnt an die RP6-Lib)

Gruß

mic

ricola
03.01.2008, 18:12
hallo, danke, ich war zu doof das CKDIV8 fuse-bit rauszunehmen,
da kann es nicht funktionieren! dank.

gruß
ricola