Forum: Mikrocontroller und Digitale Elektronik Frage zum Fading von LED's


von Martin K. (spyro07)


Lesenswert?

Hallo,

ich habe mal eine Grundsatzfrage zum LED - Fading. Entweder habe ich ein 
Brett vorm Kopf oder es ist doch gar nicht ganz ohne.

Und zwar habe ich bereits die Software - PWM. Mit der kann ich die LED's 
gewissermaßen unterschiedlich hell leuchten lassen. Zum Faden muss ich 
nun das Tastverhältnis der Soft PWM verändern. Im Artikel wird das ja 
mit einfachen Warteschleifen gemacht. Ich möchte allerdings den µc noch 
was andres machen lassen, also die ganze Zeit in Warteschleifen hängen 
geht nicht. Also müsste ich das Fading über einen Timer realisieren. An 
sich ist das nicht das Problem, jetzt kommt das aber:

ich möchte alles recht universell gestalten, d.h. alle Kanäle 
unterschiedlich schnell und das auch zur gleichen Zeit faden können.
Hintergrund: ich will später verschiedene Lichtprogramme einstellen 
können, da muss das alles recht unabhängig sein.

Allerdings fehlt mir bis jetzt der Ansatz, wie ich die ganzen Kanäle mit 
1 Timer realisieren kann, der immer gleich schnell läuft.

Hat soetwas schon jemand gemacht, wie müsste denn das Grundprinzip 
aussehen.

Aber ich glaube wohl, ich kann den Timer nur als Zähler verwenden und 
muss dann alle Lichtprogramme einzeln programmieren.
Ich hatte mir das so gedacht, das ich die Lichtprogramme dann einfach in 
einer Tabelle speichern kann, in der die dann nur die Zeiten der 
einzelnen PWM - Stufen für jeden Kanal liegen, aber das wird wohl nichts 
werden.

von Fabian (Gast)


Lesenswert?

ungefähr so: (pseudo c code)
1
ledDelay[0] = 10;
2
ledDelay[1] = 20;
3
ledDelay[2] = 30;
4
...
5
6
ISR timer()
7
{
8
   uint8_t i;
9
   for (i = 0; i < sizeof(ledDelay); i++)
10
      if (timerValue % ledDelay[i] == 0) toggleLed(i);
11
}

von Chris (Gast)


Lesenswert?

Hast Du den Artikel Soft-PWM gelesen? Da wird genau das gemacht, was 
Du gerne erreichen möchtest.

von Fabian (Gast)


Lesenswert?

Blödsinn, was ich gerade geschrieben habe... Sorry, neuer Versuch:
1
ledFadeSpeed[0] = 10;
2
ledFadeSpeed[1] = 20;
3
ledFadeSpeed[2] = 30;
4
...
5
6
ISR timer()
7
{
8
   uint8_t i;
9
   for (i = 0; i < sizeof(ledDelay); i++)
10
      if ((timerValue % ledFadeSpeed[i] == 0) && (ledPwmValue[i] > 0))
11
          ledPwmValue[i]--;
12
}

von MaWin (Gast)


Lesenswert?

Auch dein PC hat nur einen Timer, und da blinkt und dreht sich auch 
alles.

Irgendetwas auf deinem uC ist das Hauptprogramm, und irgendetwas anderes 
sind Interrupt-Routinen.

Soft-PWM kann man sowohl im Hauptprogramm (synchronisiert sich durch 
Abfrage des aktuellen Timer-Standes) als auch in einer Interrupt-Routine 
(wird vom Timer aufgerifen) implementieren.

Ich kann dir sagen, daß es technisch möglich ist, 1024 LEDs mit einem uC 
unabhängig voneinander zu dimmen - und das Bild währenddessen über UART 
zu empfangen.

Allerdingd sollte man daür programmieren können und es nicht mit BASCOM 
probieren.

Richtig ist, daß man es NICHT mit langen Warteschleifen macht.

