PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Mein erstes Prog mit ASURO



ASURO-ASURO
19.03.2008, 11:38
Hallo,

Ich habe gerade das Bsp. Prog von ASURO ein bischen abgeändert...
Es macht aber nicht, was es soll... was habe ich falsch gemacht?
Es sollte FWD fahren und wenn ein Taster gedrückt wird RWD... wan welcher stelle habe ich das Problem reingebaut?
ASURO fährt nur nach vorne aber wenn ich einen Taster drückt fährt er unbehelligt weiter...??


#include "asuro.h"

int main(void)
{
Init();
BackLED(ON,ON);
MotorDir(FWD,FWD);
MotorSpeed(120,120);
while (PollSwitch()==0);
{
SerWrite("Alles OK!\n",10);
}
MotorDir(RWD,RWD);
MotorSpeed(150,150);
FrontLED(ON);
BackLED(OFF,ON);
while(1)
{
SerWrite("Crash!!\n",10);
}
}

Gruß Matthias

D1K0
19.03.2008, 11:48
Versuch' mal, den PollSwitch()-Wert in einer Variable zu speichern:



#include "asuro.h"

int main(void)
{
unsigned char taster = 0;
char i;
Init();
BackLED(ON,ON);
MotorDir(FWD,FWD);
MotorSpeed(120,120);
while (taster==0);
{
SerWrite("Alles OK!\n",10);
for (i = 0; i < 5; i++) PollSwitch();
taster = PollSwitch();
}
MotorDir(RWD,RWD);
MotorSpeed(150,150);
FrontLED(ON);
BackLED(OFF,ON);
while(1)
{
SerWrite("Crash!!\n",10);
}
}


(PollSwitch() wird zur Sicherheit mehrmals aufgerufen.)

ASURO-ASURO
19.03.2008, 12:06
danke, jetzt läuft es schon eher, wie ich es mir vorstelle, aber er fährt nur eine halbe Sekunde oder so nach vorne und dann nach hinten, als ob ein Taster betätigt wurde oder war das beabsichtigt??
Kann das an der Hardware liegen?

Das kommt per IF an:


Alles OK!
Crash!!
ÃCrash!!
¨Crash!!
ŒCrash!!
..............................

EDIT: Jetzt habe ich noch eines Probiert mit If und else... aber das wird nicht mal vom Compiler angenommen...^^


#include "asuro.h"

int main(void)
{
unsigned char taster;
char i;
Init();
taster = PollSwitch();
{
if (Taster==0)
{
MotorDir(FWD,FWD);
MotorSpeed (120,120);
BackLED(ON,ON);
}
else
{
MotorDir(RWD,RWD);
MotorSpeed(120,120);
BackLED(OFF,OFF);
FrontLED(ON);
}
}
}

damaltor
19.03.2008, 13:05
du hast ein überflüssiges paar {}, aber das sollte den fehler nicht hervorrufen... was sagt denn der compiler?

hai1991
19.03.2008, 14:09
also was mir beim letzten Code auffällt, die Taster werden nur einmal abgefragt.
das heißt wenn du am Anfang keinen Taster drückst fährt er immer vorwärts, wenn du am Anfang Taster drückst fährt er rückwärts
späteres drücken von Tastern ändert nichts

versuch mal das ganze in eine Endlosschleife zu packen, damit die Tasterabfrage öfter ausgeführt wird


nun zu der Fehlermeldung: wäre nicht schlecht wenn du sie uns mal postest,
aber vl musst du am Ende der main-Funktion nur while(1); return 0; hinzufügen

mfg hai1991

ASURO-ASURO
19.03.2008, 15:08
test.c:10: error: `Taster' undeclared (first use in this function)
test.c:10: error: (Each undeclared identifier is reported only once
test.c:10: error: for each function it appears in.)
test.c:6: warning: unused variable `i'
test.c:24:2: warning: no newline at end of file


das kommt... was ist dann falsch?

sloti
19.03.2008, 15:38
Du hast als du die Variable taster deklariert hast, es klein geschrieben, als du sie verwendest groß, für den Compiler sind das zwei verschiedene Variablen du musst wenn du sie deklarierst auch genauso schreiben. das wären die ersten drei Fehlermeldungen. Die 4. will dir sagen, dass es eine Variable gibt, die nicht benutzt wird (eigentlich kein Problem, is ja auch nur ne Warnung). Die letzte Warnung hab ich noch nie verstanden, sie will dir einfach nur sagen, dass du keine neue Zeile am Ende deines Codes genacht hast. Einmal am Ende enter drücken und schon ist sie weg.

mfg
Erik

hai1991
19.03.2008, 15:39
in if(taster==0) hast du taster mit "T" geschrieben (Groß- und Kleinbuchstaben sind nicht das selbe!!!)

der rest sind nur Warnungen und daher nicht ausschalggebend

probier einmal diese Änderung ob er es zumindest übersetzt

aber wie oben schon erwähnt wird die Tasterabfrage nur ganz am Anfang einmal aufgerufen (ich weiß nicht ob das dein Ziel ist)

mfg hai1991

sloti
19.03.2008, 15:41
ich war schneller :)

ASURO-ASURO
19.03.2008, 16:25
danke ;-) ich probier gleich obs dann geht...!

ASURO-ASURO
19.03.2008, 16:32
aber wie oben schon erwähnt wird die Tasterabfrage nur ganz am Anfang einmal aufgerufen (ich weiß nicht ob das dein Ziel ist)


... ich weiß nicht, was du damit meinst... kann es damit zusammen hängen, das der Asuro nicht auf einen Tasterdruck ragiert???
Ich habs grad draufgespielt, hat alles wunderbar geklappt, aber anstatt, das er nach einem Tasterkontakt nach hinten fährt passiert gar nichts, er fährt nur ganz normal weiter...

kann von euch bitte jemand mal ausprobieren, ob es bei euch geht?


#include "asuro.h"

int main(void)
{
unsigned char taster;
char i;
Init();
taster = PollSwitch();
{
if (taster==0)
{
MotorDir(FWD,FWD);
MotorSpeed (120,120);
BackLED(ON,ON);
}
else
{
MotorDir(RWD,RWD);
MotorSpeed(120,120);
BackLED(OFF,OFF);
FrontLED(ON);
}
}
}

sloti
19.03.2008, 16:40
du musst die Tasterabfrage in eine while schleife packen, denn im Moment fragt er die Taster nur einmal ganz am anfang ab. Kannst den Asuro ja mal mit gedrücktetm Taster anschalten ;), dann sollte es gehen. Richtig müsste es so aussehen :
#include "asuro.h"

int main(void)
{
unsigned char taster;
char i;
Init();
while(1){
taster = PollSwitch();

if (taster==0)
{
MotorDir(FWD,FWD);
MotorSpeed (120,120);
BackLED(ON,ON);
}
else
{
MotorDir(RWD,RWD);
MotorSpeed(120,120);
BackLED(OFF,OFF);
FrontLED(ON);
}

}
}

hai1991
19.03.2008, 16:47
genau das habe ich gemeint

du müsstest schreiben


#include "asuro.h"

int main(void)
{
unsigned char taster;
char i;
Init();
while(1) //diese Endlosschleife war gemeint
{
taster = PollSwitch();
{
if (taster==0)
{
MotorDir(FWD,FWD);
MotorSpeed (120,120);
BackLED(ON,ON);
}
else
{
MotorDir(RWD,RWD);
MotorSpeed(120,120);
BackLED(OFF,OFF);
FrontLED(ON);
while(1); //damit er nicht sofort wieder vorwärtsfährt
}
}
}
}


die 1. while(1) dient dazu, das Ganze in den Klammern immer wieder zu wiederholen --> er merkt auch später ob eine Taste gedrückt ist

die 2. while(1) ist notwendig, da er sonst sofort wieder vorwärts fahren würde wenn der Taster losgelassen wird. du kannst aber hier später auch etwas einbauen, damit er zB. umdreht

ich hoffe ich konnte dir jetzt weiterhelfen
mfg hai1991

ASURO-ASURO
19.03.2008, 16:58
ja, vom aufbau habe ich es jetzt verstanden und die Programme müssten auch gehen, aber er fährt bei beiden Programmen von Anfang an rückwärts, als ob ein taster gedrückt ist, was aber nicht wahr ist... :-s
jetzt mach ich den SelfTest nochmal drauf und überprüfe die Taster...

ASURO-ASURO
19.03.2008, 17:10
also im Selftest werden die Taster richtig erkannt...
an was kann es sonnst noch liegen?
an den Make und Clear Dateien (keine ahnung, wie die heißen) oder an was kann das sonnst noch liegen? Die hardware ist ja dann ok...
Ich beschreib am besten mal, wie ich das mit den Programmen mache...

also jetzt z.B. die aus dem Thema:

