www.mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik MSP430 Timer-Problem


Autor: Rainer (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,

betreibe einen MSP430F1611 mit 8 MHz und möchte den Timer B quasi als 
Zeitmesser für max. 7 (gibt halt 7 Compare-Register) unabhäbgige 
Funktionen als Zeitbasis einsetzen. Allerdings sollen auch Zeiten, die 
mittels 16-Bit nicht mehr darstellbar sind (>= ~8,2 ms bei 8 MHz), 
gemessen werden. Nach Ablauf der entsprechenden Zeit gibt es einen 
Interrupt und es kann eine Aktion ausgeführt werden.

Die Variablen sind alle (bis auf longTempTBR) unsigned long, global und 
volatile!

In der Interruptroutine wird - bei festem Intervall - der Vergleichswert 
für den Counter berechnet und in TBCCR2 abgelegt:
__interrupt void Timer_B1(void);
TIMERB1_ISR(Timer_B1)
__interrupt void Timer_B1(void)
{
  unsigned long  longTempTBR;

   switch( TBIV )
   {
    case  4: // Timer B 2 Intterupt
             longTempTBR = (unsigned long) TBR; // Counter-Wert holen
         
             ... macht etwas...
        
             longEnableTime = longTempTBR + longEnableIntervall;
           
             longEnableTimeOverflow = longEnableTime >> 16;     // durch 2^16 teilen, um die Zahl der Overflows zu bestimmen
             TBCCR2 = (unsigned int) (longEnableTime & 0xFFFF); // Rest der Division in TBCCR2 als Vergleichswert ablegen
           
             if (longEnableTimeOverflow > 0) TBCCTL2 &= ~CCIE; // falls Overflow erforderlich (longEnableTime größer als 2^16), Interrupt B2 erstmal blockieren
             else TBCCTL2 |= CCIE; // falls kein Overflow notwendig (longEnableTime kleiner als 2^16), Interrupt B2 sofort freischalten
                            
         
             break;                              

    case 14: // Timer B Overflow
             if (longEnableTimeOverflow > 0) longEnableTimeOverflow--; // Overflow-Zähler runterzählen
             if (longEnableTimeOverflow == 0) TBCCTL2 |= CCIE; // Overflow-Zähler abgelaufen, also Interrupt freischalten
                  
             break;
    }
}

Mit Werten unter 2^16 (0 < longEnableIntervall <= 0xFFFF) für 
longEnableIntervall funktioniert das alles wunderbar! Aber sobald 
longEnableIntervall größer als 65536 wird, wird es erratisch... Hat da 
jemand eine Idee?

Autor: Rainer (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
P.S.: Der Timer B läuft auf M_CLOCK mit 16 Bit im Continious-Mode
  // no Group, SMCLK, continuous  mode, 16 Bit, Clockdivider /1
  TBCTL = TBCLGRP_0 + TBSSEL_2 + MC_2 + CNTL_0;
  TBCTL |= TBIE;  // OverflowInterrupt enabled
  TBR = 0;        // Counter B nur einmal initial zurücksetzen

Autor: Jörg S. (joerg-s)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
D.h. in der Zeile
longEnableTime = longTempTBR + longEnableIntervall;
bekommt longEnableTime einen falschen Wert wenn longEnableIntervall 
größer 0xFFFF ist?

Autor: Rainer (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
nein - das komische ist, dass die summe korrekt ist. ich habe aber 
festgestellt, dass der TBR, also der eigentliche Counter, meistens (in 
über 90% der Fälle) eine Wert von 186 hat, was eigentlich überhaupt 
nicht sein dürfte! Der TBR müßte doch eigentlich  "durchlaufen", also 
jedesmal einen anderen Wert und langfristig alle möglichen Werte 
zwischen 0 und 0xFFFF annehmen...

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.