Forum: Mikrocontroller und Digitale Elektronik MSP430 TimerA Problem


von Michael B (Gast)


Lesenswert?

Hi,

ich versuche gerade mit dem FET und einem MSP430F449
mich in die Materie einzuarbeiten.

Zur Sache:

Der SMLCK läuft auf 8MHz (externer Quarz)
Mit folgendem Code versuche ich den TimerA zu konfigurieren
und einen Interrupt durch Compare zu erzeugen.
Der Interrupt löst zwar aus, aber unabhängig vom
Wert im Register CCR0. Der Interrupt löst ca. alle
150ms aus, egal was drinsteht.

#include <msp430x44x.h>

void main(void)
{
  int i;

  P5DIR |= 0x03;                        // Set P5.1 to output direction

  P1DIR |= 0x10;                        // P1.4 (SCLK) output
  P1SEL |= 0x10;

  WDTCTL = WDTPW + WDTHOLD;             // Watchdog disable
  FLL_CTL1 &= ~XT2OFF;                  // XT2 enable

  do
  {
    FLL_CTL0 &= ~XT2OF;                 // clear XT2 osc fault flag
    for (i = 0; i < 1000; i++);         // wait
  } while(FLL_CTL0 & XT2OF);

  FLL_CTL1 |= SELM1;                    // MCLK = XT2
  FLL_CTL1 &= ~SMCLKOFF;                // Turn SMCLK on
  FLL_CTL1 |= SELS;                     // SMCLK = XT2

  CCTL0 = CCIE;                         // CCR0 interrupt enabled
  CCR0 = 10000;
  TACTL = TASSEL_2 + MC_1;              // SMCLK, upmode
  _BIS_SR(GIE);                         // Global interrupts enable

  while(1)
  {
  }
}

// Timer A0 interrupt service routine
#pragma vector=TIMERA0_VECTOR
__interrupt void Timer_A (void)
{
  P5OUT ^= 0x02;                        // Toggle P5.1
}

von Michael B (Gast)


Lesenswert?

Hallo,

der Programmcode ist korrekt.
Ihrgendwas scheint mit dem FET nicht zu stimmen.
Brenne ich den Code mit dem FET und starte den
Emulator, so wird der Interrupt nur alle 150ms
ausgelöst. Stoppe ich den Emulator und lasse
den Proz mit externer Stromversorgung laufen
so wird der Interrupt alle 1.25ms aufgeführt
(was auch richtig ist).

Kann mit vielleicht jemand sagen was da falsch läuft ?

von Sebastian (Gast)


Lesenswert?

Irgendwie gefällt mir dein Clock-Code nicht. Den Bezeichner FLL_CTL1
kenne ich nicht. Welche IDE benutzt du? Versuch mal bitte den Code, den
ich auf www.mathar.com in meinen Tutorials benutze (der Code zur
Initialisierung des 8MHz-Quartzes ist immer derselbe). Der klappt
100%ig. Ich denke, dass bei dir irgendwas mit dem Oszillator schief
läuft und der weiter beim DCO bleibt.

von Michael B (Gast)


Lesenswert?

Hallo Sebastian,

der Code entspricht dem Header für den F449.
Ich führe SMCLK auf einen Pin heraus und habe dort auch
8Mhz wie es sein soll.

Das Problem scheint mit dem Emulator zutun zu haben. Da der Timer
richtig läuft sobald ich das Kabel abziehe und wiederaufstecke.

von Sebastian (Gast)


Lesenswert?

Welche IDE benutzt du denn? Womit flashst du den MSP430?

von Michael B (Gast)


Lesenswert?

Ich benutze IAR 3.0
Ich flashe mit dem Interface Board MSP-FETP430IF 1.3 von TI.

Mir ist aufgefallen, dass es mit dem Interrupt zu tun haben muss.
Sobald ich nur mit einem Compare toggle ohne ISR ist alles ok.

