PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Odometrie die 1001



proggerr2
23.01.2007, 00:14
Hallo,
ich möchte gerne schauen wieviele Hell/Dunkel- Welchsel in 20 Sekunden links und rechts erfolgen.
Dafür habe ich mir gedacht dieses Programm zu schreiben. Es klappt aber leider nicht so, wie ich mir das eigentlich vorgestellt habe. Die wechsel werden nicht richtig gezählt und nach dem 10ten "Wechsel" mag das Programm nicht mehr weiterzählen udn ich bekomme irgendwelche komischen Zeichen im Terminal angezeigt. Ich bin neu auf diesem Gebiet und wollte diese Aufgabe als Übung hernehmen.
Ich danke fuer jeden Tipp.


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


void ZahlSenden(int zahl)
{
char text[6]=" ";
itoa(zahl,text,10);
SerWrite(text,5);
}



int main(void)
{
unsigned char flagl, flagr, sw;
unsigned int data[2];
unsigned int wechsel_l, wechsel_r, mittelwert, start_var_l, start_var_r;

Init();
MotorDir(FWD,FWD);
MotorSpeed(125,125);
OdometrieData(data);
start_var_l=data[0];
start_var_r=data[1];
mittelwert=350;
wechsel_l=0;
wechsel_r=0;
while (1) {
OdometrieData(data);
if (data[0]<mittelwert && start_var_l>mittelwert) {
wechsel_l++;
}

if (data[0]>mittelwert && start_var_l<mittelwert) {
wechsel_l++;
}

if (data[1]<mittelwert && start_var_r>mittelwert) {
wechsel_r++;
}

if (data[1]>mittelwert && start_var_r<mittelwert) {
wechsel_r++;
}


ZahlSenden(wechsel_r);
SerWrite("\t ",3);
ZahlSenden(wechsel_l);


}
return 0;
}

radbruch
23.01.2007, 07:24
Hallo

So auf die Schnelle vor der Arbeit:

char text[6]=" ";
itoa(zahl,text,10);
SerWrite(text,5);

Ich bin nicht sicher, ob dass ok ist.

Ausserdem, und das ist wohl das hauptsächliche Problem, läuft die Endlosschleife immer mit den Startwerten:

if (data[0]<mittelwert && start_var_l>mittelwert) {
wechsel_l++;
start_var_l=data[0];
}

Gruß

mic

proggerr2
23.01.2007, 14:52
Hi,
data wird ja eine Zeile drüber neu ausgelesen.
Danke trotzdem für die Antwort

damaltor
23.01.2007, 17:16
mal was kleines: \t ist EIN byte. es reicht SerWrite("\t",1).

ansonsten könnte ich mir vorstellen, dass du den mittelwert zu niedrig gewählt hast (350).

schreib mal ein programm, welches einfach nur bei drehenden motoren die aktuellen odometrie werte ausgibt, dann weisst du etwa in welcher größenordnung die sich bewegen (kannst bei dieser gelegenheit auch gleich rausfinden wie störlichempfindlich der asuro ist).

radbruch
23.01.2007, 17:27
Also doch ausführlicher:

Die Startwerte werden zu Beginn eingelesen und nicht aktuallisiert. Dann wird bei jedem Durchlauf der Zähler erhöht auch wenn wir uns noch im schon gezählten Feld befinden.

Einfaches Zahlenbeispiel:

Mittelwert ist 350, start_var_l sei 200:

Dies hier wird nie gezählt weil (start_var_l>mittelwert) immer falsch ist:

if (data[0]<mittelwert && start_var_l>mittelwert) {
wechsel_l++;
}

Aber dafür wird hier bei jedem Schleifendurchgang mit (data[0]>mittelwert) gezählt weil (start_var_l<mittelwert) immer wahr ist:

if (data[0]>mittelwert && start_var_l<mittelwert) {
wechsel_l++;
}

Wenn ein Bitwechsel festgestellt wurde, muss der Wert dazu gespeichert werden um den nächsten Bitwechsel erkennen zu können.




@damaltor: Nach dem \t folgen zwei Leerzeichen

damaltor
23.01.2007, 17:35
die hab ich nicht gesehn =)

proggerr2
23.01.2007, 22:12
ah danke ich glaube ich verstehe jetzt
supi
oh gott bin ich hohl ;)

proggerr2
23.01.2007, 22:34
sio sollte es abe rgehen oder ?


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


void ZahlSenden(int zahl)
{
char text[6]=" ";
itoa(zahl,text,10);
SerWrite(text,5);
}



int main(void)
{
unsigned int data[2];
unsigned int wechsel_l, wechsel_r, mittelwert, start_var_l, start_var_r;

Init();
SerWrite("Start ",6);
MotorDir(FWD,FWD);
MotorSpeed(125,125);
OdometrieData(data);
start_var_l=data[0];
start_var_r=data[1];
mittelwert=350;
wechsel_l=0;
wechsel_r=0;
while (1) {
OdometrieData(data);
if (data[0]<mittelwert && start_var_l>mittelwert) {
start_var_l=data[0];
wechsel_l++;
}

if (data[0]>mittelwert && start_var_l<mittelwert) {
start_var_l=data[0];
wechsel_l++;
}

if (data[1]<mittelwert && start_var_r>mittelwert) {
start_var_r=data[0];
wechsel_r++;
}

if (data[1]>mittelwert && start_var_r<mittelwert) {
start_var_r=data[0];
wechsel_r++;
}


ZahlSenden(wechsel_r);
SerWrite("\t-",3);
ZahlSenden(wechsel_l);
SerWrite("\n\r",4);


}
return 0;
}

radbruch
23.01.2007, 22:59
Fast *gg*

if (data[1]>mittelwert && start_var_r<mittelwert) {
start_var_r=data[0];
wechsel_r++;
}

Du solltest schon den richtigen Wert speichern...

(... und die Länge der Zeichenketten in den SerWrite()-Aufrufen überprüfen. \n oder \t sind jeweils nur ein Zeichen. Der \ bedeutet nur, dass das folgende Zeichen ein Steuerzeichen ist. Deshalb wird er nicht mitgezählt!)

proggerr2
24.01.2007, 01:00
ganz ehrlich aber ich verstehe nicht warum der trotzdem läuft auch wenn cih den fehler drin hab ;)
tut mir leid fuer die blöden fragen ..
danke für die antworten und die geduld

Hans Z
24.01.2007, 01:07
Da kann ich nur AVR-Studio empfehlen. Mit dem darin befindlichen Debugger kann man seine Proggies Schritt für Schritt simulieren lassen und kommt so manchem Fehler auf die Spur.
Man kann sich wunderbar die Variablen anschauen. Funktionen wie Serwrite etc. sollte man allerdings auskommentieren sonst wartet man bis zum Frühstück.

Hans

proggerr2
24.01.2007, 16:59
danke Hans, ich werd mir das Proggi anschauen

mattes77
25.01.2007, 19:42
Servus!

Bei mir lief die Odometrie bisher nicht....über dieses testproggi hab ich nun gesehen das KEINE Werte angezeigt bzw. geliefert werden (bei beiden encodern - es werden nur Nullen angezeigt). Die LED's leuchten (mit handykamera getestet) . die durchgänge hab ich auch schon gemessen --- geht alles.
Habe die asuro lib6.2 benutzt....

was könte ich nun testen?

gruß

damaltor
25.01.2007, 23:11
versuch dich mal an den funktionen EncoderInit(),EncoderSet(),und den variablen encoder[x]... vielleicht gehts damit

HermannSW
26.01.2007, 08:23
Hi,

... Die LED's leuchten (mit handykamera getestet) . ...das war ein guter Hinweis (für Alle, die keinen Camcorder besitzen)!
Habe es gleich ausprobiert, und nach EncoderInit() gibt´s auf beiden Seiten einen hellen Punkt
(im dunklen Raum), wenn man mit der Handy-Kamera draufschaut ...

mattes77
26.01.2007, 21:26
Servus!

verdammte Tat.....nach ein paar Stunden hab ich dann meinen Fehler gefunden.....die SCH*** Odometer LED's und Odometer Transistoren waren nur geringfügig nicht richtig ausgerichtet........ :-(

noch ne kurze allgemeine Frage:

das programm von waste für den geradeauslauf:

while(1){
OdometrieData(data);
if ((data[0] < 550) && (flagl == TRUE)) {flagl = FALSE; wegl++;}
if ((data[0] > 650) && (flagl == FALSE)) {flagl = TRUE; wegl++;}
if ((data[1] < 550) && (flagr == TRUE)) {flagr = FALSE; wegr++;}
if ((data[1] > 650) && (flagr == FALSE)) {flagr = TRUE; wegr++;}
diff=wegr-wegl;
if (diff>0) speedRight--;
else if (diff<0) speedLeft--;
else {speedRight=speed; speedLeft=speed;}
if (speedRight<0) {speedRight=0;}
if (speedLeft<0) {speedLeft=0;}
MotorSpeed(speedLeft,speedRight);
}

hier wird doch das wegl und wegr immer weiter hochgezählt-oder?

die 650 und 550 sind das Schwellwerte nur für den speed von 150 (habe es eben nicht hinbekommen data[] am rechner anzuzeigen....

gruß

damaltor
26.01.2007, 21:49
das stimmt, die werden immer weiter hochgezählt. bis der integer überläuft, und die werte bei ca -16000 wieder anfangen =)

mattes77
26.01.2007, 21:56
deshalb is da ja ne wegbegrenzung eingebaut ;-)

und wie kommen die 550 und 650 zustande?

gruß

damaltor
26.01.2007, 22:01
das ist eine einfache prüfung.
wenn der sensor ein schwarzes feld "sieht", dann wird ein niedriger wert ausgegeben (theoretisch 0, dieser wert wird alerdings selten mal erreicht) und wenn er ein weisses feld sieht, dann wird ein hoher wert ausgegeben (maximal 1023, aber auch dieser wert ist selten).
so kann man also davon ausgehen, dass ein wert unter 550 wahrscheinlich weiss ist, und ein wert über 650 wahrscheinlich schwarz.

mattes77
26.01.2007, 22:11
Das erklärt einiges :-)

Dankeschön!

PS: Wenn mann es genauer eingerenzen MÜSSTE könte man ja vorher wieder nen umgebungshelligkeitsabgleich machen wie bei der Linienverfolgung.....denke ich!

damaltor
26.01.2007, 22:32
richtig =)
*textfüller*textfüller*