PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Problem mit C!!!



Dreamer001
28.12.2006, 17:31
Hallo!

Habe ein Problem!

Asuro soll wenn Kollisionstaster gedrückt ist rückwärts fahren, nur habe ich das problem dass wenn ich den Taster loslasse wieder aus der Schleife rausfällt und wieder vorwärts fahrt!

Mit Timer habe ich es probiert, hat aber irgendwie nicht geklappt!

Der Code ist ein Grundgerüst, bitte um hilfe dass Asuro nach loslassen auch noch zurückfährt.



P.S. meine C.lektüre ist zum vergessen, gibt es im netz wo freeware C-Bücher???

Mfg
Roland

#include "asuro.h"

int main()
{
unsigned int i;

Init();
while(1)
{
if (PollSwitch() == 0)
{
StatusLED (GREEN);
MotorDir(RWD,RWD);
MotorSpeed(120,120);
}

else
{
i==0;
StatusLED (YELLOW);
for(i=0;i < 847;i++);
{
MotorDir(FWD,FWD);
MotorSpeed(200,200);
}
}
}
}

uwegw
28.12.2006, 17:36
Asuro soll wenn Kollisionstaster gedrückt ist rückwärts fahren, nur habe ich das problem dass wenn ich den Taster loslasse wieder aus der Schleife rausfällt und wieder vorwärts fahrt!
Du bräuchtest als ne Funktion, die dem Programmablauf einfach ne gewisse Zeit pausieren lässt, damit der Asuor erstr mal ne gewisse Zeit rückwärts fährt, bis der Taster wieder abgefragt wird. Die nennt sich _delay_ms(); und steht in der Datei delay.h.
So kommst du dran:
#include <util/delay.h>
am Aunfagn des Programms, nach #include "asuro.h"

Aufrufen könntest du sie dann über diese Funktion
void warte (int loop) //loop: wartezeit in ms
{
int i;
for(i=0;i<loop;i++) _delay_ms(1);
}
Der Parameter loop gibt die Wartezeit in Milisekunden an. Bei warte(500); würde der Asuro als ne halbe Sekunde rückwärts fahren.





P.S. meine C.lektüre ist zum vergessen, gibt es im netz wo freeware C-Bücher???

C allgemein:
http://de.wikibooks.org/wiki/C-Programmierung
und die AVR-Spezifischen Sachen:
http://www.mikrocontroller.net/articles/AVR-GCC-Tutorial

damaltor
28.12.2006, 22:18
oder du lässt ihn einfach mit sleep() oder Msleep() abwarten, dann musst du nix weiter einbinden.

ein tolles c-buch ist auch "c von a bis z", welches du hier
http://www.pcronix.de/pronix-4.html
lesen kannst (mit suchfunktion) und hier
http://download.galileo-press.de/openbook/c_von_a_bis_z/galileocomputing_c_von_a_bis_z.zip
runterladen kannst (8,5 mb; ohne suchfunktion)

Dreamer001
29.12.2006, 17:55
erstmal danke!

