Forum: Mikrocontroller und Digitale Elektronik Warten auf Interrupt


Announcement: there is an English version of this forum on EmbDev.net. Posts you create there will be displayed on Mikrocontroller.net and EmbDev.net.
von Jens K. (mister232)


Bewertung
0 lesenswert
nicht lesenswert
Hallo Leute,

ich sende in einem Programm eine Nachricht via Funk zu einem anderen 
Controller. Das ganze geschieht in einer Schleife, in welcher das 
Programm am Ende auf ein ACK vom anderen Controller wartet. Kommt dies 
nicht, wird die Nachricht erneut gesendet (deshalb die Schleife). Die 
Antwort kommt via INT0 rein und wird in der ISR ausgewertet (Zeit ist 
genug da). Ist die Nachricht korrekt, so wird in der ISR ein Flag zum 
Verlassen der Sendeschleife gesetzt.

Mein Problem betrifft nun das Warten auf den Interrupt. Aktuell lasse 
ich einfach in einer for-Schleife ein wenig rechnen. Kann ich zur 
definierten Zeiteinstellung auch ein _wait_ms() nutzen oder blockiert 
mor das den INT0?

von Marc V. (Firma: Vescomp) (logarithmus)


Bewertung
0 lesenswert
nicht lesenswert
Jens K. schrieb:
> ich einfach in einer for-Schleife ein wenig rechnen. Kann ich zur
> definierten Zeiteinstellung auch ein _wait_ms() nutzen oder blockiert
> mor das den INT0?

 Nein, INT wird nicht blockiert.
 Hast du keinen Systimer in deinem Code ?

von Oliver S. (oliverso)


Bewertung
0 lesenswert
nicht lesenswert
Das kommt auf die Implementierung von _wait_ms, den Prozessor, den 
Compiler, dazu dem  Wetter und dem Vornamen deiner Tante an.

Merkste was?

Oliver

: Bearbeitet durch User
von Falk B. (falk)


Bewertung
0 lesenswert
nicht lesenswert
@ Jens K. (mister232)

>ich sende in einem Programm eine Nachricht via Funk zu einem anderen
>Controller. Das ganze geschieht in einer Schleife, in welcher das
>Programm am Ende auf ein ACK vom anderen Controller wartet. Kommt dies
>nicht, wird die Nachricht erneut gesendet (deshalb die Schleife). Die
>Antwort kommt via INT0 rein und wird in der ISR ausgewertet (Zeit ist
>genug da). Ist die Nachricht korrekt, so wird in der ISR ein Flag zum
>Verlassen der Sendeschleife gesetzt.

AUA. Das klingt alles nach einem SEHR schlechten Konzept. Siehe 
Interrupt.

>Mein Problem betrifft nun das Warten auf den Interrupt.

Eben das tut keiner. Ein Interrupt wird verarbeitet, wenn er generiert 
wird, da muss dien CPU nicht drauf warten.

> Aktuell lasse
>ich einfach in einer for-Schleife ein wenig rechnen. Kann ich zur
>definierten Zeiteinstellung auch ein _wait_ms() nutzen

Kann man,  blockiert dir aber zu 100% die CPU. Und wenn wu in einer ISR 
wartest, was so oder so ganz böse ist, wird dein INT0 Interrupt nie 
aufgerufen, denn der AVR hat keine verschachtelten Interrupts.

> oder blockiert mor das den INT0?

Nur, wenn du schon in einer anderen ISR bist.

von Lothar M. (lkmiller) (Moderator) Benutzerseite


Bewertung
0 lesenswert
nicht lesenswert
Jens K. schrieb:
> Mein Problem betrifft nun das Warten auf den Interrupt.
Das ist mal eine kuriose Strategie: "Auf eine Unterbrechung warten".
Das ist doch eine Umschreibung für "Langeweile haben".

Wenn du schon aktiv Rechenzeit vernichten willst, warum pollst du dann 
nicht solange einfach direkt die IO-Leitung, an der das ACK-Signal 
hereinkommt?

: Bearbeitet durch Moderator
von Marc V. (Firma: Vescomp) (logarithmus)


Bewertung
0 lesenswert
nicht lesenswert
Lothar M. schrieb:
> Wenn du schon aktiv Rechenzeit vernichten willst, warum pollst du dann
> nicht solange einfach direkt die IO-Leitung, an der das ACK-Signal
> hereinkommt?

 Wahrscheinlich weil er keinen Systimer hat und irgendwie die Zeit
 welche zwischen Senden und ACK vergangen ist, rauskriegen muss.

von DanVet (Gast)


Bewertung
0 lesenswert
nicht lesenswert
Die Fragen wurden ja schon beantwortet.
Und wie schon gesagt, ist "Warten auf Interrupt" ganz schlecht.
Da du ja schon einen Interrupt hast, nämlich INT0, kannst du ja gleich 
noch einen zweiten dazu bauen, nämlich einen TimerInterrupt T1_INT.

Du stellst den Timer auf die zu wartende Zeit, schickst deine Message ab 
und startest den Timer. Dann kannst du von mir aus machen was du willst. 
Tritt der T1_INT ein, kam kein ACK, tritt der INT0 ein, ist alles OK.
Dann wieder von vorne.

von c-hater (Gast)


Bewertung
0 lesenswert
nicht lesenswert
Jens K. schrieb:

> ich sende in einem Programm eine Nachricht via Funk zu einem anderen
> Controller. Das ganze geschieht in einer Schleife, in welcher das
> Programm am Ende auf ein ACK vom anderen Controller wartet. Kommt dies
> nicht, wird die Nachricht erneut gesendet (deshalb die Schleife).

Das ist schon vom Ansatz her eine Scheisskonstruktion. Befasse dich mit 
ereignisorientierter Programmierung und state machines, dann brauchst du 
solche hirntoten Konstrukte nicht mehr und hast dann auch keine solchen 
Probleme mehr.

Ja klar, es gibt Fälle, in denen diese prinzipiell hirntoten Konstrukte 
tatsächlich genügen oder sogar die bestmögliche Lösung sind. Aber das 
sind wirklich eher seltene Ausnahmen. Nur Anfängern kommt es so vor, als 
könnte es anders sein...

von Jens K. (mister232)


Bewertung
0 lesenswert
nicht lesenswert
Vielen Dank für die Antworten. Ich werde das mit dem Timer von DanVet 
mal ausprobieren.

von DanVet (Gast)


Bewertung
0 lesenswert
nicht lesenswert
c-hater schrieb:
> Jens K. schrieb:
> Das ist schon vom Ansatz her eine Scheisskonstruktion. Befasse dich mit
> ereignisorientierter Programmierung und state machines, dann brauchst du
> solche hirntoten Konstrukte nicht mehr und hast dann auch keine solchen
> Probleme mehr.
>
> Ja klar, es gibt Fälle, in denen diese prinzipiell hirntoten Konstrukte
> tatsächlich genügen oder sogar die bestmögliche Lösung sind. Aber das
> sind wirklich eher seltene Ausnahmen. Nur Anfängern kommt es so vor, als
> könnte es anders sein...

Ehrlich gesagt habe ich deinen Kommentar nicht verstanden. Es sei denn 
du hast meinen Post (vor deinem) nicht gelesen und meinst das selbe wie 
ich.

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]
  • [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.