Hallo,
im moment versuche ich, dass mein ATMEGA8 mit meinem PC über den
seriellen Port kommuniziert. Mit einem MAX232 funktioniert das auch
soweit ganz gut, allerdings lassen sich nur Buchstaben, also "a"-"z" und
"A"-"Z" senden. Die Routinen um den UART des ATMEGAs zu initialisieren
und um Zeichen zu senden habe ich aus dem Datenblatt "abgeschrieben".
1 | #ifndef F_CPU
|
2 | #warning "F_CPU nicht definiert"
|
3 | #define F_CPU 8000000UL
|
4 | #endif
|
5 |
|
6 | #define BAUD 9600
|
7 |
|
8 | #define UBRR_VAL ((F_CPU + BAUD * 8) / (BAUD * 16) - 1)
|
9 | #define BAUD_REAL (F_CPU / (16 * (UBRR_VAL + 1)))
|
10 | #define BAUD_ERROR ((BAUD_REAL * 1000) / BAUD)
|
11 |
|
12 | #if ((BAUD_ERROR < 990) || (BAUD_ERROR > 1010))
|
13 | #error "Zu Hohe BAUDRATE"
|
14 | #endif
|
15 |
|
16 | #define MYUBRR F_CPU / 16 / BAUD - 1
|
17 |
|
18 |
|
19 | #include <avr/io.h>
|
20 |
|
21 | void UART_init (unsigned int ubrr)
|
22 | {
|
23 | UBRRH = (unsigned char) (ubrr>>8);
|
24 | UBRRL = (unsigned char) ubrr;
|
25 |
|
26 | UCSRB = (1<<TXEN);
|
27 |
|
28 | UCSRC = (1<<URSEL) | (1<<USBS) | (1<<UCSZ0);
|
29 | }
|
30 |
|
31 | void UART_Transmit (unsigned char data)
|
32 | {
|
33 | while (! (UCSRA & (1<<UDRE))){}
|
34 |
|
35 | UDR = data;
|
36 | }
|
37 |
|
38 | int main (void)
|
39 | {
|
40 | UART_init (MYUBRR);
|
41 |
|
42 | while (1)
|
43 | {
|
44 | UART_Transmit ('a') //kommt richtig an
|
45 | UART_Transmit ('1') //es kommt ein "q" an
|
46 | _delay_ms (1000);
|
47 | }
|
48 | return 1;
|
49 | }
|
Wo liegt in dem Quellcode der fehler? Wenn ich die RXD und TXD Leitung
vom Seriellen Port aneinanderschließe und ein "1" sende kommt auch eine
"1" an.