1.Ich kopier den "Text" und füge ihn im Notepad ein.
2. eingefügt in die datei Test.c von First Try, welchen ich von der Asuro CD habe und einfach den Original Text entfernt.
3. Jetzt habe ich, wie in der Anleitung beschrieben die Make und Clear datei unter optionen angelegt und nutze erst die Clear datei, um eventuell alte daten zu löschen und dann die make datei um den Text zu übersetzen.
4. Wenn keine Fehler kommen, nehme ich ASURO Flash und übertrage die daten auf ASURO, muss ich die alten Dten irgendwie löschen?
5. Testen ;-)

Ist daran was falsch? :-s

EDIT: Das Problem hängt aber nicht damit zusammen, das ich meiner SystemLED beim Auslöten ein Bein ausgerissen habe oder?
Ich habe sie jetzt nur wieder profesorisch rein gesteckt, sie geht aber nicht...^^

damaltor
19.03.2008, 22:11
"die make und clear dateien" gehören zum compiler. sie sorgen für das löschen alter daten und kompilieren das neue programm. an denen liegts sicher nicht.
du kopierst den quelltext von wo du ihn halt her hast, packst ihn in test.c, SPEICHERST (!!!!!!!!!!!), und benutzt make. nun kannst du flashen.

das problem ist, dass du PollSwitch() nur einmal abfragst. die funktion ist sehr fehlerhaft, du solltest sie wie weiter oben beschrieben immer merhfach kurz hinterienander abfragen bevor du den wert benutzt.

ASURO-ASURO
19.03.2008, 23:04
wie programiere ich die mehrfach abfrage?

kann nicht bitte jemand das prog so verändern und auch testen, dass es geht?
Und den code bitte mit, wenn es geht ein paar komentaren bestücken, damit ich es auch blicke.. ;-)

ASURO-ASURO
20.03.2008, 07:52
ok, ich habe jetzt den code so umgeändert (nr eine while schleife entfernt), dass asuro nur bei tastendruck rückwärts fährt und welch wunder es geht...!




#include "asuro.h"
int main(void)
{
unsigned char taster;
char i;
Init();
while(1) //diese Endlosschleife war gemeint
{
taster = PollSwitch();
{
if (taster==0)
{
MotorDir(FWD,FWD);
MotorSpeed (120,120);
BackLED(ON,ON);
}
else
{
MotorDir(RWD,RWD);
MotorSpeed(120,120);
BackLED(OFF,OFF);
FrontLED(ON);
// while(1); //damit er nicht sofort wieder vorwärtsfährt
}
}
}
}

ASURO-ASURO
20.03.2008, 09:15
ok, jetzt habe ich noch ein bischen rum gespielt...

aber wenn ich SerWrite benutzen will kommt:

test.c:13: error: too few arguments to function `SerWrite'

was muss ich ändern?

hai1991
20.03.2008, 09:34
könntest du den Teil mit SerWrite posten?

aber ich würde vermuten, dass du zu wenig Argumente in die Klammer geschrieben hast

ASURO-ASURO
20.03.2008, 10:49
Das ist der Code:


#include "asuro.h"

int main(void)
{
unsigned char taster;
char i;
Init();
while(1){
taster = PollSwitch();

if (taster==0)
{
SerWrite("if\n");
MotorDir(FWD,FWD);
MotorSpeed (120,120);
BackLED(ON,OFF);
}
else if (taster<5)
{
SerWrite("else if\n");
MotorDir(RWD,RWD);
MotorSpeed(0,120);
BackLED(OFF,ON);
while (1);
}
else if (taster>5)
{

SerWrite("else\n");
MotorDir(RWD,RWD);
MotorSpeed(120,0);
BackLED(ON,ON);
while (1)
}


}

}

muss ich sonnst noch was ändern?

"das problem ist, dass du PollSwitch() nur einmal abfragst. die funktion ist sehr fehlerhaft, du solltest sie wie weiter oben beschrieben immer merhfach kurz hinterienander abfragen bevor du den wert benutzt."
von dalmator.

Wie ist das gemeint??

ich denke damit hängt dann auch zusammen, das mein Asuro auch mal einfach so nach hinten fährt oder? wie sollte dann der code aussehen?

damaltor
20.03.2008, 16:09
der fehler ist doch gut beschrieben:
test.c:13: error: too few arguments to function `SerWrite'
in der datei test.c, zeile 13, sind in der funktion SerWrite zu wenig argumente.
wenn du in der anleitung nachschaust, siehst du dass serwrite nicht nur den zu sendenden text, sondern auch die länge des textes haben will.

wenn pollswitch nur einmal aufgerufen wird, werden häufig falsche werte ausgegeben. deshalb solltest du pollswitch mehrfach aufrufen, bevor du den wert verwendest.

