Problem bei der Warte-Routine bei der Steuerung eines Schrittmotors

Gast #1885601
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++);
   }
Gast #1885644
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;)
#1885654
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!
Gast #1885658
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.
Gast #1885662
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
Gast #1885674
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
#1885698
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
Gast #1885749
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
#1885762
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.
Gast #1885774
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
#1885784
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.
Gast #1885803
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
#1886136
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
}

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren