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


von Hans D. (Gast)


Angehängte Dateien:

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

von Peter D. (peda)


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:
1
    value1 = value3 = DmxField[0];
2
    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

von Hans D. (Gast)


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

von Karl H. (kbuchegg)


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) ...

1
int main()
2
{
3
...
4
5
    AlterWert = irgendwas_Sonnvolles_oft_einfach_nur_0;
6
7
    while( 1 ) {
8
9
      NeuerWert = krieg_ich_von_irgendwo_her_zb_UART;
10
11
12
      if( NeuerWert != AlterWert ) {
13
        Wert hat sich verändert
14
        darauf reagieren
15
16
        AlterWert = NeuerWert;
17
      }
18
    }
19
}

... 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'.

von Hans D. (Gast)


Lesenswert?

Hi Karl Heinz,

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

Gruß

H.D.

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
Noch kein Account? Hier anmelden.