AVR Mega 8, Capture-Match und Overflow Interrupt für Soft PWM

OP #2624628
Lesenswert?

Hallo,

ich versuche gerade eine Soft-PWM mit dem Capture-Match und dem 
Overflow-Interrupt von Timer1 zu entwerfen. Das Programm soll zur 
Helligkeitssteuerung von LEDs verwendet werden. Die definierten Werte 
sind frei gewählt (ohne PWM-Frequenzberechnung). Im späteren Programm 
soll der Compare wert über Taster verstellbar sein.
In einem Beitrag habe ich gelesen, dass PWM mit den beiden Interrupts 
anscheinend nicht funktionieren sollte, jedoch verstehe ich das nicht. 
Ist an der Überlegung etwas falsch oder kommen sich da einfach die 
beiden Interrupts in die Quere?

#define VORLADEWERT 20000UL
#define COMPARE 50000UL

void main(void)
{
  DDRC=0xFF;
  PORTC=0x00;
        //Prescaler auf 1, Timer läuft nach Compare weiter
  TCCR1B|=(1<<CS10);
        //Interrupt für Compare Mode A frei, Timer Overflow frei
  TIMSK|=((1<<OCIE1A)|(1<<TOIE1));
  TCNT1= VORLADEWERT;
  OCR1A=COMPARE;
  sei();

  while(1);

}

ISR (TIMER1_OVF_vect)
{
  TCNT1=VORLADEWERT;
  PORTC=0x00;
}

ISR (TIMER1_COMPA_vect)
{
  PORTC=0xFF;
}

Gruß,
Tom
OP #2625931
Lesenswert?

Danke für den Tipp.
Würde das beispielsweise so aussehen?

void main(void)
{
  DDRC=0xFF;
  PORTC=0x00;

  ICR1=0x0FFF;
  OCR1A=0x00FF;
  OCR1B=0x00AFF;

//Mode 14, Prescaler 1
  TCCR1B|=((1<<WGM13)|(1<<WGM12)|(1<<CS10));
//Mode 14
  TCCR1A|=((1<<WGM11)|(0<<WGM10));
//Interrupts aktivieren
  TIMSK|=((1<<OCIE1A)|(1<<OCIE1B));

  sei();

  while(1);

}

ISR (TIMER1_COMPB_vect)
{
  PORTC=0x00;
}

ISR (TIMER1_COMPA_vect)
{
  PORTC=0xFF;
}

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