UART falsch beim Systemtakt von 2MHz

OP #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

Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt. Bitte hier nur auf die ursprüngliche Frage antworten, für neue Fragen einen neuen Beitrag erstellen.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.