-         

Ergebnis 1 bis 6 von 6

Thema: 100 Impulse per Tastenknopf ausgeben / Assemblercode

  1. #1
    Neuer Benutzer Öfters hier
    Registriert seit
    21.06.2007
    Ort
    Knonau
    Alter
    29
    Beiträge
    11

    100 Impulse per Tastenknopf ausgeben / Assemblercode

    Anzeige

    Hallo Zusammen,

    Ich befasse mich seit 2 Monaten mit Assemblerprogrammierung und habe auch schon einige einfache Programme zum laufen gebracht.
    Leider komme ich an meinem jetzigem Projekt leider nicht weiter

    Ich versuche ein Schrittmotor mit dem Treiber L297 anzusteurern. ( Ich gebe einen Impuls und der Schrittmotor dreht sich um 1.8°)
    Nun möchte ich ein Programm in Assembler entwickeln welches wenn ich ein Taster drücke genau 180° also 100 Impulse ausgibt. Die Impulse müssen nicht besonders schnell sein es würde reichen wenn die 100 Impulse in zwei Sekunde erfolgen würden.

    Ich wäre sehr Dankbar wenn ihr mir ein Code oder eine Gedankenhilfe liefern würdet.

    Mit freundlichen Güssen Matthias aus der schweiz

  2. #2
    Erfahrener Benutzer Robotik Einstein Avatar von wkrug
    Registriert seit
    17.08.2006
    Ort
    Dietfurt
    Beiträge
    1.892
    Da gibt es einige Möglichkeiten wie man so etwas realisieren kann.

    Ich würd erstmal ein Register oder einen RAM Speicherplatz bei einem Tastendruck mit dem Wert 100 laden.

    Nach der Ausgabe eines kompletten impulses wird dieser Zähler um 1 zurückgezählt.

    Nun musst du für einen Motor die Ausgabefrequenz heruntersetzen.
    Das kannst Du über eine Zeitschleife machen - was aber den Nachteil hat, das der Controller während dieser Zeit nichts anderes machen kann.

    Oder Du lässt einen Timer laufen in dessen Comparematch oder Overflow Interrupt der Impuls erzeugt und der Zähler heruntergezählt wird.

    Wenn du ein symetrisches Signal brauchst (puls/pause = 50/50) könntest Du auch den Zähler mit 200 füttern und bei geraden Zahlen ein H ausgeben und bei ungeraden Zahlen ein L.
    Das geht in Assembler mit 4 Befehlen

    ROR r16
    BRCS ungerade ;Wenn das niederwertigste Bit eine 1 ist (=Zahl ungerade) wird verzweigt.
    ROL r16
    ...


    DEC r16
    BRNE nochpulse ; Es müssen noch Impulse ausgegeben werden.



    Das sind nur 2 Möglichkeiten, es gibt sicher noch einige mehr.

  3. #3
    Neuer Benutzer Öfters hier
    Registriert seit
    21.06.2007
    Ort
    Knonau
    Alter
    29
    Beiträge
    11
    Vielen Dank wkrug

    für deine schnelle Antwort!
    Ich habe kurz ein kleines Programm entwickelt und habe es breits laufen lassen, leider funktioniert es nicht so wie ich mir das wünsche. Wenn ich den Taster drücke dreht sich der Schrittmotor nur 1.8°, wenn ich ihn erneut drücke dreht sich der Schrittmotor gar nicht mehr.

    Kann mir jemand vielleicht sagen was an diesem Programm falsch ist?

    Start
    Initialiesierung ; B.0 als Eingang mit Pull - Up und B.1 als Ausgang
    r16 als Zähler ldi r16,100 r17,r18 als warte ldi, r17 0b00000001 ldi r18,0b00000001

    mainloop: sbis PINB,0
    rjmp schritt ; warte bis Tastergedrückt
    rjmp mainloop



    schritt: cbi PORTB, 1 ; lösche Bit
    rcall warte ; gehe zu warten
    sbi PORTB, 1 ; setze Bit
    subi r16,1 ; schlaufe bis r16 = 0
    brcc schritt
    rjmp mainloop


    warte: inc r17
    brne warte
    inc r18
    brne warte
    ret


    ; ----------------- Ende


    Hoffe mir kann jemand helfen

    Mfg Matthias

  4. #4
    Erfahrener Benutzer Robotik Einstein Avatar von wkrug
    Registriert seit
    17.08.2006
    Ort
    Dietfurt
    Beiträge
    1.892
    Also ich hätte da folgende Anmerkungen dazu

    Start
    Initialiesierung ; B.0 als Eingang mit Pull - Up und B.1 als Ausgang
    r16 als Zähler ldi r16,100 r17,r18 als warte ldi, r17 0b00000001 ldi r18,0b00000001

    mainloop: sbis PINB,0
    rjmp schritt ; warte bis Tastergedrückt
    rjmp mainloop



    schritt:

    rcall warte ; sonst kann es sein das die 1 nach einer 0 zu kurz anliegt.

    cbi PORTB, 1 ; lösche Bit
    rcall warte ; gehe zu warten
    sbi PORTB, 1 ; setze Bit
    dec r16
    BRNE schritt ; schlaufe bis r16 = 0

    rjmp mainloop


    warte: inc r17
    brne warte
    inc r18
    brne warte
    ret


    ; ----------------- Ende
    Ich vermute das folgendes passiert.
    Standardmässig ist der PortB.1 ja 0.
    In deinem Schritt Programm wird er durch die Anweisung SBI PORTB,1 auf 1 gesetzt, aber nur sehr kurz, weil ja fast sofort wieder die Anweisung CBI PORTB,1 ausgeführt wird.
    Diese 1 wird dein Schrittmotortreiber nicht mitbekommen und mal erst gar nichts tun.
    Am Ende der Routine wird der PORTB,1 dauerhaft auf 1 gesetzt, das schnallt dein Motortreiber und macht einen Schritt.

    Probier das mal mit dem zusätzlichen rcall warte.

    Eigentlich müsste der Motortreiber nach jedem Tastendruck einen Schritt machen, wenn Du lange genug wartest ca 15sekunden bei 8MHz.

    Was auch noch möglich wäre ist, das Du vergessen hast den Stack zu initialisieren, das macht dann auch immer komische Fehler

  5. #5
    Neuer Benutzer Öfters hier
    Registriert seit
    21.06.2007
    Ort
    Knonau
    Alter
    29
    Beiträge
    11
    Vielen Dank für deine Info leider will es immer noch nicht richtig funktionieren Momentan läuft der Motor gar nicht mehr.. den Stack habe ich initialisiert, ich nehme immer ein grundgerüst eines Assemblercode so können schon einige Fehler vermieden werden. Könntest du mir vielleicht ein Code Schnipsel oder einen ganzen code geben der anders aufgebaut ist als meiner aber die gleiche Funktion hat, denn momentan stehe ich total an diesem Problem an..

    Vielen Dank für deine Antwort
    Mfg Matthias

  6. #6
    Neuer Benutzer Öfters hier
    Registriert seit
    21.06.2007
    Ort
    Knonau
    Alter
    29
    Beiträge
    11
    Ach es war gar kein grosses Problem habe nur vergessen den Zähler wieder zu Reseten!

    Vielen Dank für eure, also eigentlich deine Hilfe wkrug

    Mfg Matthias

Berechtigungen

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