-
Das ist der Code:
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?
-
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.
-
das mit dem doppelten Aufruf von PollSwitch() war so gemeint:
Code:
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
}
}
-
danke, sehr verständlich!
-
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??
Code:
#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");
}
}
}
-
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
-
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?
-
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:
Code:
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/ze...ag.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
-
ja klar, deshalb habe ich ja auch Asuro um zu testen und Forschen, sonnst wäre das ja langweilig!
Danke, ich werde es versuchen!
-
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?
Code:
#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);
}
}