Besser ist es, die aktuelle Zeit aus einem Timer abzuholen und mit den 
Dimmwerten zu vergleichen und dadurch zu bestimmen, welche Ausgänge nun 
ein- oder ausgeschaltet sein sollen.

Wenn das zu viel Zeit in Ansruch nimmt, kann man es auch vorausgerechnen 
und zu den jeweils nötigen Zeitpunkten nur noch die für den Zeitpunkt 
vorausberechneten Portzustände an die Ausgabeports übertragen.

Statt z.B. bei 8 bit diese 256 mal pro PWM Zyklus zu machen, braucht man 
es nur 8 mal zu machen - mit einer Wartezeit von 1, 2, 4, 8, 16, 32, 64, 
128 (welcher Zeitmasstab auch immer) dazwischen in der man anderes tun 
kann. Dann spart man sich sogar vergleichen und umrechnen und schiebt 
nur die Bits der aktuellen Dimmwerte raus.

von Karl H. (kbuchegg)


Lesenswert?

> Allerdings fehlt mir bis jetzt der Ansatz, wie ich die ganzen Kanäle
> mit 1 Timer realisieren kann, der immer gleich schnell läuft.
>
> Hat soetwas schon jemand gemacht, wie müsste denn das Grundprinzip
> aussehen.

Das wichtigste Grundprinzip ist, dass dieser Ablauftimer deine 
Untergrenze der zeitlichen Auflösung definiert. D.h. Du kannst nicht 
jede Fading-Fahrt realisieren sondern nur welche, die ein Vielfaches 
dieser Grundzeit sind.

Das ist das eine, und das ist noch relativ leicht.
Das andere ist das Problem, dass von einem Zeitschritt zum nächsten 
nicht unbedingt ein ganzzahliges Inkrement der Helligkeit erhältst. Da 
gibt es mehrere Ansätze, die du gehen kannst

* du kannst einen Bresenham adaptieren (bitte danach googeln. Auch wenn
  es auf den ersten Blick nicht danach aussieht, ist es doch möglich
  einen Bresenham Algorithmus auf dieses Problem anzusetzen)

* du kannst die jeweilige Helligkeitstufe in der Fading-Fahrt nach
  jedem Zeitschritt neu ausrechnen.
  Nach dem Muster:
  Wenn sich die Helligkeit in 200 Zeitschritten um 45 Helligkeits-
  stufen ändern soll, dann muss die Zunahme vom Ausgangswert im
  Schritt 87 gleich

                    45 * 87
                   ---------
                      200

  sein

* Oder aber man kann auch das tun, was in der DDA gerne gemacht wird.
  Man kann sich sowas wie 'künstliche Nachkommastellen' erzeugen.
  Anstatt zb in 16 Bit, rechnet man in 32 Bit, wobei die unteren
  16 Bit die 'Nachkommastellen sind'.
  Im Grunde machst du zb
  Anstatt auszurechnen, um wieviel die Helligkeit bei einer
  Fading Fahrt 200Schritte und 85 Helligkeitsstufen in einem
  SChritt zunehmen soll, rechnest du einfach so, als ob die Helligkeit
  um 850 (also das Zehnfache) zunehmen soll. Du musst dir nur merken
  dass deine Helligkeiten immer das Zehnfache dessen sind, was du
  eigentlich brauchst und bei der Ansteuerung der PWM Das entsprechend
  berücksichtigen (im Rechner nimmst du natürlich nicht das 10-fache
  sondern eine 2-er Potenz)


Tja. UNd der Rest ist dann ein Lichtprogramm, welches in einer Tabelle 
steckt, und in dem verzeichnet ist, welche Helligkeitsstufe ein Kanal 
haben soll, wie lange diese Stufe einzuhalten ist und wie lange das 
Fading auf die nächste Stufe dauern soll.

von Martin K. (spyro07)


Lesenswert?

Hallo,

ersteinmal vielen Dank für die überwältigende Resonanz auf meine Frage!

