Hallo Xtreme,
ja allerdings! Da muss einiges an Zeit zwischen liegen!
Das ACS sendet periodisch IR Impulse aus.
Dabei läuft das Aussenden der IR Impulse im Hintergrund in einem der Timer Interrupts (s. ISR (TIMER2_COMP_vect) ) - das wird in der task_ACS() Funktion nur gesteuert.
Damit das korrekt funktioniert, müssen auch ein paar Millisekunden zwischen den einzelnen IR Impuls Paketen liegen, sonst erkennt der TSOP34836 das als Störlicht und blockiert den weiteren Empfang.
Wenn Du Dir mal die task_ACS Funktion in der Library anschaust, sieht Du, dass das ein schon eine recht komplexe Statemachine (=Zustandsautomat) ist (da ist aber auch noch einiges zur Synchronisation von ACS und IRCOMM drin).
Es wird immer zwischen beiden Sendedioden vorne hin und her gewechselt - erst sendet die linke Diode, es wird gewartet ob etwas emfpangen wird - dann die rechte, wieder warten - und es beginnt von vorne.
Je nachdem ob etwas detektiert wird, werden die obstacle_left und obstacle_right Variablen gesetzt.
Das braucht natürlich etwas Zeit
Teste mal 30ms Pause (oder mehr) nachdem Du die Sendeleistung umgeschaltet hast, z.B. so:
Code:
// Sendeleistung umschalten
// Pause:
uint8_t i;
for(i = 0; i < 10; i++)
{
task_ACS();
mSleep(3);
}
// Sendeleistung umschalten
// Pause...
oder natürlich besser mit den Stopwatches. Dann z.B. eine kleine Statemachine basteln die alle 30ms aufgerufen wird ...
Grundlegend so:
Code:
startStopwatch1();
while(true)
{
if(getStopwatch1() > 30) // mind. 30 ms vergangen?
{
// Hier Statemachine einfügen, die die Sendeleistung umschaltet
// je nachdem ob etwas detekiert wird...
// Stopwatch zurücksetzen:
setStopwatch1(0);
}
// Ständig die task_ACS Funktion aufrufen - die kümmert sich selbst
// ums Timing:
task_ACS();
}
Ist nur das Grundgerüst.
Da fehlt natürlich noch der Hauptteil
MfG,
SlyD
PS: Den Code oben habe ich hier im Browser eingetippt - ist also nicht getestet!
Lesezeichen