Forum: Compiler & IDEs UART falsch beim Systemtakt von 2MHz


von Owen S. (senmeis)


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

von Michael D. (etzen_michi)


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.

von Patrick (Gast)


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?

von (prx) A. K. (prx)


Lesenswert?

Michael D. schrieb:

> 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.

Andersrum könnte das stimmen, aber bei exakt doppeltem Takt gegenüber 
einer funktionierenden Konfiguration kann das nicht fehlschlagen.

von (prx) A. K. (prx)


Lesenswert?

Owen Senmeis schrieb:

> 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:

Welche Taktquelle? Der interne RC-Oszillator des 169 ist für 
zuverlässigen UART-Betrieb nicht genau genug.

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.