Na bumm. Was baust du denn ? Einen Weberknecht ?
Na bumm. Was baust du denn ? Einen Weberknecht ?
mfg robert
Wer glaubt zu wissen, muß wissen, er glaubt.
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 !
mfg robert
Wer glaubt zu wissen, muß wissen, er glaubt.
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)
mfg robert
Wer glaubt zu wissen, muß wissen, er glaubt.
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"
mfg robert
Wer glaubt zu wissen, muß wissen, er glaubt.
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
mfg robert
Wer glaubt zu wissen, muß wissen, er glaubt.
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
Lesezeichen