Also nochmal zum Artikel Soft - PWM:
den habe ich gelesen und auch - allerdings nur Variante 2 - umgesetzt. 
Hier geht es ja aber erstmal nur um die PWM - und nicht um das Fading an 
sich, richtig? Denn wie die Soft - PWM funktioniert ist ja klar, aber 
das ist ja gewissermaßen ein abgeschlossenes Modul für sich. Und das 
wollte ich dann mit dem Fader über die entsprechenden Werte füttern. Mit 
dieser Überlegung kann ich ja ran gehen, nehme ich an, oder?

Und nun zum Fading:
Da gibt es auch einen Artikel, der läuft auch schon auf meinem µc, 
zusammen mit der Soft - PWM 2. Variante. Allerdings läuft es noch mit 
Wartezeiten zwischen Stufenwechsel, die müssen aber raus.
Hier kommt nun der Timer ins Spiel, welcher mir eine Zeitbasis vorgibt, 
womit ich die Warteschleifen ersetzen kann. Das an sich geht auch noch 
klar.

Jetzt mein aktuelles Verständnisproblem:

Wo schaue ich, ob meine Wartezeit um ist, denn wenn das der Fall ist 
müsste ja nun eine neue Lichtstufe geladen werden. Erfolgt das Laden 
dann nun im Hauptprogramm oder in der ISR. Ich wöllte das ja eigentlich 
nicht in die ISR haben, das wird dann sicherlich etwas groß, oder?

Naja irgendwie habe ich zur Zeit eine Blockade, ich hoffe ihr könnt mir 
die aus dem Kopf schlagen, bis jetzt ist sie leider noch nicht so 
richtig verschwunden.

LG

Edit:
Nochetwas zu Karl-Heinz seiner Aussage:
Karl Heinz Buchegger schrieb:

> Tja. UNd der Rest ist dann ein Lichtprogramm, welches in einer Tabelle
> steckt, und in dem verzeichnet ist, welche Helligkeitsstufe ein Kanal
> haben soll, wie lange diese Stufe einzuhalten ist und wie lange das
> Fading auf die nächste Stufe dauern soll.

Wie Lange die Stufe einzuhalten ist und wie lange das Fading zur 
nächsten Sufe dauern soll ist doch eigentlich das Gleiche, oder irre ich 
mich? Weil man kann ja schlecht zwischen 2 Helligkeitsstufen faden, das 
ist ja schon die kleinste Einheit, die einfach umgeschaltet wird, oder 
haben wir unterschiedliche Auffassungen von Helligkeitsstufen?

von Karl H. (kbuchegg)


Lesenswert?

Martin K. schrieb:

> den habe ich gelesen und auch - allerdings nur Variante 2 - umgesetzt.
> Hier geht es ja aber erstmal nur um die PWM - und nicht um das Fading an
> sich, richtig? Denn wie die Soft - PWM funktioniert ist ja klar, aber
> das ist ja gewissermaßen ein abgeschlossenes Modul für sich. Und das
> wollte ich dann mit dem Fader über die entsprechenden Werte füttern. Mit
> dieser Überlegung kann ich ja ran gehen, nehme ich an, oder?

Richtig.
Die PWM-Sache ist eine Sache für sich. Sozusagen das ausführende Organ. 
Die andere Frage ist: wo kriege ich eigentlich die 'Befehle' für dieses 
ausführende Organ her - die Ablaufsteuerung, die die gewünschten 
Lichtänderungen realisiert und in Form von (wie auch immer) Daten der 
PWM Stufe zur Verfügung stellt.


> Jetzt mein aktuelles Verständnisproblem:
>
> Wo schaue ich, ob meine Wartezeit um ist,

Deine Timer-ISR kannst du dir wie eine Uhr vorstellen. In regelmässigen 
Zeitabständen hast du die Möglichkeit etwas zu tun.

reales Leben: Wenn du eine Uhr mit Sekundenzeiger hast (regelmässiges 
Ereignis mit bekannter Zeitdauer zwischen den Ereignissen) und du sollst 
2 Lampen bedienen, die eine soll 4 Sekunden leuchten und die andere 7, 
wie machst du das mit dieser Uhr?
(und von mir aus gibt es noch einen Kumpel, der dir regelmässig einen 
Tritt gibt, damit du auf die Uhr schaust)

