www.mikrocontroller.net

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


Important announcement: there is an English version of this forum on EmbDev.net. Posts you create there will be displayed on Mikrocontroller.net and EmbDev.net.
Autor: Tom V. (senju)
Datum:

Diesen Beitrag bewerten:
lesenswert
nicht 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

Autor: Stefan Ernst (sternst)
Datum:

Diesen Beitrag bewerten:
lesenswert
nicht 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.

Autor: Tom V. (senju)
Datum:

Diesen Beitrag bewerten:
lesenswert
nicht 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;
}

Autor: Stefan Ernst (sternst)
Datum:

Diesen Beitrag bewerten:
lesenswert
nicht 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.

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




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 erkennst du die Nutzungsbedingungen an.

webmaster@mikrocontroller.netImpressumNutzungsbedingungenWerbung auf Mikrocontroller.net