PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Programm für spezifische LineData Werte



Ollowain
10.10.2009, 20:58
Hallo, da bin ich mal wieder ;)
Bin grad dabei ein Programm zu schreiben mit dem man die Werte der Dioden T9 und T10 (die zwei vorne neben der roten LED mit der Hell/Dunkel gemessen wird) über die IR Schnittstelle bekommt. Das ganze sagt sich aber leichter als dass es tatsächlich ist insbesondere wenn man keine große Erfahrung in Sachen Programmieren hat. Hier mal mein erster Versuch mit sicherlich noch vielen Fehlern. Vieleicht kann mal jemand drüberschaun und das ganze korrigieren/erweitern/verbessern.


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


int main(void)

{

Init();

unsigned int data[2];
int i;
int T9;
int T10;
char zeichenkettenT9[4];
char zeichenkettenT10[4];

while(1)
{

{
for(i=0; i<5000; i++)
Sleep(72);
}

LineData(data);

data[0]=T9;
itoa(T9, zeichenkettenT9, 4);

data[1]=T10;
itoa(T10, zeichenkettenT10, 4);

SerWrite("T9: %s"/n,zeichenkettenT9, 4); {Sleep(216);}
SerWrite("T10: %s"/n/n,zeichenkettenT10 4); {Sleep(216);}
}
}

Zu guter letzt dann noch die Fehler 8-[

test.c:34: error: 'n' undeclared (first use in this function)
test.c:34: error: (Each undeclared identifier is reported only once
test.c:34: error: for each function it appears in.)
test.c:34: warning: passing argument 2 of 'SerWrite' makes integer from pointer without a cast
test.c:34: error: too many arguments to function 'SerWrite'
test.c:35: error: expected ')' before numeric constant
test.c:35: warning: passing argument 2 of 'SerWrite' makes integer from pointer without a cast

Die Fehler beziehen sich hauptsächlich auf die Zeilen 34/35, das sind die mit SerWrite was auch logisch ist da ich mit dieser Funktion noch nie gearbeitet habe. ...Aber irgentwann ist immer das erste mal... ;)

Dann steht da auch noch diese Zeile:

c:/winavr-20090313/lib/gcc/../../avr/include/avr/signal.h:36:2: warning: #warning "This header file is obsolete. Use <avr/interrupt.h>."

Weiß jemand was es damit auf sich hat?

Fragen über Fragen und hoffentlich Antworten über Antworen ;)
grüße Ollowain

ello
10.10.2009, 21:14
Hallo,

an dem gleichen Problem saß ich gestern auch.
#include "asuro.h"
int main(void)
{
unsigned int data[2];

Init();
FrontLED(ON);

while(1)
{
LineData(data);
SerPrint("T9: ");
PrintInt(data[0]);
SerPrint("\r\nT10: ");
PrintInt(data[1]);
SerPrint("\r\n");
SerPrint("\r\n");
Msleep(1000);
}
return 0;
}

MfG ello

radbruch
10.10.2009, 21:50
Hallo

Mit der orginalen CD-Library könnte das so funktionieren:

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


int main(void)

{

Init();

unsigned int data[2];
int i;
int T9;
int T10;
char zeichenkettenT9[4];
char zeichenkettenT10[4];

while(1)
{

{
for(i=0; i<5000; i++)
Sleep(72);
}

LineData(data);

T9=data[0];
itoa(T9, zeichenkettenT9, 4);

T10=data[1];
itoa(T10, zeichenkettenT10, 4);

SerWrite("T9: ", 4);
SerWrite(zeichenkettenT9, 4);
SerWrite("/n/r", 2);
Sleep(216);
SerWrite("T10: ", 5);
SerWrite(zeichenkettenT10, 4);
SerWrite("/n/r", 2);
Sleep(216);
}
}
Ich habe es nicht getestet, möglicherweise gibt es noch ein Problem mit der Endekennung der zeichenketten-Strings. FrontLED ist mit Absicht noch nicht eingeschaltet. (SerPrint erfordert die aktuelle Lib die ich für Einsteiger nicht empfehlen möchte)

Die Datei signal.h ist veraltet, man sollte besser interrupt.h verwenden. Das kann man in asuro.h ändern:

#ifndef ASURO_H
#define ASURO_H

#include <avr/io.h>
#include <avr/interrupt.h>
//#include <avr/signal.h>
#include <stdlib.h>


