ATMega16, PWM-Anfänger

OP #1720481
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 ?
OP #1722445
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);
}

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren