Hallo Leute, hab an meinem Atmega8 einen Max232 und habe jetzt eine wenig Code zusammenschustert der durch einen Interrupt einen String einließt und diesen dann ausgiebt. Funktioniert leider noch nicht so ganz.
1 | #include <avr/io.h> |
2 | #include <stdlib.h> |
3 | #include <avr/interrupt.h> |
4 | #define F_CPU 4000000
|
5 | #include <util/delay.h> |
6 | #define BAUD 9600
|
7 | #define UBRR_VAL F_CPU/16/BAUD-1
|
8 | |
9 | volatile uint16_t wert; |
10 | |
11 | |
12 | #define UART_MAXSTRLEN 10
|
13 | |
14 | volatile uint8_t uart_str_complete = 0; // 1 .. String komplett empfangen |
15 | volatile uint8_t uart_str_count = 0; |
16 | volatile char uart_string[UART_MAXSTRLEN + 1] = ""; |
17 | |
18 | char buffer[10]; // oder ein anderer passender Wert |
19 | |
20 | |
21 | void delay_ms(int delay) |
22 | {
|
23 | int i; |
24 | for (i=0;i<=delay;i++) |
25 | {
|
26 | _delay_ms(1); |
27 | }
|
28 | }
|
29 | |
30 | void init_uart(unsigned int ubrr) |
31 | {
|
32 | UBRRH = (unsigned char)(ubrr>>8); |
33 | UBRRL = (unsigned char)(ubrr); |
34 | UCSRB |= (1<<RXEN); |
35 | UCSRB |= (1<<TXEN); |
36 | UCSRB |= (1<<RXCIE); |
37 | UCSRC = (1<<URSEL)|(1<<USBS)|(3<<UCSZ0); |
38 | }
|
39 | |
40 | void send_char(unsigned char data) |
41 | {
|
42 | while (!(UCSRA & (1<<UDRE))); |
43 | UDR = data; |
44 | }
|
45 | |
46 | void send_string(char *data) |
47 | {
|
48 | while (*data) |
49 | {
|
50 | send_char(*data); |
51 | data++; |
52 | }
|
53 | }
|
54 | |
55 | |
56 | |
57 | ISR(USART_RXC_vect) |
58 | {
|
59 | unsigned char nextChar; |
60 | |
61 | // Daten aus dem Puffer lesen
|
62 | nextChar = UDR; |
63 | if( uart_str_complete == 0 ) { // wenn uart_string gerade in Verwendung, neues Zeichen verwerfen |
64 | |
65 | // Daten werden erst in string geschrieben, wenn nicht String-Ende/max Zeichenlänge erreicht ist/string gerade verarbeitet wird
|
66 | if( nextChar != '\n' && |
67 | nextChar != '\r' && |
68 | uart_str_count < UART_MAXSTRLEN - 1 ) { |
69 | uart_string[uart_str_count] = nextChar; |
70 | uart_str_count++; |
71 | }
|
72 | else { |
73 | uart_string[uart_str_count] = '\0'; |
74 | uart_str_count = 0; |
75 | uart_str_complete = 1; |
76 | }
|
77 | }
|
78 | }
|
79 | |
80 | int main(void) { |
81 | init_uart(UBRR_VAL); |
82 | |
83 | while(1) |
84 | {
|
85 | _delay_ms(1000); |
86 | wert = uart_string; |
87 | send_string("wert: "); |
88 | send_string(utoa(wert, buffer, 10)); |
89 | }
|
90 | }
|
Findet jemand hier den Wurm? Vielen Dank und an alle Frohe Feiertage!