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