In ISR was senden?

Gast #1413755
HAllo

habe eine frage bzgl ISR(UART_RX_vect)

ist es möglich innerhalb der ISR wieder was zu senden?

würde gerne so was in der art realisieren:

[c]

ISR(UART_RX_vect)
{

 data = UDR;

 if(data == 1)
 {
    flag = 1;
 }
 else
 {
  // send data is wrong
 }

}

Ist das problemlos möglich oder sollte man ausserhalb der ISR was 
rausschicken?

gruss und danke im voraus
Pete
#1413764
Gunlo schrieb:
> HAllo
>
> habe eine frage bzgl ISR(UART_RX_vect)
>
> ist es möglich innerhalb der ISR wieder was zu senden?

Möglich ist es schon.
Wer will dich daran hindern?

Die eigentliche Frage ist:
Ist es schlau das zu tun?

Das wiederrum hängt vom konkreten Programm ab und vor allen Dingen was 
du senden willst (einen Text, ein einzelnes Zeichen, das Ergebnis einer 
Berechnung).

Die Grundprämisse lautet immer:
Eine ISR sollte so schnell wie möglich wieder verlassen werden, damit 
andere Interrupts eine Chance haben, ihre ISR anzuwerfen, bzw. die 
Mainloop weiterlaufen kann.
Das bedeutet jetzt nicht, dass jegliche Operation in einer ISR verboten 
ist, das wäre Unsinn. Es bedeutet nur, dass man sich genau überlegen 
sollte, welche Operationen in der ISR gemacht werden und welche nicht 
und vor allen Dingen welche Konsequenzen es hat, wenn die ISR längere 
Zeit benötigt. Fast alles, was in irgendeiner Form mit Warten zu tun 
hat, ausser vielleicht ein paar Nanosekunden warten, ist meistens in 
einer ISR tabu.
Gast #1413771
Hallo Karl heinz Buchegger

also ich benutze nur eine Interrupt Routine und ich möchte nur ein 
einzelnes Zeichen versenden. Ein Flag, mehr nicht.
Zeit würde das nicht in Anspruch nehmen, denk ich?

Viele Grüsse
Gast #1413773
>Ist das problemlos möglich

Möglich, aber nicht problemlos.

>oder sollte man ausserhalb der ISR was
>rausschicken?

Ja.

Das Problem ist, daß du beim Senden innerhalb der ISR alles andere für 
lange Zeit blokierst. Besser ist es, das flag in der main-loop 
abzufragen, und dort entsprechend zu reagieren. Wenn die Eingabedaten 
schneller kommen, als du zurücksenden kannst, sind sie sowieso zu 
schnell.

Oliver
#1413776
Gunlo schrieb:
> Hallo Karl heinz Buchegger
>
> also ich benutze nur eine Interrupt Routine und ich möchte nur ein
> einzelnes Zeichen versenden. Ein Flag, mehr nicht.
> Zeit würde das nicht in Anspruch nehmen, denk ich?

Kommt drauf an.
Du kannst ja das Zeichen unter Umständen nicht sofort verschicken. Du 
musst ja auf jeden Fall warten, bis das Senderegister zum Senden frei 
ist.
Das ist zeitlich sicherlich kein Beinbruch und wenn du ausser in der ISR 
sonst nirgends etwas verschickst, dann ist die Wahrscheinlichkeit, dass 
du Warten musst sehr gering.

Antwort schreiben

Eine eigene Frage? Dieser Thread ist über 17 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.