Die Library des asuro, sie ist die Verbindung zwischen dem Programm und der Hardware (asuro.c und asuro.h), verwendet den C-Kompiler GCC. WinAVR und AVR-GCC sind eine Sammlung von verschiedenen Dateien die den Zugriff auf die AVR-Kontroller ermöglichen (im asuro steckt ein ATMega8 von AVR). Diese Dateien werden laufend verbessert und geändert. Weil die Library des asuro auch diese Dateien verwendet weist der Kompiler (GCC) darauf hín, dass die Datei signal.h inzwischen durch die Datei interrupt.h ersetzt wurde. Beide Dateien steuern die Zugriffe auf die Interrupts, die beim asuro z.b. für die Motor-PWM, das IR-Trägersignal und die Sleep()-Funktion zuständig sind. (btw kann ein Update von GCC unerwartete Effekte verursachen, ist aber gelegentlich bei Wechsel des Betriebssystems nötig)

Gruß

mic

radbruch
11.10.2009, 17:56
Hallo

"Nicht getestet" bedeutet bei mir lediglich, dass ich das Programm nicht auf meinen asuro geflasht habe. Selbstverständlich konnte ich es fehler- und warnungsfrei kompilieren.

Versuche mal diese Version, die Zeichenketten sind länger und die Zahlenbasis von itoa (integer to ascii) sind geändert:

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


int main(void)

{

Init();

unsigned int data[2];
int i;
int T9;
int T10;
char zeichenkettenT9[5] =" "; // Strings mit Leerzeichen vorbelegen
char zeichenkettenT10[5]=" ";

while(1)
{

{
for(i=0; i<5000; i++)
Sleep(72);
}

LineData(data);

T9=data[0]; // Wert von unsigned data[0] nach signed T9 kopieren
itoa(T9, zeichenkettenT9, 10); // letzter Parameter ist die Zahlenbasis

T10=data[1];
itoa(T10, zeichenkettenT10, 10);

SerWrite("T9: ",4);
SerWrite(zeichenkettenT9, 4);
SerWrite("/n/r", 2);
Sleep(216);
SerWrite("T10: ",5);
SerWrite(zeichenkettenT10, 4);
SerWrite("/n/n/r", 3);
Sleep(216);
}
}


Hyperterminal sagt alle fünf sekunden:

-- ASURO Testing --
Line Test

Diese Ausgabe stammt noch aus dem Selbsttest. Entweder hat das Flashen nicht funktioniert oder du hast eine leere Hex-Datei geflasht. Das passiert z.B. wenn man im Notepad vor dem Kompilieren nicht speichert.

Gruß

mic

[Edit]
Ollowain hat seinen Beitrag wohl wieder zurückgezogen

Ollowain
11.10.2009, 18:23
Ja ich hab meinen Beitrag zurückgezogen weils nachdem ich es nochmal geflashed hab dann doch funktioniert hat. (Hatte noch die falsche .hex Datei oben im Tool eingetragen). Auf jeden fall hab ich jetzt schon ettliche hundert werte ausgelesen . Hier das Ergebnis meiner Messungen:
(Dabei habe ich ihn zuerst in die Mitte gestellt und danach auf beide Seiten etwas hinaus geschoben.)

Etwas links daneben: 3100 // 1100
Genau in der Mitte: 2300 // 1300
Etwas rechts daneben: 2100 // 2100

Was sofort auffällt ist dass die werte des linken und rechten Fotortransistors im "Normalzustand"um 1000 abweichen. Verschiebt man den Asuro ändert sich daran nichts, d.h. es geht um 1000 rauf bzw. um 1000 runter.

Woran könnte dieser Unterschied liegen?
Hab bereits die Fototransistoren auf exakte Ausrichtung überprüft und außerdem beide Vorwiderstände gemessen. Soweit alles in bester Ordnung. Außerdem hat mein Asuro eine Abschirmung vorne unten, d.h. Fremdlicht kann auch nicht der Grund dafür sein.

radbruch
11.10.2009, 19:33
Hallo,

schön, dass es schon funktioniert. Allerdings sind deine Werte viel zu hoch und eigentlich unmöglich! Der 10bit-ADC kann maximal Werte bis 1023 erfassen.

Ich vermute, du verwendest itoa immer noch mit der Zahlenbasis 4 (keine Ziffer deiner Werte ist größer als 3!). Ein "normaler" asuro sollte, vor allem mit Abschirmung und ausgeschalteter FrontLED, auf Werte im einstelligen Bereich (<10) kommen. Irgendwas ist da oberfaul. Versuche mal meine zweite Programmvariante (ich hoffe, die verwendest du noch nicht).

