- 12V Akku mit 280 Ah bauen         
Seite 2 von 3 ErsteErste 123 LetzteLetzte
Ergebnis 11 bis 20 von 23

Thema: 3 ports binär auslesen?

  1. #11
    Super-Moderator Robotik Visionär Avatar von PicNick
    Registriert seit
    23.11.2004
    Ort
    Wien
    Beiträge
    6.842
    Anzeige

    E-Bike
    Na bumm. Was baust du denn ? Einen Weberknecht ?
    mfg robert
    Wer glaubt zu wissen, muß wissen, er glaubt.

  2. #12
    Erfahrener Benutzer Fleißiges Mitglied
    Registriert seit
    14.12.2003
    Ort
    Bad Krozingen
    Alter
    41
    Beiträge
    125
    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..
    Miniaturansichten angehängter Grafiken Miniaturansichten angehängter Grafiken p1010048.jpg  

  3. #13
    Super-Moderator Robotik Visionär Avatar von PicNick
    Registriert seit
    23.11.2004
    Ort
    Wien
    Beiträge
    6.842
    respekt, schaut ja sauber aus ! Dann wünsch ich viel Erfolg !
    mfg robert
    Wer glaubt zu wissen, muß wissen, er glaubt.

  4. #14
    Erfahrener Benutzer Fleißiges Mitglied
    Registriert seit
    14.12.2003
    Ort
    Bad Krozingen
    Alter
    41
    Beiträge
    125
    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

  5. #15
    Super-Moderator Robotik Visionär Avatar von PicNick
    Registriert seit
    23.11.2004
    Ort
    Wien
    Beiträge
    6.842
    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.

  6. #16
    Erfahrener Benutzer Fleißiges Mitglied
    Registriert seit
    14.12.2003
    Ort
    Bad Krozingen
    Alter
    41
    Beiträge
    125
    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

  7. #17
    Super-Moderator Robotik Visionär Avatar von PicNick
    Registriert seit
    23.11.2004
    Ort
    Wien
    Beiträge
    6.842
    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.

  8. #18
    Erfahrener Benutzer Fleißiges Mitglied
    Registriert seit
    14.12.2003
    Ort
    Bad Krozingen
    Alter
    41
    Beiträge
    125
    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

    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
    
       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
    Gruss Stefan

  9. #19
    Super-Moderator Robotik Visionär Avatar von PicNick
    Registriert seit
    23.11.2004
    Ort
    Wien
    Beiträge
    6.842
    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.

  10. #20
    Erfahrener Benutzer Fleißiges Mitglied
    Registriert seit
    14.12.2003
    Ort
    Bad Krozingen
    Alter
    41
    Beiträge
    125
    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

Seite 2 von 3 ErsteErste 123 LetzteLetzte

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •  

fchao-Sinus-Wechselrichter AliExpress