ATmega1284P PWM, Phase Correct (Mode 10)

Gast #5553489
Lesenswert?

Hi, ich hab das Timer Kapitel im ATmega1284P Datenblatt schon 3 mal rauf 
und runter gelesen und bekomme die PWM im Mode 10 bei Timer 1 (16-Bit) 
nicht hin. Ich mache folgendes:
1
// PD5 OCA1 Ausgang
2
DDRD |= (1<<5);
3
  
4
// PWM initialisieren: Mode 10, Set OC1A on Compare Match (OC1B normal)
5
// clkIO (no prescaling)
6
TCCR1A = 0xC2;
7
TCCR1B = 0x11;
8
TCCR1C = 0x00;
9

10
// TOP = MAX
11
ICR1H = 0xFF;
12
ICR1L = 0xFF;
13

14
// duty-cycle    
15
OCR1AH = 0x00;
16
OCR1AL = 0x0F;
Zum testen habe ich eine LED dran. Die bleibt immer gleich hell - 
unabhängig von OCR1A. Was mach ich falsch?
Gast #5553513
Lesenswert?

1
// PD5 OCA1 Ausgang
2
DDRD |= (1<<5);
3
  
4
// PWM initialisieren: Mode 10, Set OC1A on Compare Match (OC1B normal)
5
// clkIO (no prescaling)
6
TCCR1A |= (1<<COM1A1) | (1<<COM1A0) | (1<<WGM11); 
7
TCCR1B = (1<<WGM13) | (1<<CS10);
8

9
// TOP = MAX  
10
ICR1H = 0xFF;
11
ICR1L = 0xFF;
12

13
// duty-cycle        
14
OCR1AH = 0x00;
15
OCR1AL = 0x0F;
#5553654
Lesenswert?

Hallo,

auf meinem Mega2560 funktioniert das, sehe kurze "negative" 
Nadelimpulse.
1
ICR1 = 65535;
2
OCR1A = 15;
3
TCCR1A = (1<<COM1A1)|(1<<COM1A0)|(1<<WGM11);
4
TCCR1B = (1<<WGM13)|(1<<CS10);

Hast du das Oszi am richtigen Pin angeschlossen?
Das Signal ist mit deiner Einstellung invertiert, hoffe das ist dir 
bewusst.
Setz mal OCR1A auf die Hälfte von TOP. Dann musst du ein Rechtecksignal 
sehen.
Gast #5555560
Lesenswert?

Danke für die Antwort. Mittlerweile habe ich mir ein Oszi besorgt und 
sehe die Nadeln auch - aber bei
1
OCR1AH = 0x00;
2
OCR1AL = 0xFF;
bekomme ich keine Signal mit 50% duty-cycle und ich verstehe nicht 
warum?
Erst bei
1
OCR1AH = 0x80;
2
OCR1AL = 0xFF;
bekomme ich keine Signal mit 50% duty-cycle. Aber laut Datenblatt sollte 
der Zähler hochlaufen und bei 0x00FF (OCR1A) den Pin auf low setzten. 
Oben bei 0xFFFF (TOP) wieder runterzählen und den Pin bei 0x00FF auf 
high setzten, bis nach unten (BOTTOM) und wieder raufzählen. Das sollte 
doch 50% duty-cycle geben?
Gast #5555579
Lesenswert?

Spess fragte harm- und sinnlos:
> Gibt es nicht noch eine kryptischere Art der Initialisierumg?

Nachdem die nun vorliegt, wird er sicher gleich mit einer konstruktiven 
Antwort zurückkommen und damit das Problem lösen können.

Genau so, wie es eigentlich nie geschieht. Wichtig ist: Einwürfe, die 
niemandem helfen und Lösungen für völlig andere Probleme bringen.
#5555734
Lesenswert?

Hallo,

@ BUZ, zeige doch einmal dein gesamtes Programm. Zudem gewöhne dir den 
Mist ab mit der Registeraufteilung und hex, die Schreibweise ist 
fehlerträchtig und schwerer lesbar.
Mit was programmierst du deinen µC?
Irgendwas anderes ist hier faul wenn der einfache Code nicht das macht 
was er soll.

Wegen deinem 50% Duty Cycle Problem. Wenn Dein TOP den Wert 65535 hat, 
dann ist bei dessen halben Wert für den Compare Wert 50% Duty Cycle. 
Hatte S. Landolt schon geschrieben. Da muss man nicht groß rechnen. Mit 
dem invertierenen Modus kommst du scheinbar durcheinander.

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren