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
Wenn es ein OCR1A gibt, dann gibt es in der Regel auch ein OCR1B. Das ist dann der Vergleichswert...
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
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
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.
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...
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).
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.