PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Probleme mit der Programmierung



CubeFan2003
23.04.2012, 11:22
Hallo liebe Community,

Ich habe gestern abend meinen Asuro fertiggestellt und der Selbsttest hat auch wunderbar geklappt, also war das erste mal auf einer Platine gar nicht mal so schlecht ;)

Dann jetzt mein Problem:

Die Bsp: im handbuch sind ja fürn A.... Selbst wenn man die 1:1 übernimmt laufen die zum teil nicht da ein ";" oder so fehlt.

Naja dann wollte ich mal ein ganz einfaches und simples Programm schreiben das die Statusled solange Grün ist bis ein Kollisoonstaster gedrückt wird, dann soll sie Rot werden.
Wie gesagt ganz simpel. habe es mit einer If/else funktion versucht:


#include “asuro.h”
int main(void) {
if (PollSwitch()==0)
{StatusLED(GREEN);}
else
{StatusLED(RED);}
return 0;
}

Das Problem ist wenn ich das Make Tool drüberlaufen lasse das die fehler finden soll zeig er mir das an:


> "C:\ASURO_src\FirstTry\Test-all.bat"

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
test.c:1:10: error: #include expects "FILENAME" or <FILENAME>
-------- begin --------
avr-gcc --version
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.

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:1:10: error: #include expects "FILENAME" or <FILENAME>
test.c: In function 'main':
test.c:3: warning: implicit declaration of function 'PollSwitch'
test.c:4: warning: implicit declaration of function 'StatusLED'
test.c:4: error: 'GREEN' undeclared (first use in this function)
test.c:4: error: (Each undeclared identifier is reported only once
test.c:4: error: for each function it appears in.)
test.c:6: error: 'RED' undeclared (first use in this function)
make: *** [test.o] Error 1

> Process Exit Code: 2
> Time Taken: 00:00

Ich verstehe das garnicht denn es ist doch richtig so oder? Besonders das: "test.c:1:10: error: #include expects "FILENAME" or <FILENAME>" wundert mich etwas da es ja immer das selbe ist mit #include “asuro.h”

Ich hoffe ihr könnt mich aufklären und mir sagen was ich falsch mache, denn aus der Betriebsanleitung werde ich nciht schlau :( kennt ihr auch eine Lektüre die sinnig wäre etwas besser mit der Programiring klar zu kommen?
Vielen Dank für eure hilfe

markusj
23.04.2012, 11:47
Anführungszeichen richtig (Shift+2)? Und zu deinem Code: Der funktioniert nicht, du musst das ganze noch in eine Endlosschleife packen. Sonst wird die Fallunterscheidung nur genau einmal ausgeführt.

mfG
Markus

CubeFan2003
23.04.2012, 12:55
Anführungszeichen richtig (Shift+2)? Und zu deinem Code: Der funktioniert nicht, du musst das ganze noch in eine Endlosschleife packen. Sonst wird die Fallunterscheidung nur genau einmal ausgeführt.

mfG
Markus

Danke Markus.

Es waren wirklich die falschen Anführungszeichen -.- hätte ich auch irgendwie selber drauf kommen können aber naja.
Das mit der endlosschleife ist mir hinterher auch noch eingefallen. Habe es grade mal geflasht und es klappt super :) danke.

Habt ihr denn noch einen Tipp für ein gutes buch zum erlernen der Programiersprache?

Mattze96
23.04.2012, 16:59
hallo,

wenn du mehr über die asuro programmierung und erweiterungen lernen willst würde ich dir "mehr spaß mit asuro" empfehlen. ich habe beide bänder und kann nicht meckern. (die platinen für die erweiterungen liegen bei jedem band bei)


mfG Mattze

markusj
23.04.2012, 21:06
Nur zum Programmieren lernen: Tutorial von µC.net und hier im Wiki, außerdem gibt es ein gutes Wikibook (http://de.wikibooks.org/wiki/C-Programmierung).

mfG
Markus

CubeFan2003
24.04.2012, 09:59
Danke euch beiden :) werde dann mal das Buch: Mehr Spaß mit Asuro holen da ich die Programiersprache sonst wohl nicht brauchen werde.

Dann noch eine andere frage, mein asuro fährt sehr langsam auch wenn ich den motorspeed auf 255 stelle und ein motor hängt immer etwas hinterher also ist langsamer, außerdem fährt er wie in impulsen also gibt ruckwartig gas dann wieder etwas langsamer und dann wieder schneller, woran kann das liegen?

markusj
24.04.2012, 13:55
Irgendwo Verklemmungen in der Mechanik? Abweichungen zwischen den beiden Seiten sind normal (und können via Software ausgebügelt werden)

