Hallo Leute,
Ich will für den Nibobee ein Odometriesystem schreiben und stoße dabei auf ein kleines Problem:
Ich kann eine globale Countervariable nicht korrekt beschreiben.
Aber es wird nie odometry_l_overflow ausgeführt. Eigentlich sollte auch der Speicher nicht korrumpiert seinCode:// mit und ohne static, sowie auch ohne volatile negativ getestet /*static*/ volatile unsigned int odometry_count_r=0; /*static*/ volatile unsigned int odometry_count_l=0; /* wenn etwas überläuft, wird das ausgeführt */ // mit und ohne volatile getestet /*volatile*/ void ( * odometry_l_overflow)(void); /*volatile*/ void ( * odometry_r_overflow)(void); ISR(INT0_vect) { // u.U. muss man das nicht atomisch machen // sei(); odometry_count_l++; #ifdef __TEST set_led(LED_L_Y,1); _delay_ms(20); set_led(LED_L_Y,0); #endif // eigentlich 0, da dann ein ueberlauf da ist, 3 zum testen. if(odometry_count_l==3) { odometry_l_overflow(); } reti(); } // analog dazu vect1 void _init_odometrie(void) { GICR|= 1<<INT0; GICR|= 1<<INT1; MCUCR|= 1<<ISC01 | 1<<ISC00; MCUCR|= 1<<ISC11 | 1<<ISC10; sei(); #ifdef __TEST // lauffeuer laesst leds der reihe nach blinken. odometry_l_overflow=lauffeuer; odometry_r_overflow=lauffeuer; #else odometry_l_overflow=nop; odometry_r_overflow=nop; #endif #ifdef __TEST _init_led(); #endif } void nop(void) { asm("nop"); }
und der Funktonspointer funktioniert auch. Die ganzen Led-Sachen sind nur da um zu sehen wann der Interrupt ausgelößt wurde.
Danke im Vorraus
LittleBoy







Zitieren


Lesezeichen