Forum: Gesperrte Threads Komisches Problem


von Paul H. (powl)


Angehängte Dateien:

Lesenswert?

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.

von Paul H. (powl)


Angehängte Dateien:

Lesenswert?

Hier noch ein Programmablaufplan

von Andreas K. (a-k)


Lesenswert?

Dividieren im Interrupt ist nicht wirklich gut. Dauert zu lang.

von Andreas S. (andreas) (Admin) Benutzerseite


Lesenswert?

Zitat:
"Wichtige Regeln - erst lesen, dann posten!

* Aussagekräftigen Betreff waehlen
* Im Betreff angeben um welchen Controllertyp es geht (AVR, PIC, ...)"

Dieser Beitrag ist gesperrt und kann nicht beantwortet werden.