> müsste ja nun eine neue Lichtstufe geladen werden. Erfolgt das Laden
> dann nun im Hauptprogramm oder in der ISR. Ich wöllte das ja eigentlich
> nicht in die ISR haben, das wird dann sicherlich etwas groß, oder?

'Groß' ist ein relativer Begriff.
Wenn du heftige Berechnungen involviert sind, dann haben die in der ISR 
nichts verloren. Wenn es aber nur darum geht ein paar Zahlenwerte zu 
inkrementieren (oder dekrementieren) und ein paar Werte von A nach B 
umzukopieren, dann ist das auch in einer ISR kein Problem.

> Naja irgendwie habe ich zur Zeit eine Blockade,

Ich hab so das Gefühl, dein Denken kreist um diese eine ISR, die für PWM 
benutzt wird. Du hast auch noch andere Timer, die auch eine ISR haben 
können! Stellst du dir den so ein, dass seine ISR beispielsweise alle 
0.1 Sekunden ausgeführt wird (und die dann nachsieht ob ein bestimmtes 
Licht schon seine Leuchtdauer erreicht hat und auf einen anderen PWM 
Wert gesetzt werden muss), dann ist das wohl kurz genug, so dass du jede 
für dich relavante Lichtsteuerung erreichen kannst. 0.1 Sekunden sind 
für dich als Mensch kurz. Für einen µC ist es aber eine halbe Ewigkeit. 
Da kann er dazwischen noch ein paar 'teuflisch schwierige quadratische 
Gleichungen lösen' (tm: Douglas Adams)


> Wie Lange die Stufe einzuhalten ist und wie lange das Fading zur
> nächsten Sufe dauern soll ist doch eigentlich das Gleiche, oder irre ich
> mich?

Das kann #ich# nicht sagen. Das musst du entscheiden. Du bist der 
Programmierer und du triffst die Designentscheidungen. Aber im 
Allgemeinen würde ich das nicht für gleich halten. Wenn das Licht von 
halber Helligkeit in 2 Minuten auf voll gehen soll und dann 30 Minuten 
voll halten soll ehe es dann in 8 Minuten auf 1/10 Helligkeit 
runterfadet, dann sind da 2 verschiedene Vorgänge involviert. Das eine 
mal wird eine Helligkeit gehalten, das andere mal wird sie zeitlich 
verändert. Gut, man kann natürlich den Mittelteil auch als "In 30 
Minuten von 'voll' auf 'voll' faden" auffassen. So gesehen hast du recht 
und das eine ist ein Sonderfall vom anderen.

> Weil man kann ja schlecht zwischen 2 Helligkeitsstufen faden, das
> ist ja schon die kleinste Einheit, die einfach umgeschaltet wird, oder
> haben wir unterschiedliche Auffassungen von Helligkeitsstufen?

Ich denke der Auffassungsunterschied besteht darin, dass du dich (als 
Benutzer) um Einzellichtstufen kümmern willst, was mich nun gar nicht 
interesiert. Ich als Benutzer würde es vorziehen, wenn ich dem Rechner 
sagen könnte: In 2 Minuten 15 Sekunden von Lichtstufe 10 auf Lichtstufe 
189 faden. Und wie das dann in Einzelschritten ausgeführt wird (welche 
Zwischenstufe zu jedem 0.1 Sekunden Zeitpunkt eingestellt werden muss), 
ist Sache des Rechners. Das ist ein bischen Rechnerei um aus der vom 
Benutzer vorgegebenen Angabe die Werte für die jetzt gerade aktuellen 
0.1 Sekunden auszurechnen. Und wenn Computer eines können, dann ist das 
ja wohl rechnen.

von Martin K. (spyro07)


Lesenswert?

Also vielen Dank das du die so viel Zeit nimmst :)

