Hallo zusammen, ich habe ein Problemchen mit meiner LED die ich blinken lassen möchte. µC: Atmega 8 mit 8Mhz internem Oszillator An PB0 hängt ein Taster der gegen Masse schaltet, interne Pullups aktiviert An PB1 hängt eine LED die an 5V Versorgungsspannung liegt und leuchtet, wenn PB1 auf Masse gezogen ist Das Programm soll folgendes machen: Die LED soll beginnen zu blinken, wenn der Taster gedrückt wurde. Die Leuchtdauer und "Auszeit" wird über die Variable zeitmerker eingestellt. Wenn der Taster erneut gedrückt wird, soll das Programm anhalten, hierzu die Variable "statusProgramm". Leider funktioniert das ganze irgendwie nicht. Das Programm startet zwar bei Tasterdruck, läuft dann auch, lässt sich jedoch durch einen erneuten Druck des Tasters nicht ausschalten. Wo ist der Fehler? Kann mir jemand helfen? Bin ziemlich neu auf dem Gebiet, daher ist der Code auch womöglich für einen Profi sehr umständlich geschrieben, aber jeder hat ja mal klein angefangen :-) Danke. MfG Daniel
Ohne es jetzt gelesen haben oder C zu können würd ich vermuten die Variable wird einfach "zu schnell wieder eingeschaltet". Ist der Taster entprellt?
Ja, der Taster ist entprellt mittels der Entprellungsroutine die hier auf der Seite im Tutorial steht (nach Riggenbach). Die Variable statusProgramm hat zunächst den Wert 0. Wenn dies der Fall ist, kann das Programm per Tastendruck gestartet werden (if-Abfrage). Anschließend wird die Variable direkt auf den Wert 1 gesetzt. Über eine weitere if-Abfrage kann das Programm, wenn die Variable statusProgramm den Wert 1 hat, ausgeschaltet werden. Nur leider funktioniert das nicht und das ist mein Problem.
Ich möchte die Qualität einer Entprell-Routine, die unnötig Rechenzeit verbrät (mit _delay_us(150);) grundsätzlich in Frage stellen. Und die Entprellung ist garantiert falsch:
1 | debounce( (uint8_t*)&PINB, (1<<Taster1) ); |
2 | |
3 | if ( !(PINB & (1 << Taster1)) ) //frägt den Zustand des Tasters ab |
In der ersten Zeile wird irgendwas entprellt, und in der nächsten Zeile einfach der Zustand des Portpins abgefragt. Das kann niemals im Sinne des Erfinders gewesen sein... Und wenn doch, dann ist ein kapitales Loch in der Abfrage. Denn was passiert, wenn die Taste nach dem debounce(), aber vor der Pinabfrage betätigt wird? Insgesamt ist das Programm für die gestellte Aufgabe schlicht unleserlich und unverständlich groß. Ich will mich da nicht einarbeiten... BTW:
1 | ulCurrentCounterTimer0G+=256; //bei jedem overflow wird der Timer um 256 inkrementiert |
Warum vergeudest du einfach die unteren 8 Bits?
1 | // den Counter und den Tickzähler wieder zurücksetzen
|
2 | TCNT0 = ulCurrentCounterTimer0G-COUNTER_INCS_PER_SECOND_T0; //Preload Wert wird ausgerechnet |
Ein Counter wird im Idealfall 1 mal initialisiert, und dann in Ruhe gelassen. Durch deine Manipulation bekommst du deutliche Ungenauigkeit in die Zeitmessung...
Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.