Forum: Compiler & IDEs AVR Timer2 - gibt es den?


von Lars (Gast)


Lesenswert?

Hallo!
Versuche bei meinem ATMega16 den zweiten Timer in Betrieb zu nehmen. 
Leider meckert der Compiler über Wörter wie "TCCR2A" oder "OCR2A" (die 
Äquivalente dazu mit einer 1 gibt es alle).
Heißen die beim zweiten Timer anders? Oder brauchts dafür einen 
speziellen Header?

thx!

von OliverSo (Gast)


Lesenswert?

Datenblatt gelesen? ...

Timer 2 ist beim Mega16 nur 8 bit breit, da braucht es keine A's und 
B's. Folglich heisst das dann TCCR2, usw.

Oliver

von Lars (Gast)


Lesenswert?

Au, danke :-)

von Lars (Gast)


Lesenswert?

Mh, ich würde Timer2 jetzt gerne benutzen um per PWM eine LED leuchten 
zu lassen. Dazu habe ich folgenden Code benutzt (quasi aus dem GCC 
Tutorial):

TCCR2 |= (1<<WGM10);
TCCR2 |= (1<<COM1A1);
TCCR2 = (1<<CS12) | (1<<CS10);
OCR2 = 0x10;

Leider tut sich garnix, die LED bleibt dunkel. Mach ich was falsch? :-(

von Lars (Gast)


Lesenswert?

Habe mal mit einem Multimeter die Spannung am Ausgangspin (OC2 = D7) 
gemssen. Das sind immer konstant 23mV (Wechselspannung), egal welchen 
Prescaler/OCR Wert ich benutze...

von Andreas Paulin (Gast)


Lesenswert?

Was ist mit dem DDR-Register? LED-Port auch auf 'AUSGANG' geschaltet?

PWM-Ports werden afaik nämlich nicht automatisch beim einschalten der 
PWM auf Ausgang geschaltet..

von Karl H. (kbuchegg)


Lesenswert?

Du solltest dir angewöhnen, wenn du Code an einen anderen
Timer anpasst, im Datenblatt deines Controllers zu überprüfen,
* ob der Timer das auch alles kann, was du willst
* ob die Bitnamen auch stimmen
* ob die Registernamen stimmen

Wenn du das machst, dann stellst du fest, dass zwar die
Registe rso heissen, dass du aber Bitnummern verwendest,
die mit denen im Datenblatt nichts zu tun haben.

von Andreas Paulin (Gast)


Lesenswert?

aha... probier mal
DDRD |= 0x80; // D7 auf Ausgang

von Lars (Gast)


Lesenswert?

OK, nachdem ich ins Datenblatt geschaut habe bin ich zu folgendem Code 
gekommen, der nun eigentlich funktionieren sollte (Port D ist Ausgang):

TCCR2 |= (1<<WGM20);
TCCR2 |= (1<<COM21);
TCCR2 = (1<<CS22) | (1<<CS20);
OCR2 = 0x10;

Aber egal wie ich's einstelle: jetzt leuchtet die LED immer mit voller 
Helligkeit. Irgendwas hab ich wohl übersehen...

von Jörg W. (dl8dtl) (Moderator) Benutzerseite


Lesenswert?

Lars wrote:

> Aber egal wie ich's einstelle: jetzt leuchtet die LED immer mit voller
> Helligkeit. Irgendwas hab ich wohl übersehen...

Ja:
1
 TCCR2 |= (1<<WGM20);
2
 TCCR2 |= (1<<COM21);
3
 TCCR2 = (1<<CS22) | (1<<CS20);

Preisfrage: Welchen Wert hat TCCR2 nach diesen drei Zeilen?

Vielleicht schreibst du ja alles doch gleich in eine einzige 
Zuweisung...

von Gast (Gast)


Lesenswert?

So müsste es gehen:

 TCCR2 |= (1<<WGM20);
 TCCR2 |= (1<<COM21);
 TCCR2 |= (1<<CS22) | (1<<CS20);

von Jörg W. (dl8dtl) (Moderator) Benutzerseite


Lesenswert?

Gast wrote:

> So müsste es gehen:

Ja, aber was zum Geier[tm] soll der Quatsch?  Das generiert 12
CPU-Befehle.  Wenn man es so schreibt:
1
TCCR2 = (1<<WGM20) | (1<<COM21) | (1<<CS22) | (1<<CS20);

sind es nur zwei CPU-Befehle.

von Gast (Gast)


Lesenswert?

>Ja, aber was zum Geier[tm] soll der Quatsch?  Das generiert 12
>CPU-Befehle.  Wenn man es so schreibt:

>TCCR2 = (1<<WGM20) | (1<<COM21) | (1<<CS22) | (1<<CS20);

>sind es nur zwei CPU-Befehle.

Ja, das stimmt schon!

Aber es sollte nur zeigen, wie es prinzipiell geht, damit Lars zu einem 
Ergebnis kommt.

MfG Tobi

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.