Envoi d'une trame vers un Conv. USB-I2C
Répondre à la discussion
Affichage des résultats 1 à 4 sur 4

Envoi d'une trame vers un Conv. USB-I2C



  1. #1
    invitef0bed263

    Question Envoi d'une trame vers un Conv. USB-I2C


    ------

    Bonjour et merci de prêter attention à mon post,
    je pense bientôt devenir un membre actif de ce forum très intéressant.

    Je développe en autodidacte depuis deux ans un robot, dont je concois les parties mécaniques, électronique et informatique.

    Cela fait plusieurs semaines que je suis confronté à un problème de taille.

    J'utilise des carte I2C de chez Devantech pour contrôler mes moteurs C.C ou Servos.
    J'ai dors et déjà codé toute mon interface de pilotage du robot, qui marche à merveille.
    Je génère donc sans problème dans un buffer ma trame à envoyer au port série virtuel (VCP de FTDI), qui passe donc dans l'USB avant d'etre mis en forme par le convertisseur pour le protocole I2C.

    Voici la doc du fameux convertisseur (assez connu je pense):
    http://www.robot-electronics.co.uk/htm/usb_i2c_tech.htm

    J'ai bien lu et relu cette doc, et je pense avoir bien compris que il suffit d'envoyer la trame au port COM correspondant au VCP, et que le convertisseur se charge du protocole I2C.
    Me confirmez vous ce point ?

    J'ai bien réglé le port, comme indiqué (8dataBit 0parity, 2stop)
    J'arrive à ouvrir le port. Les outils fournis par Devantech compilent bien sous Visual C++ et marchent...

    Mon problème se situe donc sur le simple envoi de la trame.

    Par exemple, pour régler le Servo1 à 1200µs, je dois comme il est écrit dans La Doc du controleur de Servomoteur SD21
    Régler la position du servo en envoyant (dans le bon mode du convertisseur pour ce cas: 0x56) mot de 2bits (1200 sur 2bits correspond à 0x04 0xB0) sur deux registres dont je donne les adresses dans la trame.

    En C (sous CVI avec sa librarie RS232), je pense pouvoir utiliser quelque chose comme:

    Code:
    #include <rs232.h>
    
    #define COMPORTNUM 4
    void main(void){
    	
    unsigned char buf[7];
    int queuecount=0;
    
    buf[0] = 0x56;   // I2C MODE (pour 2registres)
    buf[1] = 0xC2;	 // SD21 adress
    buf[2] = 0x02;	 // Low Byte register adress
    buf[3] = 0x01;	 // Hight Byte register adress
    buf[4] = 0x40;	 // Data bytes count
    buf[5] = 0x04;	 // LOW DATA
    buf[6] = 0xB0;	 // HIGH DATA
    
    
    
    OpenComConfig (COMPORTNUM, "COM4", 19200, 0, 8, 2, 512, 512); // on configure bien le port
    
    OpenCom (COMPORTNUM, "COM4");	// on l'ouvre	
    
    queuecount = ComWrt (COMPORTNUM, buf, 6); // on y écrit la trame
    
    CloseCom (4); // et on referme
    Ceci est bien sûr une version très simplifiée de mon code, mais il illustre cette situation précise.

    Au débeugeur, queuecount prend bien la valeur 6 qui est la valeur renvoyée par ComWrt indiquant le nombre de byte effectivement mis dans la queue.

    Pourtant mon servo ne bouge pas d'un poil.
    Si j'avais un oscilo sous la main je pourrais visualiser l'état de mes lignes I2C, mais ce n'est pas le cas.

    Auriez vous une idée pour m'aider? Ou d'autre bibliothèques RS232 simple et utilisable en C++ sous Visual C++

    Je n'ai pas le temps d'en dire plus tout de suite, j'attends votre aide avec (im)patience.

    Si quelqu'un à de l'expérience avec ces modules, je serai prêt à le rencontrer.

    Merci beaucoup et bonne journée à tous!

    -----

  2. #2
    invitef0bed263

    Re : Envoi d'une trame vers un Conv. USB-I2C

    Bonjour,

    J'ai résolu une partie du probleme, ma trame n'était pas bonne,
    les registres ont une adresse sur un seul octet, et j'avais inversé MSB et LSB.

    Ma trame est donc du style:
    Code:
    0x55 // mode I2C
    0xC2 // adresse de la SD21
    0x01 // Registre de départ
    0x02 // nombre d'octets de données
    0xB0 // LSB de 1200
    0x04 // MSB de 1200
    Cette trame passe nikel sous un terminal et mes servi et moteur CC bouge à merveille.

    En revanche mon programme en C ne fonctionne pas alors que rien n'est visible au débugger ....

    Merci

  3. #3
    carcan

    Re : Envoi d'une trame vers un Conv. USB-I2C

    Salut !

    qq remarques dans ton programme en CVI :
    - tu as une trame de 7 octets à envoyer or tu n'en envoies que 6 avec la fonction ComWrt
    - OpenPortConfig ouvre aussi le port, pas besoin de refaire un OpenCom après.

    A+
    Laurent

  4. #4
    invitef0bed263

    Re : Envoi d'une trame vers un Conv. USB-I2C

    oui oui pour le nombre de bytes à envoyer... je n'avais pas mis à jours cet argument...

    HAA merci pour pour le OpenPortConfig !!!

  5. A voir en vidéo sur Futura

Discussions similaires

  1. USB-I2C + DS1621 + programme en C++
    Par invitec152bdc3 dans le forum Électronique
    Réponses: 10
    Dernier message: 12/04/2009, 22h13
  2. Envoi de messages depuis ma BàL free vers hotmail bloqué
    Par danyvio dans le forum Internet - Réseau - Sécurité générale
    Réponses: 15
    Dernier message: 08/04/2009, 19h46
  3. Secteur vers USB (chargeur USB)
    Par invite4217d2e3 dans le forum Électronique
    Réponses: 3
    Dernier message: 02/08/2007, 19h22
  4. Adaptateur USB<->I2C
    Par invite9e020ebb dans le forum Matériel - Hardware
    Réponses: 3
    Dernier message: 22/06/2007, 06h57
  5. Interface usb<->i2c
    Par invite4f0d0147 dans le forum Électronique
    Réponses: 1
    Dernier message: 02/06/2007, 10h12
Découvrez nos comparatifs produits sur l'informatique et les technologies.