Forum: Mikrocontroller und Digitale Elektronik Timer im Atmega168


von T.S. (Gast)


Lesenswert?

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.

von Benjamin U. (utzus)


Lesenswert?

Ä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

von T.S. (Gast)


Lesenswert?

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.

von T.S. (Gast)


Lesenswert?

..so ich sehe schonmal was, hatte mich auf PinB0 gehängt -> verguckt...

von Benjamin U. (utzus)


Lesenswert?

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 :)

von T.S. (Gast)


Lesenswert?

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.

von Benjamin U. (utzus)


Lesenswert?

du darfst nicht weiterlesen, sondern musst zurück lesen :)
Tabelle 16.3
Compare output mode, phase correct and phase and frequency correct 
PWM(1)

von Martin (Gast)


Lesenswert?

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

von T.S. (Gast)


Lesenswert?

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

von T.S. (Gast)


Lesenswert?

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

von T.S. (Gast)


Lesenswert?

OCR1AL=0x30;
    TCNT1=0;
    TCCR1A = ( _BV (COM1A0)| _BV ( WGM10) );
    TCCR1B = ( _BV (  CS10)| _BV (  CS11)| _BV ( WGM13) );

von T.S. (Gast)


Lesenswert?

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

von Benjamin U. (utzus)


Lesenswert?

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)

von T.S. (Gast)


Angehängte Dateien:

Lesenswert?

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

von T.S. (Gast)


Lesenswert?

...in Mode 9 spielt ICR1 laut Tabelle 16-4 nicht mit ein... oder 
meintest du mode 8?

T.

von Benjamin U. (utzus)


Lesenswert?

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

von T.S. (Gast)


Lesenswert?

kein ding, ich lese gerade bei "Fast PWM" ich glaube das isses... werde 
es jetzt testen...alles gut.

Melde mich.

T.

von T.S. (Gast)


Lesenswert?

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.

von Benjamin U. (utzus)


Lesenswert?

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

von T.S. (Gast)


Lesenswert?

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

von Benjamin U. (utzus)


Lesenswert?

zeig mal die einstellungen für den Modus 12

von T.S. (Gast)


Angehängte Dateien:

Lesenswert?

teste ich gleich... ich liebe dieses Bild...

von Benjamin U. (utzus)


Lesenswert?

T.S. schrieb:
> teste ich gleich... ich liebe dieses Bild...

schaut doch gut aus :) so schön symetrisch :)

von T.S. (Gast)


Lesenswert?

damit komme ich auch noch nicht weiter:

    OCR1AL=0x0f;
    TCNT1=0;
    ICR1 =0x0f;
    TCCR1A = ( _BV (COM1A0));
    TCCR1B = ( _BV (  CS12)| _BV ( WGM12)| _BV ( WGM13));

T.

von Benjamin U. (utzus)


Lesenswert?

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

von T.S. (Gast)


Angehängte Dateien:

Lesenswert?

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.

von Benjamin U. (utzus)


Lesenswert?

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 :)

von T.S. (Gast)


Lesenswert?

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