Archiv verlassen und diese Seite im Standarddesign anzeigen : PWM Auflösung im laufenden Programm ändern
Hallo!
Ich möchte die Auflösung einer Fast-PWM in einem INT0-Interrupt ändern und habe folgendes versucht:
INT0_ISR:
If Full_current Then
Icr1h = 0
Icr1l = 63
Else
Icr1h = 0
Icr1l = 255
End If
........weiterer Code......
Return
Leider funktioniert es nicht auf diese Weise. Darf man die Register nicht direkt im laufenden Programm setzen? Oder muss noch etwas anderes beachtet werden? Im Datenblatt des Controllers (ATMega8) konnte ich keine weiteren Hinweise finden!
Vielen Dank!
Mh ... ich versuchs jetzt einfach mal als Schuß ins blaue, da ich eigentlcih keine Ahnung von Basic für die µC hab:
Ist Full_current bekannt und zugriffsbereit in dem Interrupt?
Andun
Hi,
logisch ist Full_current bekannt, sonst hätte ich wohl ganz andere Probleme....
Dass Du keine Ahnung von Basic hast, spielt ja grundsätzlich keine Rolle für das Problem. Wenn das ganze in Assembler funktionieren würde, bekomme ich es hier auch hin.
Ruppi
Also in dem Code sehe ich keinen Fehler, und es funktioniert auch so.
Ich hab es schon mal zum laufen bekommen (ATMega32).
Es kommt nun noch drauf an wie du deinen Timer initialisiert hast!?
Kannst du das mal kurz schreiben?
Moin!
Ok, hier mal die Initialisierung des Timers:
Config Timer1 = Pwm , Prescale = 1 , Pwm = 8 , Compare A Pwm = Clear Up , Compare B Pwm = Clear Up
Tccr1a = &B10100010
Tccr1b = &B00011001
Hier würde jetzt noch das Setzen der Register ICR kommen, was ich ja aber im Programm machen möchte. Auf diese Weise erzeugt man Fast-PWM mit einer Frequenz von 250kHz (bei 16MHz Quarz und 6Bit Auflösung).
Könnte es sein, dass der aktuelle Zählwert des Timers uzrückgesetzt wird, wenn man die ICR-Register neu beschreibt?
Vielen Dank, Ruppi
Versuch mal das PWM Signal nicht mit Bascom Befehlen zu initialisieren, sondern indem du die Bits in den Registern direkt setzt. Das geht auch in Bascom.
Du sagst auf der einen Seite, dass du eine variable Auflösung haben möchtest und setzt das Register, aber auf der anderen Seite initialisierst du das PWM mit 8Bit.
So wird das nicht funktionieren.
Schau einfach mal im Datenblatt in der Tabelle nach, und setzte die Bits "manuell".
Du täuscht Dich, das funktioniert. Es läuft ja wunderbar. Ich erzeuge exakt 150kHz Frequenz, wenn ich es so schreibe. Wenn ich die ICR-Register zu Programmbeginn beschreibe, ist auch alles in Ordnung. Das Ändern im Interrupt ist das einzige, was nicht geht.
Danke, Ruppi
Also laut deinem Code schriebst du zu Beginn die Register
Tccr1a = &B10100010
Tccr1b = &B00011001
Oder hast du da dann gleich mal auch das Register ICR1 beschrieben???
Ja, hatte ja geschrieben, dass ich anfangs zu Programmbeginn ICR1 beschrieben habe. Es taucht im Beispielcode nur nicht auf, weil ich die Register ja später im Interrupt beschreibe.
Dann versuch mal vor dem Beschreiben "Disable Timer1" und nach dem Beschreiben wieder "Enable Timer1".
Wenn das nicht geht, dann weiß ich leider auch nicht weiter...
Ok, werde ich versuchen.
Danke für Deine Hilfe!
Powered by vBulletin® Version 4.2.5 Copyright ©2024 Adduco Digital e.K. und vBulletin Solutions, Inc. Alle Rechte vorbehalten.