PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Ultraschallerweiterung



frank1210
17.03.2010, 14:23
Hallo malwieder.
ich hab mir die Ultraschallerweiterung zusammengebaut. und zwar mit ner selbstentworfenen Platine. Alles gleich auf anhieb funktioniert. Fals jemand Interesse am Layout hat, stelle ich es gerne zur Verfügung.
Jetzt meine Frage:
Als Programm verwende ich folgendes:
// *******************************************
// * Ultraschall für ASURO *
// * Roboter versucht Hindernissen *
// * auszuweichen *
// * Achtung: asuro.c ist geändert *
// * (c) 2005Robin Gruber *
// * Details zum Code in: *
// * "Mehr Spaß mit ASURO, Band I" *
// *******************************************

#include "asuro_us.h"


void LocalInit(void)
{
// Change Oscillator-frequency to 40kHz, no toggling of IO-pin
TCCR2 = (1 << WGM21) | (1 << CS20);
OCR2 = 0x64; // 40kHz @8MHz
// ADC off
ADCSRA = 0;

// Analog Comparaot
ACSR = 0x02; // Generate Interrupt on falling Edge
ADMUX=0x03; // Multiplexer for Comparator to ADC pin 3
SFIOR|=(1<<ACME);

DDRD&=~(1<<6);

}


void Ping(unsigned char length)
{
count72kHz=0;
TCCR2 = (1 << WGM21) | (1 << COM20) | (1 << CS20);
while (count72kHz<length) {
OCR2=0x64+length/2-count72kHz;
};
TCCR2 = (1 << WGM21) | (1 << CS20);
OCR2=0x64;

}


int main(void)
{
int pos;
int posmarker;
int odata[2];
Init();
LocalInit();
while(1) {
// OdometrieData(odata);
posmarker=0;
Ping(20);
for (pos=0; pos<100; pos++) {
Sleep(10);
if ((ACSR&(1<<ACI))!=0) {
if (posmarker==0) {posmarker=pos;}
}
ACSR|=(1<<ACI);
}
if (posmarker>10) {
StatusLED(GREEN);
MotorDir(FWD,FWD);
BackLED(OFF,OFF);
MotorSpeed(200,200);
} else {
StatusLED(RED);
MotorDir(FWD,RWD);
BackLED(ON,ON);
MotorSpeed(0,200);
Sleep(20000);
}
}
return 0;
}


welches ich mir im Netz heruntergeladen habe. Da war ne .hex-Datei mit dabei und wenn ich es flashe--funktioniert auch alles.
Wenn ich den Code kopiere, und in meine Testdatei einfüge, compilliere, und dann flashen will passiert nix.
Woran kann das liegen?? Ich benutze die neueste Lib.

Valen
17.03.2010, 19:25
Sleep(20000);Habst du kein compilier fehler meldung bekommen? Sleep(x) kan nur mit "unsigned char" werten arbeiten. Also "x" muss irgend was sein zwisschen 0 und 255. Nicht grösser.

Msleep(20000) ist möglich in die neue lib. Das sind "int" werten, also zwischen -32.768 und 32.767. Ich verstehe aber nicht warum die lib-guru's es kein "unsigned int" gemacht haben. Negatiefe warte zeiten machen kein sinn.

frank1210
18.03.2010, 09:03
keine fehlermeldung erhalten.[/code]

m.a.r.v.i.n
18.03.2010, 19:13
Die neueste AsuroLib enthält eigene Funktionen für den Ultraschallsensor. Bei der Lib ist auch ein entsprechendes Beispielprogramm dabei. Damit sollte es eigentlich funktionieren.

frank1210
19.03.2010, 06:46
Ja, den US Test. Aber nur zum Auslesen und anzeigen der Entfernung. das funktioniert ja auch bei mir.
Gruß Frank

Thomas$
19.03.2010, 15:01
und was geht jetzt nicht? oder hast du probleme das programm für dich passend zumachen?

frank1210
21.03.2010, 14:46
Als Programm verwende ich folgendes, welches ich mir im Netz heruntergeladen habe. Da war ne .hex-Datei mit dabei und wenn ich es flashe--funktioniert auch alles.
Wenn ich den Code kopiere, und in meine Testdatei einfüge, compilliere, und dann flashen will passiert nix.
Woran kann das liegen?? Ich benutze die neueste Lib.

// *******************************************
// * Ultraschall für ASURO *
// * Roboter versucht Hindernissen *
// * auszuweichen *
// * Achtung: asuro.c ist geändert *
// * (c) 2005Robin Gruber *
// * Details zum Code in: *
// * "Mehr Spaß mit ASURO, Band I" *
// *******************************************

#include "asuro_us.h"


void LocalInit(void)
{
// Change Oscillator-frequency to 40kHz, no toggling of IO-pin
TCCR2 = (1 << WGM21) | (1 << CS20);
OCR2 = 0x64; // 40kHz @8MHz
// ADC off
ADCSRA = 0;

// Analog Comparaot
ACSR = 0x02; // Generate Interrupt on falling Edge
ADMUX=0x03; // Multiplexer for Comparator to ADC pin 3
SFIOR|=(1<<ACME);

DDRD&=~(1<<6);

}


void Ping(unsigned char length)
{
count72kHz=0;
TCCR2 = (1 << WGM21) | (1 << COM20) | (1 << CS20);
while (count72kHz<length) {
OCR2=0x64+length/2-count72kHz;
};
TCCR2 = (1 << WGM21) | (1 << CS20);
OCR2=0x64;

}


int main(void)
{
int pos;
int posmarker;
int odata[2];
Init();
LocalInit();
while(1) {
// OdometrieData(odata);
posmarker=0;
Ping(20);
for (pos=0; pos<100; pos++) {
Sleep(10);
if ((ACSR&(1<<ACI))!=0) {
if (posmarker==0) {posmarker=pos;}
}
ACSR|=(1<<ACI);
}
if (posmarker>10) {
StatusLED(GREEN);
MotorDir(FWD,FWD);
BackLED(OFF,OFF);
MotorSpeed(200,200);
} else {
StatusLED(RED);
MotorDir(FWD,RWD);
BackLED(ON,ON);
MotorSpeed(0,200);
Sleep(20000);
}
}
return 0;
}

radbruch
21.03.2010, 15:19
Wenn ich den Code kopiere, und in meine Testdatei einfüge, compilliere, und dann flashen will passiert nix.Zwischen "Einfügen" und "Kompillieren" das "Speichern" vergessen?

frank1210
21.03.2010, 16:46
Alles versucht, es funzt nur die hex- Datei die dabei war. Vieleicht braucht man die UR_LIB( nur so ne Idee)
gruß Frank

Sternthaler
26.03.2010, 02:03
@Valen
Guter Tip an die 'Gurus?'. In der nächsten Lib ist in Msleep nun ein "unsigned int" als Parameter vorhanden.

Gruß Sternthaler