Hallo,
ich habe die Aufgabe einen Schrittmotor mit enem ATMega128 zu steuern.
Der Microcontroller arbeitet mit 4MHz. Ich habe den folgenden Code zur
Probe erstellt,der Motor macht,aber nur ein Schritt in der
entsprechenden Richtung und bleibt stehen. Was mache ich da falsch? Ich
glaube, dass meine warte() Funktion nicht stimmt,was soll ichda ändern?
#include <avr/io.h>
#ifndef F_CPU
#define F_CPU 3686400UL /* Quarz mit 3.6864 Mhz */
#endif
#include <inttypes.h>
void warte(void);
int main(void)
{
DDRC=0xff;
for (uint8_t i=0;i<50;i++){
PORTC=42; // C ist mit dem Motor verbunden
warte();
}
while(1){
}
return 0;
}
void warte(void){
volatile unsigned long p;
for(p=0;p<80;p++);
}
Ahso... ich habe gedacht,dass dieses Bitmuster ein Schritt in bestimmer
Richtung bedeutet nd,dass durch die Schleife,werden einfach mehrere(in
dem Fall 50) Schritte gemacht.
Hi,
wie meinst du es genau? Ich kenne mich nicht so gut aus. Ich habe den
Motor an dem C port angeschlossen und versuche den in bewegung zu
bringen :-))
>Ich habe den Motor an dem C port angeschlossen>und versuche den in bewegung zu>bringen :-))
Mit oder ohne Treiber. Ohne kannste knicken;)
Und eine Steppersequenz besteht nicht aus einer 42.
Wobei die Zahl mir gerade sehr bekannt vorkommt;)
Ich habe Schrittmotorsteuerung und Treiber alles auf einer Plattine zur
Verfügung. Was soll ich eingeben wenn ich z.B den Motor 5 Schritte nach
rechts drehen will? Kannst d mir ein Beispielcode geben,so kann ich
vielleicht besser versteen wie das Ganze funktioniert.
Danke!
>Ich habe Schrittmotorsteuerung und Treiber alles auf einer Plattine zur>Verfügung. Was soll ich eingeben wenn ich z.B den Motor 5 Schritte nach>rechts drehen will?
Lies das Handbuch zu deiner Platine deren Namen hier keiner kennt.
Hi
>Kannst d mir ein Beispielcode geben,so kann ich>vielleicht besser versteen wie das Ganze funktioniert.
Ohne deine Hardware zu kennen? Da musst du schon mit ein paar mehr
Informationen herausrücken. Am besten mit dem Schaltplan der
Schrittmotorplatine.
MfG Spess
Ich habe leider kein Handbuch,diese Platine wurde in einem Labor gebaut
und dazu wurde mir ein Assembler- Code als Beispiel gegeben. Davon habe
ich die Zal 42 auch genommen.
Hi
>Ich habe leider kein Handbuch,diese Platine wurde in einem Labor gebaut>und dazu wurde mir ein Assembler- Code als Beispiel gegeben. Davon habe>ich die Zal 42 auch genommen.
Dann stell wenigsten das Assemblerprogramm hier rein. Und sieh nach, was
auf der Platine für Bauelemente/ICs drauf sind.
MfG Spess
ich habe einen L297 Stepper Motor controller, L298N Dual Bridge Driver.
Assembler Code:
.INCLUDE"m128def.inc"
.CSEG
rjmp progstart
progstart:
ldi r16,LOW(RAMEND)
out SPL,r16
ldi r16,HIGH(RAMEND)
out SPH,r16
lds r16,0x006A
cbr r16,1
sbr r16,2
sts 0x006A,r16
in r16,EIMSK
sbr r16,1
out EIMSK,r16
sei : Interrupts global freigeben
ldi r16,0
out DDRD,r16
ldi r16,0b11111110 : Port C Ein-/Ausgang
out DDRC,r16
ldi r16,0b00101010 : Schrittmotor Modus setzen
out PORTC,r16
ldi r18,50 : Zahl der Schritte
clock:
cbi PORTC,3 : Port C als Clock
rcall warte
sbi PORTC,3
rcall warte
dec r18
brne clock
loop2:
rjmp loop2
warte: : Wartezeit erzeugen
in r17,SREG
push r17
ldi r24,0
warte1:
ldi r25,0x50
warte2:
dec r25
brne warte2
dec r24
brne warte1
pop r17
out SREG,r17
ret
.exit
Hi
> cbi PORTC,3 : Port C als Clock> rcall warte> sbi PORTC,3> rcall warte> dec r18> brne clock
Damit wird der Takt für den Treiber erzeugt. Das fehlt in deinem
Programm völlig.
MfG Spess
Hi
>ok,soll ich das als eine Interrupt-Routine programmieren?
Und an welchen Interrupt hättest du so gedacht?
In dem Assemblerprogramm steht auch einiger Müll drin:
>lds r16,0x006A -> EICRA> cbr r16,1 -> gehört zu INT0> sbr r16,2 -> gehört zu INT1> in r16,EIMSK> sbr r16,1 -> INT1 freigeben> out EIMSK,r16> sei : Interrupts global freigeben
Interrupts freigeben, und weder eine Interruptsprungtabelle noch eine
ISR zu haben ist mehr als Dilettantismus.
MfG Spess
Den Assembler_Code habe ich nicht geschrieben. Da ich mich mit assembler
nicht beschäftigt habe, sollte ich mir Schritt nach Schritt alles
übersetzen. Genau sei() hat mit die Routine-Idee gegeben. Ok ich lasse
die Interrupts. ich glaube ich kann mir das ganze nicht so gut
vorstellen. Ich muss ein Takt erzeugen und auch noch meine
Schrittenzahl, Richtung usw. dem Motor auch übergeben. Ich dachte mit
dem bitmuster an PORT C und die Warte- Funktion wird das erledigt.
Hi
>Ich dachte mit dem bitmuster an PORT C und die Warte- Funktion wird das>erledigt.
Nein. Aber kennst du wenigsten die Bedeutung der Bits an PortC. Bit3 ist
schon mal der Takt. Ein Bit sollte z.B. für die Richtung sein.
Und hast du mal nachgesehen, welche ICs ( z.B. L...) auf der
Treiberplatine sind?
MfG Spess
Du solltest dich erst mal darüber informieren, was ein Schrittmotor ist,
wie der funktioniert und wie man den ansteuert, bevor du ohne
irgendwelches Grundwissen ziel- und planlos halbverstandenen Code
übersetzt. Das kann doch nur schiefgehen.
http://www.roboternetz.de/schrittmotoren.html
Da findest du auch die Schaltung mit L297/L298 inklusive Beschreibung.
Hi,
Ich habe gesehen dass der Bit3 irgendwie den Takt sein soll. Die Zeile:
ldi r16,0b00101010 : Schrittmotor Modus setzen
soll auch Enable,CW/CCW,CLOCK usw. setzen. Nun weiss ich nur nich wie
ich das als C-programm genau umschreiben soll.
Ich habe einen L297 Stepper Motor controller und L298N Dual Bridge
Driver auf der Platine.
Hi
>Ich habe einen L297 Stepper Motor controller und L298N Dual Bridge>Driver auf der Platine.
Dann passt der Hinweis von Andreas schon ganz gut. Dort findest du eine
Schaltung mit diesen ICs. Bleibt noch die Frage, mit welchen Bits die
Signale Enable,CW/CCW... korrespondieren.
>Nun weiss ich nur nich wie ich das als C-programm genau umschreiben soll.
Dann mach dich erst mal schlau, wie man in C einzelne Bits setzt und
löscht. Und verabschiede dich von der dezimalen Schreibweise. Deine
Umrechnung, wenn auch richtig, von 0b00101010 nach 42 stiftet nur
Verwirrung.
MfG Spess