Ja ok das reti() hat alles kaput gemacht.
Danke!
btw:
das sei() ist da, damit ich lange Prozeduren nicht atomisch ausführen kann.
Das wird dann per Variable ein und aus geschaltet.
Ja ok das reti() hat alles kaput gemacht.
Danke!
btw:
das sei() ist da, damit ich lange Prozeduren nicht atomisch ausführen kann.
Das wird dann per Variable ein und aus geschaltet.
Das sei bewirkt in dem Interrupt absolut gar nichts. Wenn das System in den Interrupt gesprungen ist, dann sind die interrupts bereits aktiv.
tja jetzt funktioniert es immer noch nicht so ganz:
ich habe zwei variablen eingefügt, die wie ein timer compare interrupt funktionieren sollen,
allerdings kann ich die nicht immer erfolgreich beschreiben:
irgendwie kommt mir das komisch vor.Code:static volatile unsigned int odometry_count_r=0; static volatile unsigned int odometry_count_l=0; // auch static getestet volatile unsigned int odometry_comp_r=0; volatile unsigned int odometry_comp_l=0; /*wie gesagt compare */ void ( * odometry_l_comp)(void); void ( * odometry_r_comp)(void); ISR(INT0_vect) { odometry_count_l++; #ifdef __TEST set_led(LED_L_Y,1); _delay_ms(20); set_led(LED_L_Y,0); #endif if(odometry_count_l==odometry_comp_l) { odometry_l_comp(); } } void _init_odometrie(void) { if(add_mod(_MOD_ODO)); { GICR|= 1<<INT0; GICR|= 1<<INT1; MCUCR|= 1<<ISC01 | 1<<ISC00; MCUCR|= 1<<ISC11 | 1<<ISC10; sei(); #ifdef __TEST odometry_l_comp=lauffeuer; odometry_r_comp=lauffeuer; #else odometry_l_comp=nop; odometry_r_comp=nop; #endif // das wuerde funktionieren // odometry_comp_l=5; // odometry_comp_r=5; } } // aus odtest.c int main(void) { // funktioniert nicht. odometry_comp_l=5; odometry_comp_r=5; //auch andersherum getestet _init_odometrie(); while(1); }
Danke in Vorraus
LittleBoy
hi,
hast Du die beiden Variablen im Modul odtest.c mit extern deklariert ?
mfg
Achim
nein,
da ich die Variablen in odometrie.h definiert habe und in odotest.c mit `#include"odometrie.h"`
eingebunden habe, genauso wie in
odometrie.c, wo die Funktion `_init_odometrie()` drin ist.
Das ist das was mich ja so wundert.
lg
LittleBoy
Eine Variable im Header kann gar nicht funktionieren. Da würde ein normaler, funktionierender Compiler sofort melden, dass "multiple definitions" vorhanden sind und abbrechen.
Pack die Variablen als static ins source-file und implementiere Funktionen zum ändern.
Dann hast du eine funktionierende, saubere und Design-konforme Lösung. Globale Variablen sind sch*****!!Code:inline void IncrOdoCount(); inline int GetOdoCount(); etc...
mfg
Lesezeichen