Forum: Mikrocontroller und Digitale Elektronik USART Interrupt problem


von André (Gast)


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
}

von Karl H. (kbuchegg)


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.

von Stephan (Gast)


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

von André (Gast)


Lesenswert?

Der setzt die Datenrichtung für den RS485- Treiber

von Karl H. (kbuchegg)


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.

von André (Gast)


Lesenswert?

Joa super danke, das ist es gewesen ;)

von André (Gast)


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
}

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.