Forum: Mikrocontroller und Digitale Elektronik MSP 430: Timer verwenden um Lautsprecher zu steuern?


von Daniel S. (daniel72)


Lesenswert?

Hallo Zusammen,

Ich habe hier bereits einmal gefragt, wie man Lautsprecher steuern kann. 
Dank diesem Forum konnte ich dann mein Programm entsprechend beenden.

Nun zur Generierung  von Tons verwende ich einfach ein Register in dem 
ich einen Startwert reinschiebe und dann dekrementiere bis auf Null. Das 
ist gleich auch meine Schleife in der ich dann Lautsprecher (ist auf Pin 
4 vom Port 2 angeschlossen) ein- bzw. ausschalte.
Das alles funktioniert gut.

Nun bin ich mir bewusst, dass es keine ideale Lösung ist, weil das 
Programm nur gerade mit dieser Prozessorgeschwindigkeit funktionieren 
würde. Wenn die Geschwindigkeit etwas schneller wäre, dann würde ich den 
Ton wahrscheinlich auch nicht mehr hören.

Daher denke ich, dass es gut wäre, wenn ich den Timer verwenden würde. 
Ich kann dann für jeden Ton genau ausrechnen, wie viele [ms] lang meine 
Schleife dauer soll damit ich entsprechenden Ton am Lautsprecher höre.

Diese Lösung würde dann unabhängig von Prozessorgeschwindigkeit 
funktionieren.

Nun wie hole ich mir die Timerwerte? In anderen Programmiersprachen 
(C/C++, NET, Java) hole ich mir die aktuelle Zeit und in jedem 
Schleifendurchgang berechne ich eine Differenz. So weiss ich wie lange 
die Schleife dauern soll (Wenn Differenz erreicht ist, dann wird 
Schleife beendet). Wie ist das aber mit Assembler bzw. MSP430?

Für einen Tipp bedanke ich mich bereits im Voraus.

Grüsse
DAniel

von Ekschperde (Gast)


Lesenswert?

Die MSP430 sind eigentlich ein Multifunktionstimer mit einer
drangehängten 16-bit-CPU :-)

Da hilft nur ausgiebiges Studium des entsprechenden Family Users 
Manual
in Verbindung mit dem typspezifischen Datenblatt, ob die verwendete CPU
auch dieses oder jenes Feature unterstützt.
Was zugegenermassen gerade am Anfang ein wenig verwirrend ist.

Für die MSP430x2xxx-Serie z.B. also bei TI nach SLAU144 nach suchen.

von Stefan (Gast)


Lesenswert?

>Diese Lösung würde dann unabhängig von Prozessorgeschwindigkeit
>funktionieren.
Das würde ich so jetzt nicht generell sagen!
Wenn Du für MCLK (CPU) und für den Timer dieselbe Clock-Source 
ausgewählt hast und deren Frequenz änderst, läuft dein Timer nicht 
unabhängig von der CPU! Allerdings bietet das flexible Clock-Management 
des MSP430 genug Möglichkeiten, diese Unabhängigkeit zu realisieren 
(falls das überhaupt notwendig ist).

Der User-Guide ist in jedem Fall die erste Anlaufstelle als Lektüre.
Ich würde an Deiner Stelle mal über die Möglichkeit nachdenken, eine PWM 
als "Tonerzeugung" zu verwenden. Dazu gibt es auch genügend 
Codebeispiele von TI.

von Peter Diener (Gast)


Lesenswert?

Hallo,

dafür verwendet man normal einen Timer im PWM oder Frequenzmodus 
(Up-Mode). Den muss man nur einmal konfigurieren und der Rest der 
Tonerzeugung passiert im Hintergrund, ohne dass die CPU benötigt wird. 
Wenn man den Ton wieder stoppen möchte, hält man entweder den Timer an 
oder man setzt die Portfunktion (PSELx) wieder von CCR auf Port um. Im 
Family Guide ist die Verwendung von Timern mit 
Capture-Compare-Rergistern zur Ausgabe von PWM und Frequenzen genau 
beschrieben, sogar mit Codebeispielen und Grafiken, wie die Waveform 
dann aussieht.

Du brauchst dafür Einstellungen in den Registern PSELx, TxCCRx, TARx, 
TxCTRL und noch ein paar anderen, aber die Benutzung ist nicht weiter 
kompliziert, wenn man das manual gelesen hat.

Grüße,

Peter

von Daniel S. (daniel72)


Lesenswert?

Zuerst einmal vielen Dank an alle.

Ich habe nun ein kleines Beispiel gefunden:

mov.w     #TASSEL0+TACLR,&TACTL

mov.w     #OUTMOD_4,&CCTL0
mov.w     #30000,&CCR0

mov.w     #OUTMOD_7,&CCTL1
mov.w     #22500,&CCR1

mov.w     #OUTMOD_7,&CCTL2
mov.w     #7500,&CCR2

bis.b    #BIT1+BIT2+BIT3,&P1DIR
bis.b    #BIT1+BIT2+BIT3,&P1SEL
bis.w    #MC0,&TACTL

Problem dabei ist, dass mir P1IN (Pin 1,2 und 3) gesetzt werden. Auf 
meinem EDU Board ist aber Lautsprecher am Port 2 Pin 4 angeschlossen!

Ich suche jetzt seit einer Stunde, wie ich PWM auf Ausgangsport 2 Pin 4 
umleiten kann, aber habe leider nichts gefunden.

Auch wenn ich &P1DIR auf &P2DIR und &P1SEL auf &P2SEL ändere, geht's 
nicht, weil dann P2IN angesprochen wird (und ich brauche den als Ausgang 
und zwar Pin 4).