Aussagekräftigere Werte erhält man, wenn man den asuro auf eine schwarze oder eine weise Fläche stellt. Danach erst kann man ihn in die Mitte von etwas oder etwas daneben von etwas stellen.

Wenn du deine Werte im Terminal mit der Maus markierst und kopierst kannst du sie uns in einer Code-Box zeigen.

Gruß

mic

Ollowain
11.10.2009, 20:33
Alles nur beispielwerte hab natürlich noch ettliche mehr aber das ist so der Durchschnitt:

Alles Weiß:T9: 243/nT10: 155/n/
Alles Schwarz: T9: 54/nT10: 34/n/
Linie in der Mitte: T9: 190/nT10: 122/n/
Asuro nach links versetzt: T9: 217/nT10: 83/n/
Asuro nach rechts versetzt: T9: 123/nT10: 142/n/

Prozentual ähnlich wie vorher also T9 immer noch deutlich größer als T10

/n funktioniert übrigens nicht, d.h. im HyperTerminal wird alles hintereinander geschrieben ist aber nicht weiter schlimm.
Kleiner Ausschnitt:

T9: 71/nT10: 36/n/T9: 71/nT10: 36/n/T9: 71/nT10: 34/n/TNÀrQ1°z 102/nùT8: 213/nT1
0: 95/n/T9: 200/nT10: 128/n/T9: 200/nT10: 128/n/T9: 141/nT10: 155/n/T9: 144/nT10
: 156/n/T9: 144/nT10: 156/n/T9: 226/nT10: 102/n/T9: 226/nT10: 93/n/T9: 226/nT10:
93/n/T9: 252/nT10: 168/n/T9: 254/nT10: 169/n/T9: 254/nT10: 169/n/T9: 254/nT10:
169/n/T9: 252/nT10: 168/n/T9: 252/nT10: 168/n/T9: 203/nT10: 113/n/zûö¸:°3»¶¿ /þå
ïþûTu0» 1?¿„Íý~90; ^€ûT1pÐÉ/T9: 198/nT10: 124/n/1¸~11»³ T9: 199/nT10: 122/n/T9:
196/nT10: 119/n/T9: 196/nT10: 120/n/T9: 209/nT10: 101/n/T9: 220/nT10: 90/n/T9:
220/nT10: 87/n/T9: 220/nT10: 87/n/T9: 215/nT10: 87/n/T9: 215/nT10: 87/n/T9: 192/
nT10: 124/n/Ýé†Ïn7ì~ßÜû Ÿ²^ òù~9}ßîrí þ ùçÍ··èï?T9: 197/nT10: 120/n/T9: 198/nT1
0: 119/n/T9: 133/nT10: 152/n/T9: 132/nT10: 149/n/T9: 133/nT10: 150/n/T9: 243/nT1
0: 167/n/T9: 243/nT10: 167/n/ þ ý ÷ T9: 54/nT10: 31/n/9: 54/nT
10: 32/n/T8: 195/nT10: 124/n/T9:

radbruch
11.10.2009, 21:02
Hallo

Jaja, /n, und übrigends auch /r, funktionieren nicht, weil es nicht der Schrägstrich sondern der Backslash sein sollte:

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


int main(void)

{

Init();

unsigned int data[2];
int i;
int T9;
int T10;
char zeichenkettenT9[5] =" "; // Strings mit Leerzeichen vorbelegen
char zeichenkettenT10[5]=" ";

while(1)
{

{
for(i=0; i<5000; i++)
Sleep(72);
}

LineData(data);

T9=data[0]; // Wert von unsigned data[0] nach signed T9 kopieren
itoa(T9, zeichenkettenT9, 10); // letzter Parameter ist die Zahlenbasis!

T10=data[1];
itoa(T10, zeichenkettenT10, 10);

SerWrite("T9: ",4);
SerWrite(zeichenkettenT9, 4);
SerWrite("\n\r", 2);
Sleep(216);
SerWrite("T10: ",5);
SerWrite(zeichenkettenT10, 4);
SerWrite("\n\n\r", 3);
Sleep(216);
}
}

Die Werte erscheinen mir zwar immer noch zu hoch, die Unterschiede könnte man viellecht durch vorsichtiges verbiegen der Led/IR-Transistoren korrigieren.

Gruß

mic