USART Interrupt problem

Gast #1783915
Lesenswert?
• ▲
▼
Was ist denn hier falsch, wenn ich send=4 setze werden nur 3 Zeichen 
gesendet, debugge ich es allerdings werden 4 Zeichen kesendet, ganz 
merkwürdig, evtl. fällt euch ja etwas auf.
1
ISR (USART_UDRE_vect)
2
{
3
  if (send>0)
4
  {
5
    send--;
6
    UDR=*buffer_send;
7
    buffer_send++;
8
  }
9
  else //Disable Interrupt
10
  {
11
  UCSRB &=~(1<<UDRIE);
12
  PORT_SEND &=~ (1 << PIN_SEND);
13
  UCSRB |=(1<<RXEN);
14
  }
15
}
#1783940
Lesenswert?
• ▲
▼
Was macht dieses PIN_SEND ?

Hintergrund:

Der UDRE  (Data Register Empty) Interrupt wird aufgerufen, wenn das UDR 
Register das nächste Zeichen aufnehmen könnte. Das bedeutet aber nicht, 
dass deswegen das Zeichen schon aus der UART draussen ist.

W§enn PIN_SEND irgendeine spezielle Bedeutung hat, könnte es sein, dass 
du dir selbst den Saft abdrehst, noch ehe das Zeichen die USART 
verlassen hat.
Gast #1783947
Lesenswert?
• ▲
▼
HI,

ich rate mal:
1
PORT_SEND &=~ (1 << PIN_SEND);
2
UCSRB |=(1<<RXEN);

Wenn das eine Sende / Empfangsumschaltung ist, machst du es im FALSCHEN 
INT!!!
Denn mit dem Auftreten des 5. INT ist das letzte Zeichen noch nicht 
raus!!!
und somit blockierst du das letzte Zeichen.
(siehen TX-Compl INT)

mfg
Stephan
#1783951
Lesenswert?
• ▲
▼
Hintergrund:

Der UDRE  (Data Register Empty) Interrupt wird aufgerufen, wenn das UDR
Register das nächste Zeichen aufnehmen könnte. Das bedeutet aber nicht,
dass deswegen das Zeichen schon aus der UART draussen ist.

W§enn PIN_SEND irgendeine spezielle Bedeutung hat, könnte es sein, dass
du dir selbst den Saft abdrehst, noch ehe das Zeichen die USART
verlassen hat.
Gast #1783989
Lesenswert?
• ▲
▼
Falls jemand mal ein ähnliches Problem haben sollte, so habe ich es 
gelöst:
1
//Interrupt DatenRegisterLeer
2
ISR (USART_UDRE_vect)
3
{
4
  if (send>0)
5
  {
6
    send--;
7
    UDR=*buffer_send;
8
    buffer_send++;
9
  }
10
  else
11
  {
12
  //Disable Interrupt Datenregister
13
  UCSRB &=~(1<<UDRIE);
14
  //Enable Interrupt TransmitComplete für Senderichtung
15
  UCSRB |=(1<<TXCIE);
16
  }
17
}
18

19
ISR (USART_TXC_vect )
20
{
21
  PORT_SEND &=~ (1 << PIN_SEND);
22
  UCSRB &=~(1<<TXCIE);
23
}

Antwort schreiben

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.

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.