PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Schleifen Problem



Namib
26.11.2007, 11:20
hallo
Ich habe ein RN-Controll und RN-Motor Board mit 2 Schrittmotoren in meine Bot Verbaut so weit so gut alles geht auch normal nur ich habe in bascom das Problem das ich ein Programm schreiben will das der Robot zb 500 schritte macht und dann stop
Jetzt meine überlegeung:



Dim Schritt as Integer
Dim I2cdaten(6) As Byte
Do

I2cdaten(1) = 10 'Kennung muss bei RN-Motor immer 10 sein
I2cdaten(2) = 7 'Befehlscode
I2cdaten(3) = 0 '1 Parameter
I2csend &H56, I2cdaten(1),5 'Befehl wird gesendet
Incr Schritt
print Schritt

Loop until schritt =500



das problem ist der bot bewegt sich keinen meter über die console zeigt er mir aber schön braf an das er die schleife sauber bis 500 hochzählt aber die motoren steh still

Btw.: ja sonst passt alles motoren on usw wenn ich zb. ein prog schreib das sich die motoren endlos drehn sollen tun sie das auch
Endlösung wäre hald ein kleines test Programm haben das der Bot zb 500 schritte grade aus dann 10 schritte nur linker motor rechts dann wieder 500 geradeaus usw. Hoffe mir kann jemand helfen

Danke

Torsten_G
26.11.2007, 12:33
Hi,

schau Dir mal die Befehle "I2cinit", I2cstart" und I2cstop" an.

Nutzt Du die vorgesehenen I2C-Pins oder fährst Du eine andere Konfiguration?

Hast Du die Abschlußwiderstände richtig?

Und poste bitte mal Deinen VOLLSTÄNDIGEN Code, das wird doch wohl kaum alles sein, oder?

Grüße

Torsten

Namib
26.11.2007, 19:09
Wie gewünscht der Vollständige code alles funkt nur wie oben schon gesagt nicht die 500 Schritt funktion


Declare Function Tastenabfrage() As Byte
Declare Sub Aendereslaveid()

$regfile = "m32def.dat"
$framesize = 32
$swstack = 32
$hwstack = 32

Const Befehl_maxstrom = 1
Const Befehl_endlos_drehen = 6
Const Befehl_ausschalten = 9
Const Befehl_einschalten = 10

Const Motor_links = 0
Const Motor_rechts = 1
Const Motor_beide = 2
Const Motor_links_schritt = 0
Const I2crnmotorslaveadr = &H56 'I2C SlaveAdresse von RN-Motor Erweiterung
Const I2crnmotorsreadlaveadr = &H57 'I2C SlaveAdresse von RN-Motor Erweiterung

Dim I2cdaten(6) As Byte 'Array um Befehlsfolge auszunehmen
Dim I2cdaten_rechts(6) As Byte
Dim Ton As Integer
Dim Schritt As Integer
Schritt = 0

$crystal = 16000000 'Quarzfrequenz
$baud = 9600

Config Scl = Portc.0 'Ports fuer IIC-Bus
Config Sda = Portc.1
I2cinit

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
Print
Print "**** RN-Motor Test"
Print "Schrittmotorn Test Simple"
Print
Do
Taste = Tastenabfrage()
If Taste <> 0 Then

Select Case Taste
Case 1
'Motorstrom auf 200mA begrenzen
I2cdaten(1) = 10 'Kennung muss bei RN-Motor immer 10 sein
I2cdaten(2) = Befehl_maxstrom 'Befehlscode
I2cdaten(3) = Motor_links '1 Parameter
I2cdaten(4) = 500 / 10 '2 Parameter (hier Milliampere /10 in diesem Fall wird 200mA eingestellt)
I2csend I2crnmotorslaveadr , I2cdaten(1) , 5 'Befehl wird gesendet (es müssen immer 5 Bytes gesendet werden, auch wenn weniger Parameter notwendig sind)
Print "Links Rennt"
I2cstop

I2cdaten_rechts(1) = 10 'Kennung muss bei RN-Motor immer 10 sein
I2cdaten_rechts(2) = Befehl_maxstrom 'Befehlscode
I2cdaten_rechts(3) = Motor_rechts '1 Parameter
I2cdaten_rechts(4) = 500 / 10 '2 Parameter (hier Milliampere /10 in diesem Fall wird 200mA eingestellt)
I2csend I2crnmotorslaveadr , I2cdaten_rechts(1) , 5 'Befehl wird gesendet (es müssen immer 5 Bytes gesendet werden, auch wenn weniger Parameter notwendig sind)
Print "Rechts Rennt"
I2cstop

