Forum: Mikrocontroller und Digitale Elektronik atmega8 Timer2 PWM zeigt keine Wirkung


von Ranjid (Gast)


Lesenswert?

Ich versuche gerade eine LED mittels PWM zu dimmen. Dafür benutze ich 
den Timer2 (8Bit) des Atmega8, weil die anderen Timer schon belegt sind.
Aber wenn ich die LED an OC1A oder B lege passiert einfach garnichts, wo 
liegt der Fehler ?
1
#define F_CPU 3686400UL
2
3
#include <avr/io.h>
4
#include <avr/interrupt.h>
5
#include <util/delay.h>
6
7
int main(void)
8
{
9
  DDRB |= ((1<<PB1) | (1<<PB2));
10
  
11
  
12
  TCCR2 |= ((1<<WGM21) | (1<<WGM20) | (1<<CS22) | (1<<CS21) | (1<<COM21)); //Fast PWM, Prescaler 256, Non inverting
13
  OCR2 = 0;
14
  sei();
15
    while(1)
16
    {
17
       OCR2++;
18
     _delay_ms(20);
19
    }
20
}

von g457 (Gast)


Lesenswert?

> [..] Timer2 [..] OC1A oder B [..]
            ^        ^
Da passt was nicht zusammen. Timer2 bedient OC2. Und soll das..

> OCR2++;

was (sinnvolles) bewirken?

von Ranjid (Gast)


Lesenswert?

Okay das mit OCR2 habe ich auch gerade gemerkt. Wenn ich jetzt daran ein 
Piezosummer hänge, kann ich leider nur mit den Prescalern die Frequenz 
ändern. Wenn ich im Register OCR2 versuche einen Wert zwischen 0 und 255 
einzutragen kommt fast immer der gleiche Ton, was mache ich falsch ?

von g457 (Gast)


Lesenswert?

Beim OCR2 muss ich mich korrigieren: das sollte so funktionieren (sofern 
Du eine sich ändernde PWM erzeugen willst) - hab das Register mit dem 
TCNT2 verbuxelt.

von Thomas E. (thomase)


Lesenswert?

Ranjid schrieb:
> Okay das mit OCR2 habe ich auch gerade gemerkt. Wenn ich jetzt daran ein
> Piezosummer hänge, kann ich leider nur mit den Prescalern die Frequenz
> ändern. Wenn ich im Register OCR2 versuche einen Wert zwischen 0 und 255
> einzutragen kommt fast immer der gleiche Ton, was mache ich falsch ?

Du brauchst keine PWM sondern CTC.

mfg.

von Micki (Gast)


Lesenswert?

Hallo

Als Grundlage um einen Timer in Betrieb zu nehmen, kannst du es mit dem 
Code auf folgender Seite versuchen:

http://www.electronicsplanet.ch/mikrocontroller/source-code/ATmega8/ATmega8-Timer1-CTC.htm

Er ist für den Timer 1, und erzeugt ein Signal mit 1s Periodendauer. 
Aber manchmal ist es einfacher, einen bestehenden Code abzuändern, als 
ihn ganz neu zu schreiben.

mfg
Micki

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.