Forum: Mikrocontroller und Digitale Elektronik ATMEGA32 Fast PWM mit Timer 1 läuft nicht


von Dennis (Gast)


Lesenswert?

Guten Abend!

Ich hab ein Problem mit Timer 1 des Atmega 32.

Ich möchte für eine spätere Anwendung eine PWM mit variabler Frequenz 
erzeugen.
Ich benutze dazu die Fast PWM mit variabler Frequnz und Teiler 1 und 
möchte, dass der Ausgang OC1A den High-Zustand bekommt, wenn ein Match 
eintritt. Im ersten Ansatz möchte ich ein Tastverhältnis von 1:1 haben.

Nach meinem Verständnis wird in diesem Modus bis zum Wert von ICR1 
gezählt. Dann beginnt der Timer von vorne. Über ICR1 wird demnach die 
Frequenz der PWM eingestellt.

Und so habe ich das konfiguriert:
1
int main (void)
2
{
3
  DDRD |= (1 << PD5);
4
5
  TCCR1A |= (1 << COM1A1) | (1 << COM1A0) | (1 << WGM11);
6
  TCCR1B |= (1 << WGM13) | (1 << WGM12);
7
8
  ICR1 = 444;
9
10
  OCR1A = 222;
11
12
  TCCR1B |= (1 << CS10);
13
14
  while (1)
15
  {
16
    asm volatile ("nop");
17
  }
18
}

Ergebnis ist: Der Portpin gibt dauerhaft High-Signal.

In einer anderen Version habe ich das zu Testzwecken mit Interrupt 
gemacht, um zu prüfen ob der Timer überhaupt läuft. In der ISR sollte er 
nur PORTB hochzählen. Das hat er getan, woraus ich schließe, dass der 
Timer funktioniert.

Was habe ich falsch gemacht?

Grüße

Dennis

von Karl H. (kbuchegg)


Lesenswert?

Dennis schrieb:

> Was habe ich falsch gemacht?

Hmm. Dein Programm sieht korrekt aus.
Auch ein Test mit einem direkten Helligkeitsvergleich mit einer nebenan 
liegenden LED zeigt ganz klar, dass die PWM-LED sauber gedimmt wird. 
Dabei hab ich die Dimmung mal etwas extremer gemacht, damit man den 
Unterschied auch deutlich sieht.
1
#include <avr/io.h>
2
3
int main (void)
4
{
5
  DDRD |= (1 << PD5) | (1 << PD6);
6
  PORTB |= ( 1 << PD6);
7
8
  TCCR1A |= (1 << COM1A1) | (1 << COM1A0) | (1 << WGM11);
9
  TCCR1B |= (1 << WGM13) | (1 << WGM12);
10
11
  ICR1 = 444;
12
13
  OCR1A = 10;
14
15
  TCCR1B |= (1 << CS10);
16
17
  while (1)
18
  {
19
    asm volatile ("nop");
20
  }
21
}

Also: An diesem Programm liegt es nicht.

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.