Senden über uart löst USART1_RX_vect aus??

Gast #1620754
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
}
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.
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.
Gast
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.
Gast
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
Gast
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ß
Gast
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ß
Gast
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
Gast
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

Antwort schreiben

Eine eigene Frage? Dieser Thread ist über 16 Jahre alt. Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.

Neuen Thread starten

Eine Lösung, Ergänzung oder Rückmeldung zu diesem Thread? Dann antworte hier.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.