Schrittmotoren über Mega2560 steuern

warms0

Neues Mitglied
19. Juni 2008
10
0
0
Sprachen
Hilfe!!!

Ich verwende zwei "RN-Stepp297" die ich über ein RN-Mega2560-Modul steuern möchte.
Hierzu verwende ich Timer0 und Timer2 die jeweils 8-bit-Timer sind. An PinB.4 und PinB.7 sollte nun der Takt zur Steuerung der "RN-Stepp297" anliegen. Durch PinA.0 bis PinA.3 werden Richtung und Stop/Start der Motoren gesteuert.
Das Ganze programmiere ich in BASCOM.
Leider laufen die Motoren jedoch nicht los, Sie werden aber, da Strom anliegt, gebremst. Was ist falsch?

Ps: Einen Mega128 hatte ich mit Schrittmotoren und dieser Konfiguration schon mal am Laufen.


Code:
'
###################################################
'mega2560modultRobo Moritz 1.bas
'für
'2 Schrittmotoren steuern
'
'Aufgabe:
'steuert 2 Schrittmotoren über RN-Stepp297
'Autor: Warms0
'##############################################################


$programmer = 12


$regfile = "m2560def.dat"
$hwstack = 82                                               '82
$framesize = 68                                             '64
$swstack = 68                                               '44


$crystal = 16000000                                         'Quarzfrequenz
$baud = 9600


Tccr0a = &B01000010
Tccr0b = &B00000101
'                                                            Toggle OC0 bei Compare-Match (Timer0 / 8-Bit-Timer)
'                                                            Prescaler an Bit0 bis Bit2 entspricht 1024
'                                                            (Quarzfrequenz wir durch 1024 geteilt)


Tccr2a = &B01000010
Tccr2b = &B00000111
'                                                            Toggle OC2 bei Compare-Match (Timer2 / 8-Bit-Timer)
'                                                            Prescaler an Bit0 bis Bit2 entspricht 1024
'                                                            (Quarzfrequenz wir durch 1024 geteilt)


Ddrb.7 = 1                                                  'OC0A (PinB.7) als Ausgang definieren damit das
'                                                            Puls-Signal von Timer0 zur Motorsteuerung des
'                                                           "linken Motors" ausgegeben wird

Ddrb.4 = 1                                                  'OC2A (PinB.4) als Ausgang definieren damit das
'                                                            Puls-Signal von Timer0 zur Motorsteuerung des
'                                                           "linken Motors" ausgegeben wird

Ocr2a = 255                                                 'Output Compare ist 255, dies bedeutet, dass der Timer2
'                                                            bis auf 255 zählt, dann einen Impuls an OC2 ausgibt
'                                                            und den  Timer2 dann auf 0 zurückstellt...

Ocr0a = 255                                                 'Output Compare ist 255, dies bedeutet, dass der Timer0
'                                                            bis auf 255 zählt, dann einen Impuls an OC0 ausgibt
'                                                            und den  Timer2 dann auf 0 zurückstellt...

Ddra = &B0001111                                            'PinA.0 bis PinA.3 auf Ausgang, PinA.4 - PinA.7
'                                                            lassen wie sie sind

'                                                            mit diesen Pins werden die Motoren ein/ausgeschaltet
'                                                            und die Richtung umgedreht
'                                                            DDRA.0 = ein/aus Motor rechts
'                                                            DDRA.1 = Richtung Motor rechts
'                                                            DDRA.2 = ein/aus Motor links
'                                                            DDRA.3 = Richtung Motor links

Porta = &B00001111                                          'PinA.0 bis PinA.3 high, PinA.4 - PinA.7 lassen
'                                                            wie sie sind


'                                                            Wenn PortA.0 auf high dann Motor Rechts an
'                                                            Wenn PortA.0 auf low dann Motor Rechts aus

'                                                            Wenn PortA.1 auf high dann Motor rechts vorwärts
'                                                            Wenn PortA.1 auf low dann Motor rechts rückwärts

'                                                            Wenn PortA.2 auf high dann Motor Rechts an
'                                                            Wenn PortA.2 auf  low dann Motor Rechts aus

'                                                            Wenn PortA.3 auf high dann Motor Rechts vorwärts
'                                                            Wenn PortA.3 auf low dann Motor Rechts rückwärts

'---------------------------------

Do
   nop
Loop


Im Voraus herzlichen Dank für Eure Hilfe!!!
Warms0
 
Hallo Warms0,

hab nur kurz geschaut, sehe aber keine Interruptfreigabe für die Compare- Matches.

Register Timsk0 für Timer0

oder wie in Bascom üblich"enable compare0a"

Globeale Interrupts in Statusregister freigeben (I-Bit)

oder in Bascom "Enable Interrupts"

Register adressier ich immer so "Tccr0a = Bits(0 , 1 , 5 , 7)"

