Gast
#312995
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]