@Ceos,
vielen Dank für den Tipp. Ich hab versucht deinen Hinweis umzusetzen und bin leider gescheitert... Mein ASURO fährt nach dem Einschalten sturr gerade aus und schaltet die LED auf Grün. Bei einem Tastendruck ändert sich daran auch nichts.
Hier mein Programm:
Code:
#include "asuro.h"
// Schwellen für die intensitätsabhängige Geschwindigkeit
#define THRESH1 20
#define THRESH2 80
#define THRESH3 200
#define STATUS 0
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;
StatusLED(OFF);
Init();
switch(STATUS){
case(0): {// Messwerte einlesen
ThermalData(tdata);
// Die Summe der Werte wird für die Berechnung der ...
// ... Geschwindigkeit genutzt
sum=tdata[0]+tdata[1];
// Signal stark genug?
if (sum>THRESH1) {
MotorDir(FWD,FWD);
speed=140;
// Ziemlich stark?
if (sum>THRESH2) {
speed=140;
}
// Sehr stark?
if (sum>THRESH3) {
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()){
STATUS==1;}
break;
}
case(1): { StatusLED(GREEN);
MotorSpeed(0,0);
Msleep(900);
MotorDir(RWD,RWD);
MotorSpeed(140,140);
Msleep(900);
STATUS==2;
break;}
case(2): { StatusLED(YELLOW);
MotorSpeed(0,0);
if(PollSwitch()){
STATUS==0;}
break;
}
}
}
}
}
ich befürchte, dass meine STATUS-deklarierung nicht passt oder die brea-Befehle falsch gesetzt sind. Ich würe mich über weitere Tipps freuen, da ich der Meinung bin, dass ich dieses Projekt so realisieren kann.
Gruß nooby21
Lesezeichen