baudrate UARTu - nastavení neodpovídá reálu

Zdravím, setkal jsem se se zajímavou věcí. Pro komunikaci s počítačem používám UART s nastavením baudrate 2400 8N1 bez parity. Setkal jsem se s problémem, že když jsem i v PC nastavil baudrate 2400 lezli z toho hlouposti, potom mne napadlo trochu laborovat a jakmile nastavím v PC baudrate 9600, tak vše šlape perfektně. Nastavení jsem přebral z tutoriálu na gcc z oněch známých německých stránek. Nicméně shoduje se s tím, co je napsáno v datasheetu… čím je způsoben onen rozdíl? Proč UART běhá rychleji než je nastaven?

Když se podívám do lss souboru, tak makro předá překladači korektní číslo do UBBR (25)…

Děkuji za vaše postřehy… komunikace funguje bezchybně. Jen mne zajímá ten rozpor mezi baudratem nastaveným v MCU a PC.

Používám butterfly s Atmegou 169 na výchozím 1 Mhz.

...

/****************** UART MAKRA *********************/
#define UART_TX_EN			SET(UCSRB,TXEN)
#define UART_RX_EN			SET(UCSRB,RXEN)
#define UART_ASYNCHRON_8N1	UCSRC = (1 << UCSZ1)|(1 << UCSZ0)
#define F_CPU                           1000000UL
#define BAUD				2400UL
#define UBRR_VAL	 		((F_CPU+BAUD*8)/(BAUD*16)-1)


/***************************************************/

...

void UART_init(void)
{
	UART_TX_EN;
	UART_ASYNCHRON_8N1;
	UBRRH = UBRR_VAL >> 8;
    UBRRL = UBRR_VAL & 0xFF;
}

...

void uart_putc(unsigned char c)
{
    while (!(UCSRA & (1<<UDRE)))
    {
    }                             
 
    UDR = c;
}

...

Je to tím že oscilátor v mikroprocesoru běží ve skutečnosti 4x rychleji než jste zadal v kódu.

Nejjednodušší způsob jak zjistit kmitočet oscilátoru je vytvořit jednoduchý program, který bliká ledkou jednou za vteřinu.