Ich grüße euch,
Was ich vorhabe:
Ich möche eine LED (oder später mehrere) faden und das mit einem 8051,
genauer mit dem Atmel 89C51AC3.
*Was ich mir dabei gedacht habe:*
Ich habe mir gedacht in einem Interrupt, der alle x ms (mit Schleife
dann ca. 100 Hz) ausgelöst wird, eine Tabelle abzuarbeiten in der steht,
wie oft der Interrupt ausgelöst wird, bevor die LED getoggelt wird.
Mir ist auch klar dass diese PWM sehr schnell geht.
Kann man wohl kaum was sehen. Wenn ich jetzt aber meine 100 Hz PWM
beibehalten möchte, muss ich ein Feld mit 500 Elemente anlegen um eine
*5 sec. lange Fading-Phase* hinzubekommen (siehe meine Berechnung am
Schluss).
Die Beiträge zu http://www.mikrocontroller.net/articles/LED-Fading und
http://www.mikrocontroller.net/articles/Soft-PWM habe ich gelesen und
noch vieles anderes. Allerdings unterscheidet sich C bei AVRs von C bei
8051 doch ziehmlich stark und von AVRs hab ich wenig Ahnung, naja
eigentlich gar keine (will mich an denen auch irgendwann mal versuchen).
Resultat ist jedenfalls, dass ich mit den Beispielen nur sehr wenig
Anfangen kann.
Jetzt gibt es hier sicher eine deutlich einfachere Methode, vorallem
ohne große Tabellen. Hardware PWM habe ich noch nie versucht, würde
jedoch gerne beides testen wollen, vorallem jedoch Soft-PWM, wenn es
darum geht mehrere LEDs zu steuern, oder würdet ihr da einfach einen
Multiplexer empfehlen?
*Was ich mir noch dabei gedacht habe:*
In meinem Code wird die LED-Auszeit verkürzt, während die An-Zeiten
länger werden (Inhalt Tabelle, exponentiell) um ungefähr die 100 Hz zu
halten.
Somit wäre dann ja auch gegeben, dass die LED wirklich ganz an und ganz
ausgehen kann.
LED = 1 -> LED aus
Timer: 16 Bit
Ich weiß de Code passt nicht, auch nicht zu meinen Angaben (erster
Versuch, danach nur noch auf Papier getüftelt), aber es geht mir nur mal
um den Prinzipaufbau, dass ich das auch verstehe.
1 | void t_int (void) interrupt 1
|
2 | {
|
3 | TF0=0;
|
4 |
|
5 | if(led == 0)
|
6 | {
|
7 | if(i == pwm_table[32-count])
|
8 | {
|
9 | i = 0;
|
10 | led = 1;
|
11 | //++count;
|
12 | if(count==32) count=0;
|
13 | }
|
14 | }
|
15 | else
|
16 | {
|
17 | if(i == pwm_table[count])
|
18 | {
|
19 | i = 0;
|
20 | led = 0;
|
21 | ++count;
|
22 | }
|
23 | }
|
24 | ++i;
|
25 | TR0=1;
|
26 | }
|
Wie ich darauf komme?
ich habe mir eine Formel zusammengebastelt:
hergeleitet aus:
f_osc in MHz
f_PWM in Hz
PWM_soll_zeit in ms
x = Größe der Tabelle, um die gewünschte Zeit zu erreichen.
dabei ist bei mir:
timervorladung = 246
PWM_soll_zeit = 5000 ms
teiler = 6, da X2 Mode
f_osc = 29,4912 MHz
f_PWM = 100 Hz
Vielen Dank für die Hilfe!