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
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
>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?
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
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.
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?
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
Eine eigene Frage?
Dieser Thread ist über 14 Jahre alt.
Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.