www.mikrocontroller.net

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


Autor: Daniel (Gast)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht 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

Autor: Henk (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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?

Autor: Daniel (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Lothar Miller (lkmiller) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht 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:
        debounce( (uint8_t*)&PINB, (1<<Taster1) );

        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:
  ulCurrentCounterTimer0G+=256;  //bei jedem overflow wird der Timer um 256 inkrementiert
Warum vergeudest du einfach die unteren 8 Bits?
    // den Counter und den Tickzähler wieder zurücksetzen
       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...

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.