Hi,
tut mir leid dass der Code so umfangreich ist, wer mag kann sich ja mal
mit befassen, wäre sehr hilfreich.
Ich möchte ein Lauflicht bauen das im Takt der Musik läuft. Der Takt
soll über die fallende Flanke eines Taster1 an PD2 (INT0) eingegeben
werden. In meinem Code wird zunächst lediglich eine LED im Takt zum
blinken gebracht. An PD3 (INT1) kann zusätzlich mit einem Taster2 noch
der Hold-modus eingeschaltet werden in dem die automatische Lichtaktion
ausgeschaltet wird und der Taster1 nun nur noch als auslöser einer
solchen dient.
An PD0 und PD1 hängen eine Grüne und eine Rote Status-LED. An PC0-4 habe
ich 5 gelbe LEDs angeschlossen um meinen Divisor auszugeben.
Der Timer1 läuft im CTC-Modus und ist so getaktet dass er bei 8Mhz alle
0,1ms einen Interrupt auslöst.
Das Programm zählt die Zeit zwischen dem jetzigen und dem letzten
Tastendruck an Taster1 und addiert sie zum Zeitspeicher. Gleichzeitig
wird der Divisor inkrementiert. Danach wird der Zeitspeicher durch den
Divisor dividiert, somit erhalte ich die durchschnittliche Zeit eines
Takts. Läuft der 16-Bit Zeitspeicher über, so dient der Taster1 nur noch
als Sync-button. Wartet man dann 1 Sekunde (timeout), wird das
programmeigene status-flag cnt auf 0 gesetzt und mit dem nächsten druck
auf taster1 wird damit begonnen einen neuen Takt einzuzählen. Bleibt es
allerdings bei einem einzigen Tastendruck und es gibt wieder einen
timeout so wurde der takt nur syncronisiert..
Irgendetwas stimmt da jedoch nicht, 12 Takte müssten eigentlich
ausreichen um den Takt so genau vorzugeben dass das ding wirklich das
ganze lied über syncron mit der musik weiter blinkt. aber schon nach
wenigen sekunden merkt man dass es etwas zu schnell blinkt. Immer zu
schnell.. ich frage mich aber warum?!
Um mir bei diesem Problem helfen zu können muss vielleicht jemand die
Schaltung nachbasteln wenn er nicht im code den ultimativen Fehler
entdeckt. Vielleicht ist meine Divisionsroutine auch einfach nur müll,
die habe ich aus einem Tuorial abgeschrieben und meine Registernamen
eingesetzt. Wie das nun genau funktioniert, damit muss ich mich
irgendwann mal beschäftigen wenn ich Zeit dazu habe ;-)
mfg Paul H.