www.mikrocontroller.net

Forum: Compiler & IDEs Taster auf und abwärts zählen


Autor: Holzi (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,

ich versuche hier 2 Taster, jeweils einen für hoch und den anderen für 
runter auf eine 7 Segment Anzeige auszugeben. Jedoch scheiterts schon 
daran, dass ich es nicht hinbekomme bei einem Tasterdruck die Variable 
menuValue nur um einen erhöht wird! Er soll von 1-9 hoch und runter 
zählen können! 0x1 ist hoch und 0x2 ist runter.

Danke!!
int main()
{
    static int menuValue = 1;
    int pushButtons;
    int pushCnt = 0;
    
    
    menu();
    do{
        pushButtons = IORD_16DIRECT(IO_IN_PUSH_BUTTONS_BASE,0);
        if(pushButtons && 0x01)
        {    
            pushCnt++;
            if(pushCnt > 8)
                if(menuValue < 9)
                {
                    menuValue++;
                    pushCnt = 0;
                    usleep(10000);
                }
        }
        if(pushButtons && 0x02)
        {
            pushCnt++;
            if(pushCnt > 8)
                if(menuValue >= 1)   
                {     
                    menuValue--;
                    pushCnt = 0;
                    usleep(10000);
                }
        }
        else if(pushButtons && 0x03)
            break;
        printf("%i %i\n",menuValue, pushCnt);
        usleep(10000);
//        IOWR_16DIRECT(IO_OUT_7_SEGMENT_BASE, 0, 0x40);
//        buttonState();
    }while(1);   

Autor: Stefan B. (stefan) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
>        pushButtons = IORD_16DIRECT(IO_IN_PUSH_BUTTONS_BASE,0);

Beachtet deine Funktion oder Makro das Thema Entprellung?

>        if(pushButtons && 0x01)

Ich denke, du willst hier und in dem anderen If kein logisches UND (&&) 
sondern ein bitweises UND (&).

Autor: Peter Dannegger (peda)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
http://www.mikrocontroller.net/articles/Entprellun...

  for(;;){
    if( get_key_press( 1<<KEY_UP ) && (menuValue < 9) )
      menuValue++;
    if( get_key_press( 1<<KEY_DOWN ) && (menuValue > 1) )
      menuValue--;
  }


Peter

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Das hier

        pushButtons = IORD_16DIRECT(IO_IN_PUSH_BUTTONS_BASE,0);

klingt nach einer mehr oder weniger direkten Port Abfrage.

Damit macht dein Programm aber:
  Solange eine Taste gedrückt ist, mache ....

und nicht
  Bei einem Tastendruck mache ...

Das ist ein Unterschied, wie bei den Scheibenhebern im Auto.
Da gibt es welche, auf die drückt man kurz drauf und die Scheibe fährt 
ganz nach oben. Und es gibt welche, bei denen bewegt sich die Scheibe 
nur dann, wenn man den Taster gedrückt hält.

Autor: Holzi (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ja mein Ziel ist es mit einem Tasterdruck nur einmal den Counter zu 
erhöhren und nicht ständig, sofern er gedrückt ist. Wie realisiere ich 
das am logischsten in C?

Autor: Peter Dannegger (peda)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Holzi schrieb:
> Wie realisiere ich
> das am logischsten in C?

Z.B. mit meiner Entprellroutine (s.o.).

Die Anpassung auf andere CPUs ist ganz leicht, nur der Timerinterrupt 
(Init, Syntax) muß angepaßt werden.

So eine zentrale Entprellroutine ist ein echter Zeitsparer. Man muß sich 
nie wieder mit Entprellen und Flanke erkennen abquälen. Man kann sich 
voll auf die eigentliche Aufgabe konzentrieren.
Das Zeitsparen ist sogar doppelt: Der Entwickler spart Zeit und die CPU 
auch (keine Delayloops).


Peter

Autor: Holzi (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
danke gelöst!
pushButtons = IORD_16DIRECT(IO_IN_PUSH_BUTTONS_BASE,0);
    segment7(menuValue);
    if((pushButtons & 0x01) && (button1Mode == TRUE))
    {    
        if(menuValue < 9)
        {
            button1Mode = FALSE;
            menuValue++;
        }
    }
    if(!(pushButtons & 0x01))
        button1Mode = TRUE;
    if((pushButtons == 0x02) && (button2Mode == TRUE))
    {
        if(menuValue > 1)   
        {     
            button2Mode = FALSE;
            menuValue--;
        }
    }
    if(!(pushButtons & 0x02))
        button2Mode = TRUE;

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
NO, das funktioniert nicht zuverlässig. Spätestens ein prellender Taster 
macht dir da einen Strich durch die Rechnung.

Warum befolgst du nicht Peters Rat und liest dir den Artikel 
Entprellung durch?

Autor: Holzi (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
weil in der Routine die Tasten bereits entprellt sind ;-)

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.