da häufig falsche werte ausgegeben werden, fährt der asuro auch schnell mal rückwärts.

hai1991
20.03.2008, 17:54
das mit dem doppelten Aufruf von PollSwitch() war so gemeint:


t1=PollSwitch(); //Tasterabfrage 2mal aufrufen
t2=PollSwitch(); //und getrennt speicher

if(t1==t2) //nur wenn PollSwitch() 2mal den selben Wert
{ //liefert wird hier fortgesetzt
if(t1==0)
{
//hier der Code zum Vorwärtsfahren
}
else
{
//hier der Code zum Rückwärtsfahren
}
}

ASURO-ASURO
20.03.2008, 20:58
danke, sehr verständlich!

ASURO-ASURO
21.03.2008, 08:06
jetzt klapt alles bis auf SerWrite da kommt, ich hätte zu wenig argumente aber auch wenn ich als zahl dahinter schreibe als ich buchstaben habe gehts nicht...
wiso??


#include "asuro.h"

int main(void)
{
unsigned char t1;
unsigned char t2;
Init();

//SerWrite("Das Programm beginnt!\n,22");
while(1)
{
t1=PollSwitch(); //Tasterabfrage 2mal aufrufen
t2=PollSwitch();//und getrennt speicher
if(t1==t2) //nur wenn PollSwitch() 2mal den selben Wert
{ //liefert wird hier fortgesetzt
if(t1==0)
{
// SerWrite("Noch kein Taster\n,16");
FrontLED(ON);
MotorDir(FWD,FWD);
MotorSpeed(123,120);
}
else
{
while(1)
{
// SerWrite("Taster wurde betätigt!\n,22");
BackLED(ON,ON);
MotorDir(RWD,RWD);
MotorSpeed(129,120);
}
}
}
else
{
FrontLED(ON);
BackLED(ON,ON);
//SerWrite("Taster gedrückt!\n,16");
}
}
}

hai1991
21.03.2008, 09:30
1. die Anzahl der Zeichen (16) muss nach dem abschließenden " stehen
2. glaube ich, dass '\n' auch als Zeichen zählt. dann zähle ich 17 (hier bin ich mir aber nicht ganz sicher, da ich diese Funktion selten verwende)

versuch es mal so: SerWrite("Taster gedrückt!\n",17);

aber wie gesagt bei der anzahl bin ich mir nicht ganz sicher

ASURO-ASURO
21.03.2008, 11:30
danke, jetzt gehts.

Hat jemand von euch einen guten Link zum Thema Odemerie-Programmierung?
In der Anleitung steht nichts und durch die Such funktion habe ich nichts gefunden!
aber ich denke es sollte doch mindestens einen Treat dazu geben oder?

radbruch
21.03.2008, 14:51
Hallo

Es gibt natürlich schon jede Menge Threads zum Thema Odometrie. Im Wesentlichen funktioniert das so: Die kleinen LEDs leuchten auf die Codescheiben, die Fototransistoren ändern ihren Widerstand durch das reflektierte Licht und am Pin des Mega8 liegt eine Spannung die der Helligkeit entspricht. Mit der Funktion OdometrieData() kann man diese Spannung digitalisieren, der gemessene Wert kann dann zwischen 0 und 1023 liegen (Maxwerte die in der Praxis nicht erreicht werden!).

Um den Weg zu messen den ein Rad zurücklegt zählt man die Hell-/Dunkelwechsel. Dazu ist es hilfreich, wenn man die minimalen und maximalen Werte kennt. Man kann dann z.b. auf diese Werte prüfen, die Flanken erkennen, Fehlmessungen ausfiltern.

Erste Hürde: serWrite() kann keine Werte ausgeben. Hier eine Möglichkeit die mit der orginalen CD-Library (asuro.c) funktioniert:

