www.mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik ATMega16, PWM-Anfänger


Autor: Karlheinz Druschel (kdruschel)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi Leuts, ich habe hier einen Mega16 mit 8 MHz und versuche mich gerade 
an PWM.
Nun habe ich folgenden Code:
int main()
{
  DDRB = 0xff;
        DDRD = 0xff;
  TCCR0 = (1<<CS00) | (1<<WGM00) | (1<<WGM01) | (1<<COM01);
  OCR0=50;

  TCCR1A |=(1<<COM1A1) |    // Clear OC1A on Compare Match
    (1<<WGM10)|(1<<WGM11)|  // 10bit, Fast PWM
                (1<<WGM12) |
    (1<<CS10);    // No Prescaler

  OCR1A=50;



  for (;;)
  {
    ;
  }
}
PWM vom Timer0 funktioniert, an OC0 (PB3) habe ich ein PWM Signal.
PWM mit Timer1 funzt nicht, an OC1A (PD5) habe ich nichts.
Was mache ich falsch ?

Autor: Peter Diener (pdiener) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Die Clock-Select Bits und Teile der WGM Bits sind nicht in Register 
TCCR1A, sondern in TCCR1B.
TCCR1B wird im Code nicht gesetzt, der Timer ist also abgeschaltet.

Grüße,

Peter

Autor: Karlheinz Druschel (kdruschel)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Stimmt, danke dass Du mir das Brett weggenommen hast :-)
Anyway, jetzt krieg ich Timer2 nicht zum Laufen (PWM und ich soll wohl 
nicht sein).
Ich möchte einfach nur, dass Timer2 alle 1ms einen CTC-Interrupt aufruft 
(Timer0 funzt):

#include <avr/io.h>
#include <avr/interrupt.h>

int main()
{
  DDRB = 0xff;
  DDRD = 0xff;


  // Timer 0 konfigurieren:
  // Fast PWM
  TCCR0=0;
  TCCR0 |= ((1<<WGM01)|(1<<WGM00));
  // Clear OC0 on compare
  TCCR0 |= (1<<COM01);
  // Systemtakt
  TCCR0 |= (1<<CS00);
  // CTC-Vergleichswert
  OCR0 = 200-1;
  /////////////////////////////////////////////////////////
  // Timer 2 konfigurieren
  // alle 1 ms wird ein CompareMatch-Interrupt ausgeloest
  TCCR2 = 0;
  // CTC-Modus einstellen
  TCCR2 |= (1<<WGM21);
  // Prescaler 64
  TCCR2 |= (1<<CS22);

  // CompareMatch-Interrupt aktivieren
  TIMSK |= (1<<OCIE2);
  // OCR-Register laden
  OCR2 = 125;


//////////////////////////////////////////////////////
  sei();
  for (;;)
  {

  }
}

// CompareMatch-Interrupt Timer 2
// wird im 1 ms Takt aufgerufen
ISR(TIMER2_COMP_vect)
{
  PORTB ^= (1<<PB1);
}

Autor: Peter Diener (pdiener) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Der Timer2 sollte mit dieser Konfiguration eigentlich funktionieren.
Ich würde das mal im Simulator ausprobieren (Breakpoint in den Interrupt 
setzen).

Grüße,

Peter

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
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
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 bestätigst du, die Nutzungsbedingungen anzuerkennen.