PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Hilfe! Mein Programm funktionirt nich!



adrisch
05.03.2007, 15:31
Hi! ich hab mir grad ein Programm gebastelt, wo der asuro wenn er gegen etwas stößt eine rückwärtskurve macht. meiner ansicht nach müsste der folgenede progrmmcode funktionieren, aber er geht nicht:


#include "asuro.h"

int main(void)
{float x;
float y;
Init();
x=PollSwitch();
while(1<2){
if (x==0) {
StatusLED(GREEN);
MotorDir(FWD,FWD);
MotorSpeed(120,120);
}
else {
StatusLED(RED);
MotorDir(RWD,RWD);
MotorSpeed(255,0);
y=0;
while(y<40){
Sleep(255);
y++;
}

}
x=PollSwitch();
}
while(1);
return 0;
}

Bitte helft mir!!!!!!!!

gtacelt
05.03.2007, 18:43
Was funktioniert den nicht? Compiliern (sollte klappen, mir ist nichts aufgefallen) oder die Funktion? Was macht der Asuro den falsch?
(ich nehm mal an er macht dauernd die rückwärtskurve)

achja, statt while(1<2) reicht auch while(1)... das is auch ne endlos schleife

und float x und float y ist unnötig. für die reichen in dem fall wahscheinlich char werte, wenn nicht dann auf jeden fall int.

edit: so.. habs mir nochmal länger angschaut.. mit dem programm sollte er nur diese kurven machen? oder?

Dorner90
05.03.2007, 19:12
Also für die Funktion PollSwitch() reicht eine unsigned char -Variable.(nur so nebenbei)

Zum Problem:
Bei dieser Funktion sollte man am besten 2 Variablen anlegen, die
den Wert der Schalter mittels PollSwitch() im Programm hintereinander
einlesen. (Hat etwas mit den Kondensatoren zu tun die noch geladen sind
u.s.w. ...) Dann fragst du sie auch beide ab.

Beispiel:



#include "asuro.h"

int main(void)
{
unsigned char s1,s2;

Init();

while(1)
{
s1=PollSwitch();
s2=PollSwitch();
if((s1 && s2) == 0)
{
....
}
}
}

drmaettu
31.03.2007, 00:31
ich habe momentan ein ähnliches problem
er fähr vorwärts, bis er anstösst, dann fährt er rückwärts, aber nur solange wie der schalter gedrückt ist... also sehr kurz
dann fährt er immer vorwärts rückwärts
irgendwie hab ich das mit der zeitverzögerung nicht so recht im griff


#include "asuro.h"

int main()


{
unsigned char s1,s2;

Init();

while(1)
{
s1=PollSwitch();
s2=PollSwitch();

if((s1 && s2) == 0)
{
FrontLED(ON);
MotorDir(FWD,FWD);
MotorSpeed(170,150);
StatusLED(GREEN);
}
else
{
MotorDir(RWD, RWD);
MotorSpeed(100,150);
StatusLED(RED);
FrontLED(OFF);
BackLED(ON,ON);
Sleep(255);
}
}

return 0;
}



kann jemand einen fehler finden?

DGS
31.03.2007, 01:10
ein sleep(255) macht nur eine pause von 255/72.000 also rund 3,5ms Laut Anleitung
Versuch mal sowas hier:


for (s1=0; s1 < 250; s1++) { Sleep(255); }

Sollte knapp ne Sekunde dauern die Pause.

drmaettu
31.03.2007, 09:36
hallo und danke
etwa ähnliches hatte ich auch schon versucht, allerdings fährt er bei dieser lösung bereits von anfang an rückwärts, was ich, ehrlich gesagt, nicht verstehe




#include "asuro.h"

int main()


