Hallo,
habe ein Problem mit der seriellen Schnittstelle, an dem ich nicht
weiterkomme. Ich möchte vom ATmega328 per USART asynchron 8N1 übertragen
und habe dazu folgenden Code:
1 | #include <avr/io.h>
|
2 | #include <avr/interrupt.h>
|
3 | #define FOSC 16000000 // Clock Speed
|
4 | #define BAUD 9600
|
5 | #define MYUBRR FOSC/16/BAUD-1
|
6 | void USART_Init( unsigned int ubrr);
|
7 | void uart_putc(unsigned char c);
|
8 |
|
9 | int main( void )
|
10 | {
|
11 | USART_Init((uint8_t )MYUBRR);
|
12 | UCSR0B |= (1 << TXEN0); // USART aktiv
|
13 | /*UCSR0C &= ~(1 << UMSEL01); // asynchron
|
14 | UCSR0C &= ~(1 << UMSEL00); // asynchron
|
15 | UCSR0C &= ~(1 << UPM00); // kein Paritätsbit
|
16 | UCSR0C &= ~(1 << UPM01); // kein Paritätsbit
|
17 | UCSR0C &= ~(1 << USBS0); // ein Stopbit
|
18 | UCSR0C &= ~(1 << UCSZ02); */ // 8 Bit
|
19 | UCSR0C |= (1 << UCSZ00) | (1 << UCSZ01);
|
20 | UCSR0C &= ~(1 << UCPOL0);
|
21 |
|
22 | uint8_t i=2;
|
23 |
|
24 | while(1)
|
25 | {
|
26 | uart_putc(i);
|
27 | }
|
28 | return 0;
|
29 | }
|
30 |
|
31 |
|
32 | void USART_Init( unsigned int ubrr)
|
33 | {
|
34 | UBRR0H = (unsigned char)(ubrr >> 8); // BAUD-Rate
|
35 | UBRR0L = (unsigned char) ubrr;
|
36 | }
|
37 |
|
38 | void uart_putc(unsigned char c)
|
39 | {
|
40 | while (!(UCSR0A & (1<<UDRE0))) // warten bis Senden moeglich
|
41 | {
|
42 | }
|
43 | UDR0 = c; // sende Zeichen
|
44 | }
|
Hardware wie hier
[[http://www.mikrocontroller.net/articles/Datei:AVR-RS232.png]],
Kondensatoren sind Elkos mit 10µF.
Der ATmega 328 wird mit 16 MHz extern getaktet; fuses sind ok und lfuse
richtig eingestellt, vgl. unten:
avrdude: Device signature = 0x1e950f
avrdude: safemode: lfuse reads as E0
avrdude: safemode: hfuse reads as D9
avrdude: safemode: efuse reads as 7
avrdude: safemode: lfuse reads as E0
avrdude: safemode: hfuse reads as D9
avrdude: safemode: efuse reads as 7
avrdude: safemode: Fuses OK
Es kommt nichts über die Schnittstelle. Ich bin mir nicht sicher, ob die
"f_osc", die man lt. Datenblatt für die Berechnung des UBRR-Eintrags
verwenden soll, die CPU-Frequenz ist.
Hat jemand eine Idee? Danke für Eure Hilfe!