Forum: Mikrocontroller und Digitale Elektronik Zähler Beispiel


von Frank (Gast)


Lesenswert?

hi! hab da ein kleines problem, muss ein Bsp schreiben welchen durch
Drücken von Taste 1 einen Zähler um 1 erhöht und durch drücken von
Taste2 den Zähler wieder um 1 verringert, wobei diese nur im Bereich
von 0 -10 möglich sein darf! Sodass wenn der Zähler bei 10 oder 0
angekommen ist nicht mehr weiterzählt.Bis auf die Grenzen hab ichs
schon , nur mit den Grenzen weiß ich nicht wie das funktionieren soll,

while (1){
        if(!Key1 && buffer == 0)

         {
                counter++;
                buffer = 1;
                delay(1);
                WriteVal(counter);


         }

        if(!Key2 && buffer == 0)

        {
                counter--;
                buffer = 1;
                delay(1);
                WriteVal(counter);
        }



        if (Key1)
        buffer = 0;

        if (Key2)
        buffer = 0;

das ist nur mal der Zählvorgang, der klappt auch! Weiß jemand wie ich
da nun die Grenzen einbaue??

m.f.G Frank

von crazy horse (Gast)


Lesenswert?

if (counter<10) counter++;
if (counter>0) counter--;  //if (counter) reicht auch

von sackgesicht (Gast)


Lesenswert?

while (1){
        if(!Key1 && buffer == 0)

         {
                if ( counter < 10 )
                  counter++;
                buffer = 1;
                delay(1);
                WriteVal(counter);


         }

        if(!Key2 && buffer == 0)

        {
                if ( counter > 0 )
                  counter--;
                buffer = 1;
                delay(1);
                WriteVal(counter);
        }

von Rick Dangerus (Gast)


Lesenswert?

statt
1
counter++;
machst Du
1
if (counter < maximum) counter++;
Beim dekrementieren dann entsprechend andersrum.

Rick

von crazy horse (Gast)


Lesenswert?

ach, soviele Nachplapperer...:-)

von sackgesicht (Gast)


Lesenswert?

Ich habe nur 1/10 Sekunde später als du auf <Submit> geklickt ;)

von Michael (Gast)


Lesenswert?

if (counter>10) counter--;
if (counter<0) counter++;

Wenn's denn noch erlaubt ist.

von Frank (Gast)


Lesenswert?

danke danke! für die schnelle hilfe!!! werd gleich mal testen obs
funktioniert!!!

von Frank (Gast)


Lesenswert?

es funktioniert! danke!

von crazy horse (Gast)


Lesenswert?

@Michael:
Erlaubt ists immer, aber:

"if (counter>10) counter--;"
Wozu soll das gut sein? Logisch zwar richtig, kostet aber mehr Zeit und
Programmspeicher, bringt also gar nichts

if (counter<0) counter++;
erstmal siehe oben, ausserdem funktioniert es nur bei signed-Variablen.
Und die setzt man normalerweise nur ein, wenn man sie auch braucht.
Also beides keine sonderlich guten Vorschläge :-)

von Michael (Gast)


Lesenswert?

Des Menschen Wille ist ein Himmelreich :-)
Anormalerweise nehme ich lieber signed, und würde letztlich auch die
Begrenzung in der Form machen: if(count > POS_LIMIT) count = POS_LIMIT;
und: if(count < NEG_LIMIT) count = NEG_LIMIT;

Das hat den Vorteil, daß diese Begrenzung einmalig vor der Verwendung
von count ausgeführt wird und einen größeren, unzulässigen Bereich
eingrenzt. Es könnte ja auch sein, daß count an anderen Stellen um +/-2
verändert wird, oder count bei der 1. Verwendung undefiniert sein kann
(z.B. no_init Bereich mit Pufferbatterie).
Ich weiß, wird hier alles nicht gebraucht; aber ein bißchen weiter zu
sehen, schadet nicht.

Und noch einmal auf das signed/unsigned zu kommen. Wird ja nur bei
Bytes so hoch gelobt (Compiler default). Bei int hingegen nimmt man
nicht unsigned int als default. Aber jeder, wie er mag.

von Karl H. (kbuchegg)


Lesenswert?

Wenn ich auch noch probieren darf:

while (1){
        if(!Key1 &&
           buffer == 0 &&
           counter < 10)

         {
                counter++;
                buffer = 1;
                delay(1);
                WriteVal(counter);


         }

        if(!Key2 &&
           buffer == 0 &&
           counter > 0)

        {
                counter--;
                buffer = 1;
                delay(1);
                WriteVal(counter);
        }

Hat den Vorteil, dass auch der Rest nur dann gemacht
wird, wenn auch wirklich gezählt wurde. Und so wie
ich das sehe ist der Rest ganz einfach: den veränderten
Counter augeben. Wozu aber einen Counter ausgeben, der
sich gar nicht geaendert hat?

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.