www.mikrocontroller.net

Forum: Compiler & IDEs Werte aus Interrupt-Routine richtig verarbeiten


Autor: Hans D. (Gast)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
Werte µC Gemeinde,

ich habe eine Frage zu Interrupts:

Ich will einen ATtiny DMX512 lesen lassen. Genauer: Er soll einen
bestimmte Kanal einlesen und diesen Wert speichern. Anschließend soll
die Interrupt-Routine den gleichen Kanal nochmals auslesen. Dieser Wert
wird dann einer anderen variablen zugewiesen.

Danach sollen diese beiden Werte verglichen werden und eine Enscheidung
getroffen werden.

Sporadisch funktioniert das Ganze, jedoch vermute ich Timing-Probleme.

Kann ich den Interrupt irgendwie sperren bis die Aktion korrekt
ausgeführt wurde?

Viele Grüße

Autor: Peter Dannegger (peda)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hans D. schrieb:
> Sporadisch funktioniert das Ganze, jedoch vermute ich Timing-Probleme.

Ne, es sind logische Probleme. Mach Dir mal nen Programmablaufplan.

Nur, wenn der UART-Interrupt genau hier zwischenfunkt:
    value1 = value3 = DmxField[0];
    value2 = value4 = DmxField[0];
passiert überhaupt mal was.

Denselben Wert in viele Variablen zu schreiben, macht nur Sinn, wenn 
diese danach geändert werden.
Versuche mal Variablen mit Bedacht zu verwenden und nicht so mit der 
Gießkanne gleiche Werte in nen Haufen Variablen zu schütten.

Also mach nen Plan, wann muß ich mir was merken, wann auswerten und wann 
updaten.


Peter

Autor: Hans D. (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi Peter,

Danke für die schnelle Antwort.

So etwas habe ich auch vermutet. Jedoch bin ich (noch) nicht der 
Programmier-Guru, um das richtig zu programmieren.

Hättest Du evtl. einen Ansatz oder eine kleine Hilfestellung für mich?

VG

Hans

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

Bewertung
0 lesenswert
nicht lesenswert
Hans D. schrieb:

> Hättest Du evtl. einen Ansatz oder eine kleine Hilfestellung für mich?

Fang nochmal von vorne an.

Und benutze den Ansatz (symbolisch als Pseudocode zu lesen) ...


int main()
{
...

    AlterWert = irgendwas_Sonnvolles_oft_einfach_nur_0;

    while( 1 ) {

      NeuerWert = krieg_ich_von_irgendwo_her_zb_UART;


      if( NeuerWert != AlterWert ) {
        Wert hat sich verändert
        darauf reagieren

        AlterWert = NeuerWert;
      }
    }
}


... dann verpasst dein Programm keine Änderung eines Vorgabewertes mehr.


> Genauer: Er soll einen
> bestimmte Kanal einlesen und diesen Wert speichern. Anschließend
> soll die Interrupt-Routine den gleichen Kanal nochmals auslesen.

Dieser Denk-Ansatz ist schon falsch. Du kannst den Tiny nicht 'lesen 
lassen'. Es liegt nicht in der Hand des Tiny das zu entscheiden. Der 
Tiny ist nur Befehlsempfänger. Irgendwann kommt ein Befehl über die UART 
herein und dann soll der Tiny reagieren. Aber der Tiny kann nicht von 
sich aus 'einen Kanal lesen'.

Autor: Hans D. (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi Karl Heinz,

vielen Dank für Deinen Ansatz. Nun funktioniert es!!

Gruß

H.D.

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.