Was ist der Unterschied zwischen TCCR1A und TCCR1B [geschlossen]

Ich hatte einen Fehler in der Konfiguration von PWM für den atmega8, weil ich mein Register nicht richtig eingestellt hatte. Aber ich dachte, dass Timer 1 Timer 1 ist , egal ob TCCR1A oder TCCR1B. Warum kann ich den ganzen Timer 1 nur mit TCCR1A so einstellen :

TCCR1A  = ((1 << COM1A1) | (1 << COM1A0) (1 << CS11) | (1 << WGM13) );

Datenblatt

BEARBEITEN: Ich war verwirrt darüber, dass TCCR1A und TCCR1B unterschiedliche Register sind, die für denselben Timer eingestellt sind.

Deine Fragen sind mir unklar. Bitte ausführlicher schreiben und besser erklären. Auch der spezifische Atmega-Chip und ein Link zum Datenblatt sind immer eine gute Sache, um die Frage hinzuzufügen.
Ich habe mein Bestes getan, um es oben zu erklären. Grundsätzlich, warum ich PWM nicht so machen kann: TCCR1A = ((1 << COM1A1) | (1 << COM1A0) (1 << CS11) | (1 << WGM13) );

Antworten (2)

Zunächst einmal denke ich, dass Sie ein |Symbol übersehen haben:

TCCR1A  = ((1 << COM1A1) | (1 << COM1A0) (1 << CS11) | (1 << WGM13) );

TCCR1A  = ((1 << COM1A1) | (1 << COM1A0) | (1 << CS11) | (1 << WGM13) );

Zweite:

  • Bits COM1A1und COM1A0sind im RegisterTCCR1A
  • Bits CS11und WGM13sind inTCCR1B

TCCR1Aund TCCR1Bsind unterschiedliche Register, aber sie arbeiten mit demselben Timer, timer1. Sie konfigurieren ein unterschiedliches Verhalten und befinden sich in separaten Registern, einfach weil nicht alle Bits in ein einzelnes Byte passen.

Beachten Sie, dass dies COM1A1einfach ein Alias ​​für die Nummer ist 7, also COM1A0ein Alias ​​für die Nummer 6, WGM13ein Alias ​​für die Nummer 4und CS11für ist 1. Es liegt an Ihnen, dem Benutzer, zu prüfen, ob Sie die richtigen Bits in die richtigen Register schreiben. Der Compiler prüft dies nicht für Sie.

Beispielsweise haben die folgenden drei Zeilen denselben resultierenden Assemblercode:

TCCR1A = ( 1 << COM1A1 );
TCCR1A = ( 1 << PB7 );
TCCR1A = ( 1 << ICNC1 );

Alle drei Zeilen ergeben die folgenden identischen zwei Montageanleitungen:

ldi r24, 0x80
out 0x2F, r24

TCCR1(A|B) kann nicht wie auf ein einzelnes 16-Bit-Register zugegriffen werden TCNT1(H|L).

Wow, danke, das war die Antwort, die ich gesucht habe.

Ich denke, Sie vermissen die Einstellung des PWM-Ausgangspins Data Direction Register auf Ausgang (DDRx) und ein Wert muss im ICR1 eingestellt werden.

Aus dem Datenblatt zu DDR:

"Wenn eines oder beide der COM1B1:0-Bits auf eins geschrieben werden, setzt der OC1B-Ausgang die normale Portfunktionalität des I/O-Pins außer Kraft, mit dem er verbunden ist. Beachten Sie jedoch, dass das Bit des Datenrichtungsregisters (DDR) dem entspricht Der Pin OC1A oder OC1B muss gesetzt werden, um den Ausgangstreiber zu aktivieren."

Sie müssen also den DDR setzen, wenn Sie die Bits COM1A1 und COM1A0 setzen.

Aus dem Datenblatt zum Zählen:

"Im phasen- und frequenzkorrekten PWM-Modus wird der Zähler inkrementiert, bis der Zählerwert mit dem Wert in ICR1 übereinstimmt (WGM13:0 = 8)"

Dies bedeutet, dass das ICR1-Register in Ihrem Fall der Wert ist, den Sie anpassen müssen, da Sie nur WGM13 einstellen:

ICR1 WGM13