void PrintChar(unsigned char x)
{
unsigned char einer, zehner, huni;
char s[3]="hze";
einer=x%10;
zehner=(x-einer)/10;
huni=(x-(zehner*10+einer))/100;
s[0]=huni+'0';
s[1]=zehner+'0';
s[2]=einer+'0';
SerWrite(s,3);
}(Aus: https://www.roboternetz.de/phpBB2/zeigebeitrag.php?t=35598)

Nächstes Problem: Werte werden durch Fremdlicht beeinflußt, Codescheiben wanderen axial.

Ich empfehle dir, erstmal etwas zu experimentieren um eigene Erfahrungen zu sammeln. Das ist spannender und lehrreicher als fertige Lösungen nachzumachen...

Gruß

mic

ASURO-ASURO
21.03.2008, 15:31
ja klar, deshalb habe ich ja auch Asuro um zu testen und Forschen, sonnst wäre das ja langweilig!

Danke, ich werde es versuchen!

ASURO-ASURO
21.03.2008, 16:28
hallo schon wieder.

ich habe jetzt das linienverfolgungs Prog abgeschlossen und wollte mich jetzt der Odemerie "opfern"^^...

Als test habe ich mal das Prog von oben laufen lassen, aber es kommt keine Ausgabe übers IF es leuchtet nur die LED rot!

wo liegt das Problem?


#include "asuro.h"
int main (void)
{
Init();
FrontLED(ON);
void PrintChar(unsigned char x)
{
unsigned char einer, zehner, huni;
char s[3]="hze";
einer=x%10;
zehner=(x-einer)/10;
huni=(x-(zehner*10+einer))/100;
s[0]=huni+'0';
s[1]=zehner+'0';
s[2]=einer+'0';
SerWrite(s,3);
}
}

hai1991
21.03.2008, 17:37
Der Code von radbruch war als Funktion gedacht und wird so verwendet:



#include "asuro.h"

void PrintChar(unsigned char x) //Funktion wird vor main(void) definier
//und kann später an jeder Stelle des Programms
//aufgerufen werden, wobei der entsprchende char-Wert
//in die Klammern eingetragen wird
{
unsigned char einer, zehner, huni;
char s[3]="hze";
einer=x%10;
zehner=(x-einer)/10;
huni=(x-(zehner*10+einer))/100;
s[0]=huni+'0';
s[1]=zehner+'0';
s[2]=einer+'0';
SerWrite(s,3);
return 0;
}

int main (void)
{
char odo[2];
Init();
FrontLED(ON);
while(1)
{
OdometrieData(odo); //einlesen der odo-Werte
PrintChar(odo[0]); //Ausgeben über die Funktion
PrintChar(odo[1]);
}
return 0;
}

ich hoffe es funktionier, da ich es selber noch nicht probiert habe

über Funktionen müsste aber auch etwas in der Anleitung stehen

radbruch
21.03.2008, 17:39
Der Fehler ist, dass es eine Funktion zur Ausgabe von Zahlenwerten ist und noch ein richtiges Programm dazu fehlt dass diese Funktion nutzt. (Und die Funktion blöderweise auch nicht richtig funktioniert :(

Hier ein funktionierendes Beispiel zu Anwendung (mit der entsprechenden PrintChar-Funktionsvariante von izaseba):


#include "asuro.h"

unsigned int daten[2], i;

// PrintChar-Funktion nach izaseba (mit int-Parameter)
void PrintChar(unsigned int x)
{
char ergebnis[] = {'0','0','0'};
while (x >=100){
ergebnis[0]++;
x -=100;
}
while (x >= 10) {
ergebnis[1]++;
x -=10;
}
ergebnis[2] +=x;
SerWrite(ergebnis,3);
}
int main(void)
{
Init();
SerWrite("\r\nOdometrietest\r\n",17); // Begrüßung
while (1)
{
OdometrieData(daten); // Daten einlesen
PrintChar(daten[0]); // Wert links senden
SerWrite("-",1); // Trennzeichen
PrintChar(daten[1]); // Wert rechts senden
SerWrite("\r\n",2); // zwei Steuerzeichen senden
for(i=0; i<50; i++) Sleep(255);
}
return(0);
}

Nach dem Start langsam direkt am Codescheibenritzel drehen...

Gruß

mic

[Edit]
@hai1991:
ne, funzt auch nicht, weil 1.: void kein return braucht und 2:.odo[] ein int sein muss. Und weil eben meine PrintChar()-Funktion überhaupt nicht funktioniert, keine Ahnung warum.

ASURO-ASURO
21.03.2008, 19:43
es geht, aber ich blick nicht, wiso da 3Stellige Zahlen ausgegeben werden...

meiner meinung nach sind die auch völlig ungeordnet, selbst wenn das rad still steht kommen verschiedene zahlen...^^

radbruch
21.03.2008, 21:24
... weil der String so definiert ist: char ergebnis[] = {'0','0','0'};

Wenn der Wert nicht dreistellig ist werden trotzdem die führenden Nullen ausgegeben. Wenn du das ändern willst - nur zu :)

Die Werte schwanken vermutlich weil es ein asuro ist. Minimale Hardware erfordert eben pfiffige Software. Wenn du die Funktion testen willst:

unsigned int x;
for(x=0;x<1000;x++) PrintChar(x);