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

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren