PWM mit Timer1 - die xxxte Frage

Ich übe grade an einem BUCK/BOOST-MPPT-Regler für meinen Universal-Solar-Lage-Regler.
Dazu will/muss ich einen NANO verwenden, der betreff Timer0 unberührt bleibt (ich brauche millis).
Timer2 kommt mir da mit dem SPI ins Gehege. OC2B ist = MOSI ! Das brauch ich auch noch zwingend ...
Bleibt also nur noch Timer1, was ja nicht das Prob sein sollte .... aber:

Mit TIMER2 bekomme ich eine adäquate Schaltfrequenz von 100-150 KHz und einer Schrittweite von < 1% an Pin 3 des Nano hin. Das sieht dann so aus:

TCCR2A = _BV(COM2A0) | _BV(COM2B1) | _BV(WGM21) | _BV(WGM20);
TCCR2B = _BV(WGM22) | _BV(CS20);
OCR2A = 155;  // ca. 100 KHz -- 102 = 152 KHz
OCR2B = 1;   // bis 99 [%]

Mit einer Umsetzung des o.g. Codes nach Timer1 passiert nix, ausser das ich konstant ca. 15 KHz an D9 habe - an D10 nichts.
OK: 8 zu 16 Bit-Timer, aber wo ist da der nennenswerte Unterschied in der Funktion ?

Ein Problem auch beim Timer2 ist, das hier 2 Register genutzt werden und auch nur OCRA und B um eim PWM mit definierter Frequenz zu erzeugen.

Wesentlich eleganter für mich wäre, "beide Timer-Register" zu nutzen, um beide mit fester Frequenz mit unterschiedlicher PWM zu nutzen.
.... Bekomme ich nicht (mehr) hin ! Hab ich mal irgendwo gelesen und auch schon getestet - leider ist der Code im Nirwana verschwunden und im WWW find ich das nich wieder.
.... da war irgendwas mit Register setzen in jeweiliger ISR ...

Timer1 und Timer2 haben leicht andere Prescaler und Modus Einstellungen! Schau ins Datenblatt was die Bits genau machen.

Die grobe Funktion ist sehr ähnlich. Wenn du Timer2 verstanden hast kannst du auch Timer1 verwenden. Aber im Detail sind da ein paar Dinge anders. Nicht nur 8 <-> 16 Bit. Timer2 hat z.B. mehr Prescaler Optionen, aber Timer1 hat viel mehr Modi (wodurch die WMG Bits ganz anders sind) und ein paar mehr Register.

Aber im Detail sind da ein paar Dinge anders.

Ja - Doppelbingo !
Verstanden hab ich das mit Timer2 schon, das hier OCRA das Timing macht und OCRB das PWM bestimmt.
Ist ja auch eigentlch sehr praktisch ... nur hier muss ich mit minimal Pin's und vorh. Rechenpower auskommen - das wird/ist eng.

Und: Ich hätte gerne wie gesagt 2 PWM's mit gleicher Frequenz aus "dem gleichen" Timer - aber mit unterschiedlichem Tastverhältnis, welche ich zur Laufzeit per Register setzen anpassen kann.

Ja ... ich lese seit Sunden in PDF's von Atmel, aber der "Blitz" kommt einfach nicht.

Schau dir die Modus und Prescaler Einstellungen an. Also was die CSnX und WGMnX Bits machen.
Im Atmega328 Datenblatt sind das für Timer2 Seite 160 und 162. Und für Timer1 136 und 137. Es geht um die TCCRnA/B Register!

Du sagst dass es mit Timer2 geht. Also schau auf was du die Bits gesetzt hast. Und dann schau wie du die Bits bei Timer1 setzten musst um den gleichen Prescaler und den gleichen Modus zu erreichen.

.... fragt sich nur noch, in welches PDF du und ich hinsehe ....
Die Seitenangaben passen nun so gar nicht sinvoll überein.
Gib mal nen Link auf/in was du das so schaust.

Hier geht's um nen 328 Nano V3.

Kann sein dass sich das was geändert hat
http://www.atmel.com/images/Atmel-8271-8-bit-AVR-Microcontroller-ATmega48A-48PA-88A-88PA-168A-168PA-328-328P_datasheet_Complete.pdf

Ich habe ein anderes das 448 Seiten hat

Da kann man aber auch einfach die Seiten für die Register finden. 132ff für Timer1 und 155ff für Timer2

Genau da hängt schon wieder hammerähnliches ....
Dein Link und meine PDF haben 660 Seiten ! Scheine ich also aktuell ?
Da ist aber so ein kleiner Unterschied von lächerlichen 212 Seiten.

Sorry für die Verwirrung. Der Link oben ist für die 660 Seiten Version. Nicht die andere die ich habe.

Es kann aber doch nicht so schwer sein die Register Beschreibung zu finden. Ich habe dazu ein paar Sekunden gebraucht

132ff und 155ff beziehen sich auf die 660 Seiten Version!

Danke dir. Prinzipiell nicht.
Aber:
Doch .... (das liegt nicht am heutigen Vatertag !)

... das lästige ist das viele Blättern hin und her - aber wenn man schon mit der Nase drauf gestoßen wird ...
Nun hats jedenfalls wieder geblitzt !

Wie Serenifly ja schon sagte, sind die Timer0/2 und 1 doch schon recht unterschiedlich, was die initialisierung betrifft.
Da gibt es nicht nur das WaveformGeneratorMode-Bit 13, sondern auch noch ein InputCompare-Register.
Mit den möglichen Modi lassen sich nun beide Timer 1A/B durch das ICR1 auf eine definierte Frequenz stellen und durch entsprechende Werte in OCR1A und B lassen sich die Pulsweiten unabhängig von einander einstellen.

Also exakt so wie ich es haben wollte. :grin:
Der Code:

  //ATmel Datasheet - ab Kap. 16.11 / S. 131
  // - Fast PWM, Mode 14
  // - TOP on ICR1, OCR1x updated at bottom
  // - Clear OC1A/OC1B on Compare Match (Set output to low level).
  // - Prescaler = 1
  TCCR1A = _BV(COM1A1) | _BV(COM1B1) | _BV(WGM11);
  TCCR1B = _BV(WGM13) |  _BV(WGM12) |_BV(CS20);
  ICR1   = 127;
  OCR1A  = 10;
  OCR1B  = 117;

Damit erreiche ich hier ca. 124 KHz (gemessen).
Bleibt man hier ein paar Schritte vom unteren Ende weg, ost die Schrittweite mit ca. 125 Steps (für mich) ganz ok.
Eine ISR braucht es nicht - die Ausgänge (hier 9, 10 beim NANO) werden direkt gesteuert.
Pulsweite ändern ? Einfach OCR1A/B ändern. CLI() und SEI() muss nicht zwingend sein.

Erstaunlich, was dieses kleine Teil so rausblasen kann...

Atmel ändert ziemlich oft die Datenblätter und macht Ergänzungen und Fehlerberichtigungen.
Das Datenblatt das auf der Arduino-Seite verlinkt ist ist alt. Aktuell ist das 660 Seitige.
http://www.atmel.com/images/atmel-8271-8-bit-avr-microcontroller-atmega48a-48pa-88a-88pa-168a-168pa-328-328p_datasheet_complete.pdf
Grüße Uwe

Hallo,

mal so als Nebeninfo. Am Besten man gibt nicht die Seitennummer an sondern die Kapitelnummer. Dann kann der eine ins Datenblatt vom 328 schauen und der andere vom Mega und beide lesen dennoch den gleichen Text zum Timer, als Bsp.