Ich hab ne vermutung
Könnte an an Waitms liegen? Denn selbst wenn ich Print weglasse kommt nicht alles an, vllt bei 20mal drücken des buttom kommt mal der vollständige Code an.
Aber ohne Waitms und mit Print reagiert mein tool nicht mehr :(
Druckbare Version
Ich hab ne vermutung
Könnte an an Waitms liegen? Denn selbst wenn ich Print weglasse kommt nicht alles an, vllt bei 20mal drücken des buttom kommt mal der vollständige Code an.
Aber ohne Waitms und mit Print reagiert mein tool nicht mehr :(
Kann mir irgendwie grad schwer deinen Programmablauf vorstellen... vielleicht solltest du mal genau schreiben was wann passiert. Also erst ischarwaiting, dann input dann waitms etc pp...
Bascom
SharpDevelopCode:'===CHIP SETTINGS===
Declare Sub Abfrage() As Byte
$regfile = "m32def.dat"
$framesize = 64
$swstack = 64
$hwstack = 64
$crystal = 16000000 'Quarzfrequenz
$baud = 19200
Config Scl = Portc.0 'Ports fuer IIC-Bus
Config Sda = Portc.1
Dim Inputstring As String * 10
Dim I As Byte
Dim A As Byte
Const I2crnmotorslaveadr = &H58 'I2C SlaveAdresse von RN-Schrittmotor Erweiterung
Const I2crnmotorsreadlaveadr = &H59 'I2C SlaveAdresse von RN-Schrittmotor Erweiterung
Dim I2cdaten(7) As Byte
Const Befehl_endlosdrehung = 54
Const Motor_1 = 3
Dim Extrahierter_integer As Integer
Dim Motor_speed_x As Byte
Dim Motor_x_an_aus As Byte
Dim Motor_speed_y As Byte
Dim Motor_y_an_aus As Byte
Dim Motor_x_richtung As Byte
Dim Motor_y_richtung As Byte
Dim Motor_x_weg As Byte
Dim Trackbar_wert_string As String * 10
Dim Trackbar_wert_byte As Byte
Dim Schritte As Long
Dim Temp As Byte
Dim Ltemp As Long
Dim Umdrehungen As Single
Dim Fahrstrecke As Word
Dim Startt As Byte
Dim Data_available As Byte
Do
Data_available = Ischarwaiting()
If Len(data_available) <> 0 Then
input "" , Inputstring
Motor_speed_x = Instr(inputstring , "SpX")
Motor_x_an_aus = Instr(inputstring , "anX")
Motor_x_richtung = Instr(inputstring , "RiX")
Motor_x_weg = Instr(inputstring , "WeX")
Motor_speed_y = Instr(inputstring , "SpY")
Motor_y_an_aus = Instr(inputstring , "anY")
Motor_y_richtung = Instr(inputstring , "RiY")
If Motor_x_weg = 1 Then
Trackbar_wert_string = Mid(inputstring , 4)
Trackbar_wert_byte = Val(trackbar_wert_string)
Motor_x_weg = 0
I2cdaten(1) = 102
I2cdaten(2) = 1
I2csend I2crnmotorslaveadr , I2cdaten(1) , 7
I2cstart
I2cwbyte I2crnmotorsreadlaveadr
I2crbyte Temp , Ack
Schritte = Temp
I2crbyte Temp , Ack
Ltemp = Temp * 256
Schritte = Schritte + Ltemp
I2crbyte Temp , Ack
Ltemp = Temp * 65536
Schritte = Schritte + Ltemp
I2crbyte Temp , Nack
Ltemp = Temp * 16777216
Schritte = Schritte + Ltemp
I2cstop
Print "WeX:" ; Schritte
'Umdrehungen = Schritte / 200
' Print "Umdrehungen: " ; Umdrehungen
' Fahrstrecke = Umdrehungen * 31.4
' Print "Der Roboter ist " ; Fahrstrecke ; " cm gefahren "
End If
If Motor_speed_x = 1 Then
Trackbar_wert_string = Mid(inputstring , 4)
Trackbar_wert_byte = Val(trackbar_wert_string)
Motor_speed_x = 0
I2cdaten(1) = 53
I2cdaten(2) = 1
I2cdaten(3) = Trackbar_wert_byte
I2cdaten(4) = 0
I2csend I2crnmotorslaveadr , I2cdaten(1) , 7
End If
If Motor_x_an_aus = 1 Then
Trackbar_wert_string = Mid(inputstring , 4)
Trackbar_wert_byte = Val(trackbar_wert_string)
Motor_x_an_aus = 0
If Trackbar_wert_byte = 1 Then
I2cdaten(1) = Befehl_endlosdrehung
I2cdaten(2) = 1
I2csend I2crnmotorslaveadr , I2cdaten(1) , 7
Else
I2cdaten(1) = 51
I2cdaten(2) = 1
I2csend I2crnmotorslaveadr , I2cdaten(1) , 7
End If
End If
If Motor_x_richtung = 1 Then
Trackbar_wert_string = Mid(inputstring , 4)
Trackbar_wert_byte = Val(trackbar_wert_string)
Motor_x_richtung = 0
If Trackbar_wert_byte = 1 Then
I2cdaten(1) = 52
I2cdaten(2) = 1
I2cdaten(3) = Trackbar_wert_byte
I2csend I2crnmotorslaveadr , I2cdaten(1) , 7
Else
I2cdaten(1) = 52
I2cdaten(2) = 1
I2cdaten(3) = Trackbar_wert_byte
I2csend I2crnmotorslaveadr , I2cdaten(1) , 7
End If
End If
If Motor_speed_y = 1 Then
Trackbar_wert_string = Mid(inputstring , 4)
Trackbar_wert_byte = Val(trackbar_wert_string)
Motor_speed_y = 0
I2cdaten(1) = 53
I2cdaten(2) = 2
I2cdaten(3) = Trackbar_wert_byte
I2cdaten(4) = 0
I2csend I2crnmotorslaveadr , I2cdaten(1) , 7
End If
If Motor_y_an_aus = 1 Then
Trackbar_wert_string = Mid(inputstring , 4)
Trackbar_wert_byte = Val(trackbar_wert_string)
Motor_y_an_aus = 0
If Trackbar_wert_byte = 1 Then
I2cdaten(1) = Befehl_endlosdrehung
I2cdaten(2) = 2
I2csend I2crnmotorslaveadr , I2cdaten(1) , 7
Else
I2cdaten(1) = 51
I2cdaten(2) = 2
I2csend I2crnmotorslaveadr , I2cdaten(1) , 7
End If
End If
If Motor_y_richtung = 1 Then
Trackbar_wert_string = Mid(inputstring , 4)
Trackbar_wert_byte = Val(trackbar_wert_string)
Motor_y_richtung = 0
If Trackbar_wert_byte = 1 Then
I2cdaten(1) = 52
I2cdaten(2) = 2
I2cdaten(3) = Trackbar_wert_byte
I2csend I2crnmotorslaveadr , I2cdaten(1) , 7
Else
I2cdaten(1) = 52
I2cdaten(2) = 2
I2cdaten(3) = Trackbar_wert_byte
I2csend I2crnmotorslaveadr , I2cdaten(1) , 7
End If
End If
End If
Print "Test"
Waitms 10
Loop
End
Code:' Erstellt mit SharpDevelop.
' Benutzer: William
' Datum: 28.02.2009
' Zeit: 19:36
'
' Sie können diese Vorlage unter Extras > Optionen > Codeerstellung > Standardheader ändern.
'
Public Partial Class MainForm
Public Sub New()
' The Me.InitializeComponent call is required for Windows Forms designer support.
Me.InitializeComponent()
serialport1.Open
' TODO : Add constructor code after InitializeComponents
'
End Sub
Dim onX As Byte
Dim RichtungX As Byte
Dim onY As Byte
Dim RichtungY As Byte
Dim ContainsA As Boolean
Dim ContainsB As Boolean
Dim ContainsC As Boolean
Dim readvar As String
Dim A_Daten As String
Sub Timer1Tick(sender As Object, e As EventArgs)
if serialport1.BytesToRead > 0 then
Do
textbox1.AppendText (chr(SerialPort1.Readbyte))
textbox1.ScrollToCaret
If SerialPort1.BytesToRead = 0 Then
Exit Do
End If
Loop
end if
End Sub
Sub TrackBar2Scroll(sender As Object, e As EventArgs)
serialport1.Write ("SpX" + (Speed_motor_1.Value).tostring + Chr(13))
SpeedMotor1.text = 11- Speed_motor_1.Value
End Sub
Sub Button3Click(sender As Object, e As EventArgs)
If RichtungX = 0 Then
serialport1.Write ("RiX" + (1).tostring + Chr(13))
RichtungX = 1
Else
serialport1.Write ("RiX" + (0).tostring + Chr(13))
RichtungX = 0
End If
End Sub
Sub Button1Click(sender As Object, e As EventArgs)
If onX = 0 Then
serialport1.Write ("anX1" + Chr(13))
onX = 1
Else
serialport1.Write ("anX0" + Chr(13))
onX = 0
End If
End Sub
Sub TrackBar1Scroll(sender As Object, e As EventArgs)
serialport1.Write ("SpY" + (Speed_motor_2.Value).tostring + Chr(13))
SpeedMotor2.text = 11- Speed_motor_2.Value
End Sub
Sub Button2Click(sender As Object, e As EventArgs)
If onY = 0 Then
serialport1.Write ("anY1" + Chr(13))
onY = 1
Else
serialport1.Write ("anY0" + Chr(13))
onY = 0
End If
End Sub
Sub Button4Click(sender As Object, e As EventArgs)
If RichtungY = 0 Then
serialport1.Write ("RiY" + (1).tostring + Chr(13))
RichtungY = 1
Else
serialport1.Write ("RiY" + (0).tostring + Chr(13))
RichtungY = 0
End If
End Sub
End Class
das habe ich gesagt weil ich eigentlich keine große Lust habe deinen quellcode zu durchforsten... Aber vielleicht findet sich ja jemand der das mal durchguckt.Zitat:
vielleicht solltest du mal genau schreiben was wann passiert
Sry hatte das problem vergessen
So wie es jetzt oben ist kommt so gut wie kein String den ich vom Tool zum Avr sende vollständig an.
Lass ich das Waitms weg reagiert das Tool nicht mehr,
Wie gesagt das Tool sendet die Stings nicht vollständig an den AVR
Lass ich Print weg und setzte Waitms auf 100 kommt auch nix vollständig an
Wenn ich Waitms und Print weglasse läuft alles super
Was mir grad als erstes mal auffällt:
Data_available = Ischarwaiting()
If Len(data_available) <> 0 Then
ist IMMER true. guck dir mal die hilfe zu ischarwaiting an. Vielleicht ist das ja schon die lösung
Hab das jetzt geändert in
Aber es hat nix gebracht, denn immer wenn ich Waitms reinschreibe ( in Bascom) kommen die Strings nicht mehr vollständig am AVR an :(Code:Data_available = Ischarwaiting()
If Data_available = 1 Then
Ich steh voll aufm schlauch hier, mir fehlt leider die erfahrung um so ein problem zulösen
Ich glaub das Problem ist waitms, denn jeder string der per rs232 reinkommt muss sofort abgeholt werden damit dein Programm nicht durcheinanderkommt. Wenn zwei Strings im Buffer sind funktioniert das mit dem markieren der strings nicht mehr richtig könnte ich mir vorstellen.
Ersetze das waitms doch durch einen timergesteuerten interrupt. Wie das geht steht bestimmt im wiki.
Hm
Ich hab mir das mal angeschaut im Wiki ( https://www.roboternetz.de/wissen/in...scom_und_Timer ) und mit google hab ich auch gesucht aber verstehen tu ich es nicht wirklich wie ein Timer funktioniert, ich weis nur das er das hauptprogramm unterbricht, runterzahlt und das hauptprogramm fortfährt, aber wie er das macht und wie ich das einsetzten soll versteh ich nicht
In deinem Timer kannst du z.b. eine Variable hochzählen. Wenn die bei z.B. 100 angekommen ist dann wird dein Programm fortgeführt, ansonsten nicht. Ist dann etwas ähnliches wie waitms.
Mit Print willst du deine Sensordaten ausgeben? Leg das Print doch auch einfach in ein
if senden = 1 then
print blabla
end if
Und dann hast du in sharp develop halt einen timer der alle 1000ms deinen µC auffordert etwas zu senden. Es gibt sooo viele möglichkeiten das ganze zu machen. Du musst halt mal mit etwas einfacherem Code rumexperimentieren. Evtl. hilft es dir mal bei "CONFIG SERIALIN" in der bascom hilfe zu gucken.
Juhu Danke Willa
Es läuft endlich so wie ich es wollte
Danke für deine geduld und das du dich nicht aufgeregt :)
Schön dass es funktioniert :) Und nicht vergessen: Never touch a running system :-b
Woran lag es denn, bzw. wie hast die die Probleme beseitigt?
Ich hab in Bascom die Zeilen
hinzugefügtCode:Config Serialin = Buffered , Size = 20
Enable Interrupts
Hallo Crischan,
wärst du so nett deinen Bascom Code und den Sharp Code komplett
zu posten? Ich interessiere mich auch dafür wie das Problem gelöst wurde.
Gruß
Neutro
Oh ich hab im moment caos im Quellcode, aber wenn ich es geordnet und das tool fertig ist stell ich es hier gerne rein
Hallo
Frage:
Wie kann ich ein Array senden?
Ich hab das schon mit
versucht das geht aber leider nicht, denn er schmeist mir eine fehler meldund rausCode:Dim myArray(9) As String , A As Integer ,B As Integer
Sub Button1Click(sender As Object, e As EventArgs)
myArray(0) = A
myArray(1) = B
serialport1.Write (myArray)
End Sub
auf die ZeileZitat:
Der Wert vom Typ "1-dimensionales Array von String" kann nicht in "String" konvertiert werden. (BC30311)
Was mach ich da falsch?Code:serialport1.Write (myArray)
Das musst du schon einzeln senden. Also:
for i = 1 bis länge array
sende array(i).tostring
sende chr(13)
next
Könnte sein dass das nicht funktioniert weil die Werte dann wirklich direkt hintereinander gesendet werden. Aber probier halt mal.
hm
Ich geh mal davon aus das dass in Bascom dann in etwa so aussehen muss
oder?Code:Input A, B, C
Ich habs hinbekommen danke dir
Hallo
Ich hab jetzt mal eine vorabversion, ist noch nicht ganz Stabil und noch nicht vollsändig.
Das Tool Steuert mit dem RN-Control v1.4 übers I2C Kabel ein RN-Schrittmotorsteuerungsboard an, das RN-Controlboard wird über den RS232-port am Com-port1 des Pcs angeschlossen (Port auswahl gibt es bisher noch keine)
Bild
Bild hier
Tool
RN-SchrittmotorSteuerung.zip
AVR Code (RN-Control v1.4)
Tipps:Code:'===CHIP SETTINGS===
Declare Sub Abfrage() As Byte
$regfile = "m32def.dat"
$framesize = 64
$swstack = 64
$hwstack = 64
$crystal = 16000000 'Quarzfrequenz
$baud = 38400
Config Scl = Portc.0 'Ports fuer IIC-Bus
Config Sda = Portc.1
'===CHIP SETTINGS END===
Config Serialin = Buffered , Size = 20
Enable Interrupts
Dim Inputstring1 As Byte
Dim Inputstring2 As Byte
Dim Inputstring3 As Byte
Dim Inputstring4 As Byte
Const Inputstring5 = 0
Const I2crnmotorslaveadr = &H58 'I2C SlaveAdresse von RN-Schrittmotor Erweiterung
Const I2crnmotorsreadlaveadr = &H59 'I2C SlaveAdresse von RN-Schrittmotor Erweiterung
Dim I2cdaten(7) As Byte
Dim Schritte As Long
Dim Temp As Byte
Dim Ltemp As Long
Dim Umdrehungen As Single
Dim Fahrstrecke As Word
Dim Data_available As Byte
Dim Endschalter As Byte
Dim Motorstatus As Byte
Do
Data_available = Ischarwaiting()
If Data_available = 1 Then
Input "" , Inputstring1 , Inputstring2 , Inputstring3 , Inputstring4 ', Inputstring5
I2cdaten(1) = Inputstring1
I2cdaten(2) = Inputstring2
I2cdaten(3) = Inputstring3
I2cdaten(4) = Inputstring4
I2cdaten(5) = Inputstring5
I2csend I2crnmotorslaveadr , I2cdaten(1) , 7
If Inputstring1 = 101 Then
If Inputstring2 = 1 Then
I2cstart
I2cwbyte I2crnmotorsreadlaveadr
I2crbyte Motorstatus , Nack
I2cstop
Print "Motorstatus_Motor1" ; Motorstatus
Else
I2cstart
I2cwbyte I2crnmotorsreadlaveadr
I2crbyte Motorstatus , Nack
I2cstop
Print "Motorstatus_Motor2" ; Motorstatus
End If
End If
End If
I2cdaten(1) = 102
I2cdaten(2) = 1
I2csend I2crnmotorslaveadr , I2cdaten(1) , 7
I2cstart
I2cwbyte I2crnmotorsreadlaveadr
I2crbyte Temp , Ack
Schritte = Temp
I2crbyte Temp , Ack
Ltemp = Temp * 256
Schritte = Schritte + Ltemp
I2crbyte Temp , Ack
Ltemp = Temp * 65536
Schritte = Schritte + Ltemp
I2crbyte Temp , Nack
Ltemp = Temp * 16777216
Schritte = Schritte + Ltemp
I2cstop
Print "A" ; Schritte ' Motor 1
Waitms 10
I2cdaten(1) = 102
I2cdaten(2) = 2
I2csend I2crnmotorslaveadr , I2cdaten(1) , 7
I2cstart
I2cwbyte I2crnmotorsreadlaveadr
I2crbyte Temp , Ack
Schritte = Temp
I2crbyte Temp , Ack
Ltemp = Temp * 256
Schritte = Schritte + Ltemp
I2crbyte Temp , Ack
Ltemp = Temp * 65536
Schritte = Schritte + Ltemp
I2crbyte Temp , Nack
Ltemp = Temp * 16777216
Schritte = Schritte + Ltemp
I2cstop
Print "B" ; Schritte ' Motor 2
Waitms 10
Loop
End
Bewegt die Regler nicht so schnell.
Sollte das Tool oder das Controlboard nicht reagieren Resetet beide Boards Manuell über den Tasten auf den Boards
Danke für den Bascom Code,
wenn du jetzt noch die Sharp Dateien zur Verfügung stellen könntest,
würdest du mich so was von glücklich machen.........
Hallo
hab da noch ein anliegen ich hab da leider nix mit google gefunden
Also ich kann mit 'Printbin' in Bascom arrays verschicken aber wie kann ich die in SharpDevelop empfangen und leserlich machen und wieder in ein array speichern?
mfg