Bei den Attinys werden Register teilweise doppelt belegt und wenn man da ne 0 reinschreibt funktioniert irgendwas anderes nicht mehr.

Grüße Pit
 
warum geht das dann ohne Freigabe an einem AVR Mega128

Herzlichen Dank für die promte Antwort!

Ich habe bereits mit einem ähnlichen Code die Motoren an einem Mega 128 zum Laufen gebracht. Da eigentlich kein Interrupt ausgelöst wird ( das Ereignis Clear Timer on Comparematch wird durch die Bits im TCCR0A und TCCR2A eingestellt erübrigt sich die Freigabe eigentlich.
Ihre Methode die Bits zu setzen kannte ich noch nicht, diese ist aber sehr gut! Danke!
In meinem Fall sind aber alle Bits wissentlich so gesetzt, denn das ist in diesem Fall laut Datenblatt AVR-Mega2560 notwendig.
Könnten Sie bitte nochmals genauer nachsehen an was es liegen könnte?

Danke für die viele Mühe
Viele Grüße
Warms0
 
Hi,

ne das "Sie" kannste lassen. So alt bin ich auch noch nicht.

Hab noch mal Timer0 im Datenblatt geschaut sieht alles ok aus.
Hab nichts auf die Schnelle gefunden.

Versuch mal in der Do-Loop Schleife einen Ausgang zu togglen um zu sehen ob der Stepper überhaupt dreht.

Wenn nicht dreh mal eine Wicklung.

Der Mega 128 ist schon etwas anders. Hat auch kein A-B Compare Register beim Timer 0.

Unter Bascom würde es z.B. so aussehen:
Code:
Config Timer1 = Counter , Prescale = 1 , Compare A = toggle , Compare B = Disconnect , , Clear Timer = 1       ', , Clear Timer = 1       'config Timer1
On Compare1a Isr_step                                                                               'verzweige bei Compare1a match zu   isr_step
Enable Compare1a

Das geht aber nicht mit jedem Timer.

Gruß Pit
 
Sodele, hatte grade Zeit und habs ausprobiert.

Sieh selbst.:)

unbenannt.jpg


Liegt nicht an den Timern. Habs mit nem 2561 getestet. Sind aber identisch.

Gruß Pit
 
Dumme Frage eines Laien

Hallo Pitlem,

entschuldige das "Sie", ich bin über die Gepflogenheiten im Netzt wohl auf dem Stand der Urzeit...

Soweit ich verstehe was du mir hier zeigst, klappt mein Code? Dein Oszilloskop zeigt die Signale?

Kann es sein dass es nun am Anschluss meines 2560 liegt? Es gibt hier einige Pins für "VCC +5V" und "GND". Angeschlossen habe ich aber jeweils nur einen dieser Pins...

Danke für die rasche Antwort
Ps: Entschuldige wenn hier einiges dumm klingt:confused: :confused: , aber ich bin eigenlich kein Elektoniker, sondern ein Papa, der seinem Sohn in Robotiks (Neigungskurrs Gymnasium 7. Klasse) hilft.

Viele Grüße
Warms0
 
Hi,

wenn ich den Schaltplan richtig deute, sind alle VCC und GND gebrückt.

Programmieren und Auslesen des µP funktioniert oder?

Hat das Board der Stepper 5V Logikspannung?

Versorgungsspannung der Stepper muss ja anliegen da sie "gebremst" werden.

Wenn ein Multimeter zu verfügung steht mal alle Signal, die ins Stepperboard gehen, anmessen.

So einen Ferndiagnose ist immer schwierig.

Gruß Pit
 

Über uns

  • Makerconnect ist ein Forum, welches wir ausschließlich für einen Gedankenaustausch und als Diskussionsplattform für Interessierte bereitstellen, welche sich privat, durch das Studium oder beruflich mit Mikrocontroller- und Kleinstrechnersystemen beschäftigen wollen oder müssen ;-)
  • Dirk
  • Du bist noch kein Mitglied in unserer freundlichen Community? Werde Teil von uns und registriere dich in unserem Forum.
  •  Registriere dich

User Menu

 Kaffeezeit

  • Wir arbeiten hart daran sicherzustellen, dass unser Forum permanent online und schnell erreichbar ist, unsere Forensoftware auf dem aktuellsten Stand ist und der Server regelmäßig gewartet wird. Auch die Themen Datensicherheit und Datenschutz sind uns wichtig und hier sind wir auch ständig aktiv. Alles in allem, sorgen wir uns darum, dass alles Drumherum stimmt :-)

    Dir gefällt das Forum und unsere Arbeit und du möchtest uns unterstützen? Unterstütze uns durch deine Premium-Mitgliedschaft!
    Wir freuen uns auch über eine Spende für unsere Kaffeekasse :-)
    Vielen Dank! :ciao:


     Spende uns! (Paypal)