mfG
Markus

CubeFan2003
24.04.2012, 13:57
Irgendwo Verklemmungen in der Mechanik? Abweichungen zwischen den beiden Seiten sind normal (und können via Software ausgebügelt werden)

mfG
Markus
wenn ich die räder von hand drehe merke ich kein großen unterschied und sind meiner meinung nach aus recht leichtgängig. vielleicht werde ich die motoren nochmal ab machen und neu ankleben vielleicht bringt das dann was. Wie müsste das Programm zum gradeausfahren denn aussehen?

Mattze96
24.04.2012, 15:55
Hallo,

hab hier mal die beiden Motoren mit mittlerer Geschwindigkeit fahren lassen:


#include “asuro.h”
int main(void)
{
Init();

MotorDir(FWD,RWD); //Parameter sind FWD, RWD, FREE, BREAK, jeweils für li und re
MotorSpeed(120,120); //0…255 jeweils für li und re
while(1); //Endlosschleife
return 0; //Ende
}


ich hoffe es hat dir geholfen

mfG Mattze

Edit:
Versuch mal die Motoren ein bisschen nachzuölen. Wenn diese einen hohen Piepston "aussenden" laufen sie meist zu schwer.
Ich habe mir die Arbeit gemacht und eine kleine Präsentation über die Befehle gestaltet. Bei Fehlern oder Anregungen bitte eine PN, danke!

CubeFan2003
24.04.2012, 16:27
Hallo,

hab hier mal die beiden Motoren mit mittlerer Geschwindigkeit fahren lassen:


#include “asuro.h”
int main(void)
{
Init();

MotorDir(FWD,RWD); //Parameter sind FWD, RWD, FREE, BREAK, jeweils für li und re
MotorSpeed(120,120); //0…255 jeweils für li und re
while(1); //Endlosschleife
return 0; //Ende
}


ich hoffe es hat dir geholfen

mfG Mattze
Danke für die mühe aber hat leider nicht geholfen denn wie ich die motoren ansteuer weiß ich nur nicht wie das programm aussehen muss das er auch wirklich gradeaus fährt, also beide räder gleich schnell sind, da wenn man beiden Motoren den selben wert gibt das nicht gewärleistet ist

Mattze96
24.04.2012, 17:24
du musst es halt durch testen herausfinden. Wenn er eine linkskurve fährt musst du zb die werte von (120,120) auf (120,110) ändern sodass er links schneller fährt und dadurch geradeaus fährt. Wenn er eine rechtskurve macht dann genau anders rum. durch öfteres testen kannst du die differenz immer genauer bestimmen und auch bei deinem nächsten programm berücksichtigen.

Eine Frage: Welche Version der Asuro-Libary verwendest du?? Wenn du die neuste verwendest (2.80) kannst du die differenz direkt in myasuro.h eintragen und brauchst dir dann keinen Kopf mehr darüber zumachen ob der Asuro jetzt links oder rechts fährt.

mfG Mattze

CubeFan2003
24.04.2012, 17:42
Es soll doch auch irgendwie mit den sensoren die am getriebe sind gehen (deswegen wurden doch die felder auf das zahnrad geklebt).

Ich benutze die standartsoftware die auf der disk war, weiß gar nicht wie man was anderes nutzt

Mattze96
24.04.2012, 17:51
hab grad keine zeit deshalb fass ich mich kurz:

Die sensoren heißen Odometer:

Hier ein Prog: Ist bei den Erweiterungsbändern dabei:


// *******************************************
// * Odometrie für ASURO *
// * Fährt exakt geradeaus *
// * *
// * *
// * (c) 2007 Robin Gruber *
// * Details zum Code in: *
// * "Mehr Spaß mit ASURO, Band II" *
// *******************************************

#include "asuro.h"

// Schwellwert fr die Hell/Dunkel-Unterscheidung
// Eventuell muss damit etwas variiert werden
#define TRIGGERLEVEL 600
#define HYSTERESIS 10
#define LOW 0
#define HIGH 1

int main(void)
{
unsigned int data[2];
signed int status[2]={0,0};
signed int difference=0;
Init();
MotorDir(FWD, FWD);
while(1) {
// Helligkeitswerte der Lichtschranken auslesen
OdometrieData(data);
// Wechsel linker Sensor von niedrig auf hoch?
if ((status[0]==LOW) && (data[0]>TRIGGERLEVEL+HYSTERESIS)) {
status[0]=HIGH;
difference++;
}
// Wechsel linker Sensor von hoch auf niedrig?
if ((status[0]==HIGH) && (data[0]<TRIGGERLEVEL-HYSTERESIS)) {
status[0]=LOW;
difference++;
}
// Wechsel rechter Sensor von niedrig auf hoch?
if ((status[1]==LOW) && (data[1]>TRIGGERLEVEL+HYSTERESIS)) {
status[1]=HIGH;
difference--;
}
// Wechsel rechter Sensor von hoch auf niedrig?
if ((status[1]==HIGH) && (data[1]<TRIGGERLEVEL-HYSTERESIS)) {
status[1]=LOW;
difference--;
}
// zur Sicherheit: verhindern, dass der Differenzz�ler
// den erlaubten Wertebereich verl�st
if (difference<-255) difference=-255;
if (difference>255) difference=255;

// Status-LED noch entsprechend der erkannten Segmente
// aufleuchten lassen, grn fr links, rot fr rechts
StatusLED(status[0]+status[1]*2);

// Z�ldifferenz passend auf die Motoren verteilen
if (difference>0) MotorSpeed(255-difference,255);
else MotorSpeed(255,255+difference);

}
return 0;
}

CubeFan2003
24.04.2012, 18:07
Danke für das Prog. habe die geschwindigkeitswerte auf 120 gesetzt und er ist auch einigermaßen gradeaus gefahren aber hat noch immer einen rechtsdrall. werde das nochmal mit dem öl versuchen, vielleicht reiben die ja echt zu sehr.

Valen
24.04.2012, 18:29
Eine kleine Kurve bei gerade aus fahren ist normal wenn man nicht die Motorkraft (MotorSpeed) anpasst mit die Odometrie-zahlung. Das ist weil die Motorenleistung, Reibung, Rad große, Rad Abstand zu mitten des PCB., H-brücke Transistoren Verlust usw. immer nicht gleich genau sind. Deshalb haben die beide Motoren immer eine kleine unterschiedliche Drehzahl bei gleichen MotorSpeed werten. Und dann ist es immer noch möglich das es ein Drehzahl unterschied gibt bei andere werten des MotorSpeed-bereich. Mann kann es nur (einfach) verringern durch reduzieren der Getriebe Reibung, Rad große und Rad Abstand.

maikel510
03.05.2012, 20:36
hallo,
also ich hab folgendes problem ich hab meinen asuro fertig gebaut flashen,etc klappt eigentlich auch, aber ich hab ein problem mit dem programm. ich hab mir 2 ideen überlegt um ein projekt mit dem asuro zu starten: 1.der asuro soll eine art wohnung absuchen. dafür wollte ich eine wohnung als modell bauen und sie weiß anstreichen oder so damit er an der wand entlang fährt und in dem raum einen schwarzen gegenstand oder einen schwarzen fleck auf dem boden sucht. ich wollt ihn in einer art halbkreisbahn an der wand entlang laufen lassen und sobald er mit einem taster aufkommt fährt er etwas zurück oder dreht sich und fährt noch einen halbkreis und so weiter.
2. er soll als eine arte einparkroboter funktionieren und mithilfe von annäherungssensoren oder ähnlichem in eine parklücke fahren
zu dieser idee hab ich gleich mal ein paar fragen: ist es schwer? hat jemand erfahrungen damit gesammelt? wie würde ich da preislich liegen?
zu meiner 1. idee hab ich schon 2 programme geschriebe aber da hab ich auch probleme xD bei dem ersten fährt er nur im kreis, die version war allerdings auch nur eine rohfassung die hab ich sofort abgebrochen:
#include <asuro.h>
#include <myasuro.h>

int main ()
{

Init();

while(1)
{
MotorDir(FWD,FWD);
MotorSpeed(120,90);
Msleep(300);

unsigned char taste;
taste= PollSwitch();
if(taste=32)
{ MotorDir(BREAK,FWD);
MotorSpeed(BREAK,100);
Msleep(100);
}
else if(taste!=32)
{
MotorDir(RWD,FWD);
MotorSpeed(100,100);
Msleep(100);
}
else
{}

}
return (0);

}

bei meinem 2ten programm steht er nur da die statusled leuchtet gelb dir vordere und die backled leuchten stark:
#include <asuro.h>
#include <myasuro.h>

