Fast-PWM Mode 14, OCR1A hat nur 9 Bit?

Gast #2388483
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.
Gast #2388514
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
Gast #2388540
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.
Gast #2388581
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.

Antwort schreiben

Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt. Bitte hier nur auf die ursprüngliche Frage antworten, für neue Fragen einen neuen Beitrag erstellen.

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.