hi,
ich habe festgestellt, dass die reaktion auf hindernisse bei eingeschalteten motoren doch unzuverlässiger ist als zuerst gedacht. Ich nehme an, die US-kapseln werden (wie im forum schon mal beschrieben) durch den US-anteil bei dem krach den die motoren veranstallten gestört. Was kann ich dagen tun? Ändert sich das bei besser einstellung am poti? Ich habe mir auch überlegt - weil, wenn der asuro schräg gegen die wand ankommt, die US-kapseln nicht reagieren können - die seitlichen taster mit zu richtungsänderun zu nehmen, ich schaffe es einfach nicht, den teil des programms (im code auskomentiert) an die richtige stelle zu bekommen. Könntet ihr mir paar tipps geben? Zumindest wie ich die stelle erkennen kann, wo die US abfrage stattfindet, denn davor müsste ja die abfrage der tasten hin...
Code:
#include "asuro.h"
unsigned char sw, sw0, sw1, sw2;
void LocalInit(void)
{
// Change Oscillator-frequency of Timer 2
// to 40kHz, no toggling of IO-pin:
TCCR2 = (1 << WGM21) | (1 << CS20);
OCR2 = 0x64; // 40kHz @8MHz crystal
ADCSRA = 0x00; // ADC off
// Analog comparator:
ACSR = 0x02; // Generate interrupt on falling edge
ADMUX = 0x03; // Multiplexer for comparator to
// ADC pin 3
SFIOR |= (1 << ACME); // Enable muliplexing of comparator
DDRD &= ~(1 << 6); // Port D Pin 6 is input!
}
void Ping(unsigned char length)
{
count72kHz = 0;
TCCR2 = (1 << WGM21) | (1 << COM20) | (1 << CS20);
// Toggling of IO-Pin on
// generate the Chirp
while(count72kHz < length) {
OCR2 = 0x64 + length / 2 - count72kHz;
}
TCCR2 = (1 << WGM21) | (1 << CS20); // Toggling of IO-Pin off
OCR2 = 0x64; // set frequency to 40kHz
}
int main(void)
{
int pos, i;
int posmarker;
Init();
LocalInit();
while(TRUE) {
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);
}
/*sw0=PollSwitch(); // Schalter einlesen und für eine Runde speichern
sw1=PollSwitch();
sw2=PollSwitch();
if ((sw0==sw1) && (sw0==sw2)) sw=sw0; else sw=0;
if (sw==32) {StatusLED (YELLOW);
//MotorDir(FWD, RWD);
//MotorSpeed(0, 200);
}
else if (sw==1) {StatusLED (YELLOW);
//MotorDir(FWD, RWD);
//MotorSpeed(0, 200);
}
else */
if(posmarker > 10) {
StatusLED(GREEN);
MotorDir(FWD, FWD);
MotorSpeed(200, 200);
}
else {
StatusLED(RED);
MotorDir(FWD, RWD);
MotorSpeed(0, 200);
for(i = 0; i<100; i++) { Sleep(200); }
}
}
return 0;
}
danke...
Lesezeichen