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

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.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.