ATtiny85 PWM: Warum muss COM1A0 eingestellt werden, bevor PWM B funktioniert?

Ich möchte die Hochgeschwindigkeits-PWM-Ausgabe auf PB4 mit einem ATtiny85 aktivieren. Nach dem Lesen des Datenblatts scheint es, dass die folgenden Bedingungen erfüllt sein müssen:

  • PLL und PCK müssen eingestellt werden, um den Hochgeschwindigkeits-Peripherietakt zu aktivieren
  • Der Prescaler muss eingestellt werden, um das Timing zu aktivieren
  • OCR1B und OCR1C müssen eingestellt werden, um den Arbeitszyklus auszuwählen
  • PB4 muss als Ausgang konfiguriert werden und der Vergleichsmodus muss mit COM1B0/COM1B1 eingestellt werden
  • PWM B muss mit GTCCR:PWM1B aktiviert werden

Der folgende Code funktioniert - ich sehe eine PWM-Ausgabe auf PB4 und kann das Tastverhältnis durch Ändern von OCR1B variieren - es funktioniert jedoch nur, wenn ich auch COM1A0 in TCCR1 einstelle. Wenn ich COM1A0 nicht einstelle, bleibt PB4 hoch und es wird kein PWM-Ausgang erzeugt.

#include <avr/io.h>
#include <avr/delay.h>

int main() {
// Enable PLL and async PCK for high-speed PWM
PLLCSR |= (1 << PLLE) | (1 << PCKE);

// Set prescaler to PCK/2048
TCCR1 |= (1 << CS10) | (1 << CS11) | (0 << CS12) | (0 << CS13);

// Set OCR1B compare value and OCR1C TOP value
OCR1B = 128;
OCR1C = 255;

// Enable OCRB output on PB4, configure compare mode and enable PWM B
DDRB |= (1 << PB4);
GTCCR |= (1 << COM1B0) | (1 << COM1B1);
GTCCR |= (1 << PWM1B);

// Why is this necessary?
TCCR1 |= (1 << COM1A0);

while (1) {}

return 0;
}

Warum ist das notwendig? Das Datenblatt besagt, dass die COM1A-Bits OC1A/PB1 steuern, was nichts mit OC1B und OCRB zu tun haben sollte

Der Grund, warum ich versuche, OC1B/PB4 anstelle von OC1A/PB1 zu verwenden, ist, dass PB4 während ISP nicht verwendet wird, während PB1 dies tut

Antworten (2)

Ist das ein alter Chip? Anscheinend hatten auch ein paar Leute dieses Problem.

http://www.avrfreaks.net/index.php?name=PNphpBB2&file=printview&t=119678

Gegen Ende des Threads kamen sie zu dem Schluss, dass es sich um ein Hardwareproblem im Chip handelt, das inzwischen vermutlich behoben wurde. Dein Code sieht gut aus. Ich frage mich, ob Atmel das Problem jemals behoben hat.

Das ATtiny85-Datenblatt in den Errata (Abschnitt 27.2.3 / Seite 213) sagt:

4) Erzeugung des PWM-Ausgangs des Timer-Zählers 1 auf OC1B – XOC1B funktioniert nicht richtig.
Der PWM-Ausgang des Timer-Zählers 1 OC1B-XOC1B funktioniert nicht richtig. Nur in dem Fall, wenn die Steuerbits COM1B1 und COM1B0 im gleichen Modus wie COM1A1 bzw. COM1A0 sind, arbeitet der OC1B-XOC1B-Ausgang korrekt.

Problembehebung/Problemumgehung
Die einzige Problemumgehung besteht darin, dieselbe Steuereinstellung für die Steuerbits COM1A[1:0] und COM1B[1:0] zu verwenden, siehe Tabelle 14-4 im Datenblatt. Das Problem wurde für Tiny45 rev D behoben.

Das hat mich eine Zeit lang wirklich stutzig gemacht. Ich habe mit dem Datenblatt gelesen und zum größten Teil ist alles, was Sie gesagt haben, für mich richtig. Allerdings sind mir einige potenzielle Diskrepanzen aufgefallen, also werde ich diese auf Sie abfeuern und vielleicht finden wir heraus, was das Problem ist.

Zuerst habe ich das TCCR1-Register überprüft und mir das COM1A0-Bit angesehen:

Geben Sie hier die Bildbeschreibung ein

Es ist wahr, dass durch die Tabelle eindeutig angegeben wird, dass die COM1A[1:0]-Bits nur den OC1A-PWM-Ausgang betreffen. Beachten Sie, dass unten steht:

"Im PWM-Modus haben diese Bits unterschiedliche Funktionen"

Also habe ich mir Tabelle 12-1 angesehen.

Geben Sie hier die Bildbeschreibung ein

Die Tabelle zeigt, dass COM1x1 und COM1x0 den OC1x-Pin manipulieren. Man würde intuitiv denken, dass, wenn man COM1A[1:0] ändert, es nur den OC1A-PWM-Pin manipulieren würde. Aber siehe Text oben:

"Wenn der Zählerwert mit dem Inhalt von OCR1A oder OCR1B übereinstimmt, werden die Ausgänge OC1A und OC1B gesetzt oder gelöscht."

Dies scheint darauf hinzudeuten, dass bei Übereinstimmung von OCR1A ODER OCR1B die Ausgänge OC1A UND OC1B gemäß den Bits COM1x[1:0] gesetzt oder gelöscht werden.

Es scheint mir also, dass durch die Manipulation der COM1x[1:0]-Bits, vorausgesetzt, die HW ist im PWM-Modus aktiviert, diese PWM-Ausgänge gleichzeitig beeinflusst werden. Aus diesem Grund sagt Tabelle 12-1, dass die PWM-Ausgänge nicht verbunden sind, wenn Sie COM1A[1:0] auf „00“ gelöscht haben.

Nur ein Gedanke, vielleicht kann jemand, der aufgeklärter ist, meine Logik kritisieren.