Forum: Mikrocontroller und Digitale Elektronik Probleme mit PWM bei AtMega8


von Pfi (Gast)


Lesenswert?

Hallo!

Ich habe ein kleines Problem mit PWM. Ich möchte einen Servo ansteuern,
der benötigt einen Zykluszeit von 20ms. Gut, habe ich mir gedacht,
nimmst du den 16bit Timer, nimmst den Betriebsmodus 15 (Seite 97 im
Datenblatt) wo man TOP durch OCR1A einstellen kann. Diesen habe ich auf
20000 gesetzt, damit habe ich genau die richtige Frequenz. Nun aber das
Problem, mit welchem Register kann ich nun den Wert einstellen, bei dem
der OCnx Ausgang am AtMega8 auf high (bzw. auf low falls invertiert)
gesetzt wird?
Hat schon mal jemand diesen PWM-Betriebsmodus gebraucht und hat ein
Codebeispiel? bei mir zählt momentan der Timer im Simulator man hoch
mal runter, aber nicht imme hoch und dann wenn er oben ist wieder von
unten her. Initialisiert habe ich den Timer1 so:


  ;set to fast PWM
  ldi temp1, 0b10100011  ;clear on compare match, set on TOP, ...
  out TCCR1A, temp1
  ldi temp1, 0b00011001  ;internal clock, no prescaler, ...
  out TCCR1B, temp1

  ;set TOP to 20000
  ldi temp1, 0b00100000
  ldi temp2, 0b01001110
  out OCR1AH, temp2
  out OCR1AL, temp1

Für jede Art von Hilfe bin ich sehr dankbar

von Rahul (Gast)


Lesenswert?

Wenn es ein OCR1A gibt, dann gibt es in der Regel auch ein OCR1B.
Das ist dann der Vergleichswert...

von Hannes L. (hannes)


Lesenswert?

Ich habe dazu einen anderen Weg gewählt:
http://www.hanneslux.de/avr/mobau/7ksend/7ksend02.html

...

von Pfi (Gast)


Lesenswert?

OK danke mal.
@Rahul: Das habe ich mir auch gedacht. Leider funktionierts aber
nicht.
Was ich inzwischen heraus gefunden habe. Im AVRStudio wird (trotz
meiner hoffentlich korrekten) Einstellungen der Timer1 nicht im
FastPWM-Modus betrieben, sondern in einem anderen PWM, bei welchem beim
TOP wert wieder abwärtsgezählt wird. Und zwar beo 0x03FF.
Ich glaube aber dass da der Simulator ein sch... macht. Ich hatte schon
mal Probleme mit dem Simulator, er setzte ein Interrupt Flag nicht
zurück nachdem der Interrupt ausgelöst wurde, obwohl im Datenblatt
stand, dass er das tun würde... Was ich damit sagen will: Ich glaube
dem Simulator langsam nichts mehr, werde vielleicht heute noch ein
Schaltung aufbauen um das ganze zu testen, dann sehe ich ob der
Simulator oder ich recht habe...

@ ...HanneS... Lux: Das wäre auch eine möglichkeit, doch es ist leider
nicht möglich dies so zu machen, weil noch zwei andere zeitkritische
Anwendungen hinzukommen, und wenn schon sowas zur Verfügung steht, dann
möchte ich das auch verwenden... Aber danke für den Tipp, wenns gar
nicht zum Laufen kommt, dann werde ich es wohl oder übel so machen und
schauen ob ichs auch so hinbekomme...

Gruss

von Volker K. (volkerkamin)


Lesenswert?

Hi!

Was meinst du mit: Leider funktionierts aber nicht?

Deine MCU läuft mit 1MHz nehme ich an, da dann die 20000 Zykel genau
20ms benötigen.

Beachte: Wenn du OCR1A als TOP benutzt ist OCR1B dein Compare Value.
D.h. du erzeugst ein OC-Match in der CompareUnit B.
=> Es werden die Interrupts Timer1CompB und Timer1OVF ausgelöst.
=> das PWM Signal kommt auf OC1B aus dem Chip raus. (Wo der ist, kannst
du der Doku im Kapitel "Alternate Port Functions" entnehmen.)
Du musst COMB richtig gesetzt haben und das DDR des entsprechenden
Ports, denn das COMB benutzt nur PVOE/PVOV (PortValue wird
überschrieben) nicht DDOE/DDOV (DDRValue wird überschrieben). Wenn dein
DDR noch auf Input steht erzeugst du nur einen internen Pullup, aber
nicht genug, um einen Motor anzutreiben.

Falls das immer noch nicht hilft, schreib nochmal, allerdings weiß ich
nicht, wann ich mal wieder reinschaue :-)

Volker

von Pfi (Gast)


Lesenswert?

Hallo!

Leider funktionierts aber nicht heisst:
Im AvrStudio Simulator zählt der Timer zwar, aber komischerweise nur
bis 0x03FF und dänn rückwärts wieder runter, und nicht das, was ich ins
OCR1A geschrieben habe. Eigentlich müsste er ja bei dem Wert in OCRB den
Ausgang abschalten und bei TOP (=OCR1A) wieder bei null beginnen und
Ausgang einschalten. Ich habe die Interrupts deaktiviert, ich möchte ja
nur, dass er diesen Ausgang an und abschaltet.
Aber eben, möglciherweise macht der Simulator auch misst, denn egal was
ich für einen Betriebsmodus einstelle.

von Pfi (Gast)


Lesenswert?

Hallo!

Meine Vermutung hat sich bestätigt:

http://www.mikrocontroller.net/articles/AVR-Studio_Bugs#AVR-Studio_4.12_RC1_.28Build_450.29_und_.E4lter

Aber da ich mir bei den AVRs noch immer nicht so sicher bin habe ich
gedacht, es liegt an meinem Programm, aber jetzt habe ich wieder einen
Lichtblick... Ich werde es mit einer neueren Version versuchen und
sonst halt doch Live auf dem avr, auch wenn dort die Fehlersuche sehr
schwierig ist...

Danke nochmals an alle die Versucht haben mir zu helfen...

von Rahul (Gast)


Lesenswert?

Das wäre dann ja der Phase-Correct-Mode (laut deiner
Timer-Initialisierung ist es IMHOP der "Fast PWM-Mode").
Ich benutze dafür immer den CTC-Mode (Mode 4).

von Pfi (Gast)


Lesenswert?

Also auch mit der neuen Version ist das merkwürdig, ich muss es also
doch real testen.

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.