schaue dir die datei ultrasoni.c in der 2.7.1 lib an, dort ist beschrieben was zu tun ist...
Druckbare Version
schaue dir die datei ultrasoni.c in der 2.7.1 lib an, dort ist beschrieben was zu tun ist...
Heureka, Kompilierproblem gelöst!
In die asuro.h (bei mir unter c:\asuro_src\asurolib\lib ) folgenden Code (gefunden auf
http://www.henkessoft.de/Roboter/ASURO.htm) eingefügt:
Nun stellt sich die Frage ob ich diese Datei abändern darf, oder ob ich das ganze in myasuro.c eintragen muss?Code:/*****************ultrasonic********************************/
/**
* being used insted TIMER2_OVF_vect during ultrasonic polling
*/
ISR(TIMER2_COMP_vect)
{
//TCNT2 += 0x25; //Wichtig!! Die Zeile muss entfernt werden, damit es funktioniert.
count36kHz++;
if(!count36kHz) timebase++;
}
/**
* initialises the Ultrasonic module
* this function is automaticly called by Chirp
*/
void InitUltrasonics(void)
{
// Change Oscillator-frequency of Timer 2
// to 40kHz, no toggling of IO-pin:
TCCR2 = (1 << WGM21) | (1 << CS20);
OCR2 = 100; // 40kHz @8MHz crystal
TIMSK |= (1 << OCIE2); // OCIE2: Timer/Counter2 Output Compare Match Interrupt Enable
ADCSRA = (0 << ADEN); // deactivate ADC
ACSR |= (1 << ACIS1); // Comparator Interrupt on Falling Output Edge
ADMUX = 0x03; // connect ADC3-input with comparator
SFIOR |= (1 << ACME); // connect ADC multiplexer to comparator
DDRD &= ~(1 << 6); // use Port D Pin 6 as input (AIN0)
}
/**
* restores the hardware after using the Ultrasonic module
* this function is called automaticly after a Chirp
*/
void RestoreAsuro(void)
{
TCCR2 = (1 << WGM20) | (1 << WGM21) | (1 << COM20) | (1 << COM21) | (1 << CS20);
OCR2 = 0x91; // duty cycle for 36kHz
TIMSK |= (0 << OCIE2); // OCIE2: Timer/Counter2 Output Compare Match Interrupt Enable
ADCSRA = (1 << ADEN) | (1 << ADPS2) | (1 << ADPS1); // clk/64
ACSR |= (0 << ACIS1);
if(autoencode)
{
EncoderInit();
}
Sleep(1);
}
/**
* @return distance in cm
*/
int Chirp(void)
{
unsigned int sleeptime = 0, dist = 0;
InitUltrasonics();
// chirpen:
count36kHz = 0;
while(count36kHz != 20)
{
OCR2 = 100 + 20 / 2 - count36kHz;
}
TCCR2 = (1 << WGM21) | (1 << CS20);
OCR2 = 100;
// analyse echoes:
while(TRUE)
{
Sleep(1);
sleeptime++;
if((ACSR & (1 << ACI)))
{
// Hinweis: 344 m/s Schallgeschwindigkeit in Luft bei ca. 20°C
dist = (unsigned int) ((long) ((344L * ((sleeptime * 1000L) / 72L) / 10000L) / 2L));
ACSR |= (1 << ACI);
break;
}
ACSR |= (1 << ACI);
if(sleeptime > 3500)
{
return -1;
}
}
RestoreAsuro();
return dist;
}
@inka:
Danke für den Hinweis, hat wohl eine Überschneidung bei unseren Posts gegeben. Der Code in der ultrasonic.c scheint neuer als der von mir verwendete zu sein, mal sehen.
Freut mich, dass sich hier nun noch mehr Ultraschall-Asuros tummeln. ;-)
hallo ehenkes,
mal eine Frage an den Fachmann:
Ich habe deinen Code geflasht:
Wenn ich nun den Asuro einschalte fährt er nur Ruckartig rückwärts, wenn ich meine Hand davorhalte fährt er gleichmässig rückwärts. Leider nie vorwärts :-kCode:/*****************ultrasonic********************************/
/**
* being used insted TIMER2_OVF_vect during ultrasonic polling
*/
ISR(TIMER2_COMP_vect)
{
//TCNT2 += 0x25; //Wichtig!! Die Zeile muss entfernt werden, damit es funktioniert.
count36kHz++;
if(!count36kHz) timebase++;
}
/**
* initialises the Ultrasonic module
* this function is automaticly called by Chirp
*/
void InitUltrasonics(void)
{
// Change Oscillator-frequency of Timer 2
// to 40kHz, no toggling of IO-pin:
TCCR2 = (1 << WGM21) | (1 << CS20);
OCR2 = 100; // 40kHz @8MHz crystal
TIMSK |= (1 << OCIE2); // OCIE2: Timer/Counter2 Output Compare Match Interrupt Enable
ADCSRA = (0 << ADEN); // deactivate ADC
ACSR |= (1 << ACIS1); // Comparator Interrupt on Falling Output Edge
ADMUX = 0x03; // connect ADC3-input with comparator
SFIOR |= (1 << ACME); // connect ADC multiplexer to comparator
DDRD &= ~(1 << 6); // use Port D Pin 6 as input (AIN0)
}
/**
* restores the hardware after using the Ultrasonic module
* this function is called automaticly after a Chirp
*/
void RestoreAsuro(void)
{
TCCR2 = (1 << WGM20) | (1 << WGM21) | (1 << COM20) | (1 << COM21) | (1 << CS20);
OCR2 = 0x91; // duty cycle for 36kHz
TIMSK |= (0 << OCIE2); // OCIE2: Timer/Counter2 Output Compare Match Interrupt Enable
ADCSRA = (1 << ADEN) | (1 << ADPS2) | (1 << ADPS1); // clk/64
ACSR |= (0 << ACIS1);
if(autoencode)
{
EncoderInit();
}
Sleep(1);
}
/**
* @return distance in cm
*/
int Chirp(void)
{
unsigned int sleeptime = 0, dist = 0;
InitUltrasonics();
// chirpen:
count36kHz = 0;
while(count36kHz != 20)
{
OCR2 = 100 + 20 / 2 - count36kHz;
}
TCCR2 = (1 << WGM21) | (1 << CS20);
OCR2 = 100;
// analyse echoes:
while(TRUE)
{
Sleep(1);
sleeptime++;
if((ACSR & (1 << ACI)))
{
// Hinweis: 344 m/s Schallgeschwindigkeit in Luft bei ca. 20°C
dist = (unsigned int) ((long) ((344L * ((sleeptime * 1000L) / 72L) / 10000L) / 2L));
ACSR |= (1 << ACI);
break;
}
ACSR |= (1 << ACI);
if(sleeptime > 3500)
{
return -1;
}
}
RestoreAsuro();
return dist;
}
Die US-Sensoren scheinen zu funktionieren, oder nicht?
Hallo,
ich habe für meine US-Kalibrierung den Code von ehenkes verwendet:
mit diesen Messergebnissen:Code:#include "asuro.h"
int abstand=0;
int main(void)
{
Init();
SerWrite("\r\n --- ultrasonic test ---",29);
Msleep(1000);
do
{
abstand = Chirp();
SerWrite("\r\n distanz in cm: ",20);
Msleep(500);
PrintInt(abstand);
}
while(1);
return 0;
}
Wenn ich nun diesen US-Code lade:Code:distanz in cm: 0
distanz in cm: 05
distanz in cm: 14
distanz in cm: 15
distanz in cm: 15
distanz in cm: 14
distanz in cm: 05
distanz in cm: 15
distanz in cm: 15
distanz in cm: 14
distanz in cm: 15
distanz in cm: 14
distanz in cm: 15
distanz in cm: 14
distanz in cm: 15
distanz in cm: 04
distanz in cm: 0
distanz in cm: 0
distanz in cm: 0
distanz in cm: 0
distanz in cm: 0
distanz in cm: 0
distanz in cm: 0
distanz in cm: 697
distanz in cm: 698
distanz in cm: 698
distanz in cm: 698
distanz in cm: 498
distanz in cm: 597
distanz in cm: 697
distanz in cm: 697
distanz in cm: 675
distanz in cm: 697
distanz in cm: 697
distanz in cm: 671
distanz in cm: 698
distanz in cm: 713
distanz in cm: 0
distanz in cm: 14
distanz in cm: 19
distanz in cm: 19
distanz in cm: 09
distanz in cm: 19
distanz in cm: 19
distanz in cm: 19
Nun dreht sich der Asuro ruckartig rückwärts im Kreis. Kann mir jemand einen Tip geben?Code:/*
Bewegung auf Basis Ultraschallortung
Dr. Erhard Henkes, Mai 2007
*/
#include "asuro.h" // incl. der Funktionen InitUltrasonics, RestoreAsuro, Chirp von "dopez" (roboternetz)
#define MAXDIFF 80 // Sehr große Sprünge zunächst ausblenden
int main(void)
{
int abstand, abstand_alt, diff, zaehler=0;
Init();
abstand = Chirp();
while(TRUE)
{
abstand_alt = abstand;
abstand = Chirp();
++zaehler;
diff = abstand - abstand_alt;
if( (abstand>15) && (abs(diff)<MAXDIFF) )
{
StatusLED(GREEN);
MotorDir(FWD, FWD);
MotorSpeed(150, 150);
}
else if( (abstand>10) && (abstand<=15) && (abs(diff)<MAXDIFF) )
{
StatusLED(GREEN);
MotorDir(FWD, FWD);
MotorSpeed(150, 100);
Msleep(30);
}
else
{
StatusLED(RED);
MotorDir(RWD, RWD);
MotorSpeed(100, 150);
Msleep(100);
}
if (zaehler > 400)
{
StatusLED(RED);
BackLED(ON,ON);
MotorDir(RWD, RWD);
MotorSpeed(250, 200);
Msleep(10);
BackLED(OFF,OFF);
}
if (zaehler > 405)
{
StatusLED(RED);
BackLED(ON,ON);
MotorDir(RWD, RWD);
MotorSpeed(200, 250);
Msleep(10);
BackLED(OFF,OFF);
if(zaehler > 410)
zaehler = 0;
}
}
return 0;
}
Danke
Pinsel
hi,
hast du beim code 1 und den messergebnissen die entfernung (mit der hand z.b.) variiert?
zu code 2: du solltest versuchen die werte z.b. für MAXDIFF oder der abfrage zu abstand zu verändern...
hi inka,
das variieren bei Code 1 habe ich gemacht. Geht, wenn auch der Wert schnell auf "0" springt. Der Poti ist so eingestellt, dass, wenn der Abstand und ca. 30 cm kommt "0" erscheint - dies war der beste Kompromiss nach 30 Minuten Poti einstellen.
Ist MAXDIFF der einzige Wert oder gibt es andere, die ich anpassen muß?
Noch was beim Kompilieren kommt folgende Warnung:
test.c:12: warning: implicit declaration of function 'Chirp'
kann ich die ignorieren?
Gruß
Pinsel
hi,
man hat mir gesagt, bei der "0" handelt es sich um einen akustischen "kurzschluss" zwischen sender und empfänger und sollte eigentlich nicht vorkommen. Kommt aber vor, auch bei mir, isolierun so gut wie unmöglich. Also rausfilter, das versucht das zweite programm, wie, das habe ich noch nicht so genau verstanden...
Ob MAXDIFF die einzuge veränderbare größe ist kann i9ch also auch nicht so genau sagen...
die fehlermeldung beim kompilieren wird durch das "nichtanmelden" (deklarieren) der funktion Chirp() verursacht, ist durch das includen der datei in der diese definition bei dir definiert ist behebbar...
OK, Wartung kommt nicht mehr. Mein Code sieht jetzt so aus:
Kannst du mal drübersehen? Ich habe immer noch das gleiche Problem mit dem "Rückwärtsgang".Code:#include "asuro.h" // incl. der Funktionen InitUltrasonics, RestoreAsuro, Chirp von "dopez" (roboternetz)
#include "ultrasonic.h"
#define MAXDIFF 80 // Sehr große Sprünge zunächst ausblenden
int main(void)
{
int abstand, abstand_alt, diff, zaehler=0;
Init();
abstand = Chirp();
while(TRUE)
{
abstand_alt = abstand;
abstand = Chirp();
++zaehler;
diff = abstand - abstand_alt;
if( (abstand>40) && (abs(diff)<MAXDIFF) )
{
StatusLED(GREEN);
MotorDir(FWD, FWD);
MotorSpeed(150, 150);
}
else if( (abstand>35) && (abstand<=40) && (abs(diff)<MAXDIFF) )
{
StatusLED(GREEN);
MotorDir(FWD, FWD);
MotorSpeed(150, 100);
Msleep(30);
}
else
{
StatusLED(RED);
MotorDir(RWD, RWD);
MotorSpeed(100, 150);
Msleep(100);
}
if (zaehler > 400)
{
StatusLED(RED);
BackLED(ON,ON);
MotorDir(RWD, RWD);
MotorSpeed(250, 200);
Msleep(10);
BackLED(OFF,OFF);
}
if (zaehler > 405)
{
StatusLED(RED);
BackLED(ON,ON);
MotorDir(RWD, RWD);
MotorSpeed(200, 250);
Msleep(10);
BackLED(OFF,OFF);
if(zaehler > 410)
zaehler = 0;
}
}
return 0;
}
Wie hast du deinen zum Laufen gebracht?