Forum: Mikrocontroller und Digitale Elektronik ATmega1284P PWM, Phase Correct (Mode 10)


von BUZ (Gast)


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?

von spess53 (Gast)


Lesenswert?

Hi

Gibt es nicht noch eine kryptischere Art der Initialisierumg?

MfG Spess

von BUZ (Gast)


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;

von Stefan F. (Gast)


Lesenswert?

Ich sehe da keinen Fehler.

von Veit D. (devil-elec)


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.

von BUZ (Gast)


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?

von BlaBla (Gast)


Lesenswert?

0xFFFF /2 = ca 0x8000, oder ?

von S. Landolt (Gast)


Lesenswert?

Vielleicht wird es verständlicher, wenn man die Werte dezimal schreibt 
(s.o. bei Veit D.), und da der Compiler das ja auch versteht:

ICR1  = 65535;
OCR1A = 65535/2;

von Kenner der Szene (Gast)


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.

von Stefan F. (Gast)


Lesenswert?

Kenner der Szene schrieb:
> Genau so, wie es eigentlich nie geschieht. Wichtig ist: Einwürfe, die
> niemandem helfen und Lösungen für völlig andere Probleme bringen.

Von Hilfesuchenden Leuten kann man schon erwarten, dass sie Ihr Problem 
in menschen-lesbarer Form schildern, nicht als Rätsel.

von Kenner der Szene (Gast)


Lesenswert?

Stefanus F. schrieb:

> Von Hilfesuchenden Leuten kann man schon erwarten, dass sie Ihr Problem
> in menschen-lesbarer Form schildern, nicht als Rätsel.

Das Listing ist gut lesbar und für die Böswilligen sogar noch 
kommentiert.

von S. Landolt (Gast)


Lesenswert?

Es ist schon erstaunlich, dass er gerade mal elf Minuten benötigte, um 
die Terme umzuschreiben, da er doch offenbar Probleme mit dem 
Hexadezimalsystem hat.

von Veit D. (devil-elec)


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.

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.