Senden von Daten in einer ISR

Gast #2863165
Lesenswert?
• ▲
▼
Hallo Zusammen,

Mal ne kurze Frage.
Bringt es etwas auf einen leeren Sendebuffer (UDRE0) zu warten wenn ich 
dies in der ISR ausführe? Oder kann ich die Daten auch sofort schicken

ISR(PCINT3_vect)      // Pin wurde getoggelt
{
  while ( !(UCSR0A & (1<<UDRE0)) )  // Wait for empty transmit buffer
  {
  }
  UDR0 = 0x40;  // send data "0x40"
}
Gast #2863198
Lesenswert?
• ▲
▼
Warten in einer Interruptroutine ist gaaaaanz schlechter 
Programmierstil.

Die übliche Vorgangsweise wäre:

In der Interruptroutine wird ein Flag gesetzt, z.B.
pin_toggled = 1;
und die ISR wird danach sofort wieder verlassen.

In der Hauptschleife wird geprüft, ob das Flag gesetzt und ob der buffer 
leer ist. Wenn beide Bedingungen wahr sind, dann die Daten in den buffer 
schieben und das Flag zurücksetzen.
Gast #2863222
Lesenswert?
• ▲
▼
Ich hab das ganze jetzt umgeschrieben. Würde dies hier passen?

while(1)  // infinite loop
{
  while(wait_for_data == 0)  // wait for incoming data
  {
    if (overload_flag == 1 && UDRE0 == 1)
    {
      UDR0 = 0x40;      // send data
                        overload_flag=0;  // reset overload_flag
    }
  }
}

ISR(PCINT3_vect)
{
   overload_flag=1;
}
Gast #2863248
Lesenswert?
• ▲
▼
Nein, lass das Warten...

while(1)  // infinite loop
{
  if(wait_for_data == 0)  // wait for incoming data
  {
    if (overload_flag == 1 && UDRE0 == 1)
    {
      UDR0 = 0x40;      // send data
                        overload_flag=0;  // reset overload_flag
    }
  }

... next ...

}
Gast #2863267
Lesenswert?
• ▲
▼
Die while schleife ist schon gewollt so, denn das Programm soll dort 
drinnen verharren bis "wait_for_data" von der --> ISR(USART0_RX_vect) 
gesetzt wurde.

Ja die Abfrage mit dem UDRE0 funktioniert so laut Simulator nicht!

if (overload_flag==1 && UDRE0==1)
{
   UDR0 = 0x40;        // send the "Overload" bit
   overload_flag = 0;  // reset the "overload_flag"
}

Wie kann ich denn aber das hier was funktioniert oben in die if Abfrage 
reinpacken? --> while ( !(UCSR0A & (1<<UDRE0)) )

Etwa so?

if (overload_flag==1 && while ( !(UCSR0A & (1<<UDRE0)) ))
Gast #2863301
Lesenswert?
• ▲
▼
Achso ich glaube ich hab verstanden was du meinst.

while(wait_for_data == 0)  // wait for incoming data from USART0
{
   if (overload_flag==1)  // if "overload_flag" is set
   {
  while (!(UCSR0A & (1<<UDRE0)))  // Wait for empty transmit buffer
  {
        }
  UDR0 = 0x40;      // send the "Overload" bit
  overload_flag = 0;    // reset "overload_flag"
  }
}

Sobald das overload flag gesetzt wurde, können Daten an die USART 
gesendet werden. Müsste meiner Meinung so jetzt stimmen?

Antwort schreiben

Eine eigene Frage? Dieser Thread ist über 14 Jahre alt. Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.

Neuen Thread starten

Eine Lösung, Ergänzung oder Rückmeldung zu diesem Thread? Dann antworte hier.

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.