PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Wo liegt der Fehler?



julien
18.05.2005, 17:40
Hallo! Ich habe den Asuro zu meinem Geburtstag gestern bekommen. Alles Funktioniert.
Nun versuche ich schon ein eigenes Programm für den Asuro zu schreiben, das so aussieht:


#include "asuro.h"

int main(void){
Init()
MotorDir(FWD,FWD);
MotorSpeed(120,120);
StatusLED(GREEN);
while(PollSwitch()==0){
SerWrite("Alles OK!\n",10);
}
MotorSpeed(0,0);
StatusLED(RED);
while(1){
SerWrite("Aua!\n",5);
}
}

Nun habe ich das Problem mit dem Make. Ich speichere den Quellcode unter der Datei test.c und klicke auf "make". Dann schmeisst er mir jedoch folgendes raus:

C:\ASURO_src\FirstTry>make all
set -e; avr-gcc -MM -mmcu=atmega8 -I. -g -Os -funsigned-char -funsigned-bitfields -fpack-struct -fshort-enums -Wall -Wstrict-prototypes -Wa,-ahlms=test.lst test.c \
| sed 's,\(.*\)\.o[ :]*,\1.o \1.d : ,g' > test.d; \
[ -s test.d ] || rm -f test.d
-------- begin --------
avr-gcc --version
avr-gcc (GCC) 3.3.1
Copyright (C) 2003 Free Software Foundation, Inc.
This is free software; see the source for copying conditions. There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.

