Hallo Leute, ich habe ein großes Problem mit der UART-Schnittstelle meines AT90CAN128. Ich bekomme Sie nicht ans laufen finde aber leider auch den Fehler nicht. Vielleicht könnt ihr mir weiterhelfen. Es sollen einfach nur einen Zeichen mit Hterm vom PC auf den AT90CAN128 übertragen werden. Bin blind für den Fehler! Hier den Code:
1 | #define F_CPU 16000000
|
2 | #define UART_MAXSTRLEN 10
|
3 | |
4 | #include <avr/io.h> |
5 | #include <avr/interrupt.h> |
6 | |
7 | volatile uint8_t uart_str_complete = 0; // 1 .. String komplett empfangen |
8 | volatile uint8_t uart_str_count = 0; |
9 | volatile char uart_string[UART_MAXSTRLEN + 1] = ""; |
10 | enum E_MODE{Error,no_Error}; |
11 | |
12 | |
13 | E_MODE set_BAUD(uint16_t BAUD){ |
14 | uint16_t UBRR0_value; |
15 | UBRR0_value=((F_CPU+BAUD*8)/(16*BAUD))-1;//calculate the count value |
16 | UBRR0H = (UBRR0_value>>8)&0xFF; |
17 | UBRR0L = UBRR0_value&0xFF; |
18 | return no_Error; |
19 | }
|
20 | |
21 | E_MODE init_UART0(uint16_t BAUD){ |
22 | if(Error==set_BAUD(BAUD)){ |
23 | return Error; |
24 | }
|
25 | else{ |
26 | //disable multiprocessor mode and double asynchronous mode
|
27 | UCSR0A &= ~((1<<MPCM0)|(1<<U2X0)); |
28 | UCSR0B &= ~(1<<UCSZ02); //select frame size 8 bit |
29 | UCSR0C |= ((1<<UCSZ00)|(1<<UCSZ01)); //select frame size 8 bit |
30 | UCSR0C &= ~((1<<UPM00)|(1<<UPM01)); //select no parity mode |
31 | UCSR0C &= ~(1<<USBS0); //select one stop bit |
32 | UCSR0C &= ~(1<<UMSEL0); //select asynchronous mode |
33 | UCSR0B |= ((1<<RXEN0)|(1<<TXEN0)); //enable reciever, transmitter |
34 | UCSR0A |= (1<<RXCIE0); //enable receive complete interrupt |
35 | return no_Error; |
36 | }
|
37 | }
|
38 | |
39 | void lamp_control(){ |
40 | if(uart_str_complete==1){ |
41 | if(uart_string[0]=='x') PORTA=3; |
42 | if(uart_string[0]=='y') PORTA=1; |
43 | uart_str_complete=0; |
44 | }
|
45 | }
|
46 | |
47 | |
48 | |
49 | ISR(USART0_RX_vect) |
50 | {
|
51 | unsigned char nextChar; |
52 | // Daten aus dem Puffer lesen
|
53 | nextChar = UDR0; |
54 | if( uart_str_complete == 0 ) { |
55 | if( nextChar != '\n' && |
56 | nextChar != '\r' && |
57 | uart_str_count < UART_MAXSTRLEN ) { |
58 | uart_string[uart_str_count] = nextChar; |
59 | uart_str_count++; |
60 | }
|
61 | else { |
62 | uart_string[uart_str_count] = '\0'; |
63 | uart_str_count = 0; |
64 | uart_str_complete = 1; |
65 | }
|
66 | }
|
67 | }
|
68 | |
69 | |
70 | int main(void) |
71 | {
|
72 | DDRA=0xFF; |
73 | init_UART0(9600); |
74 | while(1) |
75 | {
|
76 | lamp_control(); |
77 | }
|
78 | return 0; |
79 | }
|