- MultiPlus Wechselrichter Insel und Nulleinspeisung Conrad         
Ergebnis 1 bis 5 von 5

Thema: Brauche Hilfe bei Interrupts für die Taster(Assembler)

Baum-Darstellung

Vorheriger Beitrag Vorheriger Beitrag   Nächster Beitrag Nächster Beitrag
  1. #5
    Neuer Benutzer Öfters hier
    Registriert seit
    05.03.2009
    Beiträge
    20
    Hallo,

    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".

    Viel Spass
    Skroete
    Angehängte Dateien Angehängte Dateien

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •  

LiFePO4 Speicher Test