mikrocontroller.net

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


Autor: Stefan (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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
void C_UART::Init()
{
   //Sichere SREG
   uint8_t sreg = SREG;

   //Baudrate setzen
   UBRR1H = (uint8_t) (UBRR_VAL1 >> 8);
   UBRR1L = (uint8_t) (UBRR_VAL1);

  // Interrupts kurz deaktivieren
  cli();

// UART Receiver und Transmitter anschalten, Receive-Interrupt aktivieren
// Data mode 8N1, asynchron
UCSR1B = (1 << RXEN1) | (1 << TXEN1) | (1 << RXCIE1);
UCSR1C = (1 << USBS1) | (1 << UCSZ10) | (1 << UCSZ11);

// Flush Receive-Buffer (entfernen evtl. vorhandener ungültiger Werte)
do
{
  // UDR auslesen (Wert wird nicht verwendet)
  UDR1;
}
while (UCSR1A & (1 << RXC1));

// Rücksetzen von Receive und Transmit Complete-Flags
UCSR1A = (1 << RXC1) | (1 << TXC1);

// Global Interrupt-Flag wieder herstellen
SREG = sreg;

//Interrupts Global freischalten
sei();

//Setze Flag das wir uns nach der Initialisierung
//in der BTM222 Init Phase befinden
btmInit = 1;

}


Sendefunktion

void C_UART::USART_SendWithoutEcho(char *data)
{
   while (*data)
   {
     //Warten bis der Sendepuffer leer ist 
     while (!(UCSR1A & (1 << UDRE1)));
  //Daten in Usartregister Setzen
  UDR1 = (const unsigned char) *data;
  UCSR1A = (1 << RXC1);
  data++;
    }
}

//Daten die versendet werden
  strcpy(me->returnMessage, "{ERROR;");
  strcat(me->returnMessage, errorID);
  strcat(me->returnMessage, "}");
  me->uart->USART_SendWithoutEcho(me->returnMessage);
}

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Stefan Ernst (sternst)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Kein Bezug zu deiner eigentlichen Frage, aber das:
// Global Interrupt-Flag wieder herstellen
SREG = sreg;

//Interrupts Global freischalten
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.

Autor: Stefan (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Heiko (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Stefan (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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ß

Autor: Stefan (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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ß

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Stefan (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi Karl Heinz,

das werde ich machen!!!

Ich gehe jetzt vorerst noch dem Umweg über
void C_UART::USART_SendWithoutEcho(char *data)
{
 while (*data)
 {
  //Warten bis der Sendepuffer leer ist 
  while (!(UCSR1A & (1 << UDRE1)));

  //Daten in Usartregister Setzen
  UDR1 = *data;
  data++;
 }
--> unsigned char tmp;
--> while ( UCSR1A & (1<<RXC1) ) tmp= UDR1;
}

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

Autor: Heiko (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.