Hallo,
ich versuche gerade, LEDs per BCM (Binary Code Modulation) anzusteuern.
Das klappt soweit auch, allerdings habe ich hier einen komischen Effekt,
den ich mir nicht erklären kann.
Für die BCM nutze ich den Timer0 im CTC-Modus, als Prescaler habe ich 64
eingestellt. Das Problem ist, dass bei diesem Prescaler-Wert die LEDs
für den Wert OCR0A = 128 fast aus sind. Im Prinzip verhält sich der
Timer so, als wäre er nur 7 Bit breit, d.h. OCR0A = 128 ~ 1. Ändere ich
den Prescaler nun auf 8, so erhalte ich bei OCR0A = 128 die gewünschte
Helligkeit, dafür flackern die LEDs aber, da nun die ISR viel zu häufig
feuert und das Fading nicht hinterherkommt. Im Prinzip kann ich auch mit
Werten von 0 bis 127 gut leben, ich würde aber gerne wissen, woher
dieses Verhalten rührt. Kann mir da jemand hilfreich in die Seite
treten? Mein Programm, wie es aktuell zum testen aussieht ist angehängt.
Dort ist der Teil zum Faden aktuell auskommentiert und es werden nur
fixe Helligkeitswerte verwendet, wobei für die Werte 128 die LED nur
schwach glimmt.
Viele Grüße,
Daniel
Hi,
also auf die Schnelle finde ich keinen Fehler.
Hast Du das Programm mal im Debugger/Simulator laufen lassen? Wie ist
das Verhalten nach dem Setzen der Ausgabedaten für Bit 7 (128)?
Eigentlich sollte da ja gaaanz lange nichts passieren außer dem
while(1).
Ciao...
Markus
Hallo,
sorry für die späte Antwort, aber Weihnachten und so ;) Ich habe das
Ganze mal im Simulator laufen lassen, das verhalten ist dort eigentlich
wie gewünscht. Beim letzten Zeitslot (128) wird der Wert 3 an den HC595
übertragen und anschließend OCR0A auf 128 gesetzt. Demnach müssten also
für 8192 Takte (128 * 64 Prescaler) die ersten beiden LEDs leuchten. Bei
den übrigen Zeitslots sind die ersten beiden Bits immer 0, d.h. sie
müssten für 8192 Takte aus sein. Macht für mich ein Tastverhältnis von
1/2, so dass im Mittel 3mA durch die LEDs (low power) fließen müssten.
Das entspricht aber nicht dem minimalen Glimmen, dass ich in der realen
Schaltung sehe :-/
Gruß,
Daniel
Ok... ich habe jetzt gerade noch etwas Trial and Error gemacht.
Auskommentieren von
1
TCNT0=0;
Führt zum gewünschten Ergebnis. Kann mir jemand erklären, woran das
liegt? In dem moment, in dem ich TCNT0 auf 0 setze habe ich ja den neuen
Wert für OCR0A schon geschrieben, d.h. es kann doch eigentlich kein
zweiter, unerwarteter Interrupt auftreten, oder?
Viele Grüße,
Daniel