Forum: Compiler & IDEs AVR Mega 8, Capture-Match und Overflow Interrupt für Soft PWM


von Tom V. (senju)


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

von Stefan E. (sternst)


Lesenswert?

Tom V. schrieb:
> In einem Beitrag habe ich gelesen, dass PWM mit den beiden Interrupts
> anscheinend nicht funktionieren sollte,

Klar funktioniert das.
Aber statt "Vorladen" würde ich Mode 14 mit ICR1 als TOP nehmen. Das 
erleichtert auch das Festlegen des Compare-Wertes.

von Tom V. (senju)


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

von Stefan E. (sternst)


Lesenswert?

Tom V. schrieb:
> Würde das beispielsweise so aussehen?

Kommt darauf an, was du eigentlich genau machen willst. Warum jetzt auf 
einmal der zweite Compare-Interrupt, statt des Overflow-Interrupts?

Davon abgesehen: erst Mode setzen, dann ICR1 beschreiben.

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.