www.mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik Variablen vergleichen


Autor: Andi (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
hallo leute,
bin noch relativer anfänger in c programmierung und habe darum eine 
frage zur programmierung, die für viele von euch leicht zu beantworten 
sein dürfte:

ich habe ein programm in dem ich i, a, n und  p vergleichen will.

aber mein programm funktioniert nicht weil ich glaub ich es falsch 
geschrieben habe:

mein ausschnitt:

if(i==0 & a==0 & n==0& p>100 )

kann man das so schreiben?

gruß

Autor: Matthias Lipinsky (lippy)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
if  (  i==0 && a==0 && n==0  && p>100 )

Autor: Martin M. (martin69)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
muß so geschrieben werden:

if ( (i==0) && (a==0) && (n==0) && (p>100) )

Autor: Andi (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Danke schon mal für eure antworten.
nur welcher von den beiden Vorschlägen ist der Richtige?

Ich habe jetzt mal durchprobiert aber keiner dieser Vorschläge führt zum 
Ziel.

Wer kann mir sagen wie es richtig geht?

gruß

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

Bewertung
0 lesenswert
nicht lesenswert
Beide sind identisch.
Die Klammern sind an dieser Stelle nicht notwendig, schaden aber auch 
nicht

> Ich habe jetzt mal durchprobiert aber keiner dieser Vorschläge
> führt zum Ziel.

Dein Problem liegt an einer anderen Stelle

Autor: Mano Wee (Firma: ---) (manow)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
schau dir mal das an (Rangfolge der Operatoren)

http://pronix.linuxdelta.de/C/standard_C/c_program...

dann wird dir klar welche der beiden Lösungen funktioniert (oder beide)? 
Es ist die Priorität der Operatoren == und && interessant!

(Bezogen auf die Klammerung, nicht auf dein Problem!!!)

Autor: Wolfgang Mües (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Beide sind richtig. Die Klammern um die inneren Ausdrücke sind optional.

Poste doch mal einen größeren Ausschnitt aus Deinem Programm, und 
berichte mal, was es macht und was nicht.

Autor: Andi (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
mein Programm steuert 2 Servos von einem Schwenkarm mit einem Greifer. 
Hier der größere Programmausschnitt.



#include "RP6RobotBaseLib.h"

uint8_t i;
uint8_t a;
uint8_t n;
uint8_t p;
uint8_t z;

void task_servo(void)
{

if(getStopwatch1() >100 || z==1) // Greifer schließen
{
while(i<52)
{
writeString_P("Greifer schließen\n");
PORTC |=(1<<0);
mSleep(1);
PORTC &=~ (1<<0);
mSleep(19);
i++;}
}


if(i>50)  // Schwenkarm nach oben
{
while(a<52)
{
writeString_P("Schwenkarm nach oben\n");
PORTC |=(1<<1);
mSleep(2);
PORTC &=~ (1<<1);
mSleep(18);
i==0;
a++;}
}


if(a>50) // Greifer öffnen
{
while(n<100)
{
writeString_P("Greifer öffnen\n");
PORTC |=(1<<0);
mSleep(2);
PORTC &=~ (1<<0);
mSleep(18);
a==0;
n++;}

}

if(n>98) //Schwenkarm wieder nach unten
{
while(p<102)
{
writeString_P("Schwenkarm wieder nach unten\n");
PORTC |=(1<<1);
mSleep(1);
PORTC &=~ (1<<1);
mSleep(19);
n==0;
p++;}
}

if(p>100)
{p==0;}
}

void ZyklusKomplett(void)
{
if((i==0) && (a==0) && (n==0) && (p==0)  )

  {z==1;
  writeString_P("Zyklus komplett\n");  //Zyklus komplett
  }

if(z==1 & p==0)  //Zyklus nicht komplett
  {z==0;
  writeString_P("Zyklus nicht komplett\n");}
}


int main(void)
{
initRobotBase();
startStopwatch1();
ZyklusKomplett();
mSleep(1000);
setStopwatch1(0);

DDRC |=(1<<1);    //PORT 1 von Register C als Ausgang
DDRB &=~(1<<0);  //PORT 0 von Register B als Eingang
DDRC &=~(1<<6);  //PORT 6 von Register C als Eingang
DDRC |= (1<<0);  //PORT 0 von Register C als Ausgang




while(1)
{task_servo();
}

}

Autor: Andi (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Zur Erklärung. Der Arm startet mit geöffneten Greifer und ist in der 
unteren Endlage.

Mit dem Programm soll er zuerst den Greifer schließen, dann nach oben 
schwenken, dann den Greifer wieder öffnen und dann wieder nach unten 
schwenken.

Bis dahin funktioniert das Programm einwandfrei.

Nur hab ich es so programmiert das es dann wieder von vorne also wieder 
mit dem zugreifen beginnen soll aber das funktioniert irgendwie nicht.

gruß

Autor: Mano Wee (Firma: ---) (manow)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
  {z==0; 

Diese Zeile bringt nichts! Du vergleichst z auf 0, ist das wirklich 
gewollt oder möchtest Du eine Zuweisung von z = 0? (kommt zwei Mal vor)
  if(z==1 & p==0) 

schreibt man mit logischen Unds && und nicht mit & bitweise Unds

Autor: Andi (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
An der Zeile liegts aber auch nicht.
Das Problem ist, dass Zyklus Komplett nie ausgeführt wird. Bis dahin 
funktioniert alles aber dann hängts.

Ja du hast recht jetzt hab ich das Programm nochmal abgeändert, aber es 
funktioniert immer noch nicht:

#include "RP6RobotBaseLib.h"

uint8_t i;
uint8_t a;
uint8_t n;
uint8_t p;
uint8_t z;

void task_servo(void)
{

if(getStopwatch1()>200 || z==1) // Greifer schließen
{
while(i<52)
{
writeString_P("Greifer schließen\n");
PORTC |=(1<<0);
mSleep(1);
PORTC &=~ (1<<0);
mSleep(19);
i++;}
}


if(i>50)  // Schwenkarm nach oben
{
while(a<52)
{
writeString_P("Schwenkarm nach oben\n");
PORTC |=(1<<1);
mSleep(2);
PORTC &=~ (1<<1);
mSleep(18);
i==0;
a++;}
}


if(a>50) // Greifer öffnen
{
while(n<100)
{
writeString_P("Greifer öffnen\n");
PORTC |=(1<<0);
mSleep(2);
PORTC &=~ (1<<0);
mSleep(18);
setStopwatch1(0);
a==0;
n++;}

}

if(n>98) //Schwenkarm wieder nach unten
{
while(p<102)
{
writeString_P("Schwenkarm wieder nach unten\n");
PORTC |=(1<<1);
mSleep(1);
PORTC &=~ (1<<1);
mSleep(19);
n==0;
p++;}
}

if(p>100)
{p==0;
setStopwatch1(0);}
}

void ZyklusKomplett(void)
{
if((i==0) && (a==0) && (n==0) && (p==0)  )

  {z==1;
  writeString_P("Zyklus komplett\n");  //Zyklus komplett
  }


}


int main(void)
{
initRobotBase();
startStopwatch1();
ZyklusKomplett();
mSleep(1000);
setStopwatch1(0);

DDRC |=(1<<1);    //PORT 1 von Register C als Ausgang
DDRB &=~(1<<0);  //PORT 0 von Register B als Eingang
DDRC &=~(1<<6);  //PORT 6 von Register C als Eingang
DDRC |= (1<<0);  //PORT 0 von Register C als Ausgang




while(1)
{task_servo();
}

}

Autor: Sven P. (haku) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
- [ c ] zum Formatieren, sonst Dateianhang
- ordentlich einrücken
- da steht immer noch == als Zuweisung

Autor: Andi (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Wo meinst du genau? Falls du z==1 meinst, kann ich nur sagen, dass das 
so gewollt ist.

nämlich deshalb:
if(getStopwatch1() >100 || z==1) // Greifer schließen

Autor: Mano Wee (Firma: ---) (manow)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Deine DDR setzt Du auch ziemlich spät, hab ich gerade gesehen. Hat das 
einen besonderen Grund?

Ich würd das auch ein wenig anders schreiben... Einfach mal im Tutorial 
hier nachlesen und ein wenig C Grundlagen noch mal anschauen
int main(void)
{
   DDRC |=(1<<1);    //PORT 1 von Register C als Ausgang
   DDRB &=~(1<<0);  //PORT 0 von Register B als Eingang
   DDRC &=~(1<<6);  //PORT 6 von Register C als Eingang
   DDRC |= (1<<0);  //PORT 0 von Register C als Ausgang

   initRobotBase();
   startStopwatch1();
   ZyklusKomplett();
   mSleep(1000);
   setStopwatch1(0);

  .
  .
  .

Autor: Mano Wee (Firma: ---) (manow)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Andi wrote:
> Wo meinst du genau? Falls du z==1 meinst, kann ich nur sagen, dass das
> so gewollt ist.
>
> nämlich deshalb:
>
>
if(getStopwatch1() >100 || z==1) // Greifer schließen

schau mal deinen Code an wo Du vergleiche machst, die nichts bringen, 
statt Zuweisung

 == und = ist nicht das gleiche!!!

Autor: Andi (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ne, das war keine Absicht, jetzt hab ich es mal umgeändert aber an dem 
liegt es auch nicht.

Aber mein Problem besteht immer noch: Zyklus komplett wird nicht 
ausgeführt:

#include "RP6RobotBaseLib.h"

uint8_t i;
uint8_t a;
uint8_t n;
uint8_t p;
uint8_t z;

void task_servo(void)
{

if(getStopwatch1()>200 || z==1) // Greifer schließen 
{
while(i<52)
{
writeString_P("Greifer schließen\n");
PORTC |=(1<<0);
mSleep(1);
PORTC &=~ (1<<0);
mSleep(19);
i++;}
}


if(i>50)  // Schwenkarm nach oben
{
while(a<52)
{
writeString_P("Schwenkarm nach oben\n");
PORTC |=(1<<1); 
mSleep(2);
PORTC &=~ (1<<1);
mSleep(18);
i==0;
a++;}
}


if(a>50) // Greifer öffnen                                      
{
while(n<100)
{
writeString_P("Greifer öffnen\n");
PORTC |=(1<<0);
mSleep(2);
PORTC &=~ (1<<0);
mSleep(18);
setStopwatch1(0);
a==0;
n++;}

}

if(n>98) //Schwenkarm wieder nach unten
{
while(p<102)
{
writeString_P("Schwenkarm wieder nach unten\n");
PORTC |=(1<<1);
mSleep(1);
PORTC &=~ (1<<1);
mSleep(19);
n==0;
p++;}
}

if(p>100)
{p==0;
setStopwatch1(0);}
}

void ZyklusKomplett(void)
{
if((i==0) && (a==0) && (n==0) && (p==0)  )
  
  {z==1;
  writeString_P("Zyklus komplett\n");  //Zyklus komplett
  }
  

}


int main(void)
{
initRobotBase();

DDRC |=(1<<1);    //PORT 1 von Register C als Ausgang
DDRB &=~(1<<0);  //PORT 0 von Register B als Eingang
DDRC &=~(1<<6);  //PORT 6 von Register C als Eingang
DDRC |= (1<<0);  //PORT 0 von Register C als Ausgang




startStopwatch1();
ZyklusKomplett();
mSleep(1000);
setStopwatch1(0);


while(1)
{task_servo();
}

}

Autor: Falk Willberg (dl3daz) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Andi wrote:
...
> p++;}
> }
Jetzt ist p>0!
> if(p>100)
> {p==0;
Damit setzt Du p NICHT auf Null. p=0 wäre richtig.
> setStopwatch1(0);}
> }
> 
> void ZyklusKomplett(void)
> {
> if((i==0) && (a==0) && (n==0) && (p==0)  )
Da p hier ungleich 0 ist, wird diese Bedingung nie erfüllt.

Falk
P.S.: Das Ganze ist sehr unübersichtlich. Globale Variablen mit einem 
Zeichen. Das macht es sehr schwer, den Code zu lesen.

Autor: Andi (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
 schau mal deinen Code an wo Du vergleiche machst, die nichts bringen,
statt Zuweisung

 == und = ist nicht das gleiche!!!

an welchen Stellen muss ich dann ihrer Meinung nach etwas ändern?

Autor: Mano Wee (Firma: ---) (manow)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
über all da wo Du eine Zuweisung = machen möchtest aber einen Vergleich 
machst, denn einfach vergleichen und das Ergebnis von einem Vergleich 
nirgends sichern bringt sehr wenig.

Autor: Andi (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Damit setzt Du p NICHT auf Null. p=0 wäre richtig.

Das kann aber nicht sei. Jetzt hab ich es gerade mal mit p=0 probiert. 
Und jetzt bleibt das Programm dauerhaft in der Schleife
while(p<102)
{
writeString_P("Schwenkarm wieder nach unten\n");
PORTC |=(1<<1);
mSleep(1);
PORTC &=~ (1<<1);
mSleep(19);
n==0;
p++;}


Autor: Bernd Geyer (bege)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Mann oh Mann !

Variablen Zuweisung mit '='  z.B.  a=0;  setzt 'a' auf Null

Doppeltes Gleichheitszeichen nur bei Vergleichen z.B. if (a==0) {} fragt 
a auf Null ab, der Block wird ausgeführt wenn die Variable a tatsächlich 
den Wert 0 hat.

Überprüfe mal die Stellen, an denen du i,a,n,p auf Null und z auf 1 
setzen willst !

Gruß Bernd

Autor: Falk Willberg (dl3daz) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Andi wrote:
>
Damit setzt Du p NICHT auf Null. p=0 wäre richtig.
>
> Das kann aber nicht sei.

Doch, das muß sein. Mit p=0 setzt Du die Variable p auf 0. Mit p==0 
vergleichst Du p mit 0 ohne das Ergebnis auszuwerten. (Der Compiler 
merkt sowas auch und läßt das gleich weg)

> Jetzt hab ich es gerade mal mit p=0 probiert.
> Und jetzt bleibt das Programm dauerhaft in der Schleife

Welchen Wert hat p jetzt? Wenn p<100 ist, ist da was faul...

>
while(p<102)
> {
> writeString_P("Schwenkarm wieder nach unten\n");
> PORTC |=(1<<1);
> mSleep(1);
> PORTC &=~ (1<<1);
> mSleep(19);
> n==0;
> p++;}
> 

Autor: PeterL (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
if (!i && !a && !n && !p)
{z==1;....

Autor: Andi (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
oh ja danke. Tut mir echt leid, dass ich heute erst jetzt kapier was ihr 
mir sagen wolltet.

jetzt funktioniert das Programm einwandfrei:

#include "RP6RobotBaseLib.h"

uint8_t i;
uint8_t a;
uint8_t n;
uint8_t p;
uint8_t z;

void task_servo(void)
{

if(getStopwatch1()>200 || z==1) // Greifer schließen 
{
while(i<52)
{
writeString_P("Greifer schließen\n");
PORTC |=(1<<0);
mSleep(1);
PORTC &=~ (1<<0);
mSleep(19);
i++;}
}


if(i>50)  // Schwenkarm nach oben
{
while(a<52)
{
writeString_P("Schwenkarm nach oben\n");
PORTC |=(1<<1); 
mSleep(2);
PORTC &=~ (1<<1);
mSleep(18);
i=0;
a++;}
}


if(a>50) // Greifer öffnen                                      
{
while(n<100)
{
writeString_P("Greifer öffnen\n");
PORTC |=(1<<0);
mSleep(2);
PORTC &=~ (1<<0);
mSleep(18);
setStopwatch1(0);
a=0;
n++;}

}

if(n>98) //Schwenkarm wieder nach unten
{
while(p<102)
{
writeString_P("Schwenkarm wieder nach unten\n");
PORTC |=(1<<1);
mSleep(1);
PORTC &=~ (1<<1);
mSleep(19);
n=0;
p++;}
}

if(p>100)
{p=0;
setStopwatch1(0);}
}

void ZyklusKomplett(void)
{
if((i==0) && (a==0) && (n==0) && (p==0)  )
  
  {z=1;
  writeString_P("Zyklus komplett\n");  //Zyklus komplett
  }
  

}


int main(void)
{
initRobotBase();

DDRC |=(1<<1);    //PORT 1 von Register C als Ausgang
DDRB &=~(1<<0);  //PORT 0 von Register B als Eingang
DDRC &=~(1<<6);  //PORT 6 von Register C als Eingang
DDRC |= (1<<0);  //PORT 0 von Register C als Ausgang




startStopwatch1();
ZyklusKomplett();
mSleep(1000);
setStopwatch1(0);


while(1)
{task_servo();
}

}


Wie ihr seht bin ich noch ziemlicher Anfänger. Aber ich beginne erst im 
Oktober mit Elektrotechnik studieren, drum habe ich mir meine C 
Kenntnisse bisher komplett selber beibringen müssen.

Danke nochmal an alle
danke nochmal an alle

Autor: Falk Willberg (dl3daz) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Andi wrote:
> oh ja danke. Tut mir echt leid, dass ich heute erst jetzt kapier was ihr
> mir sagen wolltet.
>
> jetzt funktioniert das Programm einwandfrei:

...

> Wie ihr seht bin ich noch ziemlicher Anfänger. Aber ich beginne erst im
> Oktober mit Elektrotechnik studieren, drum habe ich mir meine C
> Kenntnisse bisher komplett selber beibringen müssen.

Das Programm mag funktionieren, der Grund dafür ist aber nicht zu 
erkennen ;-)

Wenn Du C lernen willst, kaufe Dir ein Buch (Ich kann keines empfehlen, 
"C for Atari ST" ist nicht mehr erhältlich) und arbeite es durch.

Ich würde C auch eher am Rechner lernen, wo man einen ordenlichen 
Debugger hat etc....

Viel Erfolg,
Falk

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.