Forum: Mikrocontroller und Digitale Elektronik Fast-PWM Mode 14, OCR1A hat nur 9 Bit?


von Rudolph (Gast)


Lesenswert?

Hi,

ich versuche die 16-Bit Timer im Fast-PWM Mode 14 zu benutzen.

AVR-Studio 4.19, AVR-Toolchain 3.2.3.579.

Hier mal auf das absolut notwendige eingedampfter Test-Code mit dem ich 
das gerade ausprobiere:

---
#include <avr/io.h> // target device register definitions

int main(void)
{
// DDRB = (1<<PB5); // OC1A auf Ausgang
 DDRA = (1<<PA6); // OC1A auf Ausgang

 TCCR1B = 0x00; // stop
 TCCR1A = (1<<WGM11) | (1<<COM1A1);
 ICR1 = 600; // TOP-Wert
 OCR1A = 510;
 TCCR1B = (1<<WGM13) | (1<<WGM12) | (1<<CS11); // mode = Fast-PWM, 
prescaler = 8 -> 2 MHz

 while(1)
 {
 }

}
---

Eigentlich bin ich auf einem 90CAN32 unterwegs -> PB5.
Zum Vergleich habe ich jetzt mal einen Tiny44 benutzt -> PA6.

ICR1A kann ich setzen wie ich will, kein Problem, da funktionieren die 
vollen 16 Bit.
Mit dem µC auf 16 MHz und ICR1A auf 40000 erhalte ich mit dem 
eingestellten Prescaler von 8 auch 50 Hz.

Aber OCR1A haut nicht hin, ich kann nur Werte bis 511 nutzen.

Für 520 sieht das in der .lss so aus (Tiny44):

---
 OCR1A = 520;
  46:  88 e0         ldi  r24, 0x08  ; 8
  48:  92 e0         ldi  r25, 0x02  ; 2
  4a:  9b bd         out  0x2b, r25  ; 43
  4c:  8a bd         out  0x2a, r24  ; 42
---

Sag mir doch mal bitte jemand, was ich falsch mache.

von spess53 (Gast)


Lesenswert?

Hi

>Aber OCR1A haut nicht hin, ich kann nur Werte bis 511 nutzen.

>Für 520 sieht das in der .lss so aus (Tiny44):

>---
> OCR1A = 520;
>  46:  88 e0         ldi  r24, 0x08  ; 8
>  48:  92 e0         ldi  r25, 0x02  ; 2
>  4a:  9b bd         out  0x2b, r25  ; 43
>  4c:  8a bd         out  0x2a, r24  ; 42
>---

Wie kommst du jetzt auf 511. 0x0208 (r25:r24) sind doch 520 dezimal.

MfG Spess

von Rudolph (Gast)


Lesenswert?

spess53 schrieb:
> Wie kommst du jetzt auf 511. 0x0208 (r25:r24) sind doch 520 dezimal.

Ich schrieb doch, es gehen nur Werte bis 511 und das der Code für den 
Wert 520 ist, steht doch alles da. :-)
Bei 520 bekomme ich nicht 26% PWM mit dem Code, sondern was gegen 0%.
Aber ja, die 520 werden korrekt in das Register gepackt.

Oder nochmal anders:

---
 TCCR1A = (1<<WGM11) | (1<<COM1A1);
 ICR1 = 2000;
 OCR1A = 1000;
 TCCR1B = (1<<WGM13) | (1<<WGM12) | (1<<CS11);
---

Das ergibt 24% PWM.

Ich habe auch eine Lösung gefunden:

---
 ICR1 = 2000;
 OCR1A = 1000;
 TCCR1A = (1<<WGM11) | (1<<COM1A1);
 TCCR1B = (1<<WGM13) | (1<<WGM12) | (1<<CS11);
---

---
 TCCR1A = (1<<WGM11) | (1<<COM1A1);
 ICR1 = 2000;
 TCCR1B = (1<<WGM13) | (1<<WGM12) | (1<<CS11);
 OCR1A = 1000;
---


Das ergibt beides 50% PWM.
Also wenn ich die Reihenfolge von oben benutze hat OCR1A nur eine 
effektive Breite von 9 Bit.
Wenn ich die Reihenfolge verändere oder OCR1A neu schreibe, dann werden 
auch die 16 Bit des Registers genutzt.

Jetzt fehlt mir bloss noch die Erklärung dazu.

von Peter D. (peda)


Lesenswert?

Rudolph schrieb:
> Jetzt fehlt mir bloss noch die Erklärung dazu.

Ist doch klar.
Wenn Du nur TCCR1A beschreibst, ist das Mode 2, also 9Bit-PWM.
Du mußt erst den Mode komplett setzen und danach die Werte-Register.

Die Modebits auf verschiedene Register zu verteilen, war keine 
Meisterleistung von Atmel.


Peter

von Rudolph (Gast)


Lesenswert?

Naja, als Erklärung ja schon nicht schlecht.
Das bedeutet aber auch, dass der Inhalt von OCR1A gekappt wird und nicht 
wie man erwarten könnte, anders interpretiert wird.
Und auf dieses Verhalten finde ich gerade überhaupt keinen Hinweis im 
Datenblatt.

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.