-
Odometrie die 1001
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.
Code:
#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;
}
-
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
-
Hi,
data wird ja eine Zeile drüber neu ausgelesen.
Danke trotzdem für die Antwort
-
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).
-
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
-
die hab ich nicht gesehn =)
-
ah danke ich glaube ich verstehe jetzt
supi
oh gott bin ich hohl ;)
-
sio sollte es abe rgehen oder ?
Code:
#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;
}
-
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!)
-
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