Das mit der Sleep-funktion hätte ich so schon probiert ging aber nicht :-(

wie könnte so ein Konstrukt aussehen??

Mfg
Dreamer001

P.S. danke für die links!!!

der_andi
29.12.2006, 18:22
Ungefähr so:


#include "asuro.h"

int main()
{
unsigned int i;
int zaehler; //die ist neu

Init();
while(1)
{
if (PollSwitch() == 0)
{
StatusLED (GREEN);
MotorDir(RWD,RWD);
MotorSpeed(120,120);

/*jetzt de interessante Teil, wir lassen Asuro 500 mal
*hintereinander ein kleines Päuschen einlegen*/
for(zaehler = 0; zaehler <= 500; zaehler++)
{
Sleep(74); /*Bewirkt das Asuro genau 1 ms "schläft",
*er fährt dabei aber weiterhin rückwärts!*/
}
//Das wars, ab hier wieder normal weiter

}

else
{
i==0;
StatusLED (YELLOW);
for(i=0;i < 847;i++);
{
MotorDir(FWD,FWD);
MotorSpeed(200,200);
}
}
}
}

Das funktioniert auch ohne extra-Sachen einzubinden mit der Asuro.h die mitgeliefert wird, wenn dir der Code oben nix sagt dann mach dich nochmal über die sogenannte "for-schleife" schlau, nützliches dingens.
http://www.pronix.de/pronix-689.html

AxelZ
03.01.2007, 10:47
Hallo, entschuldigt bitte,
ich bin ein 0-Ahnung Programmierneuling.
Habe meinem 13jährigem Sohn einen Asuro zu Weihnachten geschenkt,
komplett aufgebaut (Testprogramm läuft ohne Fehler inc. Datenübermittlung via USB & RS232). Aber nun ist Vaters Wissen am Ende. Welche Bücher für einen Schnelleinstieg soll ich wählen, wie kann ich ihm was erklären was ich noch nie gemacht habe?
Ich hoffe auf kompetente Hilfe. :-s

Mfg Axel

radbruch
03.01.2007, 12:31
Hallo

Hier mal mein Ansatz:


/* asuro fährt nach Anstoss einstellbare Zeit zurueck
mic 3.1.2007
*/
#include <asuro.h>

unsigned long zurueckzeit; // Zeit Rueckwaerts in Millisekunden
unsigned char sw; // Zwischenspeicher für Schalter k1-k6

int main(void) {
Init();

zurueckzeit=0; // vorwärts losfahren
MotorDir(FWD,FWD);
MotorSpeed(150,150);

/* Achtung! Das funzt nur wenn die Taster richtig erkannt werden,
sonst bleibt der asuro auf freier Strecke stehen!
*/

do {
sw=PollSwitch(); // Schalter einlesen und für eine Runde speichern

if (!zurueckzeit && ((sw==2) || (sw==16))) {
zurueckzeit=Gettime()+1000; // Aktuelle Zeit plus x millisek. zurueck
MotorSpeed(0,0);
MotorDir(RWD,RWD); // Bei unterschiedlichen Geschwindigkeiten
MotorSpeed(100,100); // dreht der asuro beim Zurueckfahren ;-)
}

if (zurueckzeit && (Gettime() > zurueckzeit)) { // Lange genug zurueck?
MotorSpeed(0,0);
MotorDir(FWD,FWD);
MotorSpeed(150,150);
zurueckzeit=0;
}

}while (1); // mainloop (Endlosschleife)

return 0;
}
(Ich werte hier nur zwei Taster aus wegen der Störimpulse der Mots)

@AxelZ: Ich denke, dass asuro-Buch wäre für dich das Richtige

Gruß

mic

AxelZ
03.01.2007, 14:50
Hallo mic und alle anderen,
schönen Dank für die Idee, wenn Du das blaue Buch mit der Zusatzplatine meinst, das habe ich schon vor dem Asuro gekauft um überhaupt eine Vorinfo
zu haben. Die weisen aber in dem Buch immer auf die Anleitung hin aber die Beschreibungen in der Anleitung sind für mich relativ Hand und Fußlos ( nicht Kopflos ) aber eben schwer zu verstehen.
Danke
Mfg Axel :cry:

AxelZ
03.01.2007, 14:50
Hallo mic und alle anderen,
schönen Dank für die Idee, wenn Du das blaue Buch mit der Zusatzplatine meinst, das habe ich schon vor dem Asuro gekauft um überhaupt eine Vorinfo
zu haben. Die weisen aber in dem Buch immer auf die Anleitung hin aber die Beschreibungen in der Anleitung sind für mich relativ Hand und Fußlos ( nicht Kopflos ) aber eben schwer zu verstehen.
Danke
Mfg Axel :cry:

radbruch
03.01.2007, 15:53
Hallo


Hallo mic und alle anderen,
schönen Dank für die Idee, wenn Du das blaue Buch mit der Zusatzplatine meinst, das habe ich schon vor dem Asuro gekauft um überhaupt eine Vorinfo zu haben.
Aha, das wusste ich ja nicht. Überhaupt ist es sehr schwer euch Tipps zu geben da ich euren "Wissensstand" nicht kenne. Deshalb mal ein kleiner Check:

Könnt ihr eigene Leerschleifenprogramme erstellen und diese zum asuro flashen und dann Testen?

Wenn ja, ist euch auch halbwegs klar, was ihr da macht?

Wenn nein, wo klemmts?

-Programme erstellen (Welche Software? Sinn eines Programms?)
-Compilieren (Hä? Welcher Compiler? Version?)
-Flashen (Welche Software? Version?)
-Testen (Was soll passieren? Was funzt und was nicht? Quellcode des Programms?)

Wenn ihr mit "ja" antworten könnt, habt ihr die Grundlagen fürs "echte" Programmieren des asuros schon und wir können loslegen. Wenn nicht müssen wir noch klären, wo es bei euch klemmt.

gruß

mic

Dreamer001
05.01.2007, 09:55
#include "asuro.h"

void main()
{
int zaehler;

Init();
while(1)
{
if (PollSwitch() == 0)
{
StatusLED (GREEN);
MotorDir(FWD,FWD);
MotorSpeed(120,120);
}

else
{
StatusLED (RED);
MotorDir(RWD,RWD);
MotorSpeed(200,200);
for(zaehler=0; zaehler < 1000; zaehler++);
{
Sleep(255);
}
}
}
}


So hier mal mein derzeitger Code!
Asuro fährt bei drüken des Tasters zwar Rückwärts, aber ich schaffe es nicht ihn z.b. 3sec lange zurückfahren zu lassen!
Was ist falsch an meinem Prog?

Bitsch
05.01.2007, 12:47
Hallo Dreamer001!

Deine Sleep()-Anweisung ist ausserhalb deiner Zählerschleife.

Also so:

for(zaehler=0; zaehler < 1000; zaehler++) Sleep(255);

der_andi
05.01.2007, 14:16
Dein Code:

for(zaehler=0; zaehler < 1000; zaehler++);
{
Sleep(255);
}

Mein Code:

for(zaehler=0; zaehler < 1000; zaehler++)
{
Sleep(255);
}

Ich hab lediglich ein einziges Zeichen entfernt, Tippfehler können fatal ausfallen...

Dreamer001
09.01.2007, 20:05
habe nach sleep den ; weggegeben sowie davor und danach die } weggegeben und nun fährt er nur noch zurück..

