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
Aus ASM-Sicht gesehen: Wenn Du nur 1 Byte senden willst, geht es. Alles Andere dauert zu lange und blockiert unnötig die Mainloop. ...
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.
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
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
>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
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.
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.