So gut, das mit der Soft - PWM klappt also so wie ich mir das vorstelle 
- ein Modul für sich was jetzt erstmal abgeschlossen ist und dann die 
eigentliche Arbeit macht.

Einen zweiten Timer habe ich auch schon, der läuft unabhängig von der 
Soft - PWM. Gedacht hatte ich mir das auch schon so, wie du das sagtest. 
Den relativ langsam laufen lassen, und dann kann das Laden und kurze 
Vergleichen auch in der ISR pasieren.

Mein Problem:

Du sagtest ja selbst, der Timer gibt sozusagen die Untergrenze für das 
Fading vor. D.h. es muss jede Helligkeitsstufe (angenommen mal von 0 bis 
255) mindestens eine Timer - Periode anbleiben, da ja in der ISR 
umgeschaltet wird.
Wenn der Timer nun angenommen 0.1s Interrupts liefert leuchtet also jede 
Stufe mind. 0,1s, d.h. bei angenommenen 255 Stufen dauer ein Fading (von 
0% auf 100%) MINDESTENS 0,1*255 = 25,5s. Das ist mir allerdings zu 
langsam um eine große Vielzahl von Lichtprogrammen einsetzen zu können. 
Gut jetzt kommt sicherlich der Einwand du hast keine 255 Stufen, aber 
selbst bei 32 Stufen dauert es noch 3,2s. Und die 32 Stufen sind mir für 
Dimmen über einer Sekunde eigentlich zu wenig.

Ok, ich habe mal gerechnet bei 10ms Timerperiode sieht es schon etwas 
anders aus.

Also nochmal zum Grundsatz:
Ich gehe vom Prinzipdenken in die richtige Richtung, wenn ich das 
komplette Einstellen der 4 Kanäle (RGBW), d.h. überprüfen ob Wartezeit 
erreicht ist, laden einer neuen Stufe und an PWM schicken, sowie laden 
der neuen Wartezeit für die Stufe alles in die ISR packe?

von Karl H. (kbuchegg)


Lesenswert?

Martin K. schrieb:

> Wenn der Timer nun angenommen 0.1s Interrupts liefert leuchtet also jede
> Stufe mind. 0,1s,

soweit richtig.

> d.h. bei angenommenen 255 Stufen dauer ein Fading (von
> 0% auf 100%) MINDESTENS 0,1*255 = 25,5s.

Du musst ja nicht jede Zwischenstufe einstellen!

 0
10
20
30
40
50

in 0.5 Sekunden von 0 auf 50 gefadet.

(Genau darum gings ja bei den ganzen Andeutung: Das Ausrechnen, welche 
Lichtstufe zu einem bestimmten Zeitpunkt an sein soll, damit es sich in 
Summe ausgeht, von 0 auf 255 in 3.8 Sekunden zu faden). Kein Mensch 
schreibt dir vor, dass du jede Zwischenstufe mitnehmen musst!

von Karl H. (kbuchegg)


Lesenswert?

An deiner Stelle würde ich mich allerdings am Anfang noch gar nicht auf
das Faden konzentrieren, sondern erst mal einfach nur eine zeitliche
Ablaufsteuerung mit fixen Helligkeitswerten realisieren. Also so was

Kanal 1
Schritt     Dauer[s]     Helligkeit
  0          10             5
  1          50            58
  2         368           250
  3          12            80

Kanal 2
Schritt     Dauer[s]     Helligkeit
  0          80            40
  1          12           213
  2           2             5
  3          10             0
  4           7             5

Kanal 3
Schritt     Dauer[s]     Helligkeit
  0          123            0
  1            2          255
  2            1            8
  ...


Also einfach nur Tabellen, in denen verzeichnet ist, welche Lichtstufe
wie lange zu halten ist. Und dann mal mit einer Timer-ISR diese Tabellen
abarbeiten. Auch da gibt es schon so manche Software-Design Entscheidung
zu treffen und Erfahrung zu sammeln.

