hi allerseits,
habe wieder ein paar fragen...
das programm aus dem band 2 lässt sich fehlerfrei kompilieren, der asuro fährt auch schön geradeaus:
Code:
/* Geradeausfahren mit Initialisierung "geradeausplus.c"*/
#include "asuro.h"
#include "eeprom.h"
#include "inka.h"
// Schwellwert für die Hell/Dunkel-Unterscheidung
// Eventuell muss damit etwas variiert werden
#define TRIGGERLEVEL 600
#define HYSTERESIS 10
#define LOW 0
#define HIGH 1
int main(void) {
unsigned int data[2];
signed int status[2]={0,0};
signed int difference=0;
unsigned int distance=0;
unsigned int eeread,eewrite;
char eewriteflag=0;
Init();
WaitforStart();
// liest ein wort aus EEPROM
eeread=eeprom_read_word ((uint16_t*)0);
// Wert auf Plausibilität prüfen
if (eeread<512) {difference=(signed)eeread-256;}
MotorDir(FWD, FWD);
while(1)
{
// Helligkeitswerte der Lichtschranken auslesen
OdometrieData(data);
// Wechsel linker Sensor von niedrig auf hoch?
if ((status[0]==LOW) && (data[0]>TRIGGERLEVEL+HYSTERESIS)) {
status [0] = HIGH;
difference++;
distance++;
eewriteflag=1;
}
// Wechsel linker Sensor von hoch auf niedrig?
if ((status[0]==HIGH) && (data[0]<TRIGGERLEVEL-HYSTERESIS)) {
status [0] = LOW;
difference++;
distance++;
eewriteflag=1;
}
// Wechsel rechter Sensor von niedrig auf hoch?
if ((status[1]==LOW) && (data[1]>TRIGGERLEVEL+HYSTERESIS)) {
status[1]=HIGH;
difference-- ;
}
// Wechsel rechter Sensor von hoch auf niedrig?
if ((status[1]==HIGH) && (data[1]<TRIGGERLEVEL-HYSTERESIS)) {
status[1]=LOW;
difference-- ;
}
// zur Sicherheit: verhindern, dass der Differenzzähler
// den erlaubten Wertebereich veriässt
if (difference<-255 ) difference=-255;
if (difference>255) difference=255;
// status-LED noch entsprechend der erkannten Segmente
// aufleuchten lassen, grün für links, rot für rechts
StatusLED(status[0]+status[1]*2);
// Zähldifferenz passend, auf die Motoren verteilen
if (difference>0) MotorSpeed(255-difference,255);
else MotorSpeed(255, 255+difference);
// Alle 128 Odo-Ticks den Wert ins EEPROM schreiben
if ((distance%128==0) && (eewriteflag==1)) {
eewrite=(unsigned) (difference+256);
eeprom_write_byte ((uint8_t * )0,eewrite&0xFF);
eeprom_write_byte ((uint8_t * )1,eewrite>>8);
eewriteflag=0;
}
return 0;
}
}
auf veränderungen bei TRIGGERLEVEL, auch ins extreme (2000 bzw. 200) reagiert er nicht und fährt weiter geradeaus. Ist das ok? Wozu dann diese variable überhaupt?
zweite frage: kann ich irgendwie überprüfen was da ins EEPROM geschrieben wird, und ob überhaupt???
danke euch
Lesezeichen