MSP430F449 Timer A

Gast #1133601
Lesenswert?

Guten Tag

Ich muss ein paar Schrittmotortreiberprints auf ihre Funktion testen,
dafür brauche ich zwei Clocks, welche ich aber unabhängig voneinander 
ansteuern muss. Ich habe nun Timer A gewählt und bekomme am Pin 1.2 auch 
die gewünschte Frequenz. Ist es möglich, dass ich P1.0 gleichzeitig mit 
einer anderen Frequenz ansteuern kann? Oder muss ich dafür Timer B 
nehmen?

So hab ich das bis jetzt programmiert:
1
  //--------------------------------------------------------------------
2
     //Initialisierung Timer A
3
     //--------------------------------------------------------------------
4
  WDTCTL = WDTPW + WDTHOLD;     //Stop Watchdog
5
  WDTCTL = WDT_ADLY_250;         //Set Watchdog Timer interval to ~250ms
6
  IE1 |= WDTIE;                  //Enable Watchdog Timer interrupt
7

8
  P1DIR |= 0x0C;                 //P1.2 and P1.3 als Ausgänge definieren
9
  P1SEL |= 0x0C;                 //P1.2 and P1.3 Selektion derPinfunktionen
10
  CCTL1 = OUTMOD_7;              //Timer Modus 7 = Reset/Set 
11
  TACTL = TASSEL_2 + MC_1;       //Takt Modus = Up Mode 
12

13
 //------------------------------------------------------------------------
14
 //Unterprogramm frequenz
15
 //------------------------------------------------------------------------
16
void frequenz(int period, int duty, int setup) 
17
{
18
  CCR0 = period;       //PWM Period
19
  CCR1 = duty;         // CCR1 PWM duty cycle
20
     
21
  P4OUT = setup;       //Port 4 = x      x       x   x   0  0  0  0     
22
                       //         ENABLE CW/CCW  M1  M2  NC NC NC NC 
23
}
Gast #1133625
Lesenswert?

An und fuer sich kannst du das mit nur einem Timer machen, wenn die 
hoehere Frequenz ein Vielfaches ist. Nimm Dir dann einfach die 
Grundfrequenz und zaehle ein Register hoch, welches bei dem Wert X die 
Funktion ausfuehrt.

Die Frage ist nur WARUM... du hast doch mehrere Timer und warum willst 
du die dann nicht nutzen.
Gast #1133648
Lesenswert?

Ich arbeite erst zum zweiten Mal mit dem MSP430 und fühle mich ein 
bisschen überfordert mit all den neuen Befehlen. Timer A hab ich 
ansatzweise verstanden, daher dachte ich, es sei sinnvoll zu Beginn nur 
mit einem Timer zu arbeiten. Ich weiss nicht genau, wo die Unterschiede 
zwischen Timer A und Timer B in der Befehlsliste liegen.
Gast #1133671
Lesenswert?

Das sind an sich beide gleich aufgebaut. Nur halt, dass sich die 
Register mit TAxxx und TBxxx unterscheiden. Es wuerde eventuell Sinn 
machen, nur mit einem zu arbeiten, wenn man Strom sparen muss/will.

Wie gesagt, man kann sich eine Grundfrequenz schaffen (z.B. 1kHz) und 
davon mit Registern, welche man beim Interrupt incrementiert, alle 
Vielfachen von 1KHz schaffen.
Das hat gleichzeitig den Vorteil, dass sich der Code relativ leicht 
nachverfolgen laesst.

Kannst eigentlich gut mit dem MSP spielen. Im Debug-Mode kannst du live 
die Register veraendern und schauen was passiert und viel kaputt kann 
man dabei auch nicht machen.

Hoffe ich konnte Dir helfen...
Gast #1133692
Lesenswert?

Ich denke ich werde einfach noch Timer B ansteuern, die Befehle sind 
sich wirklich sehr ähnlich. Das mit den Registern hab ich auch gesehen, 
danke für den Hinweis.
Muss man den Watchdog eigentlich unbedingt ausschalten oder ist das 
egal?
#1133800
Lesenswert?

Mit Timer B kannst du aber nicht P1.0 ansteuern. Da geht nur der Timer 
A0 drauf. Da der Timer A 3 CCR-Register hat, kannst du 3 unabhängige 
Frequenzen in Hardware erzeugen lassen. Das geht mit den Output-Units, 
schau mal auf Seite 452 im User Guide. Das Bild ganz unten verdeutlicht 
ein bisschen, wie der Timer arbeitet. Ist zugegeben nicht ganz einfach, 
aber gerade die Timer machen den MSP430 so interessant, mit denen kann 
man so gut wie alles veranstalten. Du musst dir dann nur für deine 
Anwendung den passenden OutMod aussuchen.
Gast #1133829
Lesenswert?

Ich hab jetzt mal versucht Timer B anzusteuern, aber wenn ich an P2.2 
messe zeigt der KO nur Müll an... könnte dies an der Initialisierung 
liegen?
1
  //-----------------------------------------------------------------------
2
  //Initialisierung Timer B und 8kHz ausgeben an P2.2 
3
  //-----------------------------------------------------------------------
4
   CCTL1 = OUTMOD_7;              //Timer Modus 7 = Reset/Set 
5
   TBCTL = TBSSEL_2 + MC_1;       //Takt Modus = Up Mode  
6
   CCR0 = 63;                     //PWM Period
7
   CCR1 = 32;                     // CCR1 PWM duty cycle
Gast #1133855
Lesenswert?

ich glaub eben schon... und den Taster, welcher normalerweise an P2.2 
hängt hab ich mit Hilfe des Dip Switches ganz abgehängt...
1
  P2DIR = 0xF4;          //Taster = Eingänge; LED's = Ausgänge,ausser P2.2 auf Ausgang (TimerB1)
2
  P2SEL = 0x04;          //Alle Funktionen ausser TimerB1 werden "abgeschaltet"
#1134222
Lesenswert?

Jens wrote:
> Das sind an sich beide gleich aufgebaut. Nur halt, dass sich die
> Register mit TAxxx und TBxxx unterscheiden. Es
Ganz so gleich sind sie dann doch nicht. Timer_B ist doppelt gepuffert. 
D.h. wenn man bei einer PWM das Tastverhältnis aendert, wird der Wert 
erst zu Beginn der neuen Periode uebernommen (konfigurierbar). Timer_A 
hat das nicht. Wenn man da einen neuen Wert ins Register schreibt, und 
der Timer ist dummerweise schon vorbei, dann fällt das Signal für 
aktuelle Periode einfach mal aus. Ich berichte da aus eigener 
unangenehmer Erfahrung :-)
Ist zwar fuer die meisten Faelle nicht relevant, aber wenn es auf jeden 
Impuls ankommt, sollte man da drauf achten :-)
Gast #1134229
Lesenswert?

Oh das ist mir nicht aufgefallen, ich dachte da man nicht TACCR0 
schreibt, muss man auch nicht TBCCR0 schreiben, da hab ich wohl falsch 
gedacht.
Ich werds morgen auf jeden Fall einmal probieren, wahrscheinlich wirds 
dann funktionieren. Danke fuer eure Hilfe!

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren