www.mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik ATmega32 Timer0 PWM will nicht so recht


Autor: Dead Dealer (deaddealer)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Moin,

Ich teste im Moment ein bischen die ganzen Sachen aus, die man mit den 
Timern machen kann. Für den Anfang wollte ich eine pulsierende LED 
haben. Die LED hängt nicht an OC0, daher setze ich bei einen 
Compare-Match PB0 auf low und bei einen Overflow auf high.
Im Moment sieht es aber so aus, dass die LED erst heller wird und beim 
runterdimmen bei niedrigster Helligkeit einmal kurz aufblitzt, sofort 
wieder dunkel wird und dann wieder langsam heller wird usw. Der Wechsel 
von heller zu dunkler macht nicht diesen Fehler. Hier der Code:

#include <avr/io.h>
#include <avr/interrupt.h>
#include <util/delay.h>

#define LED_MAX 254
#define LED_MIN 1

uint8_t dimm = LED_MIN;


int main(void)
{
  // LED Ausgang
  DDRB |= (1 << PB0);
  PORTB |= (1<< PB0);

  // PWM, kein Vorteiler
  TCCR0 |= (1 << WGM00) | (1 << CS00);

  // Setze Timer 0 Interrupts
  TIMSK |= (1 << OCIE0) | (1 << TOIE0);

  // aktiviere globale Interrupts
  sei();


  while(1)
  {
    while (dimm < LED_MAX)
    {
      dimm++;
      OCR0 = dimm;
      _delay_ms(2);
    }
    while (dimm > LED_MIN)
    {
      dimm--;
      OCR0 = dimm;
      _delay_ms(2);
    }
  }
}

ISR(TIMER0_COMP_vect)
{
  PORTB &= ~(1 << PB0);
}

ISR(TIMER0_OVF_vect)
{
  PORTB |= (1 << PB0);
}

Autor: Spess53 (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi

Mache die OCR-Updates in einem der beiden Interrupts. Asynchron wird das 
nichts.

MfG Spess

Autor: Spess53 (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi

Nachtrag: Im Overflow-Interrupt.

MfG Spess

Autor: Dead Dealer (deaddealer)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Spess53 schrieb:
> Hi
>
> Nachtrag: Im Overflow-Interrupt.
>
> MfG Spess

Das bringt es auch nicht wirklich ... was mich grad wurmt ... setze ich 
z.B. OCR0 = 16, ist die LED dunkel. Senke ich den Wert nun schrittweise 
gegen 0, wird die LED heller o_O
Habe vorsichtshalber die beiden Schleifen raußgeworfen, so dass das 
Programm in der while(1); fröhlich nichts tut. OCR0 setze ich nun direkt 
beim Overflow-Interrupt.

Autor: Spess53 (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi

Der Timer läuft auch während des Interrupts weiter. Wenn er dann den 
neuen OC-Wert schon überschritten hat leuchtet deine LED bis zum 
nächsten Overflow.

Vielleicht reicht es, den Timer langsamer zu machen. Jetzt läuft er ja 
mit Vorteiler 1.

MfG Spess

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
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
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 bestätigst du, die Nutzungsbedingungen anzuerkennen.