Ich hab nun einfach das Standartprogramm übernommen und eine weitere If-Schleife eingefügt, die den ASURO zum anhalten bringen soll, wenn ein Taster gedrückt wird. Der ASURO fährt jetzt auf meine Wärmequelle (eine Teelicht) zu, zwar etwas ruckartig, aber es funktioniert. Das Anhalten bei Tasterdruck geht aber weiterhin nicht...
Code:
#include "asuro.h"
// Schwellen für die intensitätsabhängige Geschwindigkeit
#define THRESH1 20
void ThermalData(unsigned int *data)
{
// ThermalData() funktioniert genauso, wie LineData(), ...
// ... nur dass dabei die interne Spannungsreferenz als ...
// ... AD-Wandlerreferenz verwendet wird.
// Prozessorinterne Referenz verwenden
// Multiplexer auf linken Sensor schalten
ADMUX = (1 << REFS0) | (1 << REFS1) | IR_LEFT;
// Wandlung starten
ADCSRA |= (1 << ADSC);
// Warten, bis Wandlung beendet
while (!(ADCSRA & (1 << ADIF)));
// ADCIF zurücksetzen
ADCSRA |= (1 << ADIF);
// ADC-Wert auslesen
data[0] = ADCL + (ADCH << 8);
// Prozessorinterne Referenz verwenden
// Multiplexer auf rechten Sensor schalten
ADMUX = (1 << REFS0) | (1 << REFS1) | IR_RIGHT;
// Wandlung starten
ADCSRA |= (1 << ADSC);
// Warten, bis Wandlung beendet
while (!(ADCSRA & (1 << ADIF)));
// ADCIF zurücksetzen
ADCSRA |= (1 << ADIF);
// ADC-Wert auslesen
data[1] = ADCL + (ADCH << 8);
}
int main(void)
{
// Speicher für die Messwerte bereitstellen
unsigned int tdata[2];
unsigned int speed;
signed int diff,sum;
Init();
// Motoren immer auf vorwärts
MotorDir(FWD,FWD);
while(1)
{
// Messwerte einlesen
ThermalData(tdata);
// Die Summe der Werte wird für die Berechnung der ...
// ... Geschwindigkeit genutzt
sum=tdata[0]+tdata[1];
StatusLED(RED);
// Signal stark genug?
if (sum>THRESH1) {
speed=140;
// Richtung bestimmen
diff=((signed)tdata[0]-(signed)tdata[1])*32/sum;
if (diff>4) {
// Links deutlich wärmer? Nach links fahren!
BackLED(ON,OFF);
MotorSpeed(0,speed);
}
else if (diff<-4) {
// Rechts deutlich wärmer? Nach rechts fahren!
BackLED(OFF,ON);
MotorSpeed(speed, 0);
}
else {
// Sonst geradeaus!
BackLED(OFF,OFF);
MotorSpeed(speed, speed);
}
if(PollSwitch()){
MotorSpeed(0,0);
StatusLED(GREEN);}
}
else {
// Keine Wärmequelle in Sicht? Stehen bleiben!
StatusLED(OFF);
BackLED(OFF,OFF);
}
}
return 0;
}
Lesezeichen