www.mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik In ISR was senden?


Autor: Gunlo (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Hannes Lux (hannes)
Datum:

Bewertung
0 lesenswert
nicht 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.

...

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Michael W. (retikulum)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
 if(data == 1)
 {
    UDR = UDR;
 }
 else
 {
  // send data is wrong
 }

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

Michael

Autor: Gunlo (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Oliver (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Gunlo (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo

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

Gruss

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.