Hallo Leute, Folgendes Problem ich nutze einen ATMega8 und Atmen Studio 6. Ich versuche eine Kommunikation mit Hilfe des USART aufzubauen. Folgenden Code habe ich aus den Tutorials. Es sollte mir Also eigentlich genau das zurückschicken was ich ihm sende. Anbei ein Foto von dem was ich zurück bekomme. Kann mir das jmd erklären ?
1 | #include <avr/io.h> |
2 | #include <util/delay.h> |
3 | #include <avr/interrupt.h> |
4 | |
5 | #ifndef F_CPU
|
6 | #warning "F_CPU war noch nicht definiert, wird nun nachgeholt mit 4000000"
|
7 | #define F_CPU 4000000UL
|
8 | #endif
|
9 | |
10 | #define BAUD 9600UL
|
11 | |
12 | #define UBRR_VAL ((F_CPU+BAUD*8)/(BAUD*16)-1)
|
13 | #define BAUD_REAL (F_CPU/(16*(UBRR_VAL+1)))
|
14 | #define BAUD_ERROR ((BAUD_REAL*1000)/BAUD)
|
15 | |
16 | #if ((BAUD_ERROR<990) || (BAUD_ERROR>1010))
|
17 | #error Systematischer Fehler der Baudrate gršsser 1% und damit zu hoch!
|
18 | #endif
|
19 | |
20 | void uartInit(void); |
21 | |
22 | int main(void) |
23 | {
|
24 | //PORTB als Eingänge mit internen Pull-Ups ausser PB0 & PB1 setzen
|
25 | DDRB = 0x00; |
26 | PORTB = 0xFC; |
27 | |
28 | //PORTC die ersten 4 Bits auf Ausgänge setzten
|
29 | DDRC = 0x0F; |
30 | |
31 | uartInit(); //USART init |
32 | sei(); //Interrupts erlauben |
33 | |
34 | //Hauptschleife
|
35 | while(1) |
36 | {
|
37 | PORTC |= (1<<PC2); |
38 | _delay_ms(1000) ; |
39 | PORTC &= ~(1<<PC2); |
40 | _delay_ms(1000); |
41 | }
|
42 | }
|
43 | |
44 | //############# UART ###########
|
45 | void uartInit(void) |
46 | {
|
47 | UBRRH = (unsigned char) (UBRR_VAL >> 8); |
48 | UBRRL = (unsigned char) UBRR_VAL; |
49 | |
50 | UCSRB = (1<<TXEN) | (1<<RXEN) | (1<<RXCIE) | (1<<TXCIE) ; |
51 | UCSRC = (1<<URSEL) | (1<<UCSZ1) | (1<<UCSZ0); |
52 | }
|
53 | |
54 | #define UART_MAXSTRLEN 10
|
55 | |
56 | volatile uint8_t uart_str_complete = 0; // 1 .. String komplett empfangen |
57 | volatile uint8_t uart_str_count = 0; |
58 | volatile char uart_string[UART_MAXSTRLEN + 1] = ""; |
59 | ISR(USART_RXC_vect) |
60 | {
|
61 | unsigned char nextChar; |
62 | |
63 | // Daten aus dem Puffer lesen
|
64 | nextChar = UDR; |
65 | if( uart_str_complete == 0 ) { // wenn uart_string gerade in Verwendung, neues Zeichen verwerfen |
66 | |
67 | // Daten werden erst in uart_string geschrieben, wenn nicht String-Ende/max Zeichenlänge erreicht ist/string gerade verarbeitet wird
|
68 | if( nextChar != '\n' && |
69 | nextChar != '\r' && |
70 | uart_str_count < UART_MAXSTRLEN ) { |
71 | uart_string[uart_str_count] = nextChar; |
72 | uart_str_count++; |
73 | } else { |
74 | uart_string[uart_str_count] = '\0'; |
75 | uart_str_count = 0; |
76 | uart_str_complete = 1; |
77 | uartPutStr(uart_string); |
78 | }
|
79 | }
|
80 | }
|
81 | |
82 | //++++++++++ SEND +++++++++++
|
83 | int uartPutChar(unsigned char c) |
84 | {
|
85 | while (!(UCSRA & (1<<UDRE))) |
86 | ;
|
87 | UDR = c; |
88 | return 0; |
89 | }
|
90 | void uartPutStr (char *s) |
91 | {
|
92 | while (*s) |
93 | {
|
94 | uartPutChar(*s); |
95 | s++; |
96 | }
|
97 | }
|