-
        

Ergebnis 1 bis 7 von 7

Thema: i2c Richtung Motorsteuerung

  1. #1
    Benutzer Stammmitglied
    Registriert seit
    28.07.2007
    Ort
    Roboland
    Alter
    41
    Beiträge
    70

    i2c Richtung Motorsteuerung

    Anzeige

    Hallo und ein schönes neues !

    Meine Motorsteuerung springt auf I2C nicht an wenn mir das jemand beheben könnte und auch durch den Compiler ( auch ohne wenn gut beschrieben) jagen würde währe ich froh.
    DANKE




    Code:
    
    $regfile = "m128def.dat"                                    ' Bei Mega 128
    
    $framesize = 32
    $swstack = 32
    $hwstack = 32
    
    $crystal = 16000000
    
    $baud = 19200
    $baud1 = 9600
    
    
    Config Scl = Portd.0
    Config Sda = Portd.1
    Config I2cdelay = 10
    
    
    Open "com2:" For Binary As #2
    
    
    Sound Portg.2 , 400 , 450
    Sound Portg.2 , 400 , 250
    Sound Portg.2 , 400 , 450
     ' ---------------------------------------------------
    
    Const Befehl_ausschalten = 51
    Const Befehl_drehrichtung = 52
    Const Befehl_geschwindigkeit = 53
    Const Befehl_endlosdrehung = 54
    
    Const Motor_1 = 1
    Const Motor_2 = 2
    Const Motor_3 = 3
    
    
    Const I2crnmotorw = &H58
    Const I2crnmotorsr = &H59
    
    
    
    Dim I2cdaten(7) As Byte
    Dim Lowbyte As Byte
    Dim Highbyte As Byte
    Dim Richtung As Bit
    
    
    Dim Schritte As Long
    Dim Temp As Byte
    Dim Ltemp As Long
    Dim Umdrehungen As Single
    Dim Fahrstrecke As Word
    
    Dim Geschwindigkeit As Byte
    
    
    
    Richtung = 0
    Geschwindigkeit = 250
    
      Do
    
      I2cdaten(1) = Befehl_endlosdrehung
      I2cdaten(2) = Motor_3
      I2csend I2crnmotorw , I2cdaten(1) , 7
    
    
      Toggle Richtung
      I2cdaten(1) = Befehl_drehrichtung
      I2cdaten(2) = Motor_3
      I2cdaten(3) = Richtung
      I2csend I2crnmotorw , I2cdaten(1) , 7
    
    
      If Geschwindigkeit > 40 Then
        Geschwindigkeit = Geschwindigkeit - 20
      Else
        Geschwindigkeit = Geschwindigkeit - 1
      End If
    
    
      I2cdaten(1) = Befehl_geschwindigkeit
      I2cdaten(2) = Motor_3
      I2cdaten(3) = Geschwindigkeit
      I2cdaten(4) = 0
      I2csend I2crnmotorw , I2cdaten(1) , 7
    
    
    
    
      Loop
      End

  2. #2
    Erfahrener Benutzer Roboter-Spezialist
    Registriert seit
    08.12.2005
    Beiträge
    535
    Astro,

    Dein Programm kann ich leider nicht prüfen, weil ich die Eigenheiten des Basic-Dialektes, den Du verwendest, nicht kenne. - Mir fiel aber auf, dass eine Deiner TWI-Adressen den Wert &H59 hat. Normalerweise überschreibt die TWI-Schnittstelle das Bit0 der Adresse mit dem R/W-Bit. Auf dem TWI-Bus erscheinen deshalb &H59 und &H58 als ein und dieselbe Adresse, nämlich &H58. Ich würde &H58 und &H5A verwenden. - Mir ist sowas auch mal passiert und kostete mich fast eine Woche Fehlersuche .

    Es kann aber sein, dass Dein Basic die Adresse vor der Übermittlung um ein Bit nach links verschiebt; dann wäre die Adresszuordnung in Ordnung.

    mare_crisium

  3. #3
    Benutzer Stammmitglied
    Registriert seit
    28.07.2007
    Ort
    Roboland
    Alter
    41
    Beiträge
    70
    Danke den Test mach ich mal

    wenn nicht schau ich da mal rein muss ich eh irgendwann über RS232 wenn das so nicht funkt.
    weis zwar noch nicht welches Kabel ich zerschnippel aber naja ,!geht da auch ein Monitor kabel , ich denke schon ODER??

  4. #4
    Erfahrener Benutzer Roboter-Spezialist
    Registriert seit
    08.12.2005
    Beiträge
    535
    Astro,

    bin Dein Listing nochmal durchgegangen. An der Adressvergabe liegt's nicht, weil Du "I2crnmotorsr" gar nicht ansprichst (ist der vorletzte Buchstabe "s" in dieser Adresse nicht ein Schreibfehler?). Wenn Du ausserdem die Adresse mit dem "r" am Ende nur zum Empfangen und die mit dem "w" nur zum Senden von Botschaften verwendest, kann auch mit den jetzigen Adressen nichts schiefgehen.

    Sonst gibt es nichts Auffälliges in Deinem Programm.

    mare_crisium

  5. #5
    Benutzer Stammmitglied
    Registriert seit
    28.07.2007
    Ort
    Roboland
    Alter
    41
    Beiträge
    70
    Ich hab da jetzt schon ein wenig ausprobiert aber ohne erfolg irgendwie funkt. es nicht so bei meinen Motoren kann eventuell noch mal jemand schauen und muss mann erst die neue Firmware auf die Motorsteuerung spielen oder fehlt mir da einfach nur ein Befehl .
    einfach nur drehen dann gehts schon würde erts mal reichen

    Code:
    $regfile = "m128def.dat"                                    ' Bei Mega 128
    
    $framesize = 32
    $swstack = 32
    $hwstack = 64
    
    
    $crystal = 16000000
    $baud = 9600
    Config Scl = Portd.0
    Config Sda = Portd.1
    Config I2cdelay = 10
    
    
    Open "com2:" For Binary As #2
    
    I2cinit
    Start Adc
    Sound Portg.2 , 400 , 450
    Sound Portg.2 , 400 , 250
    Sound Portg.2 , 400 , 450
     ' ---------------------------------------------------
    Const Befehl_motor_an_aus = 50
    Const Befehl_ausschalten = 51
    Const Befehl_drehrichtung = 52
    Const Befehl_geschwindigkeit = 53
    Const Befehl_endlosdrehung = 54
    Const Befehl_slave_id_aendern = 202
    
    
    
    Const Motor_1 = 1
    Const Motor_2 = 2
    Const Motor_3 = 3
    
    
    Const I2crnmotorslaveadr = &H58                             '
    Const I2crnmotorsreadlaveadr = &H59
    
    Dim I2cdaten(7) As Byte
    Dim Lowbyte As Byte
    Dim Highbyte As Byte
    Dim Richtung As Bit
    
    
    Dim Schritte As Long
    Dim Temp As Byte
    Dim Ltemp As Long
    Dim Umdrehungen As Single
    Dim Fahrstrecke As Word
    
    Dim Geschwindigkeit As Byte
    
    
    
    
    
    Richtung = 0
    Geschwindigkeit = 150
    
      Do
    
      I2csend I2crnmotorslaveadr , I2cdaten(1) , 7
      I2cdaten(1) = Befehl_slave_id_aendern
      I2cdaten(2) = 88
    
    
      I2csend I2crnmotorslaveadr , I2cdaten(1) , 7
      I2cdaten(1) = Befehl_motor_an_aus
      I2cdaten(2) = Motor_2
    
      Waitms 10
    
    
      I2csend I2crnmotorslaveadr , I2cdaten(1) , 7
      I2cdaten(1) = Befehl_endlosdrehung
      I2cdaten(2) = Motor_2
    
       Waitms 10
    
      Toggle Richtung
      I2cdaten(1) = Befehl_drehrichtung
      I2cdaten(2) = Motor_2
      I2cdaten(3) = Richtung
    
    
    
    
      If Geschwindigkeit > 40 Then
        Geschwindigkeit = Geschwindigkeit - 20
      Else
        Geschwindigkeit = Geschwindigkeit - 1
      End If
      I2csend I2crnmotorslaveadr , I2cdaten(1) , 7
      I2cdaten(2) = Motor_2
      I2cdaten(3) = Geschwindigkeit
      I2cdaten(4) = 0
    
    
    Loop

  6. #6
    Erfahrener Benutzer Robotik Einstein
    Registriert seit
    22.05.2005
    Ort
    12°29´ O, 48°38´ N
    Alter
    48
    Beiträge
    2.731
    Hallo,

    was mir auffällt, Du sendst immer 7 Bytes, obwohl die anscheinend nicht immer alle benutzt werden. Denn einmal werden nur 2 Bytes gesetzt, mal 4 Bytes, aber es werden immer alle gesendet, wer weiss was der Slave damit anstellt

    Ändere jeweils mal die Anzahl zu sendender Bytes auf die richtige Anzahl, ob sich da was zum positiven ändert.

  7. #7
    Neuer Benutzer Öfters hier
    Registriert seit
    01.11.2005
    Beiträge
    21
    Code:
    I2csend I2crnmotorslaveadr , I2cdaten(1) , 7
      I2cdaten(1) = Befehl_slave_id_aendern
      I2cdaten(2) = 88
    Ich nehme mal an damit willst du die slave adresse ändern. ist denn &H58 auch die aktuelle slaveadresse?
    weil dann brauchts du sie ja gar nicht zu ändern weil dez 88 ist &H58
    ansonsten musst du für I2crnmotorslaveadr die noch aktuelle adresse angeben und erst nachher &H58

Berechtigungen

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