Timer im Atmega168

Gast #2394783
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.
#2394793
Ä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
Gast #2394807
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.
Gast #2394833
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.
Gast #2394862
...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.
Gast #2394876
..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.
#2394894
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)
Gast #2394912
...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.
Angehängte Dateien:
Gast #2394932
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.
#2394940
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
Gast #2394949
..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.
Gast #2394975
damit komme ich auch noch nicht weiter:

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

T.
#2394978
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
#2394992
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 :)
Gast #2395002
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.

Antwort schreiben

Eine eigene Frage? Dieser Thread ist über 15 Jahre alt. Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.

Neuen Thread starten

Eine Lösung, Ergänzung oder Rückmeldung zu diesem Thread? Dann antworte hier.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.