mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik I2C-zugriff während in ISR?


Autor: Timo K. (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo zusammen.
Ich bin gerade dabei eine Projektarbeit zu starten. Da ich diesmal etwas 
strukturiert an die Sache herangehen will, hätte ich da eine Frage 
bezüglich der ‚allgemeinen‘ Software-Struktur. Und zwar sollte ich 
mittels I2C einen Baustein ansteuern. Dieser Baustein löst immer dann 
einen Interrupt aus, wenn allgemeine Ereignisse eintretten. Die Art des 
Ereignisses lässt sich dann über I2C aus dem  Register 0h auslesen. 
Danach müssen  weitere Register ausgelesen werden,  um weitere 
Informationen zu erhalten. Meine Frage bezüglich der SW-Struktur 
betrifft nun konkret die Interruptverarbeitung.
Ich sehe folgende Möglichkeiten:
a.) Ich lese direkt im Interrupt über I2C die entsprechenden Register 
aus und starte die Abarbeitung. Vorteil: Ich kann direkt auf das 
entsprechende Ereignis reagieren. Nachteil: Ich habe eine relativ lange 
ISR (Auslesen der Register über I2C, Algorithmus…)
b.) Ich setze in der ISR nur ein Flag. In einer nebenläufigen Schleife 
lese ich dann die Register über I2C aus und starte eine entsprechende 
Abarbeitung.  Vorteil: Kurze ISR, Nachteil: Ich reagiere ziemlich spät 
auf das Ereignis. Im Grunde genommen könnte ich dann ich der Schleife 
gleich den entsprechenden Pin pollen…

Wie würde man in der Praxis dies implementieren? Danke für eure Tipps 
und Anregungen.

Autor: Alfred (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Guten Morgen Timo,

ich würde Deine Variante b) in Betracht ziehen. Die "nebenläufige 
Schleife" wäre ja in Deinem Fall eine Endlosschleife in main(), die das 
Flag überprüft und dann die Verarbeitung anstößt.

Das heißt, Du hast in der Hauptschleife noch die Möglichkeit, andere 
Sachen zu erledigen, was bei der Polling-Variante ausfällt, weil Du ja 
den Pin pollst :-)

Die Variante b) entkoppelt Dir Dein System zeitlich und wenn Du 
irgendwann noch was anderes machst, als einen einzelnen I2C Slave zu 
steuern, wird Dir das zugute kommen.

Variante a) geht eigentlich nur, wenn die lange ISR keinen stört, also 
sonst nix passiert. In dem Fall würde ich dann das Flag pollen, weil das 
einen einfacheren Code gibt.

Beste Grüße

Alfred

Autor: Olaf Dreyer (Firma: O.D.I.S.) (dreyero)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo Timo K.

die Variante a) wird nicht funktionieren, da der I²C auch wieder 
Interrupts auslöst. In den Projekten meiner Kunden sehe ich immer wieder 
solche Ansätze und große Augen, wenn es schiefgeht. Schreibe Dir einen 
Treiber Task der die Logik der Hardware-Ansteuerung implementiert. 
Getriggert wird er über Events die aus den Interrupts gesendet werden, 
wenn etwas zu eempfangen ist, bzw. über Nachrichten der 
Applikations-Tasks, wenn was zu senden ist.

Der Vorteil: mehrere Applikationen können senden, der Treiber-Task 
serialisiert das.

Gruß

Olaf

Autor: Timo K. (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo Alfred, hallo Olaf.
Vielen Dank für den Hinweis auf I2C und Interrupts. An das hätte ich 
jetzt wahrscheinlich auch nicht gedacht.

Ich werde mich dann also an Variante b. orientieren.

Gruß
Timo

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.