Dunuin
26.06.2011, 09:44
Moin,
Ich nutze gerade den Timer1 per Overflow zum Hochzählen von ein paar Zeitvariablen und den Timer0 per Overflow zum Empfangen von RC5.
In der Hauptschleife halte ich dann kurz alle Interrupts an, damit die Variablen der ISRs nicht verändert werden, während ich diese auslese und es dann nicht zu Fehlern kommt. Wenn ich an das Ende meiner Hauptschleife ein "Waitms 100" setze, dann klappt auch alles prima, mit "waitms 1" wird aber nur noch sehr vereinzelt etwas empfangen, was wie ich vermute daran liegt, dass der Atmega dann im Verhältnis zu lange die Interrupts deaktiviert hat.
Das beste was mir da jetzt einfallen würde wäre, dass ich dort nun die Zeit verringere, in der die Interrupts deaktiviert sind. Wenn ich einfach nur eine Bytevariable in eine andere Bytevariable kopiere, dann kann da nichts schief gehen, weil alles in einem Schritt passiert, auch wenn sich die ISR dazwischenschiebt, oder? Bei Wordvariablen muss man da wohl aufpassen.
Aber wie sieht das in Bascom mit Bitvariablen aus? Kann es da Fehler beim Lesen/Schreiben geben, wenn die ISR genau dann einspringt, wenn die Bitvariable bearbeitet wird?
Und wie sieht das zeitlich mit "enable Interrupts" und "disable Interrupts" aus? Macht es da Sinn die Interrupts vor und nach jeder Variable zu deaktivieren und aktivieren oder lieber nur einmal am Anfang und Ende?
Also lieber...
disable interrupts
wordvariable1 = wordvariable2
enable interrupts
If A = B Then
disable interrupts
wordvariable3 = wordvariable4
enable interrupts
End If
...oder doch...
disable interrupts
wordvariable1 = wordvariable2
If A = B Then
wordvariable3 = wordvariable4
End If
enable interrupts
...?
MfG
Dunuin
Ich nutze gerade den Timer1 per Overflow zum Hochzählen von ein paar Zeitvariablen und den Timer0 per Overflow zum Empfangen von RC5.
In der Hauptschleife halte ich dann kurz alle Interrupts an, damit die Variablen der ISRs nicht verändert werden, während ich diese auslese und es dann nicht zu Fehlern kommt. Wenn ich an das Ende meiner Hauptschleife ein "Waitms 100" setze, dann klappt auch alles prima, mit "waitms 1" wird aber nur noch sehr vereinzelt etwas empfangen, was wie ich vermute daran liegt, dass der Atmega dann im Verhältnis zu lange die Interrupts deaktiviert hat.
Das beste was mir da jetzt einfallen würde wäre, dass ich dort nun die Zeit verringere, in der die Interrupts deaktiviert sind. Wenn ich einfach nur eine Bytevariable in eine andere Bytevariable kopiere, dann kann da nichts schief gehen, weil alles in einem Schritt passiert, auch wenn sich die ISR dazwischenschiebt, oder? Bei Wordvariablen muss man da wohl aufpassen.
Aber wie sieht das in Bascom mit Bitvariablen aus? Kann es da Fehler beim Lesen/Schreiben geben, wenn die ISR genau dann einspringt, wenn die Bitvariable bearbeitet wird?
Und wie sieht das zeitlich mit "enable Interrupts" und "disable Interrupts" aus? Macht es da Sinn die Interrupts vor und nach jeder Variable zu deaktivieren und aktivieren oder lieber nur einmal am Anfang und Ende?
Also lieber...
disable interrupts
wordvariable1 = wordvariable2
enable interrupts
If A = B Then
disable interrupts
wordvariable3 = wordvariable4
enable interrupts
End If
...oder doch...
disable interrupts
wordvariable1 = wordvariable2
If A = B Then
wordvariable3 = wordvariable4
End If
enable interrupts
...?
MfG
Dunuin