PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Schrittmotor mit ATmega8 und Assembler



MischaMV
19.06.2005, 17:44
Hallo.Kann mir jemand helfen.Wie kann ich Impulse für einen unipolares Schrittmotor mit Assembler programmieren.
Danke
Gruß Michi

ProgDom
19.06.2005, 18:49
Hi,
das kommt ganz darauf an, welche Elektronik du für die Ansteuerung verwendest, Das häufigste sind wohl L293 oder L297/L298. Einen Schrittmotor direkt an den µC anzuschließen ist normalerweise nicht möglich, weil der µC es nicht schafft das zu schalten.
Am bequemsten ist die Ansteuerung mit L297/L298. Da muss man dur einige Pins setzen und immer wieder einen kurten Impuls auf die Steuerleitung setzen.
Etwas schwieriger ist es bei der L293 Schaltung. Da muss man immer in bestimmten Zyklen ganze Steuerbytes senden.
Interessantes dazu findest du auch hier (https://www.roboternetz.de/schrittmotoren.html).

*********
MFG
ProgDom

MischaMV
19.06.2005, 19:19
Ich mache das eigentlich etweder mit vier Transistoren oder mit ULN2803.
Mit Bascom habe ich das schon gemacht. Ich will es halt mal mit Assembler versuchen. Am Steuerstromkreis wird mein uC angeschlossen und damit schalte ich den Hauptstromkreis in dem ein SChrittmotor angeschlossen ist.
Danke für den Link.
Gruß Michi.

ProgDom
19.06.2005, 19:22
Kannst du denn schon Assembler programmieren ?
Denn Assembler muss man genauso lernen wie C++ oder ähnliche Programmiersprachen. Einfach so ein Quellcode hilft selten.
Es gibt gut Assemblertutorials die du über die Suche oder unter dem Linksverzeichnis findest.

MischaMV
19.06.2005, 19:32
Ich bin dabei es zu erlernen.
gruß Michi

tml
19.06.2005, 19:58
Du musst dein Port als erstes als Ausgang konfigurieren. Dazu fuellst du das entsprechende DataDirectionRegister (DDR) mit 0xFF (fuer PortA z.B.: ldi DDRA, 0xFF). Dann brauchst du noch eine Prozedur, welche eine bestimmte Zeitspanne abwartet, z.B. mit Timer/Counter0. Wie man den einstellt ist im Datenblatt beschrieben. Dann laedst du in einer Schleife das entsprechende Port Register (z.B.: PortA) mit den folgenden Werten:

richtunga: ldi motor, 0x09
out PORTA, motor
call warte
ldi motor, 0x0A
out PORTA, motor
call warte
ldi motor, 0x06
out PORTA, motor
call warte
ldi motor, 0x05
out PORTA, motor
call warte
jmp richtunga

"motor" ist nur ein Hilfsregister. Die Werte kann man sich ableiten, wenn man weiß wie die Motoren funktionieren. Das ist ja in dem oben genannten Link erklaert. Fuer eine andere Drehrichtung einfach die Werte in der entgegengesetzten Reihenfolge ausgeben (0x05, 0x06, 0x0a, 0x09).

MischaMV
19.06.2005, 20:39
funktion warte hast du aber schon vordifiniert oder? und richtunga?
gruß Michi.

tml
20.06.2005, 12:25
Ich hab jetzt nur das Stueck aus meinem Programm kopiert, was unmittelbar zeigt wies funktioniert. Die Funktion "warte" ist natuerlich definiert und liegt am Ende meines Programms. "richtunga" ist nur ein label, da ist egal wies heißt, bei mir eben richtung a, weils noch richtungb (eben die andere) gibt. Wenn dus umbenennst muss natuerlich der name auch noch nach "jmp" stehen. Durch einen Interrupt kann man die Schleife verlassen, sonst muesste man nochwas einbauen.