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


von Holzi (Gast)


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!!
1
int main()
2
{
3
    static int menuValue = 1;
4
    int pushButtons;
5
    int pushCnt = 0;
6
    
7
    
8
    menu();
9
    do{
10
        pushButtons = IORD_16DIRECT(IO_IN_PUSH_BUTTONS_BASE,0);
11
        if(pushButtons && 0x01)
12
        {    
13
            pushCnt++;
14
            if(pushCnt > 8)
15
                if(menuValue < 9)
16
                {
17
                    menuValue++;
18
                    pushCnt = 0;
19
                    usleep(10000);
20
                }
21
        }
22
        if(pushButtons && 0x02)
23
        {
24
            pushCnt++;
25
            if(pushCnt > 8)
26
                if(menuValue >= 1)   
27
                {     
28
                    menuValue--;
29
                    pushCnt = 0;
30
                    usleep(10000);
31
                }
32
        }
33
        else if(pushButtons && 0x03)
34
            break;
35
        printf("%i %i\n",menuValue, pushCnt);
36
        usleep(10000);
37
//        IOWR_16DIRECT(IO_OUT_7_SEGMENT_BASE, 0, 0x40);
38
//        buttonState();
39
    }while(1);

von Stefan B. (stefan) Benutzerseite


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 (&).

von Peter D. (peda)


Lesenswert?

http://www.mikrocontroller.net/articles/Entprellung#Komfortroutine_.28C_f.C3.BCr_AVR.29
1
  for(;;){
2
    if( get_key_press( 1<<KEY_UP ) && (menuValue < 9) )
3
      menuValue++;
4
    if( get_key_press( 1<<KEY_DOWN ) && (menuValue > 1) )
5
      menuValue--;
6
  }


Peter

von Karl H. (kbuchegg)


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.

von Holzi (Gast)


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?

von Peter D. (peda)


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

von Holzi (Gast)


Lesenswert?

danke gelöst!
1
pushButtons = IORD_16DIRECT(IO_IN_PUSH_BUTTONS_BASE,0);
2
    segment7(menuValue);
3
    if((pushButtons & 0x01) && (button1Mode == TRUE))
4
    {    
5
        if(menuValue < 9)
6
        {
7
            button1Mode = FALSE;
8
            menuValue++;
9
        }
10
    }
11
    if(!(pushButtons & 0x01))
12
        button1Mode = TRUE;
13
    if((pushButtons == 0x02) && (button2Mode == TRUE))
14
    {
15
        if(menuValue > 1)   
16
        {     
17
            button2Mode = FALSE;
18
            menuValue--;
19
        }
20
    }
21
    if(!(pushButtons & 0x02))
22
        button2Mode = TRUE;

von Karl H. (kbuchegg)


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?

von Holzi (Gast)


Lesenswert?

weil in der Routine die Tasten bereits entprellt sind ;-)

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.