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.
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
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.
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
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.