avr-gcc -c -mmcu=atmega8 -I. -g -Os -funsigned-char -funsigned-bitfields -fpack-struct -fshort-enums -Wall -Wstrict-prototypes -Wa,-ahlms=test.lst test.c -o test.o
test.c: In function `main':
test.c:5: error: parse error before "MotorDir"
MAKE.EXE: *** [test.o] Error 1


> Process Exit Code: 0

Wo liegt jetzt der Fehler im Quellcode? Ich habe vor "MotorDir" keinen entdecken können. Für Profis mag das wohl kein Problem darstellen aber ich bin ein völliger Neueinsteiger in das Gebiet Robotik und C-Programmierung. Vielen Dank schonmal im Voraus für eure Hilfe, damit ich endlich weiter machen kann mit dem selber Programme schreiben.

PicNick
18.05.2005, 17:51
Wenn das dein Code ist, fehlt das Semikolon beim init()

julien
18.05.2005, 18:19
Achso! Wenn ich das Semikolon hinmache, funktionierts. Aber im Handbuch zu Asuro steht kein Semikolon bei dem Beispiel... komisch

Aber ich habe noch eine Frage:
Wie kann ich mit SerWrite() Variablen ausgeben? Es soll sowas ähnliches wie das hier sein:
SerWrite("Umdrehungen gesamt: (Variable a) [Links] (Veriable b) [Rechts] ",100);

PicNick
19.05.2005, 07:37
Semikolon:Das ist C-Standard allgemein.

SerWrite :
Da kommt's auf deine C-Library an.
Normalerweise wär das sowas wie "printf()".
Da würde das aussehen (z.B)

printf("Umdr.gesamt:(Variable %d)...(Variable %d)\n", a, b);

Type "Help" for help

julien
12.06.2005, 09:54
Joa, danke! Ich werd's mal damit versuchen. Ich habe nämlich in der Programmiersprache C fast keine Ahnung.

julien
12.06.2005, 09:59
Ne, klappt leider nicht. Da ich dann am Ende noch mehr Angaben als nötig habe, sagt er mir, dass da zu viel dran ist. Geht das nicht noch irgendwie anders?

PicNick
12.06.2005, 10:06
Kollege, jetzt brauchen wir den aktuellen code und die Fehlermeldungen. "Irgendwie anders" geht's fast immer

MSSputnik
12.06.2005, 10:12
Hi,

ich mach das so:
char string1[255];
snprintf(string1,255,"+++| %4d | %4d | %4d | %4d | %4d | %4d |---\r\n",pos[ODLEFT],pos[ODRIGHT],pos[IRLEFT],pos[IRRIGHT],pos[ADCSWITCH],pos[ADCBATT]);
SerWrite(string1,strlen(string1));

Oben mußt du noch
#include <stdio.h>
#include <string.h>
angeben.

snprintf ist so etwas wie printf, schreibt den String nur in eine Variable.
Und dass kannst du dann über SerWrite ausgeben.

julien
12.06.2005, 10:48
Hallo! Danke erstmal für deine schnelle Antwort.
Wie ich schon gesagt habe, bin ich ein C-Neueinsteiger.
Ich habe noch einige Frage:
1. Was hat %4d für eine Bedeutung
2. Was hat pos[...] für eine Bedeutung
3. Muss man noch irgendwas bei den Variablen ODLEFT, ODRIGHT, IRLEFT, IRRIGHT usw. vorher festlegen oder so?
4. Was soll das ADCSWITCH und ADCBATT?

MSSputnik
12.06.2005, 21:18
Hi,

sorry, ich habe einfach eine Zeile aus meinem Code kopiert, ohne grösser darüber nachzudenken.

snprintf hat ungefähr die gleiche funktion wie printf. Verwendet also auch die selben Formatcodes.
%d bedeutet eine Integer Variable
%4d bedeutet eine Integer Variable, für die 4 Zeichen reserviert werden.

das mit dem Pos usw. ist einfach aus meinem Code und sollte eigenlich nur demontrieren, wo man die Variablen dann angibt.

Vielleicht zur Verdeutlichung ein paar Beispiele:
snprintf(string,10,"Hallo Welt!!!!\r\n"); -> string enthält dann "Hallo Welt" Da String max. 10 Zeichen Aufnehmen darf.

snprintf(string, 40,"Wert 1: %d",variable1); -> string enthält dann "Wert 1: 100", wenn die variable1 den Wert 100 enthält.

snprintf(string,40,"Wert 1: %4d, Wert 2: %4d",variable1,variable2); -> string enthält dann "Wert 1: 1, Wert 2: 1234" wenn die variable 1 den Wert 1 und variable2 den Wert 1234 enthält.

Kurzes Google nach 'printf format codes' hat z.B. folgende Seite ergeben:
http://www.ee.surrey.ac.uk/Personal/R.Bowden/C/printf.html

Weja
13.06.2005, 10:47
Hallo Julien,
sieh Dir mal das an:
https://www.roboternetz.de/phpBB2/viewtopic.php?t=7571
Diese Bibliothek enthält die Funktion PrintInt() für die Ausgabe von Integerwerten beim ASURO. Auch die anderen Erweiterungen sind speziell für Programmieranfänger gedacht.
Gruß
Weja

julien
31.10.2006, 17:52
Klappt doch schonmal super! Vielen Dank!
Bloß die Timer-Werte stimmen nicht ganz. Wenn ich mit Time() die Zeit in Millisekunden ausgeben lasse, gibt es eine Abweichung. Ich wollte nämlich eine Uhr oder sowas in der Art programmieren doch daraus wird wohl nichts :-)

MfG julien

Weja
31.10.2006, 19:59
Uff. Deine Antwort kommt ja schon nach 16 Monaten. Du nimmst das i mit der Zeit auch njicht so genau. Das ist alles ziemlich lange her. Die Zeitfunktion ist nicht auf Genauigkeit geschrieben. Das müsste man anpassen. Die war eigentlich so gedacht, dass man im Programm kleinere Zeiteinheiten messen kann. Z.B dreh dich 3 Sekunden lang.
Gruß
Weja

julien
01.11.2006, 16:35
Ok, danke für die Info :-)

Asuro^^
22.02.2007, 18:07
also ich hab mir den asuro gekauft und in zusammen gebastelt ich bekomme aber kein programm drauf!? leider hab ich auch keine ahnung wie das mit der c programmierung geht^^ alo bitte helf mir

#include "asuro.h"
#include "aslib.c"
int main(void)
{ int diff;
Init();
Encoder_Init();
MotorDir(FWD,FWD);
MotorSpeed(175,175);
while(1){
diff=encoder[RIGHT]-encoder[LEFT]; // diff statt div
MotorSpeed(175+diff,175-diff);}
while(1);
return 0;
}

das ist mein programm das ich geschrieben hab aber er spielt es nicht ab


!!!!!!HILFE!!!!! :-s

julien
06.03.2007, 12:48
Hallo!
So viel Ahnung hab ich leider auch nicht, da ich lange nicht mehr in C programmiert habe.aber vielleicht gehts ja so:


#include "asuro.h"
#include "aslib.c"
int main(void)
{
int diff;
Init();
Encoder_Init();
MotorDir(FWD,FWD);
MotorSpeed(175,175);
while(1){
diff=encoder[RIGHT]-encoder[LEFT]; // diff statt div
MotorSpeed(175+diff,175-diff);}
}
return 0;
}


Das while (und return), dass du in der while-Schleife noch mit drin hattest, war zu viel. Da hat sich das dran aufgehängt.

MfG
julien

Asuro^^
06.03.2007, 13:23
danke!!!!
hat auch noch jemand nen fertiges programm wo er z.b. ausweicht wenn er igendwo gegen fährt? :-s

julien
06.03.2007, 13:33
Ich hatte schonmal vor geraumer Zeit solch ein Programm geschrieben...
Hier der Quellcode:


//Programm zum Umfahren von Hindernissen mithilfe der Infrarot-Hinderniserkennung von waste
//zusammengestellt und programmiert von julien

#include "asuro.h"
#include <stdlib.h>

int main(void)
{
float puls;
unsigned int Rmin = 1024, Rmax = 0, Lmin = 1024, Lmax = 0, Rmitte = 512, Lmitte = 512, lspeed=150, data[2], richt=0, wegr=0, wegl=0, auswl=0, auswr=0, schritt=0, vorhe=0r;
unsigned char flagl=FALSE, flagr=FALSE, hindernis=FALSE;
Init();
DDRD |= (1 << DDD1); // Port D1 als Ausgang
PORTD &= ~(1 << PD1); // PD1 auf LOW
puls = 1;
while(1)
{
while(hindernis==FALSE){
if (PIND & (1 << PD0)){
StatusLED(GREEN); // kein Hindernis
} else {
vorher=(int)(puls);
hindernis=TRUE;
StatusLED(RED); // Hindernis erkannt
}
puls = 1.02 * puls; // Pulsbreite wird um 2% erhöht
if (puls > 10){
if (PIND & (1 << PD0)) hindernis=0;
puls = 1;
exit;
}
OCR2 = 255 - (int)(puls);
}

if(hindernis==TRUE){ //"gucken", wo noch ein freier Weg ist und diesen dann fahren
if(schritt==0){ //nach rechts gucken
MotorDir(FWD,RWD);
Msleep(500);
}
if(schritt==1){
auswr=(int)(puls);
}
if(schritt==2){ //nach links gucken
MotorDir(RWD,FWD);
Msleep(1000);
}
if(schritt==3){
auswl=(int)(puls);
MotorDir(FWD,RWD);
Msleep(500);
}
if(schritt==4){ //richtigen weg fahren
if(auswr<vorher) richt=1;
if(auswl<vorher) richt=2;
if(auswr==auswl) richt=3;
hindernis=FALSE;
schritt=0;
}
if(schritt<4) schritt++;
}

if(hindernis==FALSE){ //kein Hindernis in Sicht - geradeaus fahren
richt=0;
schritt=0;
OdometrieData(data); // 0. links, 1. rechts
// max links
if (data[0] > Lmax)
Lmax += (data[0] - Lmax) / 2;
// min links
if (data[0] < Lmin)
Lmin -= (Lmin - data[0]) / 2;
// max rechts
if (data[1] > Rmax)
Rmax += (data[1] - Rmax) / 2;
// min rechts
if (data[1] < Rmin)
Rmin -= (Rmin - data[1]) / 2;
Rmitte=(Rmax+Rmin)/2;
Lmitte=(Lmin+Lmax)/2;
if ((data[0] < Lmitte) && (flagl == TRUE)) {
flagl = FALSE;
wegl++;
}
if ((data[0] > Lmitte) && (flagl == FALSE)) {
flagl = TRUE;
wegl++;
}
if ((data[1] < Rmitte) && (flagr == TRUE)) {
flagr = FALSE;
wegr++;
}
if ((data[1] > Rmitte) && (flagr == FALSE)) {
flagr = TRUE;
wegr++;
}
if(wegl<wegr) lspeed++;
if(wegl>wegr) lspeed--;
if(wegl>=65000){ wegr=wegr-65000; } //zurücksetzen, damit kein Überlauf nach
if(wegr>=65000){ wegl=wegl-65000; } //längeren Fahrten passiert
}
if(richt==0) MotorDir(FWD,FWD); //geradeaus
if(richt==1) MotorDir(RWD,FWD); //links
if(richt==2) MotorDir(FWD,RWD); //rechts
if(richt==3) MotorDir(RWD,RWD); //zurück
MotorSpeed(lspeed,150);
}
return 0;
}

Erklärung: wenn ein Hindernis vor ihm erkannt wird, guckt er nach links und dann nach rechts und ermittelt somit, in welcher richtung das Hindernis entfernter ist. Dann fährt er in diese Richtung. Ist kein Ausweg zu erkennen, fährt er zurück.

Leider funktioniert es nicht ganz richtig. Deshalb ist es sehr verbesserungswürdig...
Kann mir bitte jemand bei diversen Verbesserungsarbeiten helfen?

MfG
Julien

Asuro^^
06.03.2007, 13:35
cool danke wenn es immer noch net geht komm ich noch mal auf dich zurück^^

Asuro^^
06.03.2007, 13:43
geht nicht er spielt es einfach net ab kann es sein das ich was falsch mache??

julien
06.03.2007, 14:32
Hmm, ka. Vielleicht kann uns ja bitte jemand anders helfen?

m.a.r.v.i.n
06.03.2007, 16:31
Hi,



geht nicht er spielt es einfach net ab kann es sein das ich was falsch mache??


Was geht denn nicht. Läßt sich das Programm nicht übersetzen, oder tut es nur nicht das was es soll?

Das Programm von julien ist allerdings für einen Asuro mit umgebauter IR Schnittstelle gedacht.
Umbau siehe hier:
https://www.roboternetz.de/phpBB2/viewtopic.php?t=27013

Vielleicht solltest erst mal mit was einfacherem anfangen. Status LED blinken lassen oder so.

julien
07.03.2007, 20:33
Hi!
Ach ja, das hab ich ja total vergessen zu erwähnen :wink:
Aber trotzdem hat mein Programm Macken :-(

MfG
Julien