PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Problem mit IR-Schnittstelle



Chrissi_P
01.01.2009, 20:03
Hallo da drausen,
ich wollte ein Testprogramm zur einlesung und anschliessender Uebertragung von Linienverfolgewerten schreiben, doch bei folgendem Programm bekomme ich vom Hyperterminal nur wirre Zeihen(die zum Teil nicht mal auf der Tastatur vorhanden sind!) ausgegeben:


//Linienverfolgungstest

#include "asuro.h"

void Turn (void);

int main (void)
{
//Variablen
unsigned int data[2];
unsigned int ldata[100];
int i,j;
Init();
MotorDir(FWD,FWD);
MotorSpeed(150,150);
FrontLED(ON);
j=1;
while(1){
//Werte Einlesen
for(i=1;i<100;i++){
LineData(data);
ldata[j]=data[0];
j++;
ldata[j]=data[1];
j++;
};
MotorSpeed(0,0);
j=1;
//Werte Senden
for(i=1;i<100;i++){
SerWrite(ldata[j] ,5);
j++;
SerWrite(ldata[j] ,5);
j++;
};
}
return 0;
};

Das bekomme ich aber angezeigt:

SerWrite("ASURO",5);
der Weissblattest funktioniert auch!
Bitte helft mir!

Danke
Chrissi

radbruch
01.01.2009, 22:10
Hallo

Du mußt die Werte in Zeichenketten umformen:


#include "asuro.h"

// aus: https://www.roboternetz.de/phpBB2/zeigebeitrag.php?p=328394#328394
void PrintInteger(unsigned int x)
{
char ergebnis[5] = {'0','0','0','0','0'};
while (x >=10000) { ergebnis[0]++; x -=10000; }
while (x >= 1000) { ergebnis[1]++; x -= 1000; }
while (x >= 100) { ergebnis[2]++; x -= 100; }
while (x >= 10) { ergebnis[3]++; x -= 10; }
ergebnis[4] +=x;
SerWrite(ergebnis,5);
}

int main(void)
{
...
for(i=1;i<100;i++){
PrintInteger((ldata[j]);
j++;
PrintInteger((ldata[j]);
j++;
};
...
}
(nicht getestet)

ldata[100]; bietet nur Speicherplatz für 50 Wertepaare.

Nach dem Einlesen eines Datenpaares solltest du kurz warten, 100 Werte sind mit 8MHz ruckzuck eingelesen: LineData(data); Sleep(255);

Nach SerWrite() sollte ein Zeilenvorschub ausgegeben werden sonst wird möglicherweise nichts angezeigt: SerWrite("\n\r", 2);

Ohne Motoransteuerung kann man den asuro auch von Hand über die Linie schieben.

Gruß

mic

Chrissi_P
02.01.2009, 10:17
Danke, mit deinem code und Sleep(255); funktioniert es!
Wenn ich aber das einfuege, bleibt er in der for-Schleife fuer Sleep haengen:

for(i=1;i<50;i++){
LineData(data);
ldata[j]=data[0];
j++;
ldata[j]=data[1];
j++;
for(a=1;a<100;a++){Sleep(255);}
};

Und kannst du mir die Funktion PrintInteger erklaehren, die verstehe ich nicht so ganz?

MFG,
Chrissi

radbruch
02.01.2009, 16:37
Hallo

Die Funktion PrintInteger() macht nichts anderes als einen 16bit-Wert (ohne Beachtung des Vorzeichens) in eine Zeichenkette(=String) mit fünf Zeichen umzuwandeln.

Zu Beginn wird die Zeichenfolge mit "00000" vorbelegt (16bit-Werte sind maximal 5-stellig und gehen bis 65tausendirgendwas oder 2 hoch 16 minus 1). Dann wird vom Wert (in x) 10000 abgezogen solange der Wert größergleich 10000 ist. Gleichzeitig wird in der Zeichenkette die erste Stelle hochgezählt. Das funktioniert weil die ASCII-Werte der Ziffern aufeinanderfolgend sind. Anschließend werden 1000 abgezogen solange der Wert größergleich 1000 ist und die zweite Ziffer in der Zeichenkette wird hochgezählt. Dasselbe dann nochmal mit 100 und 10, der Rest kann dann einfach zur letzen Ziffer addiert werden. Die Zeichenkette ist nun fertig (mit führenden Nullen) und wird mit SerWrite() zum Terminal gesendet. Fertig.

Weitere Anmerkungen:
Der Index des Feldes ldata[] beginnt mit 0 und endet mit 99. Für 50 Wertepaare müßte es deshalb so aussehen:

j=0;
for(i=0;i<50;i++){

Das j kannst du auch sparen:

ldata[2*i]=data[0];
ldata[2*i+1]=data[1];

Oder:

ldata[i]=data[0];
ldata[50+i]=data[1];

Natürlich muß man dann beim Senden den Code entsprechend anpassen....

Mit der orginalen 72kHz-Library sollte die Sleep()-Schleife

49*99*255*(1/72000)=17,2 Sekunden verzögern.

(49 mal i, 99 mal a und 255 mal Sleep)

Gruß

mic

Chrissi_P
04.01.2009, 16:30
Danke, jetzt habe ich die Funktion so ungefähr verstanden.
Aber ich kapiere nicht, wie du vorhast, die sleep-Schleife in Queltext Umzusetzen!

Danke
Chrissi

radbruch
04.01.2009, 16:56
Wenn ich aber das einfuege, bleibt er in der for-Schleife fuer Sleep haengenDas ist deine Sleep()-Schleife! Sie dauert (mit 72kHz-Lib) eben 17 Sekunden. Vielleicht wartest du nicht lange genug und deutest es als Programmabsturz.

Chrissi_P
04.01.2009, 17:01
Achso!
Ich habe beim testen tatsächlich nur ein paar Sekunden gewartet!
Da muss man die Anzahl der Schleifendurchläufe senken, es sollte ja nur als kurze Pause zwischen den Messungen dienen!

Danke für die Hilfe,
Chrissi