Hi, mit dem folgenden Code möchte ich ein Byte über der UART vom Atmega169 senden. Das ganze funktioniert soweit nur wenn RTC_init() nicht ausgeführt wird, sonst wird nichts gesendet. In meinem Beispiel wird der interne RC Oszillator verwendet. Was ist die Ursache?
1 | int main( void ) |
2 | {
|
3 | clock_init_1MHz(); |
4 | |
5 | //RTC_init();
|
6 | USART_Init(12); // 9600bps bei 1MHz |
7 | |
8 | __enable_interrupt(); |
9 | |
10 | for(;;) |
11 | {
|
12 | Delay(1000); |
13 | Usart_Tx(0x5A); |
14 | }
|
15 | }
|
16 | |
17 | void clock_init_1MHz(void) |
18 | {
|
19 | CLKPR = (1<<CLKPCE); // set Clock Prescaler Change Enable |
20 | |
21 | // set prescaler = 8, Inter RC 8Mhz / 8 = 1Mhz
|
22 | CLKPR = (1<<CLKPS1) | (1<<CLKPS0); |
23 | }
|
24 | |
25 | void Delay(unsigned int millisec) |
26 | {
|
27 | int i; |
28 | |
29 | while (millisec--) |
30 | for (i=0; i<125; i++); |
31 | }
|
32 | |
33 | void USART_Init(unsigned int baudrate) |
34 | {
|
35 | // Set baud rate
|
36 | UBRR0H = (unsigned char)(baudrate>>8); |
37 | UBRR0L = (unsigned char)baudrate; |
38 | |
39 | // Enable 2x speed
|
40 | UCSR0A = (1<<U2X0); |
41 | |
42 | // Enable receiver and transmitter
|
43 | UCSR0B = (1<<RXEN0)|(1<<TXEN0)|(0<<RXCIE0)|(0<<UDRIE0); |
44 | |
45 | // Async. mode, 8N1
|
46 | UCSR0C = (0<<UMSEL0)|(0<<UPM00)|(0<<USBS0)|(3<<UCSZ00)|(0<<UCPOL0); |
47 | }
|
48 | |
49 | void Usart_Tx(char data) |
50 | {
|
51 | while (!(UCSR0A & (1<<UDRE0))); |
52 | UDR0 = data; |
53 | }
|
54 | |
55 | void RTC_init(void) |
56 | {
|
57 | Delay(1000); // wait for 1 sec to let the Xtal stabilize after a power-on, |
58 | |
59 | __disable_interrupt(); // disabel global interrupt |
60 | |
61 | cbi(TIMSK2, TOIE2); // disable OCIE2A and TOIE2 |
62 | |
63 | ASSR = (1<<AS2); // select asynchronous operation of Timer2 |
64 | |
65 | TCNT2 = 0; // clear TCNT2A |
66 | TCCR2A |= (1<<CS22) | (1<<CS20); // select precaler: 32.768 kHz / 128 = 1 sec between each overflow |
67 | |
68 | while((ASSR & (0x01 | 0x04))); // wait for TCN2UB and TCR2UB to be cleared |
69 | |
70 | TIFR2 = 0xFF; // clear interrupt-flags |
71 | sbi(TIMSK2, TOIE2); // enable Timer2 overflow interrupt |
72 | |
73 | OCR2A = 200; // set timer2 compare value |
74 | |
75 | __enable_interrupt(); // enable global interrupt |
76 | }
|
Gruss Owen