{
unsigned char s1,s2;
int i;
Init();

while(1)
{
s1=PollSwitch();
s2=PollSwitch();

if((s1 && s2) == 0)
{
FrontLED(ON);
BackLED(OFF,OFF);
MotorDir(FWD,FWD);
MotorSpeed(170,150);
StatusLED(GREEN);
}
else
{
MotorDir(RWD, RWD);
MotorSpeed(100,150);
StatusLED(RED);
FrontLED(OFF);
BackLED(ON,ON);
for (i=0; i < 250; i++) { Sleep(255); }
}
}

return 0;
}



könnte ich denn, theoretisch und nur zum testen, einfach mehrere sleepfunktionen hintereinander hängen?? weil alles andere, das ich bisher versuchte hat einfach nicht geklappt
ich weiss, dass das unschön ist, aber dann würde ich immerhin sehen, dass es klappen könnte

MartinFunk
31.03.2007, 09:55
sicherlich kannst du das eine schleife macht ja auch nichts anderes!

Martin

drmaettu
31.03.2007, 10:18
leider funktioniert auch das nicht
könnte ev mal jemand den code durchschauen und sagen, ob er den fehler findet?? langsam aber sicher verliere ich meine motivation :( alles was mit verzögerungen zu tun hat, klappt einfach nicht


edit:
ich korrigiere, solange die pollswitches nicht eingesetzt werden, klappt es tatsächlich
das problem liegt also irgendwo bei den switchs

radbruch
31.03.2007, 11:33
Hallo


könnte ich denn ... mehrere sleepfunktionen hintereinander hängen??
Drei Alternativen:

1. Die Funktion Msleep(zeit) wartet zeit*1miliSek. , ist aber erst in den neueren Versionen der asuro.c verfügbar.

2. Die Funktion Gettime() gibt die Zeit seit dem Systemstart des asuros in milliSek. zurück, ist aber auch erst in den neueren Versionen der asuro.c verfügbar. Anwendung:


unsigned long int stopzeit;

stopzeit=Gettime()+1000;
while(Gettime()<stopzeit);
Wartet eine Sekunde (und man könnte während des Wartens noch was tun in der while-Schleife, z.b. blinken)

3. Mit einem Schleifenzähler der jeden Programmdurchlauf mitzählt ist man unabhängig von den Zeitfunktionen des asuros:


unsigned long int loop_counter, stop_loop;
loop_counter=0;
stop_loop=0;

while(1){
loop_counter++;
if (stop_loop==0) {
Motoren_starten();
stop_loop=loop_counter+1000;
}
if (loop_counter>stop_loop) {
Motoren_stoppen();
}
}
Den Vorteil solcher etwas aufwändigeren Konstruktionen (2.+3.) sehe ich darin, dass man während den Wartezyklen noch was anderes tun kann, z.B. blinken, Tasten abfragen oder einzelne Zeichen per IR-Schnittstelle senden... Bei Verwendung von Sleep() geht das nicht.

Man muss allerdings bei 3. darauf achten, das loop_counter auch innerhalb der Warteschleife hochgezählt wird.


könnte ev mal jemand den code durchschauen und sagen, ob er den fehler findet??
Ob das

if((s1 && s2) == 0)

wie erwarten funktioniert weis ich nicht sicher. s1 && s2 ergibt false wenn s1=0 und s2=0 sind, aber false ist Typ boolean und 0 ist Typ byte(?), also sollte ein direkter Vergleich mit == eigentlich false ergeben: der asuro fährt nur rückwärts. Keine Ahnung, ob das wirklich so ist, aber sicherheitshalber würde ich schreiben:

if ((s1&s2)) == 0)

& ist bitweises Vergleichen und hat als Ergebniss den selben Typ wie s1 und s2. Dies kann man dann bedenkenlos auf ==0 prüfen. Oder man machts gleich so:

if ((s1==0) && (s2==0))

Gruß

mic

drmaettu
31.03.2007, 11:53
erstmal vielen dank, ich verlier bald den überblick :D

also hier ist mal eine abgeänderte version, allerdings fährt er immer noch schon von beginn weg rückwärts



