mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik MSP430 timerA und ISR


Autor: Klaus Kaiser (Gast)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,

ich versuche schon seit einiger Zeit folgendes:

Eine an Port1 (P1.0) meines MSP430F1611 angeschlossene LED soll
blinken. Ich möchte, dass sie Timergesteuert blinkt und habe daher den
TimerA wie im Code (im Anhang) zu sehen initialisiert und auch eine ISR
geschrieben.

Das ganze scheint auch irgendwie zu funktionieren, die LED blinkt,
allerdings ist die Blinkfrequenz völlig unabhaengig vom Wert in CCR0.

Mache ich da irgendetwas falsch?

Klaus

Autor: Christian Rötzer (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Weil ich gerade gesehen habe, dass Du da am Watchdog rum machst... der
löst nicht ständig aus und Deine LED blinkt mit der Watchdogfrequenz?

Autor: Thomas H. (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
versuch mal so:
  WDTCTL = WDTPW + WDTHOLD; // watchdog aus
  // Starten des Quarzes 
  BCSCTL1 |= XTS;         // ACLK = LFXT1 = HF XTAL
  do 
  {                       // pruefroutine, ob 8 Mhz-oszillator schon
stabil ist
    IFG1 &= ~OFIFG;       // OSCFault flag loeschen (zeigt
oszillatorfehler an)
    for (i=0xFF;i>0;i--); // warten, ob es wieder gesetzt wird
  }
  while (IFG1 & OFIFG);   // OSCFault immer noch gesetzt?       
  BCSCTL2 |= SELM_3;      // MCLK = LFXT1 (safe) 8 MHz 8,0005560
  BCSCTL2 |= SELS;        // SMCLK = LFXT1
  BCSCTL2 |= DIVS_0;      // SMCLK = 8 MHz

  _BIS_SR(GIE);           // allgemeiner interrupt-enable (noetig fuer
nulldurchgangserkennung)
  CCTL0 = CCIE;           // CCR0 interrupt enabled
  CCR0 = 200;
  TACTL = TASSEL_2 + MC_1;// SMCLK, upmode

...



// Timer A0 interrupt service routine
#pragma vector=TIMERA0_VECTOR
__interrupt void Timer_A (void)
{
  ms_counter++;
//  timer1++;
}


gruß
thomas

Autor: Michael B (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi,

du hast den Interrupt für TimerA und den Compare0 aktiviert.

Autor: Ed. (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Kein Wunder das deine Blinkfrequenz unabhängig vom Wert in CCR0 ist.
Selbst wenn du die CCR0 Zeile in der ISR rausnimmst, dürfte sich an dem
Verhalten nix ändern. Grund ist, das du den Wert in der ISR ensprechend
erhöhen musst, z.B. CCR0 += 100. So wie du das gemacht hast, löst dein
Interrupt immer bei 100 aus, zählt hoch, läuft über, löst wieder bei
100 aus, usw.. Ist genauso wie ein Überlauf Interrupt, nur um 100 Takte
verschoben. Im übrigen gibt es auf der TI Homepage massig Beispiele für
die Timer Interrupt Behandlung.

Gruß Ed.

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.