UART falsch beim Systemtakt von 2MHz

#2486595
Lesenswert?

Hi,

ich möchte die UART Schnittstelle vom Atmega169 mit dem Systemtakt von 
1MHz und 2MHz testen. Das Problem ist, bei 1MHz ist alles in Ordung, 
aber bei 2MHz sendet die UART nur Müll. Code hier:
1
#include "main.h"
2

3
int main( void )
4
{
5
  clock_init_2MHz();
6
  //clock_init_1MHz();
7
  
8
  USART_Init(25); // 9600bps bei 2MHz
9
  //USART_Init(12); // 9600bps bei 1MHz
10
  
11
  __enable_interrupt();
12
  
13
  for(;;)
14
  {
15
      Usart_Tx(0x5A);
16
  }
17
}
18

19
void clock_init_1MHz(void)
20
{
21
  CLKPR = (1<<CLKPCE);        // set Clock Prescaler Change Enable
22
    
23
  // set prescaler = 8, Inter RC 8Mhz / 8 = 1Mhz
24
  CLKPR = (1<<CLKPS1) | (1<<CLKPS0); 
25
}
26

27
void clock_init_2MHz(void)
28
{
29
  CLKPR = (1<<CLKPCE);        // set Clock Prescaler Change Enable
30
    
31
  // set prescaler = 8, Inter RC 8Mhz / 4 = 2Mhz
32
  CLKPR = (1<<CLKPS1); 
33
}
34

35
void USART_Init(unsigned int baudrate)
36
{
37
    // Set baud rate
38
    UBRR0H = (unsigned char)(baudrate>>8);
39
    UBRR0L = (unsigned char)baudrate;
40

41
    // Enable 2x speed
42
    UCSR0A = (1<<U2X0);
43

44
    // Enable receiver and transmitter
45
    UCSR0B = (1<<RXEN0)|(1<<TXEN0)|(0<<RXCIE0)|(0<<UDRIE0);
46

47
    // Async. mode, 8N1
48
    UCSR0C = (0<<UMSEL0)|(0<<UPM00)|(0<<USBS0)|(3<<UCSZ00)|(0<<UCPOL0);
49
}
50

51
void Usart_Tx(char data)
52
{
53
    while (!(UCSR0A & (1<<UDRE0)));
54
    UDR0 = data;
55
}

Hat jemand Ideen?

Gruss
Owen
#2486610
Lesenswert?

Nabend.

Rechne mal den entstehenden Fehler aus wenn du dein System auf 2MHz 
laufen lässt.

Wenn du Pech hast läuft es bei 1MHz gerade noch so und bei 2MHz ist die 
Abweichung ein wenig anders weswegen du da nurnoch Müll bekommst.

Gestern erst gefunden: avrcalc. Ist ein Super Programm um sowas aus zu 
rechnen.
Gast #2486617
Lesenswert?

Hm, das U2X-Bit hast Du ja gesetzt; laut der Baudrate-Tabelle im 
Datasheet (Seite 175 im Rev. P / 07/06) ist der Fehler damit in beiden 
Fällen nur 0,2%.

Einen anderen Fehler sehe ich jetzt auch nicht; hast Du evtl. die 
Möglichkeit, das Signal zu oszilloskopieren?

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