#define pour "mapper" les bits d'un port
Répondre à la discussion
Affichage des résultats 1 à 8 sur 8

#define pour "mapper" les bits d'un port



  1. #1
    schneiderj

    #define pour "mapper" les bits d'un port


    ------

    Bonjour,

    j’utilise un DRV8824 de chez TI comme driver pour mon moteur pas pas. Le contrôle du mode de fonctionnement du driver en mode pas, demi pas, micropas est réalisé par trois entrées du DRV qui sont appelés mode2, mode1, mode0.

    Dans mon programme je voudrais écrire les définitions suivantes :

    Code:
    #define DRV_CLOCK	(LATEbits.LATE5)
    #define DRV_MODE   	((LATEbits.LATE2) | (LATEbits.LATE1) | (LATEbits.LATE0))
    
    //definition de DRV_MODE pour déterminer le nombre de micropas
    #define FULL_STEP 		000
    #define HALF_STEP 		001
    #define QUARTER_STEP            010
    #define 8_MICRO_STEP            011
    #define 16_MICRO_STEP           100
    puis les utiliser comme ceci pour le mode :
    Code:
    DRV_MODE = QUARTER_STEP;
    Mais j'ai l’impression d'écrire une ânerie...

    Merci de me faire part de vos remarques.
    Jean-Marie

    -----

  2. #2
    terriblement

    Re : #define pour "mapper" les bits d'un port

    Salut,

    ce qui reviendrait à retrovuer dans ton code :

    ((LATEbits.LATE2) | (LATEbits.LATE1) | (LATEbits.LATE0)) = 010;

    Tout d'abord, les nombres sont généralement en base 10 quand tu compiles, pour avoir une "annerie" en moins, il faudrait écrire cela:

    ((LATEbits.LATE2) | (LATEbits.LATE1) | (LATEbits.LATE0)) = 0b010;

    Bon, je me demande si ca marche, mais je ferais plutot quelque chose dans ce genre :

    #define DRV(x) do{DRV^=(DRV^(x))&SETMASK;}whi le(0)

    avec #define SETMASK 0b00000111
    #define FULL_STEP 0
    #define HALF_STEP 1
    #define QUARTER_STEP 1<<1
    #define 8_MICRO_STEP 1<<2
    #define 16_MICRO_STEP 1<<3

    et tu appeleras ta macro comme cela:
    DRV(HALF_STEP);

    c'est juste un exemple

  3. #3
    schneiderj

    Re : #define pour "mapper" les bits d'un port

    Merci pour ta réponse... et d'avoir relevé une belle bourde avec l'oubli de 0b !

    J'ai retenu ton idée de masque, pour écrire ceci :
    Code:
    #define DRV_CLOCK	(LATEbits.LATE5)
    #define DRV_LAT   	LATE
    
    //definition de DRV_MODE pour determiner le nombre de micropas
    #define DRV_SETMASK             0b00000111
    
    #define FULL_STEP 		0b000
    #define HALF_STEP 		0b001
    #define QUARTER_STEP            0b010
    #define MICRO_STEP_8            0b011
    #define MICRO_STEP_16           0b100
    #define MICRO_STEP_32           0b111
    
    void InitMoteurPap(void) {
        // le portE est mis en sortie
        TRISE = 0;
        DRV_LAT &= (~DRV_SETMASK );
        DRV_LAT |= MICRO_STEP_8;
        DRV_nENABLE = 0;
        DRV_nSLEEP = 1
    }
    Ce n'est pas le code le plus élégant, mais j'ai pu l'écrire !

    Jean-Marie

  4. #4
    terriblement

    Re : #define pour "mapper" les bits d'un port

    pourquoi ne pas avoir fait un ou exclusif ?
    Ma fonction n'est pas forcément super jolie mais elle est optimisée pour la vitesse

  5. A voir en vidéo sur Futura
  6. #5
    schneiderj

    Re : #define pour "mapper" les bits d'un port

    Si je ne me trompe pas le ou exclusif ne va pas le faire :

    Si j'ai mon port qui a la valeur 0b01000011 et que je veule passer de 8 microstep à 16 microstep 0b100, le ou exclusif donnera 0b01000111.
    Mais je mis prend probablement mal.

    Jean-Marie

  7. #6
    terriblement

    Re : #define pour "mapper" les bits d'un port

    c'Est pour ca quand dans la MACRO j'ai un double XOR pour ce problème

    Je sais aps combien de temps prends cette instruction :
    DRV_LAT &= (~DRV_SETMASK );
    mais ca doit pas etre très bon

  8. #7
    schneiderj

    Re : #define pour "mapper" les bits d'un port

    OK merci pour cette précision.

    Je n'ai pas de problème de charge pour mon microcontrolleur, d'autant que c'est un réglage qui est fait trois fois par manipe (sur plusieurs heures).

    pour ce qui est du temps d’exécution je viens de faire une mesure (il s'agit d'un PIC32MX695 cadencé à 80 MHz, le code est compilé sans aucune optimisation) :

    TRISE = 0; Target halted. Stopwatch cycle count = 1649 (1,649 ms)
    DRV_LAT &= (~DRV_SETMASK ); Target halted. Stopwatch cycle count = 1651 (1,651 ms)
    DRV_LAT |= MICRO_STEP_8; Target halted. Stopwatch cycle count = 1657 (1,657 ms)
    DRV_nENABLE = 0; Target halted. Stopwatch cycle count = 1662 (1,662 ms)
    DRV_nSLEEP = 1; Target halted. Stopwatch cycle count = 1666 (1,666 ms)

    Cette instruction (DRV_LAT &= (~DRV_SETMASK ) est exécuté en 6 cycles, ce qui est pas mal, surtout si l'on voit que l'attribution d'un seul bit se fait en 4 cycles et le OR en 5.

    Il serait intéressante d'avoir l'avis de Risc et Hulk sur ce point !

    Jean-Marie

  9. #8
    terriblement

    Re : #define pour "mapper" les bits d'un port

    ma macro prends 3 cycles d'horloges, donc plus rapide.

Discussions similaires

  1. "fondamentales", "dures", "molles" ... : comment classer les sciences ?
    Par Arvirik dans le forum Epistémologie et Logique (archives)
    Réponses: 13
    Dernier message: 22/04/2017, 22h41
  2. "Et Dieu créa les nombres" et "sur les épaules des géants"
    Par dunc28 dans le forum Lectures scientifiques
    Réponses: 5
    Dernier message: 22/05/2011, 13h55
  3. Piloter les lignes d'un PORT USB "manuellement"
    Par indri dans le forum Matériel - Hardware
    Réponses: 2
    Dernier message: 27/08/2009, 14h31
  4. micro sd erreur"fichier non supporté"pour les musiques, et "?" pour les photos
    Par invitea74b720a dans le forum Matériel - Hardware
    Réponses: 1
    Dernier message: 27/02/2009, 17h46
  5. Quels peuvent être les "motivations" pour "orienter" le discours du patient ?
    Par invitef9a161a9 dans le forum Psychologies (archives)
    Réponses: 77
    Dernier message: 24/12/2008, 09h49
Découvrez nos comparatifs produits sur l'informatique et les technologies.