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.
...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.
... 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.
: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 ... :(
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.
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.