www.mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik Zähler Beispiel


Autor: Frank (Gast)
Datum:

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

Autor: crazy horse (Gast)
Datum:

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

Autor: sackgesicht (Gast)
Datum:

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

Autor: Rick Dangerus (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
statt
counter++;
machst Du
if (counter < maximum) counter++;
Beim dekrementieren dann entsprechend andersrum.

Rick

Autor: crazy horse (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
ach, soviele Nachplapperer...:-)

Autor: sackgesicht (Gast)
Datum:

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

Autor: Michael (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
if (counter>10) counter--;
if (counter<0) counter++;

Wenn's denn noch erlaubt ist.

Autor: Frank (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
danke danke! für die schnelle hilfe!!! werd gleich mal testen obs
funktioniert!!!

Autor: Frank (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
es funktioniert! danke!

Autor: crazy horse (Gast)
Datum:

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

Autor: Michael (Gast)
Datum:

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

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

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

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.