By the way:
Ist es möglich Compare0 und Compare2 von TimerA invertiert togglen zu
lassen. Soll heißen beide auf Modus 4 und beide Ausgänge erzeugen ein
invertiertes Signal zueinander. Compare1 kann ich nicht verwenden, da
ich ihn brauche um den ADC zu einer bestimmten Zeit auszulösen. Ich
dachte ich könnte beim Togglen einen Startwert angeben, also 0 oder 1.

von Sebastian (Gast)


Lesenswert?

OK, das FET kenne ich nicht, weil ich das von Olimex benutze. Die
sollten aber eigentlich pinkompatibel sein.

Im IAR hast du auch alles korrekt auf "Emulation" und nicht
"Simulation" eingestellt?

Ich habe es noch nie erlebt, dass eine ISR was mit dem FET-Stecker zu
tun hat. Ich benutze bei meiner Nulldurchgangserkennung auch
Interrupts, die 50 mal pro Sekunde aufgerufen werden. Das stört den
MSP430 nicht im geringsten, egal ob mit oder ohne Kabel. Sicher, dass
dein Kabel nicht kaputt ist (Kabelbruch bei VCC oder dem Reset-Pin oder
so)?

von Benjamin Johann (Gast)


Lesenswert?

Hallo Sebastian!
Du beschreibst ja mittlerweile auf denier Homepage sogar, wie man mit
einem Timer eine PWM realisiert.
Ich versuche mittlerweile einen Drehzahlmesser und einen IR-Empfänger
zu realisieren.
Beides scheitert mehr oder weniger daran, daß der Timer nicht exakt
genug auslöst. Ich brauche einen Takt von 1,75ms für den IR-Empfänger
und einen von 50 ms für den Drehzahlmesser. Leider schwankt aber die
Zeit so stark, daß ich das mit dem IR-Empfänger mittels nop()s lösen
musste. Die während den 50ms brauche ich aber REchenleistung vom
Prozessor, so daß diese Möglichkeit ins Wasser fällt - oder besser
gesagt in den Codehimmel aufsteigt.
Wie auch immer: Zur Zeit zähle ich einen 50ms-Counter hoch beim
auslösen des Interrupt. Den werte ich dann im Programm aus.
Wie gesagt schwankt dann aber die Zeit so stark, daß ich eine
Schwankung von 400 1/min bei 1800 1/min habe.
Unakzeptabel.
Hast du da noch eien Idee?
Benni

von Matthias Hartmann (Gast)


Lesenswert?

Hallo,

ich habe mal wo gelesen (glaube in diesem Forum), dass es zu Problemen
mit dem Timer A und/oder B kommen kann, wenn FET und externe Power
gleichzeitig angeschlossen sind.

Kannst Du ja mal checken.

Gruss

Matthias

von KoF (Gast)


Lesenswert?

check doch selber :-P
(bitte freundlich mit "bitte" formulieren!!!!!)

ganz einfach! sorg einfach beim layout deiner platine dafür, das nur
eine spannungsquelle zum speisen kommt!

ich habe es so gelöst, das ich spannung vom usb abzweige, diesen auf
3,3v runterregel und damit den msp betreibe. den spannungspin vom
fet(bzw den von olimex(habe/benutze beide)) habe ich einfach nicht mit
dem msp verbunden sondern offen gelassen. das habe ich gemacht, weil
ich nicht wusste, wie sich der fet verhällt, wenn die spannungsquellen
zusammengeführt werten und ob diese durch z.b. durch eine diode gegen
rückfluss gesperrt sind.

von Sebastian (Gast)


Lesenswert?

Naja, mittlerweile kann ich auch bestätigen, dass das FET irgendetwas
verändern kann. Ich bin mir nicht mehr ganz sicher, wo bei mir das
Problem lag, aber bei mir war es mal so, dass der USART0 mit
FET-Stecker dran nicht funktionierte, ohne aber einwandfrei. Und zwar
reproduzierbar ...

Da ich so ein komisches Verhalten jetzt einmal erlebt habe, würde es
mich auch nicht wundern, wenn es Probleme mit dem Timer gibt, wenn FET
und externe 3,3V gleichzeitig anliegen. :-(

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.