Forum: Mikrocontroller und Digitale Elektronik 16-Bit Timer zählt nicht bis 65535


von Jens K. (mister232)


Lesenswert?

Hallo Leute,

ich möchte auf einem ATmega32u4 einen 16-Bit Timer nutzen um an den Pins 
OCR1A und OCR1B jeweils 16-Bit PWM auszugeben. Ich habe den Timer wie 
folgt initialisiert:
1
DDRB |= (1<<PB5) | (1<<PB6); // PWM-Ports as outputs
2
TCCR1A |= (1<<WGM11) | (1<<COM1B1) | (1<<COM1A1); // PWM, fast mode, 16 bit, non-inverting
3
TCCR1B |= (1<<CS11) | (1<<CS10) | (1<<WGM12) | (1<<WGM13); // Prescaler 64
4
ICR1 |= 0xFFFF; // Set counter border to 16-Bit
Lasse ich den OCR1A-Wert ausgeben und langsam inkrementieren, dann hat 
das PWM-Signal bereits bei 1013 sein Maximum und nicht 65535.

Was mache ich falsch?

von Karl H. (kbuchegg)


Lesenswert?

Jens K. schrieb:

> Was mache ich falsch?

Du zeigst nicht das komplette Programm, so dass wir dir nicht helfen 
können, die Stelle in deinem Programm zu finden, wo du dir entweder 
eines der TCCR Register oder das ICR1 zerschiesst.

von Jens K. (mister232)


Lesenswert?

Der Rest des Programmes mach eigentlich folgendes
1
OCR1B = OCR1B + 10;
2
    
3
if (OCR1B == 0)
4
OCR1B = 65535;
5
      
6
sprintf(testString,"OCR-Value: %d\n\r", OCR1B);
7
serPuts(testString);

von Karl H. (kbuchegg)


Lesenswert?

Das hier
1
TCCR1A |= (1<<WGM11) | (1<<COM1B1) | (1<<COM1A1); // PWM, fast mode, 16 bit, non-inverting
2
TCCR1B |= (1<<CS11) | (1<<CS10) | (1<<WGM12) | (1<<WGM13); // Prescaler 64
3
ICR1 |= 0xFFFF;

ist übrigens keine so gute Idee. Du willst hier sicherlich nicht, dass 
dir eventuelle 'alte' Bits in den Registern stehen bleiben, sondern du 
willst hier ganz sicher, dass insbesondere die TCCR Register genau die 
Bits, und nur die Bits, gesetzt hat, die du angegeben hast. Dann mach 
da auch eine Zuweisung, damit sich da auf keinen Fall irgendwelche 
"Altlasten" durchmogeln.
1
TCCR1A = (1<<WGM11) | (1<<COM1B1) | (1<<COM1A1); // PWM, fast mode, 16 bit, non-inverting
2
TCCR1B = (1<<CS11) | (1<<CS10) | (1<<WGM12) | (1<<WGM13); // Prescaler 64
3
ICR1 = 0xFFFF;

Die Bits an sich sind korrekt. WGM11, WGM12 und WGM13 sind der "Fast PWM 
Mode mit dem Top Wert aus ICR1". Und du setzt sie auch im korrekten 
Register. Ergo muss das Problem in dem Codeteil liegen, den du nicht 
zeigst, sofern wir davon ausgehen können (und nach einem Reset können 
wir das), das die TCCR Register alle urspünglich den Wert 0 enthielten.

von Jens K. (mister232)


Lesenswert?

Jetzt funktioniert es. Hatte tatsächlich an einer Stelle die 
Registerwerte wieder überschrieben :-)

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.