Absender: Jörg Schüler-Maroldt
Datum: Mi, 20.09.2006 12:46:50
In-reply-to:
<002801c6db48$e25976c0$1401a8c0@user08>
Hallo Timo, du hast leider recht, man muss die Funktion mit "cli" "sei" verriegeln. uint32 timer_get_ms_ticks(void) { uint32 tick; asm volatile("cli"); // Disabel Interrupt tick=time_tick; asm volatile("sei"); // Enable Interrupt return tick; } In "delay.h" ist delay() falsch deklariert es muss void delay(uint16 ms); heißen in "delay.c" fehlt #include "delay.h" deshalb ist der Fehler nicht aufgefallen. Frage an AVR-Asm Kenner: Sind im Timerinterrupt die Interupts gesperrt bis "reti" oder muss man das selbst machen ? Mein ctbot "muckt" aber noch mit der Funktion und ich melde mich wenn es bei mir Funktioniert. -----Ursprüngliche Nachricht----- Von: ct-bot-entwickler-bounces@xxxxxxxxxxxxxxxxx [mailto:ct-bot-entwickler-bounces@xxxxxxxxxxxxxxxxx]Im Auftrag von Timo Sandmann Gesendet: Montag, 18. September 2006 19:36 An: 'Entwicklung rund um den c't-bot' Betreff: RE: [ct-bot]Patch für Fehler in delay-Funktion Jörg Schüler-Maroldt schrieb: > Hallo, > > die delay-Funktion im ct-Bot funktioniert so nicht sauber. > Der Fehler liegt in der timer.c / timer.h Der Aufruf von > timer_get_ms() und timer_get_s() nacheinander kann immer > durch einen Interrupt unterbrochen werden und beim Überlauf > von time_ms Differenzen von einer Sekunde hervorrufen. Hallo, das Problem leuchtet mir schon ein, aber die Lösung nicht so ganz: > ... > Der Zugriff auf eine 16-Bit Variable (time_ms_tick) kann > nicht unterbrochen werden, da es sich nur um eine > Assembler-Anweisung handelt. Wird uint t1=time_ms_tick; nicht zu _zwei_ LDS-Anweisungen in Assembler? Dann könnten doch auch die wieder unterbrochen werden und das ganze ändert nichts, oder sehe ich das falsch? Viele Grüße, Timo _______________________________________________ ct-bot-entwickler Mailingliste ct-bot-entwickler@xxxxxxxxxxxxxxxxx http://www.heise.de/bin/newsletter/listinfo/ct-bot-entwickler