Forum: Compiler & IDEs Senden über uart löst USART1_RX_vect aus??


von Stefan (Gast)


Lesenswert?

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
}

von Karl H. (kbuchegg)


Lesenswert?

Stefan schrieb:

> 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.
>

Schau dir doch mal an, was da empfangen wird.
Es könnte sein, dass das Gerät ein Echo macht, oder dir ein Zeichen als 
Acknowledge zurückschickt.

von Stefan E. (sternst)


Lesenswert?

Kein Bezug zu deiner eigentlichen Frage, aber das:
1
// Global Interrupt-Flag wieder herstellen
2
SREG = sreg;
3
4
//Interrupts Global freischalten
5
sei();
ist reichlich sinnlos.
Entweder du willst die Interrupts auf jeden Fall hinterher aktiviert 
haben, dann ist das ganze SREG-Sichern überflüssig, oder du willst den 
ursprünglichen Interrupt-Status wiederherstellen, dann ist das sei() 
dort völlig fehl am Platze. Außerdem solltest du mal einen Blick in 
atomic.h werfen.

von Stefan (Gast)


Lesenswert?

Ich bekomme genau das byteweise zurück (z.B. {ERROR;2}) was ich gerade 
vom AVR an den PC sende.
Ich habe durchs debuggen festgestellt das wirklich nach jedem gesendeten 
Zeichen in die Empfangsinterrupt Routine gesprungen wird.

Da das BTM222 bereits verbunden ist dürfte von dieser Seite kein Echo 
kommen. Ich habe auch das Terminalprogramm gerade getauscht um sicher zu 
ein das dieses nicht jedes Empfange Zeichen zurück sendet leider ohne 
Erfolg.

von Heiko (Gast)


Lesenswert?

Kurzschluss zwischen RxD und TxD? Bekommst du auch am PC ein Echo 
zurück, wenn du an den Controller sendest? Liegt das am "Local Echo" 
oder an einem Kurzschluss?

MfG, Heiko

von Stefan (Gast)


Lesenswert?

Hi Heiko,
einen Kurzschluss kann ich auschließen, habs gerade durchgepiepst.
Ich kann den BTM leider nicht an den PC anschließen um dies zu testen, 
da fehlen mir gerade die Bauteile.
Was verstehst du unter Local Echo?

Gruß

von Stefan (Gast)


Lesenswert?

Hi,

ich habe jetzt nochmal ordentlich gedebuggt.
Die Meldung wird versandt und kommt am Terminal an.
Gleichtzeitig sammle ich alle einkommenden Daten in einem Array (300Byte 
lang). Die Intialisierung des BTM läuft durch d.h. alle Befehle werden 
mit einem OK bestätigt. Nach aufbau der Verbindung mit einem Terminal 
erscheint nach jedem Tastendruck der gleiche Text im Sniffarray der 
Empfangsinterrupt Routine wie im Terminal. Ich muss jetzt an was anderem 
arbeiten sonst fall ich um.
Evtl. weiß vielleicht jemand noch einen Moglichkeit wo ich ansetzten 
könnte.

Gruß

von Karl H. (kbuchegg)


Lesenswert?

Erst mal würde ich abspecken, wo ich nur abspecken kann.
Blauzahn raus und direkt an den PC.
Gibts immer noch ein Echo?
Wenn nein, dann ist es der Blauzahn.

von Stefan (Gast)


Lesenswert?

Hi Karl Heinz,

das werde ich machen!!!

Ich gehe jetzt vorerst noch dem Umweg über
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
8
  //Daten in Usartregister Setzen
9
  UDR1 = *data;
10
  data++;
11
 }
12
--> unsigned char tmp;
13
--> while ( UCSR1A & (1<<RXC1) ) tmp= UDR1;
14
}

und verhindere somit den Sprung in die RX ISR in dem ich solange das 
RXC1 Bit gesetzt ist einfach den Wert aus UDR1 auslese.

Das Problem wird noch gelößt!!

Gruß Stefan

von Heiko (Gast)


Lesenswert?

Stefan schrieb:
> Was verstehst du unter Local Echo?

Ein Terminalprogramm in normaler Konfiguration sendet nur die Zeichen, 
die du eintippst, und zeigt dir nur die Zeichen an, die es empfängt. 
Wenn du bei dieser Konfiguration also siehst, was du eintippst, hast du 
das Problem nicht nur am uC, sondern auch am PC (der PC empfängt auch 
das, was er sendet) Was für mich auf einen Kurzschluss oder ein heftiges 
Übersprechen zwischen RxD und TxD hindeuten würde. (muss man dem BTM... 
vielleicht explizit eine Datenrichtung vorgeben, sonst empfängt es sich 
selbst?)

"Local Echo" ist eine Konfigurationsoption bei den meisten 
Terminalprogrammen, mit denen die am PC eingetippten Zeichen auch 
angezeigt werden. In Hyperterminal (Windows XP) beispielsweise unter 
Menü "Datei"->Menüpunkt "Eigenschaften"->Reiter 
"Einstellungen"->Schaltfläche "ASCII-Konfiguration" die Option 
"Eingegebene Zeichen lokal ausgeben (lokales Echo)"

MfG, Heiko

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.