Hallo zusammen,
bitte schaut mal drüber, ich kann ordnungsgemäß senden, nur der Empfang
funktioniert nicht richtig. Der Empfängerinterrupt wird nicht immer
aufgerufen. Wenn ich gleichzeitig sende funktioniert es, dann ist auch
der UDRIE aktiv. Danke
1 | ISR(USART_UDRE_vect)
|
2 | {
|
3 |
|
4 | UCSRA &= ~(1<<UDRE);
|
5 |
|
6 | //Sende Sendepuffer
|
7 | if (sendBufferOutPtr != sendBufferInPtr)
|
8 | {
|
9 | UDR = sendBuffer[sendBufferOutPtr++];
|
10 | if ( sendBufferOutPtr == UART_BUFFLEN)
|
11 | {
|
12 | sendBufferOutPtr = 0;
|
13 | }
|
14 | if (sendBufferOutPtr == sendBufferInPtr)
|
15 | {
|
16 | sendBufferEmpty = 1;
|
17 | //deaktiviere Sendeinterrupt
|
18 | UCSRB &= ~(1<<UDRIE);
|
19 | }
|
20 | }
|
21 |
|
22 | }
|
23 |
|
24 | ISR(USART_RXC_vect)
|
25 | {
|
26 | char tmp;
|
27 | int lng = 0;
|
28 |
|
29 | tmp = UDR;
|
30 |
|
31 | PORTD = (PORTD ^ 0x08);
|
32 | PORTD &= ~0x10;
|
33 |
|
34 | while (sendString("RX") == BUFFER_FULL){};
|
35 |
|
36 | }
|
37 |
|
38 | int initUART(void)
|
39 | {
|
40 |
|
41 | //Prescaler setzen
|
42 | UBRRH = UBRR_VAL >> 8;
|
43 | UBRRL = UBRR_VAL & 0xFF;
|
44 |
|
45 | //Transmitter und Receiver enable
|
46 | UCSRB |= (1<<TXEN)|(1<<RXEN)|(1<<RXCIE); // UART TX,RX und Empfangsinterrupt einschalten
|
47 | UCSRC = (1<<URSEL)|(1 << UCSZ1)|(1 << UCSZ0); // Asynchron 8N1
|
48 |
|
49 | }
|
50 |
|
51 | int sendString(char * buffer)
|
52 | {
|
53 | int i = 0;
|
54 |
|
55 | //Prüfe ob String in Sendepuffer passt
|
56 | i = sendBufferInPtr;
|
57 | while (buffer[i] != 0)
|
58 | {
|
59 | if ( i == sendBufferOutPtr)
|
60 | {
|
61 | if (!sendBufferEmpty)
|
62 | {
|
63 | //Aktiviere Sendeinterrupt
|
64 | UCSRB |= (1<<UDRIE);
|
65 | return -1;
|
66 | }
|
67 | else
|
68 | {
|
69 | sendBufferEmpty = 0;
|
70 | }
|
71 | }
|
72 | i++;
|
73 | if ( i == UART_BUFFLEN)
|
74 | {
|
75 | i = 0;
|
76 | }
|
77 | }
|
78 |
|
79 | //Kopiere String in Sendepuffer
|
80 | i = 0;
|
81 | while (buffer[i] != 0)
|
82 | {
|
83 | sendBuffer[sendBufferInPtr++] = buffer[i++];
|
84 | if (sendBufferInPtr == UART_BUFFLEN)
|
85 | {
|
86 | sendBufferInPtr = 0;
|
87 | }
|
88 | sendBufferEmpty = 0;
|
89 | }
|
90 |
|
91 | //Aktiviere Sendeinterrupt
|
92 | UCSRB |= (1<<UDRIE);
|
93 |
|
94 | return 0;
|
95 |
|
96 | }
|