PWM Timer und Co

Gast #6367910
Hallo,

ich habe ein paar Fragen zum PWM Thema und diversen anderen C Code.

Ich denke das wird im laufe der Zeit weiter ausarten, aber komme ich 
erstmal auf dad pwm Thema..

Also ich habe ein ATMega128A mit einer pwm am laufen.
Mit dieser pwm dimme ich eine LED. Wenn ich den OCR1A Wert ändere, 
ändert sich auch die Helligkeit der LED.

Ok.

Wenn ich dad ganze nun aufdimmen lassen möchte, schreibe ich ganz simpel
1
int test = 0;
2
while(1)
3
{
4
  OCR1A = test;
5
  _delay_ms(100);
6
  test++;
7
}

und dann dimmt die led auf...

oder auf und ab...
1
int test = 0;
2
int up = 1;
3
while(1)
4
{
5
  OCR1A = test;
6
  _delay_ms(100);
7

8
  if (up == 1) {
9
    test++;
10
  } else {
11
    test--;
12
  }
13

14
  if (test == 255) {
15
    up = 0;
16
  } 
17
  if (test == 0) {
18
    up = 1;
19
  }
20
}

Jetzt würde ich das ganze jedoch gerne mit einem timer machen. Das delay 
lässt ja den ganzen Controller schlafen.

Ein timer mit einer isr habe ich auch schoneinmal ans laufen bekommen, 
die isr belegt jedoch auch Zeit vom Controller.

Wie könnte man den Wert denn mit einem timer ändern? Ohne isr? Und wie 
ändert man die "Geschwindigkeit" des dimmens?

Danke
#6367919
Christoph schrieb:
> Wie könnte man den Wert denn mit einem timer ändern? Ohne isr? Und wie
> ändert man die "Geschwindigkeit" des dimmens?

Da bleibt wohl nur ein DMA, den der µC meine ich nicht hat.

Christoph schrieb:
> Ein timer mit einer isr habe ich auch schoneinmal ans laufen bekommen,
> die isr belegt jedoch auch Zeit vom Controller.

Ja eine Hand voll Takte wenn überhaupt.....
Gast #6367982
Christoph schrieb:
> Wie könnte man den Wert denn mit einem timer ändern? Ohne isr?

Ohne ISR wird das immer polling und polling kostet nunmal CPU Takte.
Ich gehe meist so vor, das ich mir einem ISR Basistimer schreibe.
1ms, 10ms, 100ms oder mehr, je nachdem wie kurz der kleinstmögliche 
Zeitablauf sein soll.

In der ISR werden dann die zeitlichen Abläufe der verschiedenene 
zeitabhängigen Routinen gemanaged Ein Flag wird gesetzt wenn z.B. die 
dimming Zeit abgelaufen ist und der PWM Timer neu beschrieben werden 
soll.

In der Main ein paar If Abfragen ob das jeweilige Flag gekommen ist, 
rücksetzen des Flags und Sprung in die Funktion die das bearbeitet.

Am Ende der Main lege ich die CPU schlafen, bis zum nächsten ISR Aufruf.

Antwort schreiben

Eine eigene Frage? Dieser Thread ist über 6 Jahre alt. Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.

Neuen Thread starten

Eine Lösung, Ergänzung oder Rückmeldung zu diesem Thread? Dann antworte hier.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.