mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik (USART) RX Complete Interrupt wird nicht angesprungen


Autor: Fabian Cordes (Gast)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,

nur eine kurze Frage:

Ist diese Initialisierung des USART vollständig, wenn ich damit senden 
und empfangen will? Der Auszug ist aus S. Salewskis Referenzcode für den 
AT90USB1287. Er hat aber nur die Ausgabe eingebaut (läuft auch), ich 
will zu Debugzwecken aber auch Daten empfangen. Er springt dabei leider 
nicht die ISR an (laut Definition in der Headerdatei USART1_RX_vect). 
Ich bin mir nicht ganz sicher, ob ich einen Initialisierungsschritt 
vergessen habe?
Meine Änderung für den RX-Interrupt waren (1<<RXEN) | (1<<RXCIE1) in 
UCSR1B.

Senden klappt wie gesagt Problemlos...wenn es Probleme mit dem Kabel 
oder der Einstellungen wären, dürfte das ja nicht gehen



UBRR1 = UART_UBRR;
UCSR1C = (1<<UCSZ10) | (1<<UCSZ11);
UCSR1B = (1<<TXEN) | (1<<RXEN) | (1<<RXCIE1);

ISR (USART1_RX_vect)
{
  char debStr[2];

  uint8_t data = UDR1;

  debStr[0] = data;
  debStr[1] = 0;
  Debug(debStr);

  if ((data == 0x0D) ||
    (data == 0x0A))
  {
    submitHostCommand(rxBuffer);
  } else if (rxIndex < 32)
  {
    rxBuffer[rxIndex] = data;
    rxIndex++;
  }
}

Falls sich jemand durchwühlen möchte anbei noch der gesamte 
quellcode...ich möchte es aber niemandem empfehlen. Wenn, dann ist 
usart_drv.c wohl am interessantesten.

Vielen Dank für eure Zeit,

Fabian

Autor: Fabian Cordes (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Heute nochmal durchgemessen (Oszilloskop), Signal liegt auf jeden Fall 
an den korrekten Pins an, ausserdem klappt es, nachdem ich den code aus 
der ISR in eine Funktion kopiert habe und diese per Polling aufrufe.

sei() ist es auch nicht, Interrupts sind aktiviert.

Muss man ausser RXEN und RXCIE noch andere Flags setzen? Im 
UART-Tutorial finde ich nur diese beiden.


Viele Grüße,
Fabian

Autor: F.Cordes (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
llo,

das Problem besteht leider immer noch. Aus irgendeinem Grund wird der 
Rx-Interrupt nicht ausgelöst, obwohl da offensichtlich Daten im Puffer 
sind.

Hat nicht irgendwer eine Idee, wie ich den Fehler weiter eingrenzen 
kann? Ich bin mit meinem Latein am Ende.

Falls es irgendwie hilfreich ist: Im Simulator funktionieren die 
Interrupts ebenfalls nicht - das kann aber auch an mir liegen. Was ich 
dort gemacht habe ist einen wert in UDR zu schreiben und dann das RX 
Complete bit zu setzen? Ich hatte irgendwo gelesen, dass es so geht.

Vielleicht auch noch von Interesse: Die (mit pollen) empfangenen Daten 
haben ziemlich viele Bitfehler, aber immer nur nullen, die zu einer eins 
werden. Die gesendeten aber gar keine? Ist die serielle Schnittstelle 
von meinem Laptop doof (=sendet zu schwach?)
Ich denke, das dürfte aber nicht mit dem eigentlichen Problem 
zusammenhängen...Dem Puffer sollte es ja egal sein, was für Daten 
gelesen werden.

Viele Grüße,
Fabian

Autor: Stefan Ernst (sternst)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Fabian Cordes schrieb:
> sei() ist es auch nicht, Interrupts sind aktiviert.

Nicht in dem Code, den du dem ersten Posting beigepackt hast.

Autor: H.Joachim Seifert (crazyhorse)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Wie gross ist dein rxBuffer? Und du behandelst nirgendwo den rxIndex.
Das wäre nur dann sinnvoll, wenn der rxBuffer 256Byte gross ist und 
rxIndex ein uchar8 ist.
Das aber nur am Rande, hat mit dem eigentlichen Problem eher nichts zu 
tun.
-stimmt der Interuptvektor, kann schon mal sein, dass in der headerdatei 
was falsches drinsteht?
-lad dir das Ganze mal ins AVR-Studio und löse den Interrupt zu Fuss aus

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.