Na bumm. Was baust du denn ? Einen Weberknecht ?
Druckbare Version
Na bumm. Was baust du denn ? Einen Weberknecht ?
Ne, ist nicht für mich sondern für jemand anderen, der will irgend so einen Bagger ferngesteuert haben, brauch die servos für hydraulikventile und halt gleich 16..das größe was er fernsteuerungstechnisch gefunden hat sind allerdings 8 Servos...
Jetzt kann er aber 16 steuern, vorerst noch über ein kabel, später dann über rs232 funkmodul oder so..
respekt, schaut ja sauber aus ! Dann wünsch ich viel Erfolg !
Jo, vielen dank....
Funzt ja jetzt..also hat eigentlich schon die ganze zeit gefunzt, hat ja auch mit dem if then else geklappt, aber wenn man das programm verschönern will, warum nicht? ist ja nicht so als würd irgendjemand das gesamte programm sehen, aber für einen selber ist das doch ok :)
Gruss Stefan
Der Vorteil bei dem Select... ist die leicht lesbarkeit, daß man auch in einem Jahr noch ohne Schwierigkeiten sein eigenes Programm lesen und verstehen kann. (das is nämlich nicht selbstverständlich)
Ja das ist klar....ich arbeite selber auch viel mit dem select, das war ja auch nicht das schwierige,ich mag auch die if-sache nicht, machts immer so unübersichtlich und vermeide es wenns geht... nur wie sollte man von sich aus auf "Result = Pinb And 7" kommen? hab in der hilfe nix gefunden :(
Hab mir schon gedacht dass mal vll. die 3 werte in ein byte schreiben kann, aber wenn dann halt nur mit den restlichen Ports und da die als ausgang deklariert sind , sind sie high und verfälschen bestimmt das ergebnis..
Gruss Stefan
Die "AND" Geschichte ist nützlich, kann man sich merken, da das Problem mit mixed Input/Output ja öfter vorkommt.
Immer eine Konstant-Zahl haben, wo die entsprechenden Input-Bits auf 1 stehen, in unserem Fall also &B00000111 = 7
Mach man dann damit AND, sind im Ergebnis die Output-Bits immer NULL, und nur die interessenten Bits haben den wert von PINx
Das Ganze nennt man "maskieren"
Maskieren..ok, man lernt nie aus :)
Bin ja eh nicht sooo der progger, mach lieber mechanische dinge und progg nur was ich muss, aber falls es dich interessiert poste ich dir hier gerna mal das ganze Programm....da ich aber natürlich faul bin, ist es unkommentiert, aber du kannst ja vll. trotzdem was mit anfangen :)
Gruss StefanCode:$regfile = "m16def.dat"
$framesize = 24
$swstack = 8
$hwstack = 32
$crystal = 16000000
$baud = 9600
Ddrc = &B10000000
Ddrb = &B11111000
Ddrd = &B00000000
Portb = 255
Portd = 0
Dim A As Word
Dim B As Byte
Dim C As Byte
Dim D As Byte
Dim Result As Byte
B = 0
C = 0
D = 0
Waitms 200
Gosub Drehbereich
Enable Interrupts
Enable Int0
Config Int0 = Change
On Int0 Drehbereich
Config Adc = Single , Prescaler = Auto
Start Adc
Do
Select Case Pind.3
Case 1 : Gosub Rechts
Case 0 : Gosub Links
End Select
Loop
Rechts:
Portb.3 = 0
Portb.4 = 1
Portc.7 = 1
A = Getadc(b)
A = A / 8
Select Case A
Case 59 To 69 : A = 64
Case 128 : A = 127
End Select
'128 ; Servodevice ; Servocommand ; Servonummer ; Servodata
Print Chr(128) ; Chr(1) ; Chr(2) ; Chr(b) ; Chr(a)
Incr B
Select Case B
Case Is > 7 : B = 0
End Select
Waitms 1
Return
Links:
Portb.3 = 1
Portb.4 = 0
Portc.7 = 0
A = Getadc(b)
A = A / 8
C = B + 8
Select Case A
Case 59 To 69 : A = 64
Case 128 : A = 127
End Select
'128 ; Servodevice ; Servocommand ; Servonummer ; Servodata
Print Chr(128) ; Chr(1) ; Chr(2) ; Chr(c) ; Chr(a)
Incr B
Select Case B
Case Is > 7 : B = 0
End Select
Waitms 1
Return
Drehbereich:
If Pind.2 = 1 Then
Result = Pinb And 7
Select Case Result
Case 0 : D = 4
Case 1 : D = 12
Case 2 : D = 8
Case 3 : D = 16
Case 4 : D = 6
Case 5 : D = 14
Case 6 : D = 10
Case 7 : D = 18
End Select
For B = 0 To 15 Step 1
'128 ; Servodevice ; Servocommand ; Servonummer ; Servodata
Print Chr(128) ; Chr(1) ; Chr(0) ; Chr(b) ; Chr(d)
Next
Else
For B = 0 To 15 Step 1
'128 ; Servodevice ; Servocommand ; Servonummer ; Servodata
Print Chr(128) ; Chr(1) ; Chr(0) ; Chr(b) ; Chr(20)
Next
End If
Return
End
Schau mal, ich hab das ein wenig unstrukturiert, spart Code.
Code:$regfile = "m16def.dat"
$framesize = 24
$swstack = 8
$hwstack = 32
$crystal = 16000000
$baud = 9600
Ddrc = &B10000000
Ddrb = &B11111000
Ddrd = &B00000000
Portb = 255
Portd = 0
Dim A As Word
Dim B As Byte
Dim C As Byte
Dim D As Byte
Dim Result As Byte
B = 0
C = 0
D = 0
Waitms 200
Gosub Drehbereich
Enable Interrupts
Enable Int0
Config Int0 = Change
On Int0 Drehbereich
Config Adc = Single , Prescaler = Auto
Start Adc
Do
A = Getadc(b)
A = A / 8
Select Case A
Case 59 To 69 : A = 64
Case 128 : A = 127 ' gibt es aber eigentlich nicht
End Select
Result = Pind.3
On Result Gosub Links , Rechts
Incr B
B = B And 7
Waitms 1
Loop
End
'----------------------------------------------------
Rechts:
Portb.3 = 0
Portb.4 = 1
Portc.7 = 1
'128 ; Servodevice ; Servocommand ; Servonummer ; Servodata
Print Chr(128) ; Chr(1) ; Chr(2) ; Chr(b) ; Chr(a)
Return
'----------------------------------------------------
Links:
Portb.3 = 1
Portb.4 = 0
Portc.7 = 0
C = B + 8
'128 ; Servodevice ; Servocommand ; Servonummer ; Servodata
Print Chr(128) ; Chr(1) ; Chr(2) ; Chr(c) ; Chr(a)
Return
'----------------------------------------------------
Drehbereich:
If Pind.2 = 1 Then
Result = Pinb And 7
Select Case Result
Case 0 : D = 4
Case 1 : D = 12
Case 2 : D = 8
Case 3 : D = 16
Case 4 : D = 6
Case 5 : D = 14
Case 6 : D = 10
Case 7 : D = 18
End Select
Else
D = 20
End If
For C = 0 To 15 Step 1 'besser C, da sonst b (SrvNr) falsch ist
'128 ; Servodevice ; Servocommand ; Servonummer ; Servodata
Print Chr(128) ; Chr(1) ; Chr(0) ; Chr(c) ; Chr(d)
Next
Return
Na toll..ich brauch da Tage bis ich das programm soweit hab dass es gut läuft und dann kommt hier einer daher und schreibt es mal schnell in nem Stündchen um :(
Ich mein Code Sparen müsst ich eh net, mehr macht der m16 eh nicht, aber trotzdem cool..aber wenn du schon den code änderst hätte ich ein paar fragen :)
Warum zb. B=B And 7 ?ist b also die tatsächliche dezimalzahl? und nicht die anzahl der bits? ich dachte And 7 heisst sowas wie lese 7 bits aus und nicht lese die ersten 3 bits aus da die ja dezimal 7 sind?
Und da ich (was du ja nicht wissen kannst) 2 analoge 8->4 multiplexer am adc hab (16potis) und jeweils mit dem pinc.7 zwischen den potis herspringe, wär dann nicht meine art immer in den sub´s links und rechts den analogen wert frisch einzulesen besser/schneller? weil dann hat er immer nach dem umschalten der mux den aktuellen wert und nicht den zu letzt verfügbaren gewesenen wert??
So far..
Gruss Stefan