17.02.2012, 02:46 AM
Im Umfeld von Interrupts hält der AVR ja so den einen oder anderen netten Stolperstein bereit, z.B.
kann man den Watchdogtimer dazu überreden, einen wakeup Interrupt auszulösen statt durch den reset zu laufen. Dazu muß man am Ende jedes WDT-irq aber jedesmal neu das zugehörige enable-bit setzen.
Andernfalls fällt er zurück in den default und läuft zyklisch in den reset (bei mir ca alle 1,5sec). Wenn man also mal wieder testweise global alle interrupts sperrt, wird man genau das erleben, da der rettende WDT-irq damit auch gesperrt wird.
Um ein irq-Flag zu löschen, muß man in das entsprechende Registerbit eine 1 schreiben. Die naheliegende Veroderung mit diesem bit ist definitiv der falsche Weg: Dabei werden alle bereits gesetzten flags ausgelesen und beim zurückschreiben gelöscht! Richtig ist es also, in das register nur dieses eine bit zurückzuschreiben, alle anderen dabei aber auf Null zu setzen.
Den Austausch von Variablen >8bit zwischen Irqs und Hauptprogramm sollte man tunlichst unterlassen,
dies ist ein 8-bit controller. Als workaround wird ein Plausibilitätstest vorgeschlagen, also so lange pollen,
bis zwei identische Resultate aufeinanderfolgen.
Das sind so die netten Kleinigkeiten die dafür sorgen,
dass dieses alberne power-monitor-programm immer noch nicht fertig ist.
Und außerdem hat sich gezeigt, dass das Arbeiten mit einer IDE wie Eclipse auf meinem 12" Bildschirm doch schon eher grenzwertig ist.
kann man den Watchdogtimer dazu überreden, einen wakeup Interrupt auszulösen statt durch den reset zu laufen. Dazu muß man am Ende jedes WDT-irq aber jedesmal neu das zugehörige enable-bit setzen.
Andernfalls fällt er zurück in den default und läuft zyklisch in den reset (bei mir ca alle 1,5sec). Wenn man also mal wieder testweise global alle interrupts sperrt, wird man genau das erleben, da der rettende WDT-irq damit auch gesperrt wird.
Um ein irq-Flag zu löschen, muß man in das entsprechende Registerbit eine 1 schreiben. Die naheliegende Veroderung mit diesem bit ist definitiv der falsche Weg: Dabei werden alle bereits gesetzten flags ausgelesen und beim zurückschreiben gelöscht! Richtig ist es also, in das register nur dieses eine bit zurückzuschreiben, alle anderen dabei aber auf Null zu setzen.
Den Austausch von Variablen >8bit zwischen Irqs und Hauptprogramm sollte man tunlichst unterlassen,
dies ist ein 8-bit controller. Als workaround wird ein Plausibilitätstest vorgeschlagen, also so lange pollen,
bis zwei identische Resultate aufeinanderfolgen.
Das sind so die netten Kleinigkeiten die dafür sorgen,
dass dieses alberne power-monitor-programm immer noch nicht fertig ist.
Und außerdem hat sich gezeigt, dass das Arbeiten mit einer IDE wie Eclipse auf meinem 12" Bildschirm doch schon eher grenzwertig ist.
...mit der Lizenz zum Löten!