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.
Code:
// 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");
}
Aber es wird nie odometry_l_overflow ausgeführt. Eigentlich sollte auch der Speicher nicht korrumpiert sein
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
Lesezeichen