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
TI hat aplication notes dafür und im Family User's Guide wird es erklärt. http://focus.ti.com/mcu/docs/litabsmultiplefilelist.tsp?sectionId=96&tabId=1502&literatureNumber=slaa120&docCategoryId=1&familyId=912 http://www.ti.com/litv/pdf/slau144i
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
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.