mikrocontroller.net

Forum: Compiler & IDEs Timer einstellen über Taster und AVR


Autor: Stefan Müller (skysurfer)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi,

ich hab mit einem AVR einen Timer aufgebaut, um die Zeit einstellen zu 
können habe ich 2 Taster  um nicht ewig warten zu müssen soll der Eimer 
nach 10 Einzelschritten in 10 Schritten hoch bzw. runter zählen und wenn 
man ihn los lässt wieder mit Einzelschritten beginnen.

Mein versuch :

SIGNAL (SIG_OVERFLOW2)
{
  cli();    // Interrupts nicht zulassen

  if (pin_keys & (1 << btn_up))    // Up-Taste gedrückt
    key_up++;
  else
  {
    key_up = 0;
  }

  if (pin_keys & (1 << btn_down))  // Down-Taste gedrückt
    key_down++;
  else
  {
    key_down = 0;
  }

  if (pin_keys & (1 << btn_start))  // Start-Taste gedrückt
    key_start++;

  sei();    // Interrupts zulassen
}



und in der main dann :

while (1)
  {
    if (key_up >= 100)
    {
      display_value += 10;
      key_up = 90;
    }
    else if (key_up >= 10)        // Up-Taste gedrückt
    {
      display_value++;        // Wert +1

      if (display_value > 999)      // Wenn Überlauf => Wert=0
        display_value = display_value - 999;
      key_up = 0;
    }

    if (key_down >=100)
    {
      display_value -= 10;
      key_down = 90;
    }

    else if (key_down >= 10)      // Down-Taste gedrückt
    {
      display_value--;        // Wert -1

      if (display_value <= 1)      // Wenn Unterlauf => Wert=999
        display_value = 999 + display_value;

      key_down =0;
    }
leider zählt er so nur rasant in 10er Schritten.

Hat jemand ne Idee woran es liegt? Ich steh grad etwas auf dem Schlauch.
Oder zufällig ne Lösung parat? Bin über jeden anstoß froh.

Gruß SkySurfer

Autor: Peter Dannegger (peda)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Da empfehle ich die Entprellroutine aus der Codesammlung.

Und dann so etwa:
                        // single press and repeat

    if( get_key_press( 1<<KEY_UP )){
      repcount = 0;
      val++;
    }
    if( get_key_rpt( 1<<KEY_UP )){
      if( repcount < 10 ){
        repcount++;
        val++;
      }else{
        val += 10;
      }
    }


Peter

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.