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
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
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
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'.
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.