www.mikrocontroller.net

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


Important announcement: there is an English version of this forum on EmbDev.net. Posts you create there will be displayed on Mikrocontroller.net and EmbDev.net.
Autor: Dennis (Gast)
Datum:

Diesen Beitrag bewerten:
lesenswert
nicht 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:
int main (void)
{
  DDRD |= (1 << PD5);

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

  ICR1 = 444;

  OCR1A = 222;

  TCCR1B |= (1 << CS10);

  while (1)
  {
    asm volatile ("nop");
  }
}


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

Autor: Karl Heinz Buchegger (kbuchegg) (Moderator)
Datum:

Diesen Beitrag bewerten:
lesenswert
nicht 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.
#include <avr/io.h>

int main (void)
{
  DDRD |= (1 << PD5) | (1 << PD6);
  PORTB |= ( 1 << PD6);

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

  ICR1 = 444;

  OCR1A = 10;

  TCCR1B |= (1 << CS10);

  while (1)
  {
    asm volatile ("nop");
  }
}

Also: An diesem Programm liegt es nicht.

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel




Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder GIF-Format hochladen.
Siehe Bildformate
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken erkennst du die Nutzungsbedingungen an.

webmaster@mikrocontroller.netImpressumNutzungsbedingungenWerbung auf Mikrocontroller.net