{
unsigned char s1,s2;
int i;
Init();

while(1)
{
s1=PollSwitch();
s2=PollSwitch();

if((s1=0)&&(s2=0))
{
FrontLED(ON);
BackLED(OFF,OFF);
MotorDir(FWD,FWD);
MotorSpeed(170,150);
StatusLED(GREEN);
}
else
{
MotorDir(RWD, RWD);
MotorSpeed(100,150);
StatusLED(RED);
FrontLED(OFF);
BackLED(ON,ON);
for (i=0; i < 250; i++) { Sleep(255); }
}
}

return 0;
}

damaltor
31.03.2007, 12:02
probier mal

if((s1 & s2) == 0)...

m.a.r.v.i.n
31.03.2007, 12:06
Hi,

die Antwort zu deinem Problem hat Radbruch schon gegeben.


if((s1=0)&&(s2=0))

s= 0 und s2= 0 sind Zuweisungen. Ein Wert (0) wird einer Variablen zugewiesen, und deshalb immer wahr. Der if Zweig wird immer durchlaufen.

So ist es richtig. Hier wird ein Vergleich gemacht, keine Zuweisung. Die If Schleife wird nur durchlaufen, wenn beide Bedingungen erfüllt sind.


if ((s1==0) && (s2==0))

drmaettu
31.03.2007, 12:08
gleiche reaktion, fährt von beginn weg rückwärts und reagiert auch nicht auf betätigung der tasten

m.a.r.v.i.n
31.03.2007, 12:13
Hi,

Bei den neueren Bausätzen sind die Motoranschlüsse vertauscht. Damit dreht er in die falsche Richtung. Laß ihn doch einfach mal nur vorwärts fahren, ohne Tasterabfrage. Klappt es dann? Wenn er dann auch rückwärts fährt, müssen die Motoranschlüsse (rot/schwarz) umgelötet werden.

drmaettu
31.03.2007, 12:19
hi, die vorherige antwort war auf damaltor bezogen, du warst nur etwas schneller mit schreiben ;-) allerdings stimmt das mit dem rückwärtsfahren auch bei deiner version...
und die motoren drehen richtig rum, alles andere klappt eigentlich auch...
ev könnte es sein, dass einer der pollswitches defekt ist und dauernd schaltet??

DGS
31.03.2007, 14:29
Das Problem mit den Tastern wird durch die Motoren verstärkt.
Es sollte helfen je 2 10µF Kondensatoren anzuschließen wie folgt:
ersten mit + beim Motor mit Motorgehäuse
zweiten mit - beim Motor mit Gehäuse
Anschließend Gehäuse erden ( zB - bei Batterie )

Das sollte die Schwankungen beim Pollswitch verringern.
Oder du machst mehr Pollswitch abfragen rein. Es reicht eine Variable vollkommen aus:



s = PollSwitch();
s = s & PollSwitch();
s = s & PollSwitch();
s = s & PollSwitch();
if (s==0) {
...

drmaettu
01.04.2007, 03:51
hi, danke für den tipp
hat aber leider immer noch nicht geklappt :-(

DGS
01.04.2007, 10:34
Was hat nicht funktioniert?
Das mit den Kondensator oder Code?



Es könnte dir auch helfen, die Taster manuell neu zu kalibrieren.

Dieses Topic könnte hilfreich sein:
KLICK (https://www.roboternetz.de/phpBB2/zeigebeitrag.php?t=26648#243457)

Andere Alternative wäre es die Motoren von dem Stromkreis zu entkoppeln. Also Motoren an einen Schalter anschließen, den die CPU steuert, aber den Strom direkt von den Batterien beziehen. Dadurch gibts keine Stromschwankungen innerhalb des Systems, wodurch messungenauigkeiten bei den Tastern minimiert werden.

radbruch
01.04.2007, 11:05
hat aber leider immer noch nicht geklappt
Da du im Verlauf dieses Threads schon bewiesen hast, dass du Schwierigkeiten mit dem Kopieren der Codeschnippsel hast, solltest du IMMER deinen aktuellen Code mit in deine Postings setzen.

Gruß

mic

drmaettu
01.04.2007, 12:10
also, von den hardwarelösungen habe ich bisher noch keine ausprobiert, da ich lieber erst alle softwarelösungen versuchen möchte.... ausserdem hab ich grad keine dieser kondensatoren da :-)
aber vielen dank für die tipps, wenns weiterhin nicht klappt, werde ich halt dann in trotzdem in betracht ziehen müssen, am asuro rumzulöten

ok, mit dem folgenden code fährt der asuro von beginn weg rückwärts.
ist irgendwo im code ein grundlegender fehler??



#include "asuro.h"

int main()


{
unsigned char s;
int i;
Init();

while(1)
{
s = PollSwitch();
s = s & PollSwitch();
s = s & PollSwitch();
s = s & PollSwitch();
if (s==0)
{
FrontLED(ON);
BackLED(OFF,OFF);
MotorDir(FWD,FWD);
MotorSpeed(150,150);
StatusLED(GREEN);
}
else
{
MotorDir(RWD, RWD);
MotorSpeed(100,150);
StatusLED(RED);
FrontLED(OFF);
BackLED(ON,ON);
for (i=0; i < 250; i++) { Sleep(255); }
}
}

return 0;
}

radbruch
01.04.2007, 13:34
Aha, scheinbar klemmt es immer noch bei deiner Tastenabfrage. Teste mal mit diesem Code deine Werte:

int sw;
while (1) {
sw=PollSwitch();
SerWrite["\n\r",2);
PrintInt(sw);
}

Bei einzeln gedrückten Tasten sollten folgende Werte geliefert werden:

1 2 4 8 16 32

Bei Tastenkombinationen sollte jeweils die Summe der einzelnen Tasten erscheinen, alle Tasten zusammen müssen 63 ergeben.

In deinem Code solltest du testweise mal einen oder zwei einzelne Taster abfragen (OHNE vorheriges Mehrfacheinlesen der Werte!):

s=PollSwitch();
If ( (s == 2) || (s == 16) ) ... // Prüft jeweils die vorderen Taster
If ( (s == 1) || (s == 32) ) ... // Prüft jeweils die äußeren Taster
If ( s == 18 ) ... // Prüft ob beide vorderen Taste gleichzeitig gedrückt sind (16+2)

Zufällig habe ich heute im AREXX-Forum (http://www.arexx.com/forum) diesen Codeschnipsel gefunden:

if(!(PINC & (1<<PC4)))

Er prüft nur, ob überhaupt eine Taste gedrückt wurde. Ich habe es noch nicht ausprobiert, aber die Quelle bürgt für Funktion.

(Der direkte Pfad zum betreffenden Thread lautet http://www.arexx.com/forum/v i e w t o p i c.php?p=1323#1319 (http://www.arexx.com/forum/viewtopic.php?p=1323#1319) und kann hier im RN-Forum nicht als Link angegeben werden, weil das Forum den Link "eindeutscht" und automatisch aus v i e w t o p i c.php ein zeigebeitrag.php macht)

Gruß

mic

DGS
01.04.2007, 14:14
C:\[...]FirstTry/test.c:27: undefined reference to `PrintInt'

Kurz gesagt, kannst du mal die PrintInt() function posten?

radbruch
01.04.2007, 15:56
Aus der asuro.c:


void PrintInt(int wert)
{ char text[6]=" ";
itoa(wert,text,10);
SerWrite(text,5);
}

damaltor
01.04.2007, 16:49
die ist in der neuen library zu finden. entweder du verwendest die version 2.70 aus einem der aktuellen threads (etwas komplizierter, aber neuer) oder du nutzt die version 2.61 von hier: http://sourceforge.net/project/showfiles.php?group_id=155217

da musst du nur die asuro.c und die asuro.h in das verzeichnis deines quellcodes entpacken und damit die dateien der cd überschreiben.

drmaettu
01.04.2007, 17:31
if(!(PINC & (1<<PC4)))


dank diesem code hats funktioniert... vielen vielen dank :-D juhui :-D