Forum: Mikrocontroller und Digitale Elektronik Timer MSP430F2274 (EZ430-RF2500)


von Tobias (Gast)


Lesenswert?

Hallo wissende Forumsmitglieder, ich konnte schon viel durch eure 
Einträge lernen. Zu meinem Problem konnte ich jedoch leider noch nichts 
finden. Und zwar möchte ich auf dem obig genannten µC eine Software PWM 
realisieren, die eine LED ein- und ausschaltet (Pin 1.0). Ich versuche 
dies bereits seit einigen Tagen, aber ich weis einfach nicht mehr wo der 
Fehler liegen könnte. Meiner Meinung nach sollte der Timer bis TACCR0 
(=30000) zählen. Von 0 bis TACCR1 (28000) sollte die LED aus sein, und 
von TACCR1 (28000) bis TACCR0 (=30000) sollte die LED an sein. Somit 
müsste die LED nur kurz aufblinken. Aber egal was ich mach, die LED 
blinkt gleichmäßig. Sie blink nur mal schneller, mal langsamer aber nie 
ändert sich der Duty Cycle. Es wäre super, wenn jemand mal einen Blick 
drauf werfen könnte. Ich hab einfach keine Idee mehr....

#include "msp430x22x4.h"

void main(void)
{
  WDTCTL = WDTPW + WDTHOLD;                 // Stop WDT
  P1DIR = BIT0;                            // P1.0 output (LED)

  P1OUT = ~BIT0;                            // P1.0 aus

  TACTL = TASSEL_2 + MC_1 + ID_3; // + TAIE;            // SMCLK, 
up-mode, interrupt, Teiler 8

  // Bis hierhin wird gezählt
  TACCTL0 = CCIE;// + OUTMOD_7;                           // TACCR0 
interrupt enabled
  TACCR0 = 30000;

  // hier wird wird umgeschalten
  TACCTL1 = CCIE;// + OUTMOD_7;          // TACCR1 interrupt enabled
  TACCR1 = 28000;

  __bis_SR_register(LPM0_bits + GIE);       // Enter LPM0 w/ interrupt
}

// Timer_A3 Interrupt Vector (TAIV) handler
#pragma vector=TIMERA0_VECTOR
__interrupt void Timer_A0(void)
{

  // Wenn er hier rein geht, ist TAR == 0;

  P1OUT &= ~BIT0;

}


// Timer_A3 Interrupt Vector (TAIV) handler
#pragma vector=TIMERA1_VECTOR
__interrupt void Timer_A1(void)
{

  // Wenn er hier rein geht, ist TAR == TACCR1

  switch (TAIV)        // Efficient switch-implementation
  {
    case  TAIV_TACCR1: P1OUT |= BIT0;        // hier geht er rein.
               break;
    case  TAIV_TACCR2: break;                // geht nicht rein. Passt.

    case TAIV_TAIFG: break;             // geht nicht rein. Passt.

  }
}

Es wäre wirklich super, wenn irgendjemand eine Idee hätte! Vielen vielen 
Dank im Vorraus.

Tobias

von Reset (Gast)


Lesenswert?


von Tobias (Gast)


Lesenswert?

Vielen Dank für die Antwort. Leider hilft sie mir bei der Lösung meines 
Problems nicht weiter. Die TI User's Guide kenn ich schon auswendig, und 
das andere Dokumen "PWM DC Motor Control Using Timer_A" kannte ich auch 
schon. Es bezieht sich aber auf den Hardware-Timer-Pin T1. Ich möchte 
aber eine Software PWM erzeugen, die an jedem Pin funktioniert.

Erkennt vielleicht jemand meinen Denkfehler im Code?

Gruß Tobias

von Jörg S. (joerg-s)


Lesenswert?

>Sie blink nur mal schneller, mal langsamer aber nie ändert sich der Duty
>Cycle.
D.h. auch wenn du nur TACCR1 änderst ändert sich nur die Frequenz?

