Forum: Mikrocontroller und Digitale Elektronik Timerproblem bei PWM?


von Helmut Hofmann (Gast)


Lesenswert?

Hallo,
kann es sein, daß beim Programmieren der PWM (ATMega8) Probleme mit dem
Timing auftreten können?. Als Einzelanwendung läßt sich PWM
(Timer1,10bit,ohne Prescaler,8MHZ) problemlos aktivieren. Wenn PWM
jedoch in eine etwas umfangreichere Schleife zur Abfrage mehrerer
ADC-Ports zusammen mit einer Stoppuhr(Timer0)eingebaut
wird,funktioniert zwar die Stoppuhr, jedoch nicht mehr PWM. Erst wenn
viele Abfragen wieder gelöscht werden, die Stoppuhr jedoch belassen
wird,funktioniert der PWM wieder.
Kann mir jemand Tips geben??

mfg Helmut

von Frank Linde (Gast)


Lesenswert?

Wenn Du Deinen Quellcode zeigst, vielleicht. So ist das Fischen im
Trüben...

Gruß, Frank

von Helmut Hofmann (Gast)


Angehängte Dateien:

Lesenswert?

hier ein Auszug des Quellcodes

mfg Helmut

von Peter D. (peda)


Lesenswert?

Timer:
  in temp,sreg      ; Statusregister sichern
  push temp
  ldi temp, 150      ; Timer 0 auf 150 einstellen
...
  out sreg,temp
  pop temp
  reti


Kein Wunder, das da nichts mehr geht.

Du lädst temp mit sreg, ohne es vorher zu sichern.
Dafür lädst Du am Ende sreg mit 150 und temp mit sreg.

Und dann noch ein "rjmp Hauptlcd" mitten ausm Interrupt ist ein ganz
böses Foul.


Peter

von Helmut Hofmann (Gast)


Lesenswert?

Hallo Peter,
wie sollte ich es denn deiner Meinung nach besser machen. Komisch ist,
daß genau mit diesem Timercode ein anederes Ladegerät seit 2 Jahren
einwandfrei funktioniert.

gruß Helmut

von Peter D. (peda)


Lesenswert?

"wie sollte ich es denn deiner Meinung nach besser machen."

Erstmal das Tutorial lesen, mindestens aber das hier:

http://www.mikrocontroller.net/tutorial/stack.htm

http://www.mikrocontroller.net/attachment.php/677/Der-Stack-1.pdf


Peter

von Helmut Hofmann (Gast)


Lesenswert?

Hallo Peter,
vielen Dank für den Tipp. Ich habe das Programm Timer.asm hier aus dem
Forum (Codesammlung) verwendet und modifiziert. Vermutlich ist mir
dabei ein Fehler unterlaufen. Wenn ich alles richtig verstanden
habe, muß die Interruptroutine etwa so aussehen:

in temp, sreg
push temp
   .
   .
   .
pop temp
out sreg,temp

Wäre das so richtig, um das Statusregister zu sichern?


gruß Helmut

von Peter D. (peda)


Lesenswert?

Damit hast Du nur das sreg gesichert, das temp zerstörst Du aber immer
noch.

Kleiner Tip:
Ich nehme für Interrupts und das Mainprogramm verschiedene Register,
dann braucht man nur noch das sreg zu sichern und nichts weiter.


Peter

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
Noch kein Account? Hier anmelden.