volatile

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

Antwort schreiben

Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt. Bitte hier nur auf die ursprüngliche Frage antworten, für neue Fragen einen neuen Beitrag erstellen.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.