Hallo
Drei Alternativen:könnte ich denn ... mehrere sleepfunktionen hintereinander hängen??
1. Die Funktion Msleep(zeit) wartet zeit*1miliSek. , ist aber erst in den neueren Versionen der asuro.c verfügbar.
2. Die Funktion Gettime() gibt die Zeit seit dem Systemstart des asuros in milliSek. zurück, ist aber auch erst in den neueren Versionen der asuro.c verfügbar. Anwendung:
Wartet eine Sekunde (und man könnte während des Wartens noch was tun in der while-Schleife, z.b. blinken)unsigned long int stopzeit;
stopzeit=Gettime()+1000;
while(Gettime()<stopzeit);
3. Mit einem Schleifenzähler der jeden Programmdurchlauf mitzählt ist man unabhängig von den Zeitfunktionen des asuros:
Den Vorteil solcher etwas aufwändigeren Konstruktionen (2.+3.) sehe ich darin, dass man während den Wartezyklen noch was anderes tun kann, z.B. blinken, Tasten abfragen oder einzelne Zeichen per IR-Schnittstelle senden... Bei Verwendung von Sleep() geht das nicht.unsigned long int loop_counter, stop_loop;
loop_counter=0;
stop_loop=0;
while(1){
loop_counter++;
if (stop_loop==0) {
Motoren_starten();
stop_loop=loop_counter+1000;
}
if (loop_counter>stop_loop) {
Motoren_stoppen();
}
}
Man muss allerdings bei 3. darauf achten, das loop_counter auch innerhalb der Warteschleife hochgezählt wird.
Ob daskönnte ev mal jemand den code durchschauen und sagen, ob er den fehler findet??
if((s1 && s2) == 0)
wie erwarten funktioniert weis ich nicht sicher. s1 && s2 ergibt false wenn s1=0 und s2=0 sind, aber false ist Typ boolean und 0 ist Typ byte(?), also sollte ein direkter Vergleich mit == eigentlich false ergeben: der asuro fährt nur rückwärts. Keine Ahnung, ob das wirklich so ist, aber sicherheitshalber würde ich schreiben:
if ((s1&s2)) == 0)
& ist bitweises Vergleichen und hat als Ergebniss den selben Typ wie s1 und s2. Dies kann man dann bedenkenlos auf ==0 prüfen. Oder man machts gleich so:
if ((s1==0) && (s2==0))
Gruß
mic
Lesezeichen