ich habe hier ein für mich merkwürdiges problem. für einen digitalen Tacho nutze ich bei einem MSP430F149 den Capture-Interrupt. In der Interruptroutine wird pro Sensorsignal eine unsigned long Variable incrementiert. Wenn ich dieser Variable das Attribut volatile gebe, kommt es zu einem systematischen Fehler bei der Berechnung für den Kilometerzähler. Dieser Fehler liegt bei 20%, soll heißen bei einer konstanten Geschwindigkeit von 100Km/h steht der Kilometerzähler nach einer Stunde auf lediglich 80Km. Ein fehler in der berechnung ist auszuschließen, da der Fehler lediglich besteht wenn die variable das Attribut volatile hat. hier mal ein ausschnitt aus dem code [code] #define WHEELIMPREC 32 // sets count of impulses to get for speedcalculation #define WITDINDEXMASK 0x001F // indexmask #define WHEELIMPCALC 8 // sets count of impulses to calc speed volatile unsigned int uiTurnsImpCnt; // Timer_A1 Interrupt Vector (TAIV) handler interrupt (TIMERA1_VECTOR) Timer_A1(void) { switch (TAIV) { case 0x04: ulWheelImpCnt++; // count interrups for dist.-calc. if( TACCTL2&COV ) { TACCTL2 &= ~COV; ulWheelImpCnt++; // count interrups for dist.-calc. break; } uiWITDIndex++; auiWheelImpTimeDelta[uiWITDIndex&WITDINDEXMASK] = TACCR2; break; } } ... void calcDistance( void ) { unsigned long ulDistance; unsigned long ulWIC; static unsigned long ulLastWIC; // Speed ulWIC = ulWheelImpCnt; // Distance ulDistance = ( READ_FROM_CONFIG->ulWheelSegment * (ulWIC-ulLastWIC) ) / 10000; ulLastWIC = ulWIC; stLogData.ulTotalDistance += ulDistance; } [\code]
Hi! Ist das der richte Code? Ich sehe hier eine Zeile mit volatile volatile unsigned int uiTurnsImpCnt; aber die Variable wird nicht verwendet. Stattdessen wird ulWheelImpCnt benutzt. Solltest Du die Variable nicht mit 0 initialisieren. Kann es nicht zu einem Überlauf kommen? Viele Grüße Dirk
Du willst lesen / lernen: a.) Was Race-Conditions sind, b.) dass in C ist ein "variable++" nicht atomar ist, c.) wie man kritische Code-Blöcke vor Interupts schützt.
Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.