Hallo,
mit dem Timer hatte ich eine Frequenz von ca. 4 kHz erzeugt. Der Ton ist
allerdings nicht sauber (Jitter).
Deshalb habe ich mich an den PWM gewagt. Ich kriege aber nur eine
Frequenz zustande mit Hilfe einer while-Schleife. Das geht doch bestimmt
auch ohne, da der PWM eine eigene Einheit im µC ist, oder?
Der Atmega32 hat einen internen Takt von 1 MHz, bei einem 8-Bit-Timer
und einem Prescaler von 1 wäre das eine Frquenz von 3,9 kHz.
Soweit, so gut. Ich habe aber gelesen, dass man kein ISR braucht(??) und
die while-Schleife in der Hauptroutine der Anwendung ist auch nicht sehr
toll.
Kann mir bitte jemand helfen, wo fehlt da ein Parameter. Ihr seht schon
an meiner Beschreibung, dass ich noch Anfänger bin und mich mit Mühe
durch den Bit-Dschungel des Atmega taste.
Hier mein Code:
1 | // Timer Testprogramm für PWM
|
2 |
|
3 | #include <avr/io.h>
|
4 | #include <avr/interrupt.h>
|
5 | #include <stdint.h>
|
6 |
|
7 | int main(void)
|
8 | {
|
9 | TCCR2 |= (1<<CS20); // Prescaler 1
|
10 | TCCR2 |= (1<<WGM21) | (1<<WGM20); // Timer aktivieren, 8-Bit, Fast PWM
|
11 | TCCR2 |= (1<<COM21) | (0<<COM20) ; // Compare match, Fast PWM, nicht invertiert
|
12 | OCR2 = 255; // Vergleichswert setzen
|
13 |
|
14 | DDRD |= (1<<PD7); // Port D Pin 7 als Ausgang
|
15 |
|
16 | uint8_t wert;
|
17 | while(1)
|
18 | {
|
19 | for (wert=0; wert<255; wert++)
|
20 | {
|
21 | OCR2 = wert;
|
22 | }
|
23 | }
|
24 | }//main
|