Absender: Achim Pankalla
Datum: Do, 17.08.2006 15:09:59
hallo,nachdem mein hilferuf hier im entwickler-newsletter unbeantwortet blieb, habe ich selbst nochmal versucht herauszubekommen, warum die delay-fkt nicht verzögert.
das ergebnis ist dieser patch, der vielleicht nicht ganz den richtlinien entspricht. aber jetzt geht die funktion. aus zwei gründen ging die delay-fkt nicht.1) die warte-schleife musste auf grund der bedingungen immer sofort abbrechen!
2) die timer-isr wird zu spät initialisiert. da 1) immer für eine rückkehr von der delay fkt sorgte ist dieser fehler auch nicht aufgefallen (zumal die verzögerungen sehr gering sind). als ich jedoch die bedingungen der warteschleife korregiert habe, hing der bot. weil nun auf ein weiterlaufen der sekunden und millisekundengewartet wurde, diese änderten sich aber nicht, da die timer-variablen nicht aktualisiert wurden, da die isr dafür noch nicht aktiv war. sprich alle delay aufrufe bis zum aufruf von bot_sens_isr() hatten keine wirkung (wegen schleifenabbruch), beziehungsweise hingen nach der korrektur.
der patch ändert die warte-bedingung der delay-fkt und trägttimer_2_init() in die init-fkt von ct-bot.c ein, ob das der ideale platz ist weiss ich nicht, aber ich wüsste auch nicht welcher besser waere (der eintrag in bot_sens_isr() wird vom dem patch aber nicht entfernt.
viel spass damit. gruss achim
Index: Changelog.txt =================================================================== RCS file: /ctbot/ct-Bot/Changelog.txt,v retrieving revision 1.93 diff -u -r1.93 Changelog.txt --- Changelog.txt 15 Aug 2006 08:21:30 -0000 1.93 +++ Changelog.txt 17 Aug 2006 13:02:25 -0000 @@ -1,5 +1,7 @@ CHANGELOG fuer c't-Bot ====================== +2006-08-17 Achim Pankalla [achim.pankalla@xxxxxx]: Korregiert Fehler bei delay-Fkt. + 2006-08-04 Timo Sandmann [mail@xxxxxxxxxxxxxxx]: tcp.h um include fuer Macs ergaenzt 2006-08-04 Benjamin Benz [bbe@xxxxxxxx]: Alle TCP-Daten werden nun auf einen Schlag uebertragen Index: ct-Bot.c =================================================================== RCS file: /ctbot/ct-Bot/ct-Bot.c,v retrieving revision 1.33 diff -u -r1.33 ct-Bot.c --- ct-Bot.c 15 Aug 2006 08:21:30 -0000 1.33 +++ ct-Bot.c 17 Aug 2006 13:02:25 -0000 @@ -105,6 +105,11 @@ // Watchdog aus! wdt_disable(); + // Time ISR initialiseren vor ersten delay Aufruf + timer_2_init(); + // Ist das ein Power on Reset ? if ((MCUCSR & 1) ==1 ) { MCUCSR &= ~1; // Bit loeschen Index: mcu/delay.c =================================================================== RCS file: /ctbot/ct-Bot/mcu/delay.c,v retrieving revision 1.5 diff -u -r1.5 delay.c --- mcu/delay.c 8 Jul 2006 02:36:15 -0000 1.5 +++ mcu/delay.c 17 Aug 2006 13:02:26 -0000 @@ -68,7 +68,9 @@ uint16 s_stop = s_start + ms_stop/1000; ms_stop %= 1000; - while ((s_stop != timer_get_s()) && (ms_stop != timer_get_ms())){asm volatile("nop");} + while ( s_stop > timer_get_s() ){asm volatile("nop");} /*Sekunden ablaufen lassen*/ + while (ms_stop > timer_get_ms()){asm volatile("nop");} /*Millisek. ablaufen lassen*/ +// while ((s_stop != timer_get_s()) && (ms_stop != timer_get_ms())){asm volatile("nop");} #else uint16 ms_counter=0;