Und dann willst du ja auch noch einen Satz derartiger Tabellen (oder ist
es nur 1 Tabelle? Du entscheidest) unter einem 'Programm' zur Verfügung
haben. etc. etc. Da gibt es schon noch einige Dinge, die bedacht sein
wollen.

von Martin K. (spyro07)


Lesenswert?

Ich denke wir reden jetzt vom gleichen und due meinst genau das wie ich 
es mir vorstelle.

Der Tip mit den festen Leuchtschritten ist erstmal gut, da kann ich die 
ganze Sache mal ausprobieren. Wie gesagt, die Timer ISR muss ja 
möglichst universell sein, um jedes Lichtprogramm später mal abarbeiten 
zu können.

Da werde ich mich mal an die ISR setzen, aber nochmal zur Absicherung:

Ich bin auf dem richtigen Weg, wen ich die ganze Sache mit Stufe laden, 
Zeit für Stufe laden und überprüfen in die ISR stecke?

Nicht das ich mich dann übernehme und die ISR ständig aufgerufen wird 
oder sich vielleicht gegenseitig sogar verschluckt. Ins Menü muss dann 
ja auch noch ab und zu geschaut werden, ob vllt. ein anderes Programm 
inzwischen eingestellt ist. Aber ich denke das kommt hin.

Aber naja im Hintergrund bahnt sich mir dann ein neues Problem an ... 
die Tabellen für die Lichtprogramme ... ich glaube damit ist schnell der 
Flash vollgestpoft bis oben hin, aber naja das ist erstmal ein Problem 
was dann hinten ansteht.

Vielen Dank erstmal, mal schauen wie schnell es mit der ISR klappt!

von Karl H. (kbuchegg)


Lesenswert?

Martin K. schrieb:

> Ich bin auf dem richtigen Weg, wen ich die ganze Sache mit Stufe laden,
> Zeit für Stufe laden und überprüfen in die ISR stecke?

Ich hab nochmal drüber nachgedacht und bin eigentlich zum Schluss 
gekommen, dass ich das nicht tun würde. Ich würde mir in der ISR ein 
Jobflag setzen und dass dann in der Hauptschleife auswerten.

Der Grund:
Spätestens beim übergang von einer Fading Fahrt zur nächsten sind ein 
paar Berechnungen notwendig. Ist nicht so wild, aber doch. Und die will 
ich dort nicht haben. Warum? Weil in der Zeit, in der eine ISR läuft 
keine andere ISR laufen kann. Du hast aber im System eine andere ISR, 
die eminent wichtig ist: die ISR, die die PWM realisiert. Und #die# darf 
auf keinen Fall ins Stocken kommen, denn das würde bedeuten, dass die 
Lampen in der Helligkeit flackern. Wird wahrscheinlich nicht viel sein, 
aber mit etwas Pech würde man es bemerken. Und das darf auf keinen Fall 
sein. Da nehm ich lieber in Kauf, dass eine neue Lichtstufe ein paar µs 
zu spät gesetzt wird, denn das merkt kein Mensch.

> Aber naja im Hintergrund bahnt sich mir dann ein neues Problem an ...
> die Tabellen für die Lichtprogramme ... ich glaube damit ist schnell der
> Flash vollgestpoft bis oben hin,

das kann leicht sein.
Daher ja auch: eine kompakte Beschreibung.
Es ist sinnlos, wenn du das Fading in den Tabellen bis auf den 
Einzelschritt auflöst, das müllt dir nur den Speicher zu. In den 
Tabellen brauchst du alle Daten, die dir erlauben die relevanten Werte 
auszurechnen, zu dem Zeitpunkt an dem dieser Fading Schritt gemacht 
wird. Du brauchst die Werte vorher nicht und du brauchst sie nachher 
nicht. Damit müssen die auch nicht in den Tabellen dauerhaft abgelegt 
sein.

von Frank M. (ukw) (Moderator) Benutzerseite


Lesenswert?

Karl Heinz Buchegger schrieb:

