PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Hilfe bei Programmierung



wenckstar
09.04.2012, 21:30
Hallo miteinander,

Hatte dieses schöne Programm geschrieben, doch leider gibt es bei Ausführung von make all eine Fehlermeldung. Könnte mir dabei jemnd helfen wäre echt super nett.

Make all
avr-gcc (WinAVR 20100110) 4.3.3
Copyright (C) 2008 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.


Compiling: FWDBWD.c
avr-gcc -c -mmcu=atmega32 -I. -gdwarf-2 -Os -funsigned-char -funsigned-bitfields -fpack-struct -fshort-enums -Wall -Wstrict-prototypes -Wa,-adhlns=FWDBWD.lst -I../../RP6Lib -I../../RP6Lib/RP6base -I../../RP6Lib/RP6common -std=gnu99 -MD -MP -MF .dep/FWDBWD.o.d FWDBWD.c -o FWDBWD.o
FWDBWD.c: In function 'main':
FWDBWD.c:12: warning: implicit declaration of function 'Dist_MM'
FWDBWD.c:12: error: expected ')' before ';' token
FWDBWD.c:19: error: too few arguments to function 'move'
FWDBWD.c:19: error: expected ';' before '}' token
FWDBWD.c:19: error: expected declaration or statement at end of input
FWDBWD.c:9: warning: unused variable 'distance'
FWDBWD.c:8: warning: unused variable 'dir'
make.exe: *** [FWDBWD.o] Error 1
> Process Exit Code: 2#include "RP6RobotBaseLib.h"



Programm

int main(void)
{
initRobotBase();
powerON();
uint8_t dir;
uint16_t distance;
while(true)
{
move(30,FWD,Dist_MM(300);
moveAtSpeed(0,0);

move(30,BWD,Dist_MM(300);
moveAtSpeed(0,0);
}
return 0;
}[/B]

RolfD
09.04.2012, 22:41
Hallo Wenkstar,
das Programm hat mal rein garnichts schönes...


FWDBWD.c:12: error: expected ')' before ';' token

expected heißt "erwartet", es fehlt wohl ein ) vor dem ;?


move(30,FWD,Dist_MM(300);

wieviel Klammern gehen da also auf und wie viele zu?
Bei BWD genau so....


moveAtSpeed(0,0);
dürfte nach dem move Befehl auch wenig Sinn machen, vielleicht guckst du dir mal an was in der RP6RobotBaseLib.c
zur Funktion "moveAtSpeed" und "move" steht... oder exerzierst erst mal alle Beispielprogramme und Libs durch.. incl. lesen und verstehen der Sources.

Mal abgesehen davon, das "move" 4 Parameter hat wie in den Lib Sources zu sehen und nicht 3 wie in deinem Aufruf,

FWDBWD.c:19: error: too few arguments to function 'move'
begehst du noch einen logischen Fehler obwohl der Compiler dies schon anmeckert.

Du möchtest das der Bot sich 300mm vorwärts bewegt und stehen bleibt, dann 300mm zurück fährt und stehen bleibt.
Dazu schickst du einen verkorksten Move Befehl ab.. und dann ein moveAtSpeed(0,0); also quasi als "Stop" Befehl.

Das ist wie wenn ich Dir sage, "gehe 10 Schritte" ... was machst du nach den 10 Schritten normalerweise? Stehenbleiben? Aha! Und dann wenn du stehst sag ich dann noch mal "stehen bleiben" oder wie?

Genau das machst du da im Programm. Logisch falsch! Steht auch genau so im Source...



* This function allows you to tell the robot to drive a specific distance
* at a given speed and then stop.


Ein extra Stop macht nur bei einer unbefristeten Bewegung wirklich Sinn z.B. an einem Hindernis... und dazu muss man auch erst mal die Interuptstruktur, blocking, Odometrieauswertungen usw. verstanden haben.
Nebenbei - es gibt auch einen echten Stop Befehl... auch im Lib Source zu finden.

Das sind Anfängerfehler aber nicht ohne Grund wird Anfängern auch dringenst empfohlen, sich die Beispiele genau anzugucken.
Dieser Tip ist nicht nur als sinn- und zweckfreie "nice to do" Aufgabe gedacht.

Der Compiler sagt dir ausserdem doch deutlich wo es klemmt... les das bitte auch und behebe es selbstständig. In dem kurzen Stück Programm stecken schon 4 syntaktische und 2 logische Fehler so wie 2 warnings wegen ungenutzter Vars und einem Denkfehler zum Ablauf, du achtest nicht auf die Compilermessages und schaust dir auch nicht die gut dokumentierten Funktionsköpfe in den Libs an. Es gehört schon etwas mehr Präzision zum programmieren. Schön ... ist was anders.

Gruß Rolf

wenckstar
15.04.2012, 10:58
Vielen Dank für die Antwort,
Ja stimmt das Prog hatte echt nicht schönes.
das ist mir schon klar wo ich etwas finde. Ich muss es ja auch verstehen.
Z.B. bei den Programm: Jetzt möchte ich gerne noch eine Distance fahren 300, dann stoppen, noch die Richtung ändern und wieder zurückfahren. das ganze soll er 30 mal machen.

Später will ich noch einen von den 2 en Ports die frei sind beschalten.

Wie und wo setze ich diese Dinge ein?

void stop(void)
{
mleft_des_speed = 0;
mright_des_speed = 0;
left_i = 0;
right_i = 0;
motion_status.move_L = false;
motion_status.move_R = false;
motion_status_tmp = motion_status.byte;
MOTIONCONTROL_stateChangedHandler();
}

void changeDirection(uint8_t dir)
{
drive_dir = dir;
mleft_des_dir = (dir == BWD || dir == LEFT);
mright_des_dir = (dir == BWD || dir == RIGHT);
}
DIST_MM(DISTANCE)


#include "RP6RobotBaseLib.h"

int main(void)
{
initRobotBase();

powerON();

moveAtSpeed(30,30);

while(true)
{

task_motionControl();

task_ADC();
}
return 0;
}

Danke

RolfD
16.04.2012, 02:13
Ich empfehle dir nun schon zum zweiten mal, dir erst die Beispiele/Examples aus den Libs - insbesondere die Porgramme Example_05_Move_01 bis Example_05_Move_05 aus den RP6BASE_EXAMPLES durchzuarbeiten. Also lesen, verstehen, ausprobieren, verändern usw... Es macht einfach keinen Sinn, dir irgend was zu erklären wenn du die Grundlagen nicht verstanden hast.
LG Rolf