Hi, nutze gerade timer 1 im Atmega168. Ich möchte eine 256 schrittige PWM starten, auch wenn es sich um einen 16Bit Counter handelt. Erstmal versuche ich überhaupt etwas zu sehen. Habe dafür den "Normal Mode" gewählt und den Teiler auf 1. Ich finde das ist total verquirlt im Datenblatt dargestellt, so viele Abhängigkeiten. ... Das habe ich bis jetzt: /* Page 130 .-------.-------.-------.-------.-------.-------.-------.-------. TCCR1A | COM1A1| COM1A0| COM1B1| COM1B0| - | - | WGM11 | WGM10 | '-------'-------'-------'-------'-------'-------'-------'-------' Page 132 .-------.-------.-------.-------.-------.-------.-------.-------. TCCR1B | ICNC1 | ICES1 | - | WGM13 | WGM12 | CS12 | CS11 | CS10 | '-------'-------'-------'-------'-------'-------'-------'-------' WGM10-WGM13 for Counter Mode COM1A1-COM1B0 for PWM Mode CS10-CS12 for Preascaler Page 130 toggle on compare (COM1A1=0, COM1A0=1) Page 132 Normal Mode from bottom to max (WGM10-WGM13=0) Page 133 No prescaling (CS10=1) */ TCNT1=0; TCCR1A=0x40; TCCR1B=0x01; Aber ich sehe noch nicht wirklich viel. T.
Ähm, was willst du denn sehen? Dass ein Portpin tuckelt? Hast du ihn als Ausgang konfiguriert? (However, note that the Data Direction Register (DDR) bit correspond- ing to the OC1A or OC1B pin must be set in order to enable the output driver.) Zeig mal deinen Code, ich geh so lange das Datenblatt suchen ... Einen Comparewert solltest du auch setzten
http://www.atmel.com/dyn/resources/prod_documents/doc2545.pdf ich will einen Pin mit einer PWM nutzen (toggeln). Timer 0 läuft bereits mit einem internen Interrupt. Nun will ich timer 1 für eine PWM mit PB1 OC1A nutzen. Portpin ist als Ausgang: //init pwm an b0 und b1 als Ausgang DDRB|=0x03; sei(); geschaltet. Ich habe das hier: OCR1AL=0xff; TCNT1=0; TCCR1A = ( _BV (COM1A0) ); TCCR1B = ( _BV ( CS10) ); eingebracht. Eines ist mir noch nicht klar, es wird immer wieder darauf hingewiesen dass es sich um 16Bit Register handelt, sie aber nur über 8Bit zugreifbar sind, ist klar. Was passiert aber wenn ich schreibe: OCR1A=0xFFFF; wir daraus automatisch: OCR1AH=0xFF; OCR1AL=0xFF; ? Mein Ziel ist eine 256 Stufige PWM (Frequenzrichtig), also die Periodendauer soll gleich bleiben. Momentan bin ich aber froh wenn ich überhaupt etwas sehe auf meinem Oszi. Gruß, T.
Das wollte ich grad anmerken. Auf PB0 gibts keine PWM :) Und was siehst du nun? T.S. schrieb: > wir daraus automatisch: > > OCR1AH=0xFF; > OCR1AL=0xFF; ja, macht der compiler. Und für deine 8bit PWM würde sich der Mode 1 anbieten :)
danke für den Tip, mache gerade das: OCR1AL=0x0f; TCNT1=0; TCCR1A = ( _BV (COM1A0)| _BV (WGM10) ); TCCR1B = ( _BV ( CS10) ); finde diese Beschreibung im Datenblatt irritierend: WGM13:0 = 4 or 12 wie kann WGM13 (1Bit) denn 4 oder 12 werden oder sein? oder ist ... aahh WGM13:0 soll WGM13 bis WGM10 heißen - au wie blöde ist das denn zu lesen! Naja, nachdem ich WGM10 für Mode 1 gesetzt habe ist erstmal wieder nichts zu sehen...lese weiter... T.
du darfst nicht weiterlesen, sondern musst zurück lesen :) Tabelle 16.3 Compare output mode, phase correct and phase and frequency correct PWM(1)
T.S. schrieb: > WGM13:0 = 4 or 12 WGM13:0 ist zu lesen als WGM1 Bits 3 bis 0 Dann sind das 4 Bits, in die der Wert 0..15 für den Mode reinpaßt
...ok, das hatte ich vorhin auch schon mal vor der Nase, wenn COM1A0 gesetzt ist geht das nur in WGM13:0=9 oder 11... gibt es einen mode indem ich keine ISR bedienen muss und trotzdem zu Ziel komme? T.
..habe jetzt den WGM Mode 9 ausgewählt... nun habe ich natürlich immer entsprechende Periodendauer (Summe aus 2 ocr inhalten). Tastverhältnis immer 50/50 und die Frequenz ändert sich entsprechend - also genau falsch...das ocr wird nun für die low und die high phase nachgeladen...ich möchte aber keinen Frequenzgenerator bauen, sondern eine pwm entlocken... T.
OCR1AL=0x30; TCNT1=0; TCCR1A = ( _BV (COM1A0)| _BV ( WGM10) ); TCCR1B = ( _BV ( CS10)| _BV ( CS11)| _BV ( WGM13) );
... das kanns echt nicht sein - ich möchte gern in einer Variablen den Tastgrad: http://de.wikipedia.org/wiki/Pulsweitenmodulation verändern... Das verstehe ich auch unter PWM, aber das scheint die Hardware nicht zu bieten!? Also ohne da in der ISR noch wieder was nachzuladen und Interrupts ein und aus zu schalten? T.
Okay, mein Tip war mist, glaub ich :) Aber modus 9 müsste gehen. ICR1 = 0xFF (TOP) dann müsste der counter immer von 0 bis 0xFF zählen, dann wieder bei 0 beginnen Über OCR1A dann die PWM einstellen. Viel Glück :) EDIT: DAS GEHT OHNE ISR, ganz sicher :) EDIT2: COM1A1/COM1B1 | COM1A0/COM1B0 | Description 1 | 0 | Clear OC1A/OC1B on compare match, set OC1A/OC1B at BOTTOM (non-inverting mode) 1 | 1 | Set OC1A/OC1B on compare match, clear OC1A/OC1B at BOTTOM (invertiong mode)
...hey, nein, klasse mal jemanden zu haben der etwas dazu sagt... ich habe mal eben aufgezeichnet wie ich das meine... mode 9 habe ich ja wie gesagt schon, werde gleich mal sehen was du meinst... T.
...in Mode 9 spielt ICR1 laut Tabelle 16-4 nicht mit ein... oder meintest du mode 8? T.
:D genau, damit hast du mich verwirrt, wollte nochmal nachschauen, was mode 9 ist :) Ich mein mode 12, CTC ... sorry :) ich bin ja eine tolle hilfe ... :(
kein ding, ich lese gerade bei "Fast PWM" ich glaube das isses... werde es jetzt testen...alles gut. Melde mich. T.
das isses: The counter counts from BOTTOM to TOP then restarts from BOTTOM. In non-inverting Compare Output mode, the Output Compare (OC1x) is cleared on the compare match between TCNT1 and OCR1x, and set at BOTTOM. In inverting Compare Output mode output is set on compare match and cleared at BOTTOM. aber er machts nicht: OCR1AL=0x0f; TCNT1=0; //ICR1 =0xff; TCCR1A = ( _BV (COM1A0)| _BV ( WGM11)| _BV ( WGM10) ); TCCR1B = ( _BV ( CS10)| _BV ( CS11)| _BV ( WGM12)| _BV ( WGM13) ); Mode 15. T.
Nein nein, laut Figure 16-7. Fast PWM mode, timing diagram. Seite 122 ist FastPWM nicht das, wonach ich für dich suche :D CTC mode müsste passen. Figure 16-6. CTC mode, timing diagram. Seite 121. Das Bild stimmt nicht, wenn du ICR1 nicht änderst
..der Text dort passt, aber es steht bei dem Textabschnitt kein expliziter Mode dabei, das Kapitel bearbeitet ja die Modes: 5,6,7,14,15... aber ich sehe immer nur ein 50-50 Tastverhältnis auf dem Oszi... Das kann doch nicht sein das man nach einer so einfachen Sache bei einer PWM so lange ohne Erfolg sucht - ich zweifle langsam an mir selbst... hatte ich noch bei keinem Controller... T.
T.S. schrieb: > teste ich gleich... ich liebe dieses Bild... schaut doch gut aus :) so schön symetrisch :)
damit komme ich auch noch nicht weiter: OCR1AL=0x0f; TCNT1=0; ICR1 =0x0f; TCCR1A = ( _BV (COM1A0)); TCCR1B = ( _BV ( CS12)| _BV ( WGM12)| _BV ( WGM13)); T.
Okay, also ich hab mal ein altes projekt rausgekramt. Du hast recht, mit FastPWM sollte es am leichtesten sein: //Timer1 Konfigurieren (PWM) TCCR1A = (1<<WGM10) | (1<<COM1B1); //Fast-PWM Mode //Set OCPinB at Bottom, clear at match TCCR1B = (1<<WGM12) | (5<<CS10); //Fast-PWM Mode //Prescaler 4 = 256 OCR1B = 0x00; Das ist modus: 5. Ich war von dem Bild verwirrt ... Was hat beim FASTPWM nicht geklappt? EDIT: Okay, bei dir vorhin hattest du modus 15 oder sowas. Du brauchst einen modus wo TOP fest ist und er auf OCRA den PIN toggelt. Das wäre bei Modus 5
LMAA, das kann nicht sein....Daaanke! ich hatte nur Mode 14 und 15 getestet...aber wie soll man das da raus lesen? bin ich zu blöd? Welches Bild hat sich verwirrt? T.
Dem Jubel entnehme ich, dass es geht? :D das Bild mit der FastPWM hat mich verwirrt S.122. denn da war die periode ja nicht gleich. Aber das ist nur so, wenn man ein variable obergrenze hat. Mode 14 hätte auch funktionieren müssen. ICR1 = 0xff und OCRA ist dann der Wert, bei dem getoggelt wird. Bei modus 5 ist ja 0xff schon fest eingespeichert, also eine fehlerquelle weniger. Dann wünsch ich noch nen schönen Abend :)
Hey, yes! das Bild hat mir gerade Hoffnung gemacht, denn man erkennt ansatzweise meine Zeichnung wieder. Nur dass wie du auch schon sagtest das Maximum nicht konstant sein ist/muss/kann. Ich finde man könnte das anders besser darstellen, nicht alles in einer Zeichnung und etwas sortierter. Obwohl ja schon in Gruppen eingeteilt wurde... ..das es nicht in Mode 14 funktioniert hatte lag daran: COM1A0 gesetzt. und nicht COM1A1! Ich war immer noch bei toggeln. Aber im Fast PWM legt man ja einen inverting oder not inverting mode der Pins fest, die Option habe ich beim Toggeln auch schon vermisst... dummerweise hat COM1A0 gesetzt bei Fast PWM keine Funktion und schon nimmt das Übel seinen Weg. Das ist immer wieder das Problem mit Hardware die nicht konsequent aufgebaut ist und lesern die zu blöd sind alles zu bedenken, da ist das Übel vorprogrammiert. Wenn dann sollten die Timer doch in sich logisch verknüpft sein, aber so hat der User natürlich mehr möglichkeiten zu kombinieren, demnach auch mehr Möglichkeiten ins Klo zu greifen. Vielen Vielen Dank noch mal und ebenfalls einen schönen Abend. T.
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.