Ok, wie bereits per PN beschrieben, hast Du zwei wesentliche Baustellen:
Die Schrittfrequenz des Timers hatte ich oben bereits bestimmt, der Teimer läuft im phasenkorrekten PWM, also im dual Slope. Er läuft zwischen 0 und 255 hin und her, erreicht alle 510 Schritte die Null, wo das Überlauf-Flag gesetzt wird.125000Hz/510≈245Hz PWM-Frequenz, das sind 4,08ms pro Überlauf.
Deine Flacker-Effekt-Programmschleife war diese:
CodeBox BascomAVR
Kern des Flackerns ist unter anderem, daß die Dauer gleicher Intensität einer LED der Summe zweier Zufallszahlen (je 0..10) multipliziert mit 25 in Millisekunden ist. Außerdem sind beide LEDs um eine dieser Zeiten verschoben. Die 25 werden durch 6 Timerüberläufe realisiert, das entspräche 24,48ms (hinreichend genau, denk ich).
CodeBox BascomAVR
Wäre jetzt mal locker aus dem Handgelenk geschüttelt, und nicht weiter getestet. Sollte eigentlich dauerhaft genau so flackern. Kannst Du das mal testen?
Edit @Dirk : Schau mal Zeile 14... die vielen Sterne im Kommentar werden durch irgendwelche "B"-Tags ersetzt... bekommst Du das hin?
(eigentlich stand da
- Durch Stop Timer wird der Timer nur angehalten, aber die LEDs nicht zwingend abgeschaltet. Dazu wäre der Compare Output Mode umzuschalten.
- Du hast versucht, zwei für sich funktionierende Teilprogramme zusammenzufassen - beide verwendeten aber Warteschleifen. Das beeinträchtigt sich jetzt gegenseitig.
Die Schrittfrequenz des Timers hatte ich oben bereits bestimmt, der Teimer läuft im phasenkorrekten PWM, also im dual Slope. Er läuft zwischen 0 und 255 hin und her, erreicht alle 510 Schritte die Null, wo das Überlauf-Flag gesetzt wird.125000Hz/510≈245Hz PWM-Frequenz, das sind 4,08ms pro Überlauf.
Deine Flacker-Effekt-Programmschleife war diese:
CodeBox BascomAVR
Do Fla = Rnd(200) Fla = Fla + 55 Pwm0a = Fla Waitms Pause Pwm0b = 255 - Fla Pause = Rnd(10) Pause = Pause * 25 Waitms Pause LoopVersuchen wir das mal ohne wait/mithilfe des Timerüberlaufs möglichst genau so nachzubauen (egal, obs genau so sein muß oder nicht).
Kern des Flackerns ist unter anderem, daß die Dauer gleicher Intensität einer LED der Summe zweier Zufallszahlen (je 0..10) multipliziert mit 25 in Millisekunden ist. Außerdem sind beide LEDs um eine dieser Zeiten verschoben. Die 25 werden durch 6 Timerüberläufe realisiert, das entspräche 24,48ms (hinreichend genau, denk ich).
CodeBox BascomAVR
$regfile = "m8adef.dat" $crystal = 8000000 $hwstack = 32 $swstack = 32 $framesize = 64 Config Timer1 = Pwm , Prescale = 64 , Compare_a_pwm = Clear_down , Compare_b_pwm = Clear_down Dim Fla As Byte Dim Pause As Byte Dim Pausex2 As Byte Dim Tov1cnt As Byte 'Programmschleife******************* Do If Tifr.tov1 = 1 Then 'Auf Überlauf prüfen Set Tifr.tov1 'Überlaufflag zurücksetzen Incr Tov1cnt 'überlaufzähler inkrementieren If Pause = Tov1cnt Then 'entspricht dem 2ten "waitms pause" Fla = Rnd(200) Fla = Fla + 55 Pwm1a = Fla End If If Pausex2 = Tov1cnt Then 'entspricht dem ersten "waitms pause" Pwm1b = 255 - Fla Pause = Rnd(10) Pause = Pause * 6 Pausex2 = Pause Shift Pausex2 , Left 'pausex2=pause*2 Tov1cnt = 0 End If End If Loop
Wäre jetzt mal locker aus dem Handgelenk geschüttelt, und nicht weiter getestet. Sollte eigentlich dauerhaft genau so flackern. Kannst Du das mal testen?
Edit @Dirk : Schau mal Zeile 14... die vielen Sterne im Kommentar werden durch irgendwelche "B"-Tags ersetzt... bekommst Du das hin?
(eigentlich stand da
'Programmschleife*******************
)
Zuletzt bearbeitet von einem Moderator: