Forum: Compiler & IDEs LED blinken mit Taster an/ausschalten will nicht so recht


von Daniel (Gast)


Angehängte Dateien:

Lesenswert?

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

von Henk (Gast)


Lesenswert?

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?

von Daniel (Gast)


Lesenswert?

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.

von Lothar M. (Firma: Titel) (lkmiller) (Moderator) Benutzerseite


Lesenswert?

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
Noch kein Account? Hier anmelden.