mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik volatile


Autor: Tenner (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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]

Autor: Dirk Doerr (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Unbekannter (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
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.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.