int main (void)
{

unsigned int data [2];
Init();
FrontLED(ON);
while(1)
{
LineData(data);
if(data[0]==data[1])
{
MotorDir(FWD,FWD);
MotorSpeed(150,110);
Msleep(300);

unsigned char taste;
taste= PollSwitch();
if(taste=32)
{
MotorDir(BREAK,FWD);
MotorSpeed(BREAK,100);
Msleep(100);
}
else if(taste!=32)
{
MotorDir(RWD,FWD);
MotorSpeed(100,100);
Msleep(100);
}
else
{
return 0;
}
}
else
{
while(10)
{
BackLED(ON,OFF);
BackLED(OFF,ON);
StatusLED(YELLOW);
}
}

}


return 0;

}
bitte helft mir oder gebt mir anregungen was ich sonst noch aus meinem asuro mache kann es ist ein schulprojekt ich kenn mich nicht so wirklich damit aus und verzweifle weil mir nichts mehr einfällt

Valen
03.05.2012, 21:19
hallo,
also ich hab folgendes problem ich hab meinen asuro fertig gebaut flashen,etc klappt eigentlich auch, aber ich hab ein problem mit dem programm. ich hab mir 2 ideen überlegt um ein projekt mit dem asuro zu starten: 1.der asuro soll eine art wohnung absuchen. dafür wollte ich eine wohnung als modell bauen und sie weiß anstreichen oder so damit er an der wand entlang fährt und in dem raum einen schwarzen gegenstand oder einen schwarzen fleck auf dem boden sucht. ich wollt ihn in einer art halbkreisbahn an der wand entlang laufen lassen und sobald er mit einem taster aufkommt fährt er etwas zurück oder dreht sich und fährt noch einen halbkreis und so weiter.
2. er soll als eine arte einparkroboter funktionieren und mithilfe von annäherungssensoren oder ähnlichem in eine parklücke fahren
zu dieser idee hab ich gleich mal ein paar fragen: ist es schwer? hat jemand erfahrungen damit gesammelt? wie würde ich da preislich liegen?
zu meiner 1. idee hab ich schon 2 programme geschriebe aber da hab ich auch probleme xD bei dem ersten fährt er nur im kreis, die version war allerdings auch nur eine rohfassung die hab ich sofort abgebrochen:



#include <asuro.h>
#include <myasuro.h>

int main ()
{

Init();

while(1)
{
MotorDir(FWD,FWD);
MotorSpeed(120,90);
Msleep(300);

unsigned char taste;
taste= PollSwitch();
if(taste=32)
{ MotorDir(BREAK,FWD);
MotorSpeed(BREAK,100);
Msleep(100);
}
else if(taste!=32)
{
MotorDir(RWD,FWD);
MotorSpeed(100,100);
Msleep(100);
}
else // Diese Möglichheit besteht nicht: taste ist 32, oder es ist nicht 32. Eine andere Wahl gibt es nicht.
{}

}
return (0);

}Als erste Program Versuch ist das OK. Ich sehe hier kein problem.



bei meinem 2ten programm steht er nur da die statusled leuchtet gelb dir vordere und die backled leuchten stark:

#include <asuro.h>
#include <myasuro.h>

int main (void)
{

unsigned int data [2];
Init();
FrontLED(ON);
while(1)
{
LineData(data);
if(data[0]==data[1]) // data[links] ist fast immer nie gleich an data[rechts]! Nur in sehr seltsamme fallen.
{
MotorDir(FWD,FWD);
MotorSpeed(150,110);
Msleep(300);

unsigned char taste;
taste= PollSwitch();
if(taste=32)
{
MotorDir(BREAK,FWD);
MotorSpeed(BREAK,100);
Msleep(100);
}
else if(taste!=32)
{
MotorDir(RWD,FWD);
MotorSpeed(100,100);
Msleep(100);
} [b]
else //Wieder eine Wahl das nicht existiert! Weglassen
{
return 0;
}
}
else [COLOR=red]// hier ist data[0]!=data[1] (nicht gleich). Deshalb geht er hier fast immer in einer Endloss-schleife und fläckert ganz schnell die BackLeds an/aus! Und kommt nie wieder raus. Weil 10 nicht 0 ist. {
while(10)
{
BackLED(ON,OFF);
BackLED(OFF,ON);
StatusLED(YELLOW);
}
}

}


return 0;

}
bitte helft mir oder gebt mir anregungen was ich sonst noch aus meinem asuro mache kann es ist ein schulprojekt ich kenn mich nicht so wirklich damit aus und verzweifle weil mir nichts mehr einfälltDeine letzte Code geht gleich in einer Endloss schleife weil de Responz von die Linien Phototransistoren verschiedene werten liefern bei gleichen Beleuchtung. Du muss erst diese sensoren zu einander Kalibrieren bis du darauf entscheidungen macht.

Spacy Bar
06.06.2014, 16:26
Was mich auch wundert ist, dass bei dir das Init() fehlte, du nur die Anführungszeichen geändert hast und es jetzt klappt.
Kannst du dir/mir das erklären?

LG
Spacy Bar