endlich mal wieder Einer, der sich an den Asuro in Assembler herantraut.
@Besserwessi
Das eventuelle Prellen von Tasten spielt bei diesem Effekt keine Rolle
und dass r18 nicht auf den Stack gerettet wird, ist auch OK, solange r18
nur in der ISR benutzt wird. Das Gleiche gilt auch für r25.
Deshalb vergiss mal die ganze Tastenentprellung.
@Gurkenmesser
Dass der Asuro bei jedem 2. Anecken um 180Grad dreht ist völlig richtig.
Das hast du so programmiert! Beim 1. Aufruf der ISR setzt du am Label
Drehen: das Register r25 mit der Anweisung inc r25 auf 1.
Beim 2. Aufruf landet er dann durch cpi r25,1 immer auf Drehen180:
Dort wird dann mit clr r25 das Register wieder auf 0 gesetzt und das
Spiel kann von vorn beginnen.
Also du müsstest dafür sorgen, dass r25 nach Ablauf einer gewissen Zeit
wieder auf 0 gesetzt wird.
So weit, so schlecht.
Ein paar Bemerkungen nun zu deiner Implementierung.
Sehr schlecht ist es in einer ISR den AVR in Warteschleifen zu schicken
(rcall wait). Wenn der Asuro fährt und während dem rcall wait irgendwo
andonnert, dann kriegst du das nicht mit, da er ja noch in der ISR routine
verweilt. Alle ISR sind dann nämlich gesperrt.
Da er nur dreht, wird er wohl nicht anstossen können, ist aber dennoch
generell schlechter Programmstil und man sollte sich das gar nicht erst
angewöhnen.
Lösung : In der ISR nur ein Flag setzen, im Hauptprogramm das Flag prüfen und dort das Drehen abarbeiten.
Damit kannst du dann auch gleich dein 2. Problem
"Ich würde das jetzt irgendwie über timer lösen weiß aber noch nicht so richtig wie"
lösen.
Wenn du den Asuro nach dem Drehen wieder vorwärts fahren lässt, schickst du den AVR mit rcall wait_neu wieder in eine warteschleife. Falls er nun während dem Warten wieder irgendwo andonnert, landet er wieder in der ISR. Dort kannst du nun ein weiteres Flag setzen für die 180Grad Drehung. In der wait_neu kannst du dann das Flag prüfen und falls notwendig die 180Grad Drehung abarbeiten. Beim Verlassen
der wait_neu werden auf jedenfall die beiden Flags gelöscht.
Damit ist der AVR wieder scharf für das nächste Anstossen.
Das wäre eine Lösung von vielen, vielen Möglichkeiten.
Da in der ISR nun nur noch 2 Flags gesetzt werden, stellt sich mir die Frage, ob man das Ganze nicht auch im Hauptprogramm prüfen und abarbeiten kann.
Das ist aber Geschmackssache.
Falls du ein paar Assembler Beispiele sehen möchtest, dann schau mal hier im Forum nach "Asuro programmieren in Assembler".
Anbei noch ein kleines Fahrprogramm und die Sourcen für das AVR-Studio.
Und lass dich hier nicht von den C-Programmierern beirren. Nur wer beides beherrscht kann auch beides beurteilen.
Also kein Grund für das Wörtchen "leider".
Lesezeichen