Problem mit PWM-Routine

Gast #130064
Lesenswert?

Hallo!

Ich hab ein kleines Problem mit einer PWM-Routine die über den
Timer-Overflow-Interrupt gesteuert wird. Der code sieht so aus:

; timer overflow interrupt
tint:  clc
  cp t4, p0
  brlo ipwm1
  cbi PORTD, MOTAPWM
ipwm1:  clc
  cp t4, p1
  brlo ipwm2
  cbi PORTD, MOTBPWM
ipwm2:  inc t4
  brcc iende
  sbi PORTD, MOTAPWM
  sbi PORTD, MOTBPWM
  clc
iende:  reti

t4 ist der schleifenzähler, er wird sonst nirgends in dem programm
verwendet. in p0 und p1 steht der jeweilige wert für die Pulsbreite
(0<x<255). MOTAPWM und MOTBPWM stehen für den jeweiligen Pin.

Das problem ist jetzt, dass es nicht funktioniert, wenn p0 kleiner als
p1 ist und wenn p1 0 oder 255 ist. und ich hab jetzt keinen blassen
schimmer, wo ich da suchen könnte. kann mir da jemand helfen?

Danke
Bernhard
Gast #130066
Lesenswert?

Hallo Bernhard,

schau doch mal in der Suche, da habe ich vor 2-3 Wochen das gleiche
Problem gehabt, mit Software PWM... dort ist ein Funktionsfähiger Code
mit erklärung...

Gruß Dennis
Gast #130067
Lesenswert?

Hi!
Kann nicht gehen, weil
<ipwm2:  inc t4> kein C-Flag beeinflusst
<brcc iende> "brne iende" sollte besser gehen.
Übrigens der ganze Ablauf ist etwas ungünstig, besser wäre eventuell:

; timer overflow interrupt
tint: ;S-Reg sichern!
  inc t4
  brne ipwm1
  sbi PORTD, MOTAPWM
  sbi PORTD, MOTBPWM
  rjmp iende
ipwm1:  cp t4, p0
  brlo ipwm2
  cbi PORTD, MOTAPWM
  cp t4, p1
  brlo iende
  cbi PORTD, MOTBPWM
iende: ;S-Reg auf alten Wert!
  reti

S-Register sichern/zurückschreiben nicht vergessen!!

viel Erfolg, Uwe
Gast #130068
Lesenswert?

Danke!

Habs jetzt mit der Methode vom Dennis probiert und das hat super
hingehaun. und so werd ichs jetzt lassen.
das mit dem SREG hab i no ned gewusst, ist jetzt aber auch drin.

Bernhard

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren