Répondre à la discussion
Affichage des résultats 1 à 25 sur 25

C pour PIC : récupérer le nième bit d'un entier



  1. #1
    Toufinet

    C pour PIC : récupérer le nième bit d'un entier


    ------

    Bonjour à tous.

    Bon, bah j'ai finalement décidé de me mettre au C pour PIC avec CC5X !

    Premier blocage. J'ai un unsigned int ( de 8 bits donc ), et je souhaiterai pouvoir accéder au nième bit.

    J'ai essayé :
    unsigned int truc;

    PORTA.0 = truc.0;

    mais ça ne passe pas, il refuse le point après "truc".
    J'ai fouillé un peu le net, mais pas plus trouvé que ça ... pouvez-vous me donner une piste svp ?

    Merki

    -----

  2. Publicité
  3. #2
    Toufinet

    Re : C pour PIC : récupérer le nième bit d'un entier

    Ma question est mal posée ?
    Y'a quelque chose de compliqué ?

    Ne me forcez pas à retourner en ASM !!

  4. #3
    invite76a

    Re : C pour PIC : récupérer le nième bit d'un entier

    Bonsoir, Toufinet

    Ta question est très bien posée et est très claire.

    Le langage C permet cela sachant que :
    - Une structure permet d'associer des variables de différents types
    - Une variable peut être déclarée avec une taille spécifiée en nombre de bits
    - une union est composée de variables occupant le même espace mémoire

    Voici comment faire (je suppose que le C de microchippe est ANSII) :
    http://www.68hc08.net/modules/newbb/...id=146&forum=6

    thierry

    PS: ma référence préférée : http://tamoggemon.com/blog/contents/...hell/front.jpg
    Dernière modification par invite76a ; 14/10/2007 à 23h03. Motif: ortografe

  5. #4
    RISC

    Re : C pour PIC : récupérer le nième bit d'un entier

    Salut,

    Pour pouvoir faire cela, il faut que des structures à champs de bits aient été définies dans un fichier header.

    Sur les compilateurs Microchip C18 et C30, toutes les déclarations sont faites dans les fichiers header pour chaque micro. Tu peux télécharger ces compilateurs ou chercher un fichier header sur internet dans un projet

    Regarde sur CC5x ce qui existe comme fichier header ou fabrique toi ces structures en recopiant celles du compilateur C18.

    a+

  6. #5
    invite76a

    Re : C pour PIC : récupérer le nième bit d'un entier

    Citation Envoyé par RISC Voir le message
    Salut,

    Pour pouvoir faire cela, il faut que des structures à champs de bits aient été définies dans un fichier header.

    a+
    Certainement pas, si ce n'est pas déclaré dans un fichier header, il y a toujours moyen de faire cette manipulation pour n'importe quelle variable en utilsant la syntaxe standard du C.

    Mais c'est effectivement le genre de déclaration que l'on trouve pour les ports d'E/S dans les fichiers header.

    th
    Dernière modification par invite76a ; 14/10/2007 à 23h24.

  7. A voir en vidéo sur Futura
  8. #6
    Seb.26

    Re : C pour PIC : récupérer le nième bit d'un entier

    Bonsoir, alors premièrement : le type int est à utiliser avec precaution, en effet, c'est un type qui varie selon la cible ...

    Sur PIC, tu dis que c'est un 8b, mais sur intel, c'est un 32b ... docn il faut preferer systematiquement les type figés ( char, short et long )

    Ensuite, pour obtenir un bit, il est preferable de declarer ta variable comme union d'un champ de bit et d'un unsigned char, comme cela, tu peux utiliser ta variable comme un uchar ou comme un groupe de bits.


  9. Publicité
  10. #7
    mictour

    Re : C pour PIC : récupérer le nième bit d'un entier

    Bonjour Toufinet,
    CC5X ne suit pas la norme AINSI notamment pour les variables :

    uns8 u8; // 8 bit unsigned
    uns16 u16; // 16 bit unsigned
    uns24 u24; // 24 bit unsigned
    uns32 u32; // 32 bit unsigned
    int8 s8; // 8 bit signed
    int16 s16; // 16 bit signed
    int24 s24; // 24 bit signed
    int32 s32; // 32 bit signed

    unsigned a8; // 8 bit unsigned
    char a8; // 8 bit unsigned

    Ce petit extrait que je viens de tester dans un programme "passe"

    char i;

    …………

    void main(void)
    {
    init();
    do
    {
    PORTA.2 = n.2;
    ……..

    Bonne prog, mictour.

  11. #8
    mictour

    Re : C pour PIC : récupérer le nième bit d'un entier

    .... Re
    Une erreur d'inattention (copier coller !) il faut lire :
    char n; et non char i; .... mais je pense que tu avais rectifié.
    mictour.

  12. #9
    Toufinet

    Re : C pour PIC : récupérer le nième bit d'un entier

    Bonjour à tous,

    Merci pour vos réponses, mais une des informations de mon problème ne semble pas être passée. Je veux pouvoir accéder au i-ième bit de ma variable.

    Exemple ( non fonctionnel ) :
    unsigned int i;
    char variable;

    for (i=0; i<8; i++) {
    PORTA.0 = variable.i;
    }

    De la même manière, comment parcourir un port ( PORTA.i ) ?

    C'est vraiment casse-pied, car en assembleur, ça se fait très facilement !

  13. #10
    Jack

    Re : C pour PIC : récupérer le nième bit d'un entier

    Il te suffit d'écrire une fonction ou une macro. Il faudra utiliser les décalages et les masques à l'aide ET et de OU pour forcer un bit à 0 ou à 1.

    En fait c'est pareil qu'en assembleur.

    Exemple: tu veux mettre à 1 le bit n de data: ton masque vaut 0b00000001 au départ et tu vas le décaler n fois à gauche et faire un OU avec ta donnée.

    data |= 0x01 << n;

    A+

  14. #11
    mictour

    Re : C pour PIC : récupérer le nième bit d'un entier

    CC5X n'aime pas l'ecriture indexée : variable.i Mais ceci devrait passer (pas testé),
    lecture fixe + décalage du registre, comme Jack te l'indiques.

    for (i=0; i<8; i++)
    {
    PORTA.0 = variable.0;
    variable >>1;
    }
    mictour

  15. #12
    Toufinet

    Re : C pour PIC : récupérer le nième bit d'un entier

    Super , ça marche impec !

    Sauf que lorsque je simule, la valeur de PORTA ne change pas ... mais ça c'est un autre problème

  16. Publicité
  17. #13
    Benoit_ofr

    Re : C pour PIC : récupérer le nième bit d'un entier

    Bonjour,

    Je me permet de réouvrir la discussion car j'ai un problème similaire mais dont la solution n'est pas encore donnée ici.

    Je cherche également à accéder au nième bit d'une variable mais également de lui donner un nom pour améliorer la lisibilité du code.

    Par exemple je déclare une variable PORTBBuf :
    unsigned char PORTBBuf

    Puis je défini un nom pour le bit 0
    #define RB0Buf PORTBBuf,0

    Cette solution fonctionne si je viens lire RB0Buf dans mon programme mais j'ai une erreur de compilation lorsque je veux écrire RB0Buf.

    Quelqu'un aurait il une solution pour avoir une variable pointant sur le bit d'une autre et pouvoir utiliser cette variable en lecture et en écriture??

    Merci d'avance.
    Benoit

  18. #14
    Benoit_ofr

    Re : C pour PIC : récupérer le nième bit d'un entier

    Pour être plus précis je travaille avec HITECH compiler sur MPLAB

  19. #15
    Tix

    Re : C pour PIC : récupérer le nième bit d'un entier

    Salutation
    bitn =( octet AND 2^n )/ 2^n

    si je ne m'abuses. sinon, tu peus aussi remplacer le /2^n par des décallages à droite ">>" ou à gauche "<<"

    si tu est moins exigent et qu'un seul bit de l'octet te suffit :

    int bitn(char octet, int pos)
    {
    if(octet AND 2^pos)
    {
    return 1;
    }
    else
    {
    return 0;
    }
    }

    si je ne m'abuse, bien évidemment...
    désolé, mauvaise appréciation de la question =)

    Benoit_ofr, un define est un préprocesseur, autrement dit, toutes les entités définies sont remplacée avant compilation, ce ne sont pas des variables !
    don tu ne peu pas modifier un define, il faut trouver autre chose.

    plusplus, Tix.
    Dernière modification par Tix ; 19/01/2009 à 19h31.

  20. #16
    MiGaNuTs

    Re : C pour PIC : récupérer le nième bit d'un entier

    Bonne approche Tix, mais on peut faire encore plus bourin, pas besoin de rediviser par 2^N.
    Code:
    resultat=variable_a_tester&&(2^numero_du_bit_a_tester);
    résultat ne pourra valoir que 0 ou 1, tu peut donc le mettre dans un boolean pour économiser un peu de ram, ou dans un char pour pas te prendre la tête avec les déclarations de variables.


    J'utilise pas HITECH C, mais normalement ça marche avec tous les compilateurs, c'est du C "standard"

    tu peut même tester le 12 bit d'un int par exemple de la même façon, ça marche aussi.

  21. #17
    Jack

    Re : C pour PIC : récupérer le nième bit d'un entier

    Citation Envoyé par Benoit_ofr Voir le message
    Bonjour,

    Je me permet de réouvrir la discussion car j'ai un problème similaire mais dont la solution n'est pas encore donnée ici.

    Je cherche également à accéder au nième bit d'une variable mais également de lui donner un nom pour améliorer la lisibilité du code.

    Par exemple je déclare une variable PORTBBuf :
    unsigned char PORTBBuf

    Puis je défini un nom pour le bit 0
    #define RB0Buf PORTBBuf,0

    Cette solution fonctionne si je viens lire RB0Buf dans mon programme mais j'ai une erreur de compilation lorsque je veux écrire RB0Buf.

    Quelqu'un aurait il une solution pour avoir une variable pointant sur le bit d'une autre et pouvoir utiliser cette variable en lecture et en écriture??

    Merci d'avance.
    Benoit
    Ca a pourtant déjà été évoqué dans ce fil par thm: les bit fields
    Code:
    typedef union {
      unsigned char u8loctet;
      struct {
        byte bit0         :1;       
        byte bit1         :1;                                    
        byte bit2         :1;                                      
        byte bit3         :1;                                     
        byte bit4         :1;                               
        byte bit5         :1;                                   
        byte bit6         :1;                                 
        byte bit7         :1;                                    
      } Bits;
    } octetdecompose;
    
    ...
    
    octetdecompose toto; 
    
    toto.u8loctet = 255; // si on veut utiliser la variable complète
    toto.Bits.bit5 = 1; // si on veut utiliser un bit
    et c'est du C ANSI !!!

    A+

  22. #18
    Tix

    Re : C pour PIC : récupérer le nième bit d'un entier

    Salutations

    MiGaNuTs, oui, les méfaits de la programmation hors-sol j'espere ^^

    Jack, prendre un octet pour stoquer un bit, c'est pas un peu gros pour un PIC ?

    ++ Tix.

  23. Publicité
  24. #19
    Jack

    Re : C pour PIC : récupérer le nième bit d'un entier

    prendre un octet pour stoquer un bit, c'est pas un peu gros pour un PIC ?


    Non, un octet pour stocker 8 bits, mais adressables séparément. Les bits fields sont fait pour çà et le C n'a pas pour réputaion de consommer de la mémoire pour rien.

    A+

  25. #20
    Benoit_ofr

    Re : C pour PIC : récupérer le nième bit d'un entier

    Sachant que je souhaite utiliser l'octer ou un bit de l'octet cette solution convient. Par contre on garde une notation a.b et l'idéal pour moi serai d'avoir RB0Buf pour PORTBBuf.0 par exemple.

    Dans les librairies HI-TECH c'est fait puisqu'ils définissent par exemple à la fois RB0 et PORTB mais en reprenant les même notation dans mon .h ça ne compile pas. Je pense que ça vient du fait qu'il pointe directement sur les addresse étant donné que ces registres sont fixes. La question est donc comment fait on pour faire la même chose avec une variable??

    Merci de votre aide,
    Benoit

  26. #21
    Jack

    Re : C pour PIC : récupérer le nième bit d'un entier

    Par contre on garde une notation a.b et l'idéal pour moi serai d'avoir RB0Buf pour PORTBBuf.0 par exemple.
    Aucun problème:
    Code:
    #define RB0Buf PORTBBuf.0
    A+

  27. #22
    Tix

    Re : C pour PIC : récupérer le nième bit d'un entier

    Non, un octet pour stocker 8 bits, mais adressables séparément. Les bits fields sont fait pour çà et le C n'a pas pour réputaion de consommer de la mémoire pour rien.


    typedef union {
    unsigned char u8loctet;
    struct {
    byte bit0 :1;
    byte bit1 :1;
    byte bit2 :1;
    byte bit3 :1;
    byte bit4 :1;
    byte bit5 :1;
    byte bit6 :1;
    byte bit7 :1;
    } Bits;
    } octetdecompose;
    fichtre, un byte, n'est-ce pas là un Octet ?
    j'ai l'impression de ne pas capter exactement la maniere dont fonctionne ton code. Peus tu m'en dire plus s'il te plait ?

    plusplus Tix.

  28. #23
    Jack

    Re : C pour PIC : récupérer le nième bit d'un entier

    C'est la syntaxe de la déclaration qui veux çà. Mais le compilateur traduira le tout sur un seul octet.

    A+

  29. #24
    Tix

    Re : C pour PIC : récupérer le nième bit d'un entier

    ok,merci beaucoup pour cette précision =)

    ++

  30. Publicité
  31. #25
    diabo

    Re : C pour PIC : récupérer le nième bit d'un entier

    il faudra essayer avec PIC CCS COMPILER

Sur le même thème :

Discussions similaires

  1. Réponses: 39
    Dernier message: 14/01/2017, 15h57
  2. Compilateur CCS C - initialiser struct bit à bit ?
    Par branqueira dans le forum Électronique
    Réponses: 4
    Dernier message: 26/11/2007, 15h37
  3. TS arithmétique nombre de diviseurs positifs d'un entier
    Par raptor77 dans le forum Mathématiques du collège et du lycée
    Réponses: 14
    Dernier message: 11/11/2007, 09h56
  4. Un organisme entier né d'un fragment de vaisseau sanguin
    Par RSSBot dans le forum Commentez les actus, dossiers et définitions
    Réponses: 2
    Dernier message: 19/03/2007, 11h42
  5. Choix d'un PIC pour projet robotique
    Par Pierrick dans le forum Électronique
    Réponses: 7
    Dernier message: 22/01/2004, 22h18
Découvrez nos comparatifs produits sur l'informatique et les technologies.