I2cdaten(1) = 10 'Kennung muss bei RN-Motor immer 10 sein
I2cdaten(2) = Befehl_einschalten 'Befehlscode
I2cdaten(3) = Motor_beide '1 Parameter
I2csend I2crnmotorslaveadr , I2cdaten(1) , 5 'Befehl wird gesendet (es müssen immer 5 Bytes gesendet werden, auch wenn weniger Parameter notwendig sind)

Case 2


I2cdaten(1) = 10 'Kennung muss bei RN-Motor immer 10 sein
I2cdaten(2) = Befehl_endlos_drehen 'Befehlscode
I2cdaten(3) = Motor_beide '1 Parameter
I2csend I2crnmotorslaveadr , I2cdaten(1) , 5 'Befehl wird gesendet (es müssen immer 5 Bytes gesendet werden, auch wenn weniger Parameter notwendig sind)
Case 3

I2cdaten(1) = 10 'Kennung muss bei RN-Motor immer 10 sein
I2cdaten(2) = Befehl_endlos_drehen 'Befehlscode
I2cdaten(3) = Motor_rechts '1 Parameter

I2csend I2crnmotorslaveadr , I2cdaten(1) , 5 'Befehl wird gesendet (es müssen immer 5 Bytes gesendet werden, auch wenn weniger Parameter notwendig sind)

Case 4
Do

I2cdaten(1) = 10 'Kennung muss bei RN-Motor immer 10 sein
I2cdaten(2) = 7 'Befehlscode
I2cdaten(3) = 0 '1 Parameter
I2csend &H56 , I2cdaten(1) , 5 'Befehl wird gesendet
Incr Schritt
Loop Until Schritt = 5
Wait 1



Case 5
I2cdaten(1) = 10 'Kennung muss bei RN-Motor immer 10 sein
I2cdaten(2) = Befehl_ausschalten 'Befehlscode
I2cdaten(3) = Motor_beide '1 Parameter
I2csend I2crnmotorslaveadr , I2cdaten(1) , 5 'Befehl wird gesendet (es müssen immer 5 Bytes gesendet werden, auch wenn weniger Parameter notwendig sind)
I2cstop
Print "Motoren aus....."

End Select
End If

Waitms 100
Loop




Function Tastenabfrage() As Byte
Local Ws As Word


Tastenabfrage = 0
Start Adc
Ws = Getadc(7)
If Ws < 1010 Then
Select Case Ws
Case 400 To 455
Tastenabfrage = 1
Case 335 To 380
Tastenabfrage = 2
Case 250 To 305
Tastenabfrage = 3
Case 180 To 220
Tastenabfrage = 4
Case 100 To 130
Tastenabfrage = 5
End Select
End If

End Function
End

Torsten_G
26.11.2007, 19:36
Ich sehe zwar 2x "Ic2stop", aber keinen "I2cstart"...

Versuch doch mal, das Programm konsequent mit
I2cstart
I2csend
I2cstop
aufzubauen.

Oder zumindest mit einem I2cstart vor jedem Send - damit hatte ich beimMega8 in Kombination mit einem PCF8574 schon Erfolg.

Gruß

Torsten

Namib
26.11.2007, 19:59
Ich sehe zwar 2x "Ic2stop", aber keinen "I2cstart"...

Versuch doch mal, das Programm konsequent mit
I2cstart
I2csend
I2cstop
aufzubauen.

Oder zumindest mit einem I2cstart vor jedem Send - damit hatte ich beimMega8 in Kombination mit einem PCF8574 schon Erfolg.

Gruß

Torsten

also dann so zb.:


I2cstart
Do
I2cdaten(1) = 10 'Kennung muss bei RN-Motor immer 10 sein
I2cdaten(2) = 7 'Befehlscode
I2cdaten(3) = 0 '1 Parameter
I2csend &H56 , I2cdaten(1) , 5 'Befehl wird gesendet



Incr Schritt
Loop Until Schritt = 5
I2cstop

Torsten_G
26.11.2007, 22:49
Nein... eher so:



Do
I2cdaten(1) = 10 'Kennung muss bei RN-Motor immer 10 sein
I2cdaten(2) = 7 'Befehlscode
I2cdaten(3) = 0 '1 Parameter

I2cstart
I2csend &H56 , I2cdaten(1) , 5 'Befehl wird gesendet
I2cstop


Incr Schritt
Loop Until Schritt = 5


Oder auch ganz ohne I2cstop, nur mit I2cstart

Gruß

Torsten