was nun?

damaltor
09.01.2007, 20:24
das ist falsch. hinter sleep der ; bleibt. hinter for(......) der ; kommt weg.
alles andere bleibt.

Dreamer001
09.01.2007, 20:34
hilft leider auch nichts

damaltor
10.01.2007, 13:29
poste bitte nochmal deinen code in der aktuellen fassung.

Dreamer001
13.01.2007, 16:04
So hier die aktuelle Version, die zumindest funktioniert, da die for Schleife eigenständig ist, das heißt asuro fährt die selbe Zeit an die er auch dann zurück fährt!!
nur wenn ich nur eine geschwungene Klammer verändere, dass heißt ich gebe die for schleife in das else hinzu dann fährt er dauerhaft zurück.

//bitte um hilfe





#include "asuro.h"

void main()
{
int zaehler;

Init();
while(1)
{
if (PollSwitch() ==0)
{
StatusLED (GREEN);
MotorDir(FWD,FWD);
MotorSpeed(120,120);
}
else
{
StatusLED (YELLOW);
MotorDir(RWD,RWD);
MotorSpeed(100,200);
}
for(zaehler=0; zaehler < 800; zaehler++)
{
Sleep(255);
}
}
}

damaltor
14.01.2007, 15:00
schreibe das hier

for(zaehler=0; zaehler < 800; zaehler++)
{
Sleep(255);
}

mit in die else-schleife rein.

Dreamer001
14.01.2007, 19:30
er dreht sich dauerhaft rückwärts..

könnte bitte mal jmd von euch meinen code am asuro probieren um zu schauen obs geht od nicht?

danke

radbruch
14.01.2007, 20:10
Hallo

Um den Zähler beim Zurückfahren auch zu beachten muss er im else-Zweig sein. Also nicht so:

else
{
StatusLED (YELLOW);
MotorDir(RWD,RWD);
MotorSpeed(100,200);
} // Ende else
for(zaehler=0; zaehler < 800; zaehler++)
{
Sleep(255);
}

sondern so:

else
{
StatusLED (YELLOW);
MotorDir(RWD,RWD);
MotorSpeed(100,200);
for(zaehler=0; zaehler < 800; zaehler++)
{
Sleep(255);
}
} // Ende else

Trotz der Änderung wird dein asuro vermutlich endlos zurückfahren weil die Abfrage von PollSwitch() auf "gleich 0" wegen Brumm-Störungen nicht zuverlässig funktioniert. Drehe die Abfrage um und prüfe auf PollSwitch() " gleich 1" bzw. 2, 16 oder 32 (jeweils die äußeren zwei Taster) und fahre bei erkanntem Wert zurück, sonst fahre vorwärts. (Beispiel (https://www.roboternetz.de/phpBB2/viewtopic.php?t=26416))

Gruß

mic