www.mikrocontroller.net

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


Autor: Schrittmotor mit ATMega128 steuern (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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++);
   }

Autor: Uwe ... (uwegw)
Datum:

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

Autor: Ana Kamenova (ada)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: spess53 (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi

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

MfG Spess

Autor: Ana Kamenova (ada)
Datum:

Bewertung
0 lesenswert
nicht 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 :-))

Autor: holger (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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;)

Autor: Ana Kamenova (ada)
Datum:

Bewertung
0 lesenswert
nicht 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!

Autor: holger (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: spess53 (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Ana Kamenova (ada)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: spess53 (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Ana Kamenova (ada)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: spess53 (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Ana Kamenova (ada)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
hi,

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

Autor: spess53 (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Ana Kamenova (ada)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: spess53 (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Andreas (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Ana Kamenova (ada)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: spess53 (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Ana Kamenova (ada)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ok,danke :-)

 ich lese erstmal alles durch.

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht 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.

#define F_CPU 3686400UL     /* Quarz mit 3.6864 Mhz  */

#include <avr/io.h>
#include <utils/delay.h>
#include <inttypes.h>

#define MOTOR_DDR  DDRC
#define MOTOR_PORT PORTC
#define CLOCK_PIN  PC3

int main(void)
{
  MOTOR_DDR = 0xFE;

  MOTOR_PORT |= (1<<PC1) | (1<<CLOCK_PIN) | (1<<PC5);

  Steps = 50;

  for( uint8_t i = 0; i < 50; i++ ) {

    MOTOR_PORT &= ~(1<<CLOCK_PIN);
    _delay_ms( 100 );
    MOTOR_PORT |= (1<<CLOCK_PIN);
    _delay_ms( 100 );
  }

  while( 1 ) {
  }
  return 0;
}

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.