PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : 100 Impulse per Tastenknopf ausgeben / Assemblercode



Matthiaso11
11.09.2007, 13:39
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 =P~

wkrug
11.09.2007, 14:51
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.

Matthiaso11
11.09.2007, 15:18
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

wkrug
11.09.2007, 16:52
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

Matthiaso11
12.09.2007, 07:56
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

Matthiaso11
12.09.2007, 17:09
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