www.mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik MSP430 timerA interrupt


Autor: Fips B. (becphi)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo Leute,
ich möchte den TimerA so programmieren, dass er alle Minute einen 
Interrupt auslöst.
Die Einstellungen, die ich bisher gemacht habe bringen mich aber nur auf 
max. 16 sekunden (32kHz Quarz).
Gibt es eine Möglichkeit diese Dauer zu verlängern?

Mein code:

#include  <msp430x12x2.h>

void main(void)
{
  WDTCTL = WDTPW+WDTHOLD;                  // Stop WDT
  P2DIR = 0x001;                           // P2.0 output

  TACCTL0 = CCIE;                          // TACCR0 interrupt enabled
  TACCR0 = 65536-1;
  TACTL = TASSEL_1 + MC_1 + ID_3;          // ACLK, upmode, divider 8
  P2OUT = ~0x001;                          // P2 out

  _BIS_SR(LPM3_bits + GIE);                // LPM3, enable interrupts
}

// Timer A0 interrupt service routine
#pragma vector=TIMERA0_VECTOR
__interrupt void Timer_A (void)
{
  P2OUT ^= 0x001;                           // Toggle P2.0
  int i;
  for (i = 32000; i>0; i--);                // Delay
  P2OUT  = ~0x001;                          // P2 out
}

Danke!!!

Autor: Rufus Τ. Firefly (rufus) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Deine Interruptroutine sieht sehr merkwürdig aus

>   P2OUT ^= 0x001;                           // Toggle P2.0
>  int i;
>  for (i = 32000; i>0; i--);                // Delay
>  P2OUT  = ~0x001;                          // P2 out

Die erste Zeile reicht; was soll die "Delay" genannte Schleife *im 
Interrupthandler*? Die hat da nichts verloren.

ACLK wird mit 32 kHz getaktet. Je nach verwendetem MSP430-Derivat kannst 
Du hier noch einen Vorteiler anwenden. Beim 'F1611 und artverwandten 
sind das die DIVAx-Bits in BCSCTL1, mit denen durch bis zu 8 geteilt 
werden kann.

  BCSCTL1 |= DIVA_3;

Damit resultiert ein ACLK von 4 kHz.

Die Taktquelle von Timer_A kann ebenfalls durch 8 geteilt werden (was Du 
ja auch schon tust).

Daraus resultiert ein Takt von 500 Hz (2 msec).

Die langsamste Interruptrate beträgt ein 65536tel davon, das sind 0.0076 
Hz bzw. 131.072 Sekunden Periodendauer.

Das sind etwas über zwei Minuten.

Wenn Du in Deiner Interruptroutine den P2OUT nur einmal invertierst, 
dann resultiert eine Frequenz mit einer Periodendauer von über vier 
Minuten.


Wenn der verwendete MSP430 ein 'F5438 o.ä. ist, dann bietet der Timer_A 
noch einen weiteren Vorteiler, der das ganze nochmal um den Faktor 8 
verlängern kann, das sind die Bits IDEX im Register TAxEX0.

Autor: Fips B. (becphi)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Danke für diesen tip!!!  Jetzt funktionierts:-)

Die interruptroutine sieht so aus, damit ich nur ein kurzes Blinken an 
einer LED erzeuge, die an P2.0 hängt.

Autor: Rufus Τ. Firefly (rufus) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
> Die interruptroutine sieht so aus, damit ich nur ein kurzes Blinken an
> einer LED erzeuge, die an P2.0 hängt.

Das ist Murks. Verwende eine höhere Interruptfrequenz und eine 
Zählvariable, die Du im Interrupt inkrementierst, und in Abhängigkeit 
des Wertes schaltest Du die LED um:
static uint8_t zaehl = 0;


#pragma vector=TIMERA0_VECTOR
__interrupt void Timer_A (void)
{
  zaehl++;

  if ((zaehl == 1) || (zaehl == 2))
    P2OUT ^= 0x01;                           // Toggle P2.0

  if (zaehl == 16)
    zaehl = 0;

}

Warum schreibst Du eigentlich 12-Bit -Konstanten in Deinen Code?

  P2DIR = 0x001;                           // P2.0 output

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.