Forum: Mikrocontroller und Digitale Elektronik volatile


von Tenner (Gast)


Lesenswert?

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]

von Dirk Doerr (Gast)


Lesenswert?

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

von Unbekannter (Gast)


Lesenswert?

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
Noch kein Account? Hier anmelden.