Forum: Mikrocontroller und Digitale Elektronik MSP430F449 Timer A


von Selina (Gast)


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
}

von Jens (Gast)


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.

von Selina (Gast)


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.

von Jens (Gast)


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...

von Selina (Gast)


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?

von Jörg S. (joerg-s)


Lesenswert?

>Muss man den Watchdog eigentlich unbedingt ausschalten oder ist das egal?
Der muss aus, ansonsten gibt's einen Reset :)
Oder du nutzt halt die Watchdog Funktion und setzt ihn immer zurück.

von Christian R. (supachris)


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.

von Selina (Gast)


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

von Christian R. (supachris)


Lesenswert?

P2DIR und P2SEL richtig eingestellt?

von Selina (Gast)


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"

von Christian R. (supachris)


Lesenswert?

Achso, bei Timer B muss das natürlich TBCCR0 und TBCCR1 heißen. Du 
schreibst ja mit CCR0 die Register von Timer A. Jetzt seh ich´s erst. 
TBCCTL1 genauso.

von S. Z. (szimmi)


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 :-)

von Selina (Gast)


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!

von Christian R. (supachris)


Lesenswert?

Selina wrote:
> 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.

Hm...wie soll der Kompiler das denn dann unterscheiden können...?

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.