Gibt es also eine Möglichkeit den PWM Signal auf Ausgangsport 2 Pin 4 
umzuleiten? Wenn NEIN, wie kann ich dann vom Port P1IN auf P2OUT Pin 4 
umleiten?

Danke

von Stefan (Gast)


Lesenswert?

>Gibt es also eine Möglichkeit den PWM Signal auf Ausgangsport 2 Pin 4
>umzuleiten? Wenn NEIN, wie kann ich dann vom Port P1IN auf P2OUT Pin 4
>umleiten?
Umleiten auf einen beliebigen Pin geht nicht!
Die Output-Einheit des Timers hat festgelegte Pins, die benutzt werden 
können. Dieses sind im Datenblatt aufgelistet (im Kapitel Timer).
Ohne Deinen genauen MSP430-Typ zu kennen, kann Dir da keiner weiter 
helfen.

Nur so als Bsp.:
Der MSP430F21x2 kann an P2.4 eine PWM ausgeben, wenn man Timer_0, 
CCR2-Compareregister benutzt und das TA2-Modul auf P2.4 ausgeben lässt.
Das Codebeispiel würde sich dann etwa so ändern:
1
mov.w     #TASSEL0+TACLR,&TACTL
2
3
mov.w     #OUTMOD_7,&CCTL2
4
mov.w     #7500,&CCR2          <- reset output
5
mov.w     #30000,&CCR0         <- set output
6
7
8
bis.b    #BIT4,&P2DIR
9
bis.b    #BIT4,&P2SEL
10
bis.w    #MC0,&TACTL

Es gibt aber auch andere MSP-Typen, die an P2.4 keinen Timer-Ausgang 
besitzen! Dann bliebe Dir weiterhin nur eine Software-PWM.

von Peter Diener (Gast)


Lesenswert?

Hallo,

was Stefan sagt ist völlig korrekt, der MSP430 hat für jedes 
Capture-Compare-Register (CCR) nur bestimmte Pins die man in Verbindung 
mit diesem CCR als PWM-Ausgang verwenden kann. Das sind alle, die im 
Datenblatt mit TAx oder TBx gekennzeichnet sind, wobei x eine Ziffer 
ist. Es ist nicht optimal, den Lautsprecher an x=0 anzuschließen, das 
CCR0 hat eine Sonderstellung und wird meistens als Hilfsregister 
benutzt, z.B. als Umkehrwert für den Timer.

Damit wir dir helfen können, brauchen wir die genaue Bezeichnung des 
MSP430.

Grüße,

Peter

von Daniel S. (daniel72)


Lesenswert?

Also es handelt sich um MSP430F1232.

Laut ein paar Informationen aus dem Buch Mikrocontrollertechnik 
(Matthias Sturm), sollte er doch P2.4 ansprechen können.

von Stefan (Gast)


Lesenswert?

>Also es handelt sich um MSP430F1232.
Na dann haste aber Glück ;-)

Mein Bsp von oben sollte dann eigentlich funktionieren.

von Peter Diener (Gast)


Lesenswert?

Hallo,

P2.4 ist TA2. D.h. du musst es so machen:

bis.b    #BIT4,&P2DIR
bis.b    #BIT4,&P2SEL

Das routet das CCRA2 auf P2.4.

Grüße,

Peter

von Daniel S. (daniel72)


Lesenswert?

OK, vielen Dank, das funktioniert jetzt auch. Ich höre schon etwas auf 
dem Lautsprecher :)

Nun musste ich ziemlich lange mit den Werten herumspielen, bis ich 
überhaupt einen Ton bekommen habe.

Noch eine letzte Frage hätte ich und zwar, was bedeuten die Werte von 
CCR0 bzw. CCR2. Momentan habe ich drin:

mov.w     #500,&CCR0
mov.w     #100,&CCR2

und man hört einen Ton. Wie soll ich die optimal setzen, dass auch ein 
normaler Ton generiert wird?

Ahh ja, und wie stoppe ich am einfachsten den Timer?

PS: Bei Werten #30000 und #7500,&CCR2 hört man dann nur das Knicken 
(wahrscheinlich weil die Frequenz sehr klein ist)!

Gruss

von Stefan (Gast)


Lesenswert?

>Noch eine letzte Frage hätte ich und zwar, was bedeuten die Werte von
>CCR0 bzw. CCR2. Momentan habe ich drin:
CCR0 bestimmt die Frequenz Deines Tons.
Dein Timer läuft von 0 bis CCR0 und fängt dann wieder von 0 an...
Jedesmal, wenn er von CCR0 auf 0 überläuft, wird P2.4 gesetzt (high).
CCR2 bestimmt, wann P2.4 zurückgesetzt wird (low). Ich würde also in 
Deinem Fall CCR2 = CCR0/2 setzen, dann bekommst Du eine PWM mit 50% 
Duty-Cycle.

Jetzt hängt es nur noch von Deiner Clock-Source ab, welche Frequenz 
Deine PWM erzeugt. Timer_A Clock ist bei Dir ACLK (TASSEL0). Wenn nun an 
LFXT1 ein 32kHz-Uhrenquarz dranhängt, kommst Du auf ca. 65Hz.
Bei 1MHZ an LFXT1 wärens dann schon 2kHz PWM-Frequenz.

>Ahh ja, und wie stoppe ich am einfachsten den Timer?
z.B.
1
bic.w    #MC0+MC1,&TACTL

von Daniel S. (daniel72)


Lesenswert?

PERFEKT !!!

Vielen Dank es funktioniert nun alles wie gewünscht!!!

Schönen Abend noch!

Daniel

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.