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


von Fabian Cordes (Gast)


Angehängte Dateien:

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


1
UBRR1 = UART_UBRR;
2
UCSR1C = (1<<UCSZ10) | (1<<UCSZ11);
3
UCSR1B = (1<<TXEN) | (1<<RXEN) | (1<<RXCIE1);
1
ISR (USART1_RX_vect)
2
{
3
  char debStr[2];
4
5
  uint8_t data = UDR1;
6
7
  debStr[0] = data;
8
  debStr[1] = 0;
9
  Debug(debStr);
10
11
  if ((data == 0x0D) ||
12
    (data == 0x0A))
13
  {
14
    submitHostCommand(rxBuffer);
15
  } else if (rxIndex < 32)
16
  {
17
    rxBuffer[rxIndex] = data;
18
    rxIndex++;
19
  }
20
}

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

von Fabian Cordes (Gast)


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

von F.Cordes (Gast)


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

von Stefan E. (sternst)


Lesenswert?

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

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

von H.Joachim S. (crazyhorse)


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

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.