>#pragma vector=TIMERA0_VECTOR
>__interrupt void Timer_A0(void)
>{
>  // Wenn er hier rein geht, ist TAR == 0;
>  P1OUT &= ~BIT0;

In den Interrupt geht er rein?
Oder wird dein Pin ncht zufällig durch einen Reset zurück gesetzt?

von Tobias (Gast)


Lesenswert?

Hallo Jörg S., vielen Dank für deine Antwort.

Ja, egal ob ich die Werte in TACCR0 oder TACCR1 verändere, es ändert 
sich nur die Blinkgeschwindigkeit und auch irgendwie die Helligkeit. Ich 
kann es leider schlecht beschreiben. Ich habe schon öfter was mit PWM 
gemacht und ich kann auf jeden Fall sagen, dass nicht die On oder Off 
Time größer oder kleiner wird. Um sicherzugehen hab ich auch den Teiler 
auf 8-fach gesetzt. Es ist auf jeden Fall kein kurzes aufblinken so wie 
ich es erwaren würde.

In den Interrupt Timer_A0 geht er rein, das hab ich ausprobiert. Ich 
wüsste auch nicht, wo der Pin sonst zurückgesetzt werden könnte?!

Für weiter Hilfen, Vorschläge oder Anregung würde ich mich freun.

Gruß Tobias

von LuXXuS 9. (aichn)


Lesenswert?

Wenn du eine PWM machen willst, wieso benutzt du dann nicht den 
OUTMOD_7, das ist doch die sinnvollste Lösung. Ist dann Hardware-PWM, 
aber wieso bevorzugst du die Software-PWM?

Ich weiß ja nicht, wie du aktuell deinen Code am Laufen hast, da du ja 
einige Sachen, welche maßgeblich an der Geschichte beteiligt sind, 
hingeschrieben, aber auskommentiert hast.

Wirkliche Soft-PWM ist das ja auch nicht, was du da machst ;-) Eher eine 
ungeschickte Hardware-PWM.

von Jörg S. (joerg-s)


Lesenswert?

Tobias schrieb:
> Ja, egal ob ich die Werte in TACCR0 oder TACCR1 verändere, es ändert
> sich nur die Blinkgeschwindigkeit und auch irgendwie die Helligkeit. Ich
> kann es leider schlecht beschreiben. Ich habe schon öfter was mit PWM
> gemacht und ich kann auf jeden Fall sagen, dass nicht die On oder Off
> Time größer oder kleiner wird.
D.h. du hast kein Oszi sondern schätzt nur?


> Ich wüsste auch nicht, wo der Pin sonst zurückgesetzt werden könnte?!
Wie gesagt: Reset
Den Reset kannst du also ausschliessen?

von Tobias (Gast)


Lesenswert?

Hallo LuXXuS 909,

ich möchte eine Software PWM realisieren, da diese Pin-unabhängig ist. 
Bei der Hardware PWM ist man ja auf bestimmte Pin-Ausgänge angewiesen. 
Außerdem interesiert mich wie es funktioniert :-)
Warum denkst du, dass es eher eine ungeschickte Hard-PWM als eine 
Soft-PWM ist? Hast du ein Codebeispiel oder eine Idee wie man eine 
geschickte Soft-PWM realiesiert?


Hallo Jörg S.,

schätzen würde ich nicht gerade sagen. Ich hab ja den Prescaler auf 
8-fach gestellt und dann lass ich ihn auch noch bis 30000 zählen. Somit 
kann ich die Veränderungen mit dem Auge erkennen. Und es lässt sich 
erkennen, dass die On- und die Off-Zeit immer gleichlang sind. Nach 
meiner Theorie müsste ja die LED viel länger Off sein, als On sein.

Ich bin mir nicht sicher, was du mit Reset meist. Ich habe doch keinen 
Befehl in der Richtung drin. Wo oder wie könnte der geresetet werden?


Gruß Tobias

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.