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