> Ich hab nochmal drüber nachgedacht und bin eigentlich zum Schluss
> gekommen, dass ich das nicht tun würde. Ich würde mir in der ISR ein
> Jobflag setzen und dass dann in der Hauptschleife auswerten.

Das kann ich von der Praxis her absolut bestätigen. Ich hatte bei einer 
ähnlichen Entwicklung

  Beitrag "Equinox-Uhr mit 60 ATtinys"

das Fading zunächst auch in der ISR. Teilweise dauerte die Berechnung 
der Schrittweiten (bei variabler Fadingzeit) zu lange. Durch Setzen des 
Flags und die Verlagerung des eigentlichen Fadings in die Hauptschleife 
hatte sich das Problem dann erledigt.

von Martin K. (spyro07)


Lesenswert?

Ok, also nochmal eine Frage, zur ISR:

Die Berechnungen für die PWM-Stufe und das Setzen der Stufen in der PWM 
nehme ich ins Hauptprogramm und in der ISR schaue ich quasi nur, ob die 
Zeit für die jeweiligen Kanäle und Helligkeitsstufen erreicht wurden, 
wenn es der Fall ist, dann Flag setzen. Im HP schaue ich dann ob Flag 
gesetzt und abhängig davon wird dann die neue Stufe eingestellt und an 
die PWM übermittelt. So müsste es dann klappen, oder?

von Karl H. (kbuchegg)


Lesenswert?

Martin K. schrieb:
> Ok, also nochmal eine Frage, zur ISR:
>
> Die Berechnungen für die PWM-Stufe und das Setzen der Stufen in der PWM
> nehme ich ins Hauptprogramm und in der ISR schaue ich quasi nur, ob die
> Zeit für die jeweiligen Kanäle und Helligkeitsstufen erreicht wurden,

noch nicht mal das.

In der ISR setzt du einfach nur ein Flag: Es ist wieder mal soweit, 0.1 
Sekunden sind vergangen.

Und in der Hauptschleife tust du, was immer es alle 0.1 Sekunden zu tun 
gibt. Zb testen ob eine Lampe eine andere Einstellung in der PWM 
braucht.

Diese ISR fungiert rein nur als Zeitgeber, der in ...
1
ISR( ... )
2
{
3
  doWork = TRUE;
4
}
5
6
int main()
7
{
8
  ...
9
10
  while( 1 ) {
11
12
    if( doWork ) {
13
      doWork = FALSE;
14
15
      ....
16
    }
17
18
  }
19
}

... die regelmässige Verzweigung in den Arbeitsteil anstösst.

von Martin K. (spyro07)


Lesenswert?

Karl Heinz Buchegger schrieb:
> Martin K. schrieb:
>> Ok, also nochmal eine Frage, zur ISR:
>>
>> Die Berechnungen für die PWM-Stufe und das Setzen der Stufen in der PWM
>> nehme ich ins Hauptprogramm und in der ISR schaue ich quasi nur, ob die
>> Zeit für die jeweiligen Kanäle und Helligkeitsstufen erreicht wurden,
>
> noch nicht mal das.
>
> In der ISR setzt du einfach nur ein Flag: Es ist wieder mal soweit, 0.1
> Sekunden sind vergangen.
>
> Und in der Hauptschleife tust du, was immer es alle 0.1 Sekunden zu tun
> gibt. Zb testen ob eine Lampe eine andere Einstellung in der PWM
> braucht.
>
> Diese ISR fungiert rein nur als Zeitgeber, der in ...
>
>
1
> ISR( ... )
2
> {
3
>   doWork = TRUE;
4
> }
5
> 
6
> int main()
7
> {
8
>   ...
9
> 
10
>   while( 1 ) {
11
> 
12
>     if( doWork ) {
13
>       doWork = FALSE;
14
> 
15
>       ....
16
>     }
17
> 
18
>   }
19
> }
20
>
>
> ... die regelmässige Verzweigung in den Arbeitsteil anstösst.

Also ehrlich gesagt, das war ganz am Anfang meine Idee. Die hatte ich 
aber aus einem Grund verworfen:

Denn ich war dann wieder dabei gelangt, das er gewissermaßen in einer 
Endlosschleife hängt, halt nur nicht zählt sondern wartet, das sich der 
Timer ausgezählt hat. Aber das kann ich ja eigentlich ganz intelligent 
überspringen, wie ich gerade sehe. Und dann gehts nach dem if einfach 
weiter mit Menu - Abfrage und so weiter - stimmt eigentlich ganz 
logisch.

Ich glaube jetzt ist die Blockade von gestern endlich gelöst! Mal sehen 
ob ich dann über dem Proggen nochmal drauf stoße, oder ob ich jetzt so 
hinkomme.

Vielen Dank erstmal!!!

von Karl H. (kbuchegg)


Lesenswert?

Martin K. schrieb:

> Also ehrlich gesagt, das war ganz am Anfang meine Idee. Die hatte ich
> aber aus einem Grund verworfen:
>
> Denn ich war dann wieder dabei gelangt, das er gewissermaßen in einer
> Endlosschleife hängt,

das tut ein µC sowieso immer.
(ausser er ist im Sleep)

> halt nur nicht zählt sondern wartet, das sich der
> Timer ausgezählt hat. Aber das kann ich ja eigentlich ganz intelligent
> überspringen, wie ich gerade sehe. Und dann gehts nach dem if einfach
> weiter mit Menu - Abfrage und so weiter - stimmt eigentlich ganz
> logisch.


Genau.,
Der springende Punkt ist die Denkweise.

Betrachte das Flag als Benachrichtigung: Es ist ein Ereignis 
eingetreten.

Der µC testet in seiner Hauptschleife ständig alle möglichen 
Ereignisuaslöser durch und bearbeitet das Ereignis.

So ein Ereignis kann sein
   Timer hat ausgelöst (weil eine Zeitdauer vergangen ist)
   Taste wurde gedrückt
   Lichtschranke hat ausgelöst
   Endschalter ist betätigt
   ...

die Hauptschleife testet einfach nur der Reihe nach die möglichen 
Ereignisse, ob sie eingetreten sind und reagiert darauf. Es ist immer 
das gleiche Prinzip.

Du kannst dir auch selbst ein 'künstliches Ereignis' definieren, um eine 
längere Berechnung in mehrere Teile zu zerteilen, die dann in mehreren 
Durchgängen durch die Hauptschleife abgearbeitet werden. Das macht man 
zb dann, wenn man sicherstellen möchte, dass während dieses längeren 
Teils auch die anderen Ereignisse eine Chance haben kurz dazwischen zu 
funken.

von Frank M. (ukw) (Moderator) Benutzerseite


Lesenswert?

Martin K. schrieb:
> Ich glaube jetzt ist die Blockade von gestern endlich gelöst! Mal sehen
> ob ich dann über dem Proggen nochmal drauf stoße, oder ob ich jetzt so
> hinkomme.

Denke daran, doWork als volatile zu definieren. Sonst wunderst Du Dich, 
warum nichts passieren wird ;-)

von Martin K. (spyro07)


Lesenswert?

Hey, ich glaube jetzt bin ich wirklich wieder über die Klippe 
gesprungen. JEtzt ist mir das irgendwie alles wieder klarer und 
eigentlich auch selbstverständlich. Das kommt halt davon, wenn man über 
ein Jahr nur noch normalen PC programmieren musste und wieder auf µc 
umsteigt. Aber ich denke es ist wieder da, die Fading - Funktion aus dem 
Artikel habe ich nun so auf den Timer umgebaut, ohne Warteschleifen.
So nun muss ich das nur noch universeller gestalten und dann kann es ja 
schon bald mit Lichtprogrammen losgehen.

Ich habe sogar gesehen, das es so auch problemlos möglich ist, einfach 
die Lichtprogramme direkt in C zu proggen, mal sehen ob das Sparsamer 
ist als Tabellen, da kann der µc ja selber sich was ausrechnen. Aber wie 
gesagt, da muss ich erstmal schauen ...

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.