PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : PWM Auflösung im laufenden Programm ändern



Ruppi
09.07.2007, 10:37
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!

Andun
09.07.2007, 12:38
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

Ruppi
10.07.2007, 09:29
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

feinmax
11.07.2007, 07:51
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?

Ruppi
11.07.2007, 11:03
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

feinmax
11.07.2007, 11:23
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".

Ruppi
11.07.2007, 12:06
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

feinmax
11.07.2007, 12:35
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???

Ruppi
11.07.2007, 12:41
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.

feinmax
11.07.2007, 12:44
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...

Ruppi
12.07.2007, 10:04
Ok, werde ich versuchen.
Danke für Deine Hilfe!