Hi,
ich habe folgendes Problem. Ziel ist es, eine LED-Fading zu realisieren.
Klar habe ich die Artikel dazu gelesen. Mein Code führt dazu das die LED
ehr unkoordiniert flackert.
Ich habe es auch mit for-Schleife in der loop-Funktion probiert, was
ebenso nicht funktioniert. Was allerdings funktioniert, wenn ich das
Fading manuell mache, also wie folgend.
1
voidloop(void)
2
{
3
uint16_tu16Delay=400;
4
5
OCR1A=pwmtable_16[1];
6
delay(u16Delay);
7
OCR1A=pwmtable_16[2];
8
delay(u16Delay);
9
OCR1A=pwmtable_16[3];
10
delay(u16Delay);
11
OCR1A=pwmtable_16[4];
12
13
// Und so weiter
14
}
Für mich ist das Verhalten rätselhaft. Als wenn die loop nicht korrekt
Kompiliert wird.
@Tim S. (timer)
>ich habe folgendes Problem. Ziel ist es, eine LED-Fading zu realisieren.>Klar habe ich die Artikel dazu gelesen. Mein Code führt dazu das die LED>ehr unkoordiniert flackert.
Hmm. Was hindert dich daran, einfach mal de Originalquelltext
unverändert auf deinen AVR zu laden? Das minimiert die Fehlerquellen.
> TIMSK1 = ((1<<OCIE1A) | (1<<TOIE1));> TCCR1B |= (1<<CS10);
Wo wird OCRx freigeschaltet? COMxy Bits.
>ISR(TIMER1_COMPA_vect)>{> LED_PORT |= LED; // switch led off>}
Das LED-Fading im Artikel benutzt die Hardware-PWM, was vor allem bei 16
Bit PWM auch gar nicht ander geht. Du versuchst hier ein Software-PWM.
>Ich habe es auch mit for-Schleife in der loop-Funktion probiert, was>ebenso nicht funktioniert. Was allerdings funktioniert, wenn ich das>Fading manuell mache, also wie folgend.
Glaub ich nicht so recht, das ist eher ein Dreckeffekt, der dir ein
funktionierendes Programm vorgaukelt.
>Für mich ist das Verhalten rätselhaft. Als wenn die loop nicht korrekt>Kompiliert wird.
;-)
Falk B. schrieb:>> Hmm. Was hindert dich daran, einfach mal de Originalquelltext> unverändert auf deinen AVR zu laden? Das minimiert die Fehlerquellen.
Weil ich Soft-PWM benötige, der Fading-Artikel verwendet Hardware-PWM.
Der Code aus dem Soft-PWM Artikel realisiert PWM auf nen ganzen Port,
ich brauche ihn für einen speziellen Pin.
> Wo wird OCRx freigeschaltet? COMxy Bits.
Wegen Soft-PWM brauche ich die Pins nicht.
> Das LED-Fading im Artikel benutzt die Hardware-PWM, was vor allem bei 16> Bit PWM auch gar nicht ander geht. Du versuchst hier ein Software-PWM.
Ja, das versuche ich.
> Glaub ich nicht so recht, das ist eher ein Dreckeffekt, der dir ein> funktionierendes Programm vorgaukelt.
Dreckeffekt? Warum sollte es nicht funktionieren?
@ Tim S. (timer)
>Weil ich Soft-PWM benötige, der Fading-Artikel verwendet Hardware-PWM.>Der Code aus dem Soft-PWM Artikel realisiert PWM auf nen ganzen Port,>ich brauche ihn für einen speziellen Pin.
Leg lieber einen Draht auf deiner Platine zum passenden PWM-Pin, das
geht deutlich schneller und ist einfacher.
>> Das LED-Fading im Artikel benutzt die Hardware-PWM, was vor allem bei 16>> Bit PWM auch gar nicht ander geht. Du versuchst hier ein Software-PWM.>Ja, das versuche ich.
Hast du schon mal einen Gedanken daran verschwendet, warm man in
bestimmten Situationen KEIN Software-PWM verwenden will/kann. Und wo die
Grenzen von Soft-PWM liegen?
Wenn ich den Code richtig verstehe, wird die Variabel u8I auf 0 gesetzt
und danach der Wert 1 (u8I + 1, oder Wert 0 und u8I um Eins erhöht) des
Array in das Match-A-Register des Timer 1 geladen.
Und Das immer wieder - da ich das '=0' so interpretiere, daß der
Variabel JEDES MAL der Wert 0 zugeteilt wird.
Wenn NICHT, also diese Zuweisung nur 1x ausgeführt wird - gehört die
Zeile eher in den Init-Bereich.
MfG
Falk B. schrieb:> Leg lieber einen Draht auf deiner Platine zum passenden PWM-Pin, das> geht deutlich schneller und ist einfacher.
Die sind alle schon belegt.
> Hast du schon mal einen Gedanken daran verschwendet, warm man in> bestimmten Situationen KEIN Software-PWM verwenden will/kann. Und wo die> Grenzen von Soft-PWM liegen?
Verschwendet ist hier vielleicht der richtige Ausdruck. Eine LED zu
dimmen sollte wohl kein Problem darstellen. Zu mal es ja bei manueller
Programmierung funktioniert.
Patrick J. schrieb:> Wenn ich den Code richtig verstehe, wird die Variabel u8I auf 0 gesetzt> und danach der Wert 1 (u8I + 1, oder Wert 0 und u8I um Eins erhöht) des> Array in das Match-A-Register des Timer 1 geladen.> Und Das immer wieder - da ich das '=0' so interpretiere, daß der> Variabel JEDES MAL der Wert 0 zugeteilt wird.>> Wenn NICHT, also diese Zuweisung nur 1x ausgeführt wird - gehört die> Zeile eher in den Init-Bereich.>> MfG
Die Variable ist statisch, dass heißt, sie wird nur einmalig
initialisiert. Ich kann sie natürlich auch global deklarieren und dann
im setup-Bereich initialisieren. Kommt aber auf's gleiche heraus.
@ Tim S. (timer)
>Verschwendet ist hier vielleicht der richtige Ausdruck. Eine LED zu>dimmen sollte wohl kein Problem darstellen. Zu mal es ja bei manueller>Programmierung funktioniert.
Schon mal nachgerechnet, wie oft deine beiden ISRs aufgerufen werden?
Patrick J. schrieb:> Wenn NICHT, also diese Zuweisung nur 1x ausgeführt wird - gehört die> Zeile eher in den Init-Bereich.
Das ist keine Zuweisung, sondern eine Initialisierung. Und da die
Variable static ist, wird sie nur einmal erzeugt und damit auch nur
einmal initialisiert.