Forum: Mikrocontroller und Digitale Elektronik In ISR was senden?


von Gunlo (Gast)


Lesenswert?

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

von Hannes L. (hannes)


Lesenswert?

Aus ASM-Sicht gesehen:

Wenn Du nur 1 Byte senden willst, geht es. Alles Andere dauert zu lange 
und blockiert unnötig die Mainloop.

...

von Karl H. (kbuchegg)


Lesenswert?

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.

von Michael W. (retikulum)


Lesenswert?

1
 if(data == 1)
2
 {
3
    UDR = UDR;
4
 }
5
 else
6
 {
7
  // send data is wrong
8
 }

Das sollte funktionieren und dauert nicht länger als das Flag setzen.

Michael

von Gunlo (Gast)


Lesenswert?

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

von Oliver (Gast)


Lesenswert?

>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

von Karl H. (kbuchegg)


Lesenswert?

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.

von Gunlo (Gast)


Lesenswert?

Hallo

ahh ok, hab verstanden. Dann versuch ich es am besten mit einem Flag und 
ausserhalb der ISR. Danke euch!! :)

Gruss

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.