LittleBoy
17.08.2015, 10:18
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.
// 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
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.
// 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