Forum: Mikrocontroller und Digitale Elektronik MSP430 timerA und ISR


von Klaus Kaiser (Gast)


Angehängte Dateien:

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

von Christian Rötzer (Gast)


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?

von Thomas H. (Gast)


Lesenswert?

versuch mal so:
1
  WDTCTL = WDTPW + WDTHOLD; // watchdog aus
2
  // Starten des Quarzes 
3
  BCSCTL1 |= XTS;         // ACLK = LFXT1 = HF XTAL
4
  do 
5
  {                       // pruefroutine, ob 8 Mhz-oszillator schon
6
stabil ist
7
    IFG1 &= ~OFIFG;       // OSCFault flag loeschen (zeigt
8
oszillatorfehler an)
9
    for (i=0xFF;i>0;i--); // warten, ob es wieder gesetzt wird
10
  }
11
  while (IFG1 & OFIFG);   // OSCFault immer noch gesetzt?       
12
  BCSCTL2 |= SELM_3;      // MCLK = LFXT1 (safe) 8 MHz 8,0005560
13
  BCSCTL2 |= SELS;        // SMCLK = LFXT1
14
  BCSCTL2 |= DIVS_0;      // SMCLK = 8 MHz
15
16
  _BIS_SR(GIE);           // allgemeiner interrupt-enable (noetig fuer
17
nulldurchgangserkennung)
18
  CCTL0 = CCIE;           // CCR0 interrupt enabled
19
  CCR0 = 200;
20
  TACTL = TASSEL_2 + MC_1;// SMCLK, upmode
21
22
...
23
24
25
26
// Timer A0 interrupt service routine
27
#pragma vector=TIMERA0_VECTOR
28
__interrupt void Timer_A (void)
29
{
30
  ms_counter++;
31
//  timer1++;
32
}

gruß
thomas

von Michael B (Gast)


Lesenswert?

Hi,

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

von Ed. (Gast)


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.

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.