Werte aus Interrupt-Routine richtig verarbeiten

Gast #1397601
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
Angehängte Dateien:
#1397623
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
Gast #1397698
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
#1397730
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'.

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren