Forum: Mikrocontroller und Digitale Elektronik PWM Timer und Co


von Christoph (Gast)


Lesenswert?

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

: Verschoben durch Moderator
von Kevin M. (arduinolover)


Lesenswert?

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.....

von Christoph (Gast)


Lesenswert?

Eine Hand voll Takte....

Also ein paar if else in der isr sind "vernachlässigbar"?

von M. K. (Gast)


Lesenswert?

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.

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.