servus, hab auf meiner platine einen sender mit dem P1.1/TA0 verbunden. ist es mit dem TA0 auch möglich PWM mit einstellbarer Dutycycle zu erzeugen?? Oder geht das nur mit den TA1 und TA1 ausgägngen?? danke!
Genau die selbe Frage wollte ich gerade für Timer B stellen :) Hab eine Platine gemacht wo TB0 und TB1 als PWM Ausgänge benutzt werden sollen. Jetzt hab ich festgestellt das alle Beispiele von TI nur TB1 und höher verwenden, weil das TBCCR0 Register (für TB0) als Maximalwertspeicher benutzt wird. Leider kann ich an der Platine nix mehr Ändern :( Gibt es Hoffnung?
ja, bei mir ist es nicht ganz so schlimm, wird beim ersten redesign geändert, falls es keine andere lösung gibt. hab eine notlösung gefunden, warte aber noch ab, ob jemand eine bessere lösung hat als ich!
Ich könnte was mit Interrupts basteln, aber das Ding soll natürlich noch was anderes machen ausser Interrupts alle paar ms. Wie sieht deine Lösung aus?
Also ein PWM Signal kann an TA0 / TB0 nicht erzeugt werden, denn wie vorher bereits gesagt, TA0 / TB0 dienen der Definition der Grundfrequenz. Der DutyCycle kann nur mit TA1 / TB1 und aufwärts definiert werden. Ein Murks mit einem software PWM bleibt wohl die einzige Möglichkeit, sofern das Layout nicht mehr geändert werden kann.
ja, bei der software lösung hab ich ein problem hab da so eine DELAY function mit den timerb gmacht, aber des funzt nicht so richtig. wird der sensor einmal angestoßen, wird gesendet und die led blinkt beim 2ten mal anstoßen geht der MSP schlafen und wenn ich ihn ein drittes mal anstoß dann hängt er in der while schleife der delayfunktion fest. das passiert aber nur, wenn die delay funktion im main nicht 5000 wie in der delay funktion der ISR steht. also wenn beide delay funktionen 5000, oder einen anderen gleichen wert haben, geht alles, ist er unterschiedlich, dann hängts wieder in der while schleife der delay funkt. was ist da falsch?!?!
Ich würde das ganze so umschreiben, dass Du gar keine Delays mer benötigst. Solche Programme sind meist nicht wartbar, da das Timing überhaupt nicht mehr stimmt, wenn man an der falschen Stelle was am Code ändert oder es funktioniert sogar überhaupt nicht mehr. Die Erzeugung des PWM Signals würde ich komplett im Timer IRQ machen, es sind ja nur ein paar Zeilen einfacher Code. Irgend sowas vielleicht (nicht getestet): // Interruptroutine #pragma vector=TIMERB0_VECTOR __interrupt void count_CCRO() { irq_count += 1; // Grundfrequenz bestimmen if (irq_count > max_count) { irq_count = 0; } // PWM generieren if (irq_count < pwm_sollwert) { redON; } else { redOFF; } } Das sollte dann äusserst stabil laufen, fast egal was Du im main() noch so machst.
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.