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


von Karlheinz D. (kdruschel)


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 ?

von Peter D. (pdiener) Benutzerseite


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

von Karlheinz D. (kdruschel)


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);
}

von Peter D. (pdiener) Benutzerseite


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

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.