Grüß Gott ich hab folgendes problem ich will über USART ein zeichen senden egal welches wenn es ankommt soll der text EIN kommen wenn ich wieder eins sende soll der text AUS kommen wenn ich wieder eins schik kommt wieder EIN usw... wenn ich bei meinem programm ein zeichen schick dann schreibt es abwechselnt EIN AUS EIN AUS un das un unterbrochen was muss ich ändern damit sich der interrupt programmabschnitt erst neustartet wenn ich wieder ein zeichen an den micro sende
1 | #include <avr/io.h> |
2 | #include <avr/interrupt.h> |
3 | #define F_CPU 8000000L
|
4 | #define BAUD 9600L
|
5 | #define UBRR_VAL ((F_CPU+BAUD*8)/(BAUD*16)-1)
|
6 | #define BAUD_REAL (F_CPU/(16*(UBRR_VAL+1)))
|
7 | #define BAUD_ERROR ((BAUD_REAL*1000)/BAUD-1000)
|
8 | |
9 | #if ((BAUD_ERROR>10)||(BAUD_ERROR<-10))
|
10 | #error Systematischer Fehler in der Baudrate größer 1% und damit zu hoch!
|
11 | #endif
|
12 | volatile uint8_t a; |
13 | |
14 | |
15 | int main(void) |
16 | {
|
17 | UCSRB = (1<<TXEN)|(1<<RXEN)|(1<<RXCIE); |
18 | UCSRC = (1<<URSEL)|(1<<UCSZ1)|(1<<UCSZ0); |
19 | UBRRH = UBRR_VAL >> 8; |
20 | UBRRL = UBRR_VAL & 0xFF; |
21 | |
22 | sei(); |
23 | |
24 | while (1) |
25 | {
|
26 | }
|
27 | }
|
28 | |
29 | |
30 | ISR (USART_RXC_vect) |
31 | |
32 | {
|
33 | char string[4]; |
34 | ++a; |
35 | if (a==1) |
36 | {
|
37 | string [0]='A'; |
38 | string [1]='U'; |
39 | string [2]='S'; |
40 | string [3]=0; |
41 | }
|
42 | if (a==2) |
43 | {
|
44 | string [0]='E'; |
45 | string [1]='I'; |
46 | string [2]='N'; |
47 | string [3]=0; |
48 | a=0; |
49 | }
|
50 | |
51 | |
52 | int i=0; |
53 | |
54 | while (i<6) |
55 | {
|
56 | while (!(UCSRA & (1<<UDRE))) |
57 | {
|
58 | }
|
59 | |
60 | UDR =string[i]; |
61 | ++i; |
62 | }
|
63 | reti(); |
64 | }
|