Forum: Mikrocontroller und Digitale Elektronik Fast PWM zählt nicht bis ICR1


von Hans L. (Gast)


Lesenswert?

Hallo Leute,

ich möchte eine FAST PWM erzeugen und dazu die beiden Kanäle des Timer1 
an meinem MEGA8515 benutzen.

Komischerweise zählt der Timer nicht im fast Modus sondern im 
phasenkorrekten Modus bis 1FF und dann wieder runter auf 0. Ich möchte 
aber den TOP durch ICR1 festlegen und habe deshalb PWM Modus 14 wie 
folgt konfiguriert:

...
1
 TCCR1A |= (1<<COM1A1)|(1<<COM1B1)|(1<<COM1A0)|(1<<COM1B0)| //Set OC1A/OC1B on Compare Match, clear OC1A/OC1B at TOP
2
           (1<<WGM13)|(1<<WGM12)|(1<<WGM11);        // Fast PWM with TOP : ICR1
3
 ICR1 = 0x00FF;
4
 OCR1A = 0x0001;
5
 OCR1B = 0x000F;
6
 TCCR1B  |= (1<<CS10);
...

Warum zählt der Timer nicht bis 0xFF?

von Karl H. (kbuchegg)


Lesenswert?

TCCR1A |= (1<<COM1A1)|(1<<COM1B1)|(1<<COM1A0)|(1<<COM1B0)
          (1<<WGM13)|(1<<WGM12)|(1<<WGM11);

Bei den WGM Bits muss man aufpassen. Die sind meistens auf 2 Register 
verteilt. So auch beim Mega8515. WGM13 und WGM12 sind in TCCR1B

von Hans L. (Gast)


Lesenswert?

1
TCCR1A |=   (1<<COM1A1)|(1<<COM1B1)|(1<<COM1A0)|(1<<COM1B0)|1<<WGM11);            
2
ICR1 = 0x00FF;
3
OCR1A = 0x0001;
4
OCR1B = 0x000F;
5
TCCR1B  |= (1<<CS10)|(1<<WGM13)|(1<<WGM12);

macht keinen Unterschied. Uhr zählt munter über ICR1 drüber

von Grrrr (Gast)


Lesenswert?

Zu spät. :-(

von Grrrr (Gast)


Lesenswert?

Hans L. schrieb:
> Uhr zählt munter über ICR1 drüber

Dann zeig bitte mal ein vollständiges Minimalbeispiel. Woran merkst Du, 
dass er zu weit zählt?

von Hans L. (Gast)


Angehängte Dateien:

Lesenswert?

Im AVR Studio!

von Grrrr (Gast)


Lesenswert?

Brrr: Bildformate!

Wie ist der Zählerstand wenn die Anweisung
1
TCCR1B  |= (1<<CS10)|(1<<WGM13)|(1<<WGM12);
ausgeführt wird?

von Grrrr (Gast)


Lesenswert?


von Hans L. (Gast)


Lesenswert?

ich weiß zwar nicht warum und weshalb aber nach einem neustart gings.. 
-.-

von Grrrr (Gast)


Lesenswert?

Das

> Wie ist der Zählerstand wenn die AnweisungTCCR1B  |= 
(1<<CS10)|(1<<WGM13)|(1<<WGM12);
> ausgeführt wird?

 habe ich nicht ohne tieferen Grund gefragt:

Siehe Datenblatt, S. 112

"...there is a risk that the new ICR1 value written is lower than the 
current value of TCNT1.
The result will then be that the counter will miss the Compare Match at 
the TOP value.
The counter will then have to count to the MAX value (0xFFFF) and wrap 
around starting
at 0x0000 before the Compare Match can occur."

Die hier weggelassen Einschränkung am Anfang des Satzes mag ncht allein 
ausschlaggebend sein, wenn der Timer, etwas von vorherigen Experimenten 
noch auf einem anderen Zählerstand seht als nach dem Reset.

von Hans L. (Gast)


Lesenswert?

Grrrr schrieb:
> Wie ist der Zählerstand wenn die AnweisungTCCR1B  |= 
(1<<CS10)|(1<<WGM13)|(1<<WGM12);
>
>
>
>
>
> ausgeführt wird?


es ist doch manchmal zum Mäusemelken!
jetzt geht das Ganze wieder nicht.. grrr..

Im AVR Studio zählt er immer wieder von 0 bis 0x1FF und wieder zurück.. 
über mehrere Perioden.

Der Zähler ist vorm Starten 0.

Komisch ist weiterhin, dass ich nicht bis auf OCR1A/B=0 runterdimmen 
kann. Ein ganz kleines bisschen leuchtet die LED immernoch.

Auch komisch ist, dass ICR1 wohl vom uc wahrgenommen wird als obergrenze 
für den Timer, da sich bei Änderungen die Helligkeit von OCR1A/B 
mitändert. Im AVR Studio wird beim Timer jedoch IMMER nur bis 1FF 
gezählt (in nicht FAST PWM Methode).

Bin ratlos.

von Karl H. (kbuchegg)


Lesenswert?

Hans L. schrieb:

> Komisch ist weiterhin, dass ich nicht bis auf OCR1A/B=0 runterdimmen
> kann. Ein ganz kleines bisschen leuchtet die LED immernoch.

Das ist normal und aus der hardwareseitigen Arbeitsweise der PWM 
bedingt. Bei 0 musst du eben den Timer ganz abschalten.

> mitändert. Im AVR Studio wird beim Timer jedoch IMMER nur bis 1FF
> gezählt (in nicht FAST PWM Methode).

Der Simulator im AVR-Studio hat so seine Macken. Hast du schon gesucht, 
ob es sich dabei nicht um einen dokumentierten Fehler handelt?

von Grrrr (Gast)


Lesenswert?

Hans L. schrieb:
> über mehrere Perioden.

Das ist eindeutig nicht wie im Datenblatt beschrieben.

Es gibt übrigens seit einiger Zeit zwei Simulatoren. Ich weiss 
allerdings nicht ob beide den Mega8515 unterstützen. Solltest Du mal 
nachschauen. (Projekteinstellungen)

von Hans L. (Gast)


Lesenswert?

Karl heinz Buchegger schrieb:
> Hast du schon gesucht,
>
> ob es sich dabei nicht um einen dokumentierten Fehler handelt?

Nein. Habe ich nicht. Scheint aber einfach ein Fehler zu sein.

Grrrr schrieb:
> Es gibt übrigens seit einiger Zeit zwei Simulatoren. Ich weiss
>
> allerdings nicht ob beide den Mega8515 unterstützen.

Der Simulator2 unterstützt den 8515 nicht.

Wie kann man denn richtig debuggen? Das ist total nervig. Vor allem, 
wenn die Projekte mal ein wenig größer werden.

Kann man mit den Hardware Debuggern GENAU das sehen was in der HARDWARE 
passiert und dann mit den gesamten Informationen wie im AVR Studio; nur 
ebn richtig?

von Grrrr (Gast)


Lesenswert?

Hans L. schrieb:
> Kann man mit den Hardware Debuggern GENAU das sehen was in der HARDWARE
> passiert und dann mit den gesamten Informationen wie im AVR Studio; nur
> ebn richtig?

Ob die Timerwerte etwa mit einem MKII korrekt gelesen werden können, 
weiss ich leider nicht. Sorry. Probier es mal selbst.

Es ist aber mit hoher Wahrscheinlichkeit davon auszugehen, das der uC 
korrekt geht. D.h. Poor-Mans-Debugging mit printf oder Pin-Toggle falls 
Du kein MKII hast.

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.