Forum: Mikrocontroller und Digitale Elektronik Problem bei der Warte-Routine bei der Steuerung eines Schrittmotors


von Schrittmotor mit ATMega128 steuern (Gast)


Lesenswert?

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++);
   }

von Uwe .. (uwegw)


Lesenswert?

Wenn du immer nur das gleich Bitmuster ausgibst (42), dann ist es ganz 
normal das nichts passiert...

von Ana K. (ada)


Lesenswert?

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.

von spess53 (Gast)


Lesenswert?

Hi

Da stellt sich gleich die Frage, wie der Schrittmotor angeschlossen ist.

MfG Spess

von Ana K. (ada)


Lesenswert?

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 :-))

von holger (Gast)


Lesenswert?

>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;)

von Ana K. (ada)


Lesenswert?

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!

von holger (Gast)


Lesenswert?

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

von spess53 (Gast)


Lesenswert?

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

von Ana K. (ada)


Lesenswert?

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.

von spess53 (Gast)


Lesenswert?

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

von Ana K. (ada)


Lesenswert?

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

von spess53 (Gast)


Lesenswert?

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

von Ana K. (ada)


Lesenswert?

hi,

 ok,soll ich das als eine Interrupt-Routine programmieren?

von spess53 (Gast)


Lesenswert?

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

von Ana K. (ada)


Lesenswert?

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.

von spess53 (Gast)


Lesenswert?

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

von Andreas (Gast)


Lesenswert?

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.

von Ana K. (ada)


Lesenswert?

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.

von spess53 (Gast)


Lesenswert?

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

von Ana K. (ada)


Lesenswert?

Ok,danke :-)

 ich lese erstmal alles durch.

von Karl H. (kbuchegg)


Lesenswert?

Ich kanns nicht mit ansehen.
Wieder mal ein Fall von: Denn sie wissen nicht was sie tun. Und von dem 
was sie tun haben sie keine Ahnung.

1
#define F_CPU 3686400UL     /* Quarz mit 3.6864 Mhz  */
2
3
#include <avr/io.h>
4
#include <utils/delay.h>
5
#include <inttypes.h>
6
7
#define MOTOR_DDR  DDRC
8
#define MOTOR_PORT PORTC
9
#define CLOCK_PIN  PC3
10
11
int main(void)
12
{
13
  MOTOR_DDR = 0xFE;
14
15
  MOTOR_PORT |= (1<<PC1) | (1<<CLOCK_PIN) | (1<<PC5);
16
17
  Steps = 50;
18
19
  for( uint8_t i = 0; i < 50; i++ ) {
20
21
    MOTOR_PORT &= ~(1<<CLOCK_PIN);
22
    _delay_ms( 100 );
23
    MOTOR_PORT |= (1<<CLOCK_PIN);
24
    _delay_ms( 100 );
25
  }
26
27
  while( 1 ) {
28
  }
29
  return 0;
30
}

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.