Hallo,
ich bin noch ein ziemlicher Anfänger was Elektronik und Programmierung betrifft daher eine recht simple Frage.
Wie kann ich in den Code von RN_Stepp297_beispiele.bas von der Robotikhardware CD folgende Funktion einfügen
Wenn ich die Taste 2 drücke (Case2) soll sich der Schrittmotor 82 Schritte drehen dann eine Pause von 2 sec einlegen und dann wieder 82 Schritte drehen und das ganze 72 mal
Hier ist nochmal der Ganze Code und Danke im Voraus
'################################################# ##
'Schrittmotoransteuerung mit RN-Control und
'Ansteuerungsboard RN-Stepp297
'RN-Stepp297 ist die bekannt Standardschaltung
'mit L297 und L298 (Bausatz)
'rn_stepp297_beispiele
'
' Achtung:
' Diese Demo ist mit Bascom Compiler 1.11.8.4 getestet
' Getestet mit RN-Schrittmotor Firmware V 1.1
'
' RN-Stepp97 wird wie folgt angeschlossen
' Enable auf PA0 / Richtung auf PA1 / Takt auf PA2
'
'Aufgabe:
' Dieses Testprogramm zeigt wie man RN-Stepp297
' über Takt- und Richtungsleitung ansteuert
' Den verschiedenen Tasten sind bestimmte Funktionen zugeordnet
' Taste 1: Schaltet Motorstrom ein (Stellung wird gehalten)
' Taste 2: Bewegt Motor genau 400 Halbschritte (1 Umdrehung bei den meisten Motoren)
' Taste 3: Bewegt Motor schneller genau 400 Halbschritte
' Taste 4: Ändert die Drehrichtung
''Taste 5: Schaltet Motor aus
'
'Autor: Frank
'Weitere Beispiele und Beschreibung der Hardware
'in der Anleitung zu RN-Schrittmotor
'Anleitung findet man unter http://www.Roboternetz.de im Download Bereich
'oder www.robotikhardware.de
'Weitere Beispiele sind im Roboternetz gerne willkommen!
'################################################# #############
$programmer = 12 'MCS USB (Zeile weglassen wenn anderer Programmer)
' -------------- RN-Control übliche _____________________
Declare Function Tastenabfrage() As Byte
$regfile = "m32def.dat"
$framesize = 32
$swstack = 32
$hwstack = 64
$crystal = 16000000 'Quarzfrequenz
$baud = 9600
Config Scl = Portc.0 'Ports fuer IIC-Bus
Config Sda = Portc.1
Config Adc = Single , Prescaler = Auto 'Für Tastenabfrage und Spannungsmessung
Config Pina.7 = Input 'Für Tastenabfrage
Porta.7 = 1 'Pullup Widerstand ein
Dim Taste As Byte
Dim Ton As Integer
I2cinit
Start Adc
Sound Portd.7 , 400 , 450 'BEEP
Sound Portd.7 , 400 , 250 'BEEP
Sound Portd.7 , 400 , 450 'BEEP
Print "**** RN-Control V1.4 *****"
Print "Demoprogramm um Zusatzboard RN-Stepp297 zu testen/demonstrieren"
' -------------- Ende RN-Control übliche _____________________
Config Pina.0 = Output
Stepper_enable Alias Porta.0
Config Pina.1 = Output
Stepper_richtung Alias Porta.1
Config Pina.2 = Output
Stepper_takt Alias Porta.2
Dim I As Integer
Stepper_enable = 0 ' Erst mal aus
Do
Taste = Tastenabfrage()
If Taste <> 0 Then
Select Case Taste
Case 1 'Schaltet Motorstrom ein
Stepper_enable = 1
Case 2 'Bewegt Motor genau 400 Halbschritte (1 Umdrehung bei den meisten Motoren)
For I = 1 To 400
Stepper_takt = 0 : Waitus 1 : Stepper_takt = 1
Waitms 30
Next
Case 3
For I = 1 To 400
Stepper_takt = 0 : Waitus 1 : Stepper_takt = 1
Waitms 5
Next
Case 4
Toggle Stepper_richtung
Case 5 'Schaltet Motor aus
Stepper_enable = 0
End Select
Sound Portd.7 , 400 , 500 'BEEP
End If
Waitms 100
Loop
End
' Diese Unterfunktion fragt die Tastatur am analogen Port ab
' Sollte beim betätigen einer Taste kein Quittungston kommen, dann
' muss die die Tastenabfrage (Select Case Anweisung in Funktion )
' an ihr Board angepaßt werden. Widerstandstoleranzen sorgen in
' Einzelfällen manchmal dafür das die Werte etwas anders ausfallen
' Am besten dann den WS wert mit Print für jede Taste ausgeben lassen
Function Tastenabfrage() As Byte
Local Ws As Word
Tastenabfrage = 0
Ton = 600
Ws = Getadc(7)
' Print "ws= " ; Ws
If Ws < 1010 Then
Select Case Ws
Case 400 To 455
Tastenabfrage = 1
Ton = 550
Case 335 To 380
Tastenabfrage = 2
Ton = 500
Case 250 To 305
Tastenabfrage = 3
Ton = 450
Case 180 To 220
Tastenabfrage = 4
Ton = 400
Case 100 To 130
Tastenabfrage = 5
Ton = 350
End Select
Sound Portd.7 , 400 , Ton 'BEEP
End If
End Function
Das braucht dann seine Zeit. 72 Mal 2 Sekunden Pause plus 72 Mal 82 Umdrehungen inkl. 30 ms Pause. Da würde ich mir dann Gedanken um "Multitasking" machen. Entweder per Timer oder mit Zeitschlitzen arbeiten. Falls Daten per I2C übertragen werden sollen und auch die Stopptaste würde ich während dessen nicht stilllegen. Ist das in Deinem Projekt nicht von Bedeutung, dann einfach die Schleife von 400 auf 82 ändern und eine Pause von 2 Sekunden einfügen. Darum noch eine 2. Schleife mit 72 Durchläufen und Deine Wünsche sind ohne Rücksicht auf Verluste der Tasten und I2C während der Codeausführung erfüllt.
In den Kopf:
Dann die Änderungen:Code:dim Durchlauf as byte
Oder mit Stopptaste:Code:Case 2 'Bewegt Motor genau 400 Halbschritte (1 Umdrehung bei den meisten Motoren) For Durchlauf = 1 to 72 For I = 1 To 82 Stepper_takt = 0 : Waitus 1 : Stepper_takt = 1 Waitms 30 Next I Wait 2 next durchlauf
In den Kopf:
Dann die Änderungen:Code:dim Durchlauf as byte dim ipause as integer dim abbruch as byte 'schneller als bit
Alles ungetestet...Code:Case 2 'Bewegt Motor genau 400 Halbschritte (1 Umdrehung bei den meisten Motoren) abbruch=0 For Durchlauf = 1 to 72 For I = 1 To 82 Stepper_takt = 0 : Waitus 1 : Stepper_takt = 1 Waitms 30 if abbruch=1 then exit for Next I for ipause= 1 to 2000 ' evtl. Wegen Tastenabfrage verkleinern Waitms 1 taste = tastenabfrage() if taste=5 then abbruch=1 end if if abbruch=1 then exit for next durchlauf
Wenn das Herz involviert ist, steht die Logik außen vor! \/
Lesezeichen