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ß
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ß
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
schau dir mal das an (Rangfolge der Operatoren)
http://pronix.linuxdelta.de/C/standard_C/c_programmierung_30.shtml
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!!!)
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.
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ß
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();
}
}
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
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:
Damit setzt Du p NICHT auf Null. p=0 wäre richtig.
1
>setStopwatch1(0);}
2
>}
3
>
4
>voidZyklusKomplett(void)
5
>{
6
>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.
ü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.
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
>> 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...
>
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
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