Hallo zusammen, ich habe folgendes Problem: wenn ich vom PC (Docklight) über einen BTM222 an einen AT90USB1287 Daten schicke funktioniert alles d.h. die Empfangenen Daten werden vom AVR ausgewertet und entsprechend behandelt. Sobald der AVR auf die empfangenen Daten antwortet d.h. z.B ein "OK" zurück sendet, wird nach jedem Byte das gesendet wird der USART1_RX_vect ausgelößt. Habe ich was Grundlegendes vergessen? Gruß Stefan Init
1 | void C_UART::Init() |
2 | {
|
3 | //Sichere SREG
|
4 | uint8_t sreg = SREG; |
5 | |
6 | //Baudrate setzen
|
7 | UBRR1H = (uint8_t) (UBRR_VAL1 >> 8); |
8 | UBRR1L = (uint8_t) (UBRR_VAL1); |
9 | |
10 | // Interrupts kurz deaktivieren
|
11 | cli(); |
12 | |
13 | // UART Receiver und Transmitter anschalten, Receive-Interrupt aktivieren
|
14 | // Data mode 8N1, asynchron
|
15 | UCSR1B = (1 << RXEN1) | (1 << TXEN1) | (1 << RXCIE1); |
16 | UCSR1C = (1 << USBS1) | (1 << UCSZ10) | (1 << UCSZ11); |
17 | |
18 | // Flush Receive-Buffer (entfernen evtl. vorhandener ungültiger Werte)
|
19 | do
|
20 | {
|
21 | // UDR auslesen (Wert wird nicht verwendet)
|
22 | UDR1; |
23 | }
|
24 | while (UCSR1A & (1 << RXC1)); |
25 | |
26 | // Rücksetzen von Receive und Transmit Complete-Flags
|
27 | UCSR1A = (1 << RXC1) | (1 << TXC1); |
28 | |
29 | // Global Interrupt-Flag wieder herstellen
|
30 | SREG = sreg; |
31 | |
32 | //Interrupts Global freischalten
|
33 | sei(); |
34 | |
35 | //Setze Flag das wir uns nach der Initialisierung
|
36 | //in der BTM222 Init Phase befinden
|
37 | btmInit = 1; |
38 | |
39 | }
|
Sendefunktion
1 | void C_UART::USART_SendWithoutEcho(char *data) |
2 | {
|
3 | while (*data) |
4 | {
|
5 | //Warten bis der Sendepuffer leer ist
|
6 | while (!(UCSR1A & (1 << UDRE1))); |
7 | //Daten in Usartregister Setzen
|
8 | UDR1 = (const unsigned char) *data; |
9 | UCSR1A = (1 << RXC1); |
10 | data++; |
11 | }
|
12 | }
|
//Daten die versendet werden
1 | strcpy(me->returnMessage, "{ERROR;"); |
2 | strcat(me->returnMessage, errorID); |
3 | strcat(me->returnMessage, "}"); |
4 | me->uart->USART_SendWithoutEcho(me->returnMessage); |
5 | }
|