PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : LineData() auslesen



listner
23.03.2008, 11:10
Hi leute,
ich habe mich nun etwas weiter vor gewagt in der Programmierung des Asuros :) und das ist dabei rausgekommen:
Es sollte eine Methode sein, um die Werte der Phototranistoren des Asuros aus zulesen, es hat soweit alles geklapt, nur habe ich ein paar kleinere Probleme


unsigned int data[2];
unsigned char s[4] = "thze";

void PrintCharR(unsigned int x)
{
unsigned char einer, zehner, huni, tausend;
x = data[1];

einer= x%10;
zehner= (x-einer)%100;
huni= (x-(zehner*10+einer))%1000;
tausend= (x-((huni*100)+(zehner*10)+einer))%10000;

s[0]=huni+'0';
s[1]=zehner+'0';
s[2]=einer+'0';
s[3]=tausend;

SerWrite(s,4);
}

void PrintCharL(unsigned int x)
{
unsigned char einer, zehner, huni, tausend;
x = data[0];

einer=x%10;
zehner=(x-einer)/10;
huni=(x-(zehner*10+einer))/100;

if((x = 1000) && (x > 1000))
tausend= 1;
else
tausend= 0;

s[0]=huni+'0';
s[1]=zehner+'0';
s[2]=einer+'0';
s[3]=tausend;

SerWrite(s,4);
}


die wären, der asuro übergibt einen nur 3stelligen wert, anstatt einen 4-stelligen!!!

ich habe verschiedene Methoden versucht, die einzelwerte der "zehner, einer, tausender und hunderter" zu ermitteln, wobei ich auf die gute anleitung von "Radbruch" aus dem Threat: der Threat (https://www.roboternetz.de/phpBB2/viewtopic.php?t=39126&postdays=0&postorder=asc&start=22)
zurückgegriffen habe, nun habe ich das problem das die werte nicht, bzw als Zeichen wirwar, übermittelt werden!

In meinem Code hab ich bei der funktion des Linken und des Rechten Phototransistors verschiedene möglcihkeiten genommen, wobei die obere Fehleraufweist, kann mir jemand bitte

Lösungsansätze vorschlagen, bitte keine Komplettlösung, da ich selber auch noch was tuen möchte :P

thx im vorraus greezZ dr Listner

EDIT:
achja, mir ist bewust, dass ich oben nur die Funktionen gepostet habe :P

aufgerufen habe ich sie mit :


PrintCharL(a); //bzw
PrintCharR(a);

radbruch
23.03.2008, 11:39
Hallo

Es ist mir sehr peinlich, aber aus noch nicht erkannten Gründen funktioniert mein Code nicht mehr. Ich hatte das damals mit dem RP6 getestet, keine Ahnung ob es mit dem asuro überhaupt mal funktionierte. Verwende deshalb bitte die Alternative von izaseba:

// 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);
}


Wenn du als Aufruf PrintChar(data[0]); bzw. PrintChar(data[1]); verwendest, benötigst du nur eine Funktion.

Die Werte der Liniensensoren sind mit der serienmäßigen LED deutlich kleiner als die Werte der Odometrie, auf keinen Fall also 4-stellig.

Gruß

mic

hai1991
23.03.2008, 11:39
hallo listner

was willst du mit


if((x = 1000) && (x > 1000))
tausend= 1;
else
tausend= 0;

bezwecken?

denn mit x = 1000 wird in x der Wert 1000 abgespeichert (zum Vergleichen muss man == verwenden)

und 2. kann x nicht genau 1000 sein und gleichzeitig größer als 1000
vl. meintest du if(x >= 1000) (gesprochen: x größer oder gleich 1000)
bzw. wenn man es aufteilt if( x==1000 || x > 1000 )

mfg hai1991

harry3
23.03.2008, 12:27
Folgende Variable sollte ein String sein, so wie du das gemacht hast ist das aber kein String, sondern ein einfaches char Feld!
unsigned char s[4] = "thze";

Strings werden mit einem Nullterminator beendet, also:
unsigned char s[5] = "thze\0";

Folgende Zeilen ergeben auch keinen Sinn, du würfelst da die Stellen wild durcheinander! Bei der Tausenderstelle würde ein '0' auch nicht schaden!
s[0]=huni+'0';
s[1]=zehner+'0';
s[2]=einer+'0';
s[3]=tausend;

harry3
23.03.2008, 13:18
Achja, was mir noch eingefallen ist:
Nimm einfach die Funktionen aus der Bibliothek, in dem Fall sprintf:
int sprintf ( char * str, const char * format, ... );

Also in der der Art(nicht getestet!):



char temp[10]={0};
int ldata[2]={0};

LineData(ldata);
sprintf(temp,"%ld",ldata[0]);
SerWrite(temp,strlen(temp));

damaltor
23.03.2008, 15:18
probier mal sowas:


unsigned char tausender(int x){
return x / 1000;
}

unsigned char hunderter(int x){
return (x - 1000 * tausender(x)) / 100;
}

unsigned char zehner(int x){
return (x - 1000 * tausender(x) - 100 * hunderter(x)) / 10;
}

unsigned char einer(int x){
return (x - 1000 * tausender(x) - 100 * hnderter(x) - 10 * zehner(x));
}


jetzt müsstest du mit diesen funktionen beliebige stellen finden können.

listner
29.03.2008, 17:35
schön und gut ^^ und thx 4 help, aber warum funktioniert diese methode:

void PrintCharL(unsigned int x)
{
unsigned char einer, zehner, huni, tausend;
x = data[0];

einer=x%10;
zehner=(x-einer)/10;
huni=(x-(zehner*10+einer))/100;

if((x == 1000) || (x > 1000))
tausend= 1;
else
tausend= 0;

s[0]=huni+'0';
s[1]=zehner+'0';
s[2]=einer+'0';
s[3]=tausend+'0';

SerWrite(s,5);
}



und diese methode nicht:

void PrintCharR(unsigned int x)
{
unsigned char einer, zehner, huni, tausend;
x = data[1];

einer= x%10;
zehner= (x-einer)%100;
huni= (x-(zehner*10+einer))%1000;
tausend= (x-((huni*100)+(zehner*10)+einer))%10000;

s[0]=huni+'0';
s[1]=zehner+'0';
s[2]=einer+'0';
s[3]=tausend+'0';

SerWrite(s,5);
}

damaltor
29.03.2008, 18:02
du solltest das % einsparen, es braucht extrem viel rechenzeit. evtl läuft dabei der speicher im µC über.

ausserdem willsz du in einem unsigned char die tausenderstelle speichern, aber ein char geht nur bis 255.