Serieousl Lesrely schrieb:
> ist irgendwas unklar ??
Nee, ist alles klar. Die Timerinitialisierung ist richtig, der Quelltext
ist vernünftig eingrückt. Das war es dann aber auch schon mit den guten
Nachrichten.
Die while(1)-Schleifen in der while(1)-Schleife , also mit Reset als
einziger Abbruchbedingung, sind noch das geringste Übel.
Deine Tasten sind nicht entprellt. Damit funktioniert schon mal gar
nichts.
Nein, "WaitMs(10);" ist keine Entprellung. Oder glaubst du, daß du es
schaffst in 10ms die Taste wieder loszulassen, bevor sie wieder als
gedrückt erkannt wird? Das schafft keiner.
Ein Taster hat 4 Zustände:
-Losgelassen
-Wurde gerade gedrückt
-Gehalten
-Wurde gerade losgelassen
Eine Entprellung braucht eine Flankenerkennung, die die Zustände "Wurde
gerade gedrückt bzw. losgelassen" erkennt und verarbeitet. Deine Mimik
erkennt "Gehalten". Und solange die Taste gedrückt ist, wird addiert
bzw. subtrahiert. Gerade bei der Minustaste landest du dann ganz schnell
im Nirvana. Denn:
1 | if (OCR5A >= 0)
|
2 | {
|
3 | OCR5A -= 25;
|
4 | ...
|
Das macht ganz sicher nicht das, was du willst.
Angenommen OCR5A sei 0. Die Bedingung ist also erfüllt und es werden 25
subtrahiert. Das Ergebnis ist dann 65511. Das bedeutet, daß die
Compare-Match-Bedingung(0 - 255) nie erfüllt wird und die LED ständig
leuchtet. Ein Drücken der Plustaste bringt gar nichts mehr, da die
Bedingung <=255 nicht erfüllt ist. Jetzt kannst du dir die Finger
wundtippen, bis du mit der Minustaste wieder im "grünen Bereich" bist.
Denn diese Bedingung >=0 ist erfüllt.
Für das Addieren, "if (OCR5A <= 255)..." gilt ähnliches.
Solche Kleinigkeiten wie 16Bit für einen Bool'schen Ausdruck
(int modus=0;) lassen wir erstmal aussen vor.
mfg.