Forum: Mikrocontroller und Digitale Elektronik counter im void loop()


von Stephan R (Gast)


Lesenswert?

Hallo, ich bin gerade dabei für ein Fach einen Morsecodeübersetzer zu 
basteln und bin dabei auf ein Problem gestoßen. Ich möchte, dass sich 
eine Zählervariable bei jedem Durchlauf des "void loop()" um 1 erhöht. 
Ich habe bisher schon alles versucht (counter++, counter = counter + 
1,...) aber es funktioniert nichts. Die Variable wird bei jedem 
Durchlauf wieder zurückgesetzt und ich ende immer wieder bei dem Wert 1. 
Kann mir irgendjemand sagen, ob es eine Möglichkeit gibt einen Zähler zu 
installieren der die Durchläufe des "void loop()" erfasst? Würde mir 
ungemein helfen!!!

Grüße, Stephan

von Nutzer (Gast)


Lesenswert?

Du darfst die Zählervariable nicht im Loop mit einem festen Wert 
überschreiben. Irgendwo scheint dein Code genau das zu tun.

Da du deinen Code jedoch nicht zeigst, kann dir leider niemand sagen an 
welcher Stelle das passiert und wie du das beheben kannst. Prinzipiell 
sollte für deinen Zweck nichts gegen ein Inkrement mit dem ++-Operator 
sprechen.

Veröffentliche deinen Quelltext.

von Marc S. (marc_s86)


Lesenswert?

deklarier die variable außerhalb des loops.

von Mark B. (markbrandis)


Lesenswert?

Oder innerhalb als static.

von Andreas S. (Firma: Schweigstill IT) (schweigstill) Benutzerseite


Lesenswert?

Möglichkeit 1: globale Variable
Möglichkeit 2: static-Deklaration innerhalb der Funktion

Diese Information findet man auch in jedem ordentlichen Lehrbuch für die 
von Dir verwendete, offenbar C-artige Programmiersprache.

von Stephan R (Gast)


Lesenswert?

Hallo, das geht ja hier wirklich schnell :)!
Ich habe bereits versucht die Variable (im Code unten "counter") als 
globale Variable ohne Wert zu initialisieren. Des weiteren habe ich es 
im "void setup()" versucht. Beides führt zum selben Ergebnis. Die 
Variable wird nach jedem loop-Durchlauf wieder auf 0 zurückgesetzt und 
ich Ende an der relevanten Stelle wieder bei counter = 1.

Nicht wundern der Code ist noch nicht fertig. Im Moment gehts mir nur 
darum, dass beim ersten Durchlauf die Variable A einen neuen Wert (1 
oder 2 für kurz oder lang) bekommt und beim zweiten Durchlauf der Loop 
die Variable B.

Code:

int A;
int B;


//Light measurement
int lightpin = 0;
float state;
float threshold = 400;

//Time measure
unsigned long startS;
unsigned long finishS;
unsigned long startB;
unsigned long finishB;
unsigned long signtime;


void setup()
{
  Serial.begin(9600);
  ambient = analogRead(lightpin);

}

void loop()
{

  state = analogRead(lightpin);
  Serial.println(counter);

  while(state >= threshold){
              state = analogRead(lightpin);
              startS = millis();
              finishB = millis();}
  while(state <= threshold){
              state = analogRead(lightpin);
              finishS = millis();}

  startB = millis();
  signtime = finishS - startS;


  counter = counter++;

  if(signtime <= 2000){
                if(counter = 1){
                        A = 2;}
                        else if(counter = 2){
                                    B = 2;}}

  if(signtime <= 1000){
                 if(counter = 1){
                         A = 1;}
                         else if(counter = 2){
                                     B = 2;}}

}

von Dussel (Gast)


Lesenswert?

Stephan R schrieb:
> counter = counter++;
Wenn ich mich recht erinnere, ist das nicht definiert und darf alles 
bewirken. Außerdem sehe ich nicht, wo Counter deklariert wird.

von Nutzer (Gast)


Lesenswert?

Deklariere "counter" anständig

Mach keine zusätzlichen Zuweisungen beim ++-Inkrement

Schau dir Vergleichsoperatoren an! In die If-Verzweifungen gehören 
Vergleiche, keine Zuweisungen

von Dirk B. (dirkb2)


Lesenswert?

Wenn das C ist, dann sind deine Vergleiche (auf Gleichheit) bei den if 
falsch.

von Stephan R (Gast)


Lesenswert?

Ach mist, jetzt habe ich die Version gepostet an der ich gerade 
rumgespielt habe :(.

Die Deklarierung erfolgte in dieser Version ursprünglich als globale 
Variable.
   int counter;

Allerdings scheint es mir als ob es ganz egal ist wo ich die Variable 
deklariere. Es funktioniert einfach nicht. Ich versuch es jetzt einmal 
mit einer static innerhalb der loop.

Vielen Dank auf jedenfall für die Tipps und es ist echt großartig wie 
schnell einem hier geholfen wird!

Grüße

von Thomas E. (thomase)


Lesenswert?

Stephan R schrieb:
> Allerdings scheint es mir als ob es ganz egal ist wo ich die Variable
> deklariere. Es funktioniert einfach nicht. Ich versuch es jetzt einmal
> mit einer static innerhalb der loop.

Das wird dir auch nichts nützen.

Daaaaaa: if(counter = 1)
                    ^

mfg.

von (prx) A. K. (prx)


Lesenswert?

Stephan R schrieb:
>   counter = counter++;

Das ist Unfug, weil undefiniert.

Entweder
    ++counter;
oder
    counter++;
oder
    counter += 1;
oder
    counter = counter + 1;

von Stephan R (Gast)


Lesenswert?

Ok, danke für eure Hilfe und Tipps! Es funktioniert jetzt :)

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.