[PIC]-Aide déclaration variables
Répondre à la discussion
Affichage des résultats 1 à 18 sur 18

[PIC]-Aide déclaration variables



  1. #1
    invite3c35244f

    [PIC]-Aide déclaration variables


    ------

    Bonjour,

    je programme en C, et afin d'optimiser le "gain de place" au point de vue du programme, je souhaiterai déclarer 2 variables, "ligne" qui aura pour valeur un nombre entier de 0 à 7 et "batt" qui aura pour valeur 1,2 ou 3.
    Comment me conseillez vous de déclarer ces 2 variables?
    Merci d'avance
    Bonne journée

    -----

  2. #2
    invite2d24c6c6

    Re : [PIC]-Aide déclaration variables

    Salut,
    Le format qui prend le moins de place c'est short int (2 octets) et sa suffit largement vu les valeurs que tu va donner à tes variables

  3. #3
    invite3c35244f

    Re : [PIC]-Aide déclaration variables

    Je te remercie...

  4. #4
    Jack
    Modérateur

    Re : [PIC]-Aide déclaration variables

    Si tu veux vraiment gagner un max de place, tu peux les déclarer comme des champs de bits (bit field). Un octet devrait suffire en tout et pour tout.

    A+

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

    Re : [PIC]-Aide déclaration variables

    Merci pour le conseil jack...mais pourrais tu etre plus clair...
    un exemple par exemple...
    merci d'avance

  7. #6
    Jack
    Modérateur

    Re : [PIC]-Aide déclaration variables

    http://www.tastalian.org/scar/article-100.html

    4 bits pour mémoriser ligne et 3 bits pour mémoriser batt, ça doit tenir dans un octet tout ça !

    A+

  8. #7
    Jack
    Modérateur

    Re : [PIC]-Aide déclaration variables

    Je viens de relire en détail le lien que je viens de te donner. Il y est dit que les bitsfields sont stockés dans l'unité de stockage élémentaire, c'est à dire un int, en principe 16 bits sur un petit µContrôleur.

    Du coup, aucun intérêt finalement à utiliser les bitfields. 2 octets suffiront:

    Code:
    unsigned char ligne, batt;
    A+

  9. #8
    invite3c35244f

    Re : [PIC]-Aide déclaration variables

    Je te remercie pour ces infos.

    A bientôt.

  10. #9
    Seb.26

    Re : [PIC]-Aide déclaration variables

    Fais des MACRO SET et GET pour chacune de tes variables ... donc 1 octet pour tes 2 variables, et pas de déclaration tordue ...

    Tu gagne 1 octet de RAM, mais ton code est plus lent et plus gros ... à toi de voir si ça vaut le coup ...
    << L'histoire nous apprend que l'on apprend rien de l'histoire. >>

  11. #10
    Jack
    Modérateur

    Re : [PIC]-Aide déclaration variables

    Citation Envoyé par Seb.26 Voir le message
    Fais des MACRO SET et GET pour chacune de tes variables ... donc 1 octet pour tes 2 variables, et pas de déclaration tordue ...

    Tu gagne 1 octet de RAM, mais ton code est plus lent et plus gros ... à toi de voir si ça vaut le coup ...
    Je ne te suis pas trop. Tu peux détailler?

    A+

  12. #11
    invite6a878e16

    Re : [PIC]-Aide déclaration variables

    Salut à tous

    A mon avis les champs de bits sont codés par défaut sur 8 bits sur les pics (les articles de tastalian sont plutôt sur la programmation sur pc). Mais pour en être sûr il faut faire un sizeof( nom_champ_bit ).

    Et de toute façon je pense que le µp fait un masque à chaque fois qu'on utilise les champs de bits. Et pour ne pas s'emmêler les pinceaux, on peut effectivement faire des macros de ce genre:

    Code:
    #define SET_LIGNE(valeur) variable = variable | (valeur & 0x0F)
    #define GET_LIGNE variable & 0x0F
    (Avec variable en unsigned char regroupant [0;batt;ligne])

  13. #12
    Seb.26

    Re : [PIC]-Aide déclaration variables

    pour Agahaz

    ( Et je pense aussi que les champs de bit sur PIC sont sur 1 octet, mais pas sûr à 100% ... disons 90% AMA )

    Et de toute façon je pense que le µp fait un masque à chaque fois qu'on utilise les champs de bits.
    AMA : Sauf quand il ne manipule qu'1 bit à la fois, car là les instructions dédiés existent ...
    << L'histoire nous apprend que l'on apprend rien de l'histoire. >>

  14. #13
    Jack
    Modérateur

    Re : [PIC]-Aide déclaration variables

    Sur mon compilo, un champ de bit peut effectivement prendre un octet (on notera que le compilateur a optimisé puisque c'est lui qui a fait le calcul et pas le programme. C'est normal d'ailleurs puisque le résultat est toujours connu à la compilation avec sizeof.
    Concernant le code généré, ça marche effectivement par masque, ce qui est normal aussi.
    Ex:
    Code:
      struct {
        unsigned char ch1:4;
        unsigned char ch2:3;
      } ch_bit;
      int taille;
    .....
       taille = sizeof(ch_bit);
       ch_bit.ch1 = 5;
       ch_bit.ch2 = 2;
    les 2 dernières ligne étant traduites en asm ainsi:
    Code:
      0003 ae01     [2]             LDX   #1
      0005 8c       [1]             CLRH  
      0006 960000   [5]             STHX  taille
       18:     ch_bit.ch1 = 5;
      0009 450000   [3]             LDHX  @ch_bit
      000c f6       [3]             LDA   ,X
      000d a4f0     [2]             AND   #-16
      000f aa05     [2]             ORA   #5
      0011 f7       [2]             STA   ,X
       19:     ch_bit.ch2 = 2;
      0012 a48f     [2]             AND   #-113
      0014 aa20     [2]             ORA   #32
      0016 f7       [2]             STA   ,X
    conclusion: c'est jouable pour optimiser la mémoire. Il faut juste vérifier sue le compilo du pic

    A+
    Dernière modification par Jack ; 02/06/2008 à 18h28.

  15. #14
    invite6a878e16

    Re : [PIC]-Aide déclaration variables

    Citation Envoyé par Seb.26 Voir le message
    pour Agahaz

    ( Et je pense aussi que les champs de bit sur PIC sont sur 1 octet, mais pas sûr à 100% ... disons 90% AMA )


    AMA : Sauf quand il ne manipule qu'1 bit à la fois, car là les instructions dédiés existent ...
    Effectivement j'ai un peu trop généralisé. C'est sur que quand on a 1 ou 2 bits à modifier, c'est plus efficace. Mais pour ici des mots 4 bits, les masques sont plus intéressants...

    Eh bien surprise (en tout cas pour moi) MC18 (version avec optimisations encore activées) donne ça:
    Code:
    8:                 struct {
    9:                     unsigned char ch1:4;
    10:                    unsigned char ch2:3;
    11:                  } ch_bit;
    12:                  int taille;
    13:                
    14:                   taille = sizeof(ch_bit);
      00D6    0E01     MOVLW 0x1
      00D8    6EF3     MOVWF 0xff3, ACCESS
      00DA    CFF3     MOVFF 0xff3, 0xfdb
      00DC    FFDB     NOP
      00DE    0E02     MOVLW 0x2
      00E0    6ADB     CLRF 0xfdb, ACCESS
    15:                   ch_bit.ch1 = 5;
      00E2    80DF     BSF 0xfdf, 0, ACCESS
      00E4    92DF     BCF 0xfdf, 0x1, ACCESS
      00E6    84DF     BSF 0xfdf, 0x2, ACCESS
      00E8    96DF     BCF 0xfdf, 0x3, ACCESS
    16:                   ch_bit.ch2 = 2;
      00EA    98DF     BCF 0xfdf, 0x4, ACCESS
      00EC    8ADF     BSF 0xfdf, 0x5, ACCESS
      00EE    9CDF     BCF 0xfdf, 0x6, ACCESS
    17:                }

  16. #15
    Jack
    Modérateur

    Re : [PIC]-Aide déclaration variables

    Marrant, il fait du bit à bit.

    Je ne connais pas assez les pics pour savoir si c'est plus efficace, mais il me semble tout de même que l'utilisation d'un masque irait plus vite.

    A+

  17. #16
    Seb.26

    Re : [PIC]-Aide déclaration variables

    Citation Envoyé par Jack Voir le message
    Marrant, il fait du bit à bit.
    Je ne connais pas assez les pics pour savoir si c'est plus efficace, mais il me semble tout de même que l'utilisation d'un masque irait plus vite.
    A+
    Sur du 16F, il me semble qu'a part les sauts, toutes les instructions prennent 1 cycle ...

    Voilà ce que donne SDCC :
    Code:
     // ch_bit.ch1 = 5;
    BCF 0x3, 0x5
    MOVF 0x45, W
    ANDLW 0xf0
    IORLW 0x5
    
    // ch_bit.ch2 = 2;
    MOVWF 0x45
    ANDLW 0x8f
    IORLW 0x20
    
    MOVWF 0x45
    NB: 0x45 = adr de la variable
    << L'histoire nous apprend que l'on apprend rien de l'histoire. >>

  18. #17
    invitef86a6203

    Re : [PIC]-Aide déclaration variables

    Comme ça ;
    ça fonctionne pas ?
    Code:
    char ligne;
    char batt;
    
    ligne.0 = 1;
    ligne.7 = 1;
    PORTA = ligne;
    
    ligne.0 = 0;
    ligne.7 = 0;
    PORTA = ligne;
    
    batt.0 = 1;
    batt.0 = 0;
    PORTB = batt;

  19. #18
    Jack
    Modérateur

    Re : [PIC]-Aide déclaration variables

    ligne.0 = 1;
    Je ne vois pas comment c'est possible en C, vu qu'un identificateur ne peut commencer par un chiffre.

    De plus l'écriture qui utilise le point (ligne.0 = 1 doit à la base être déclarée comme une structure.

    A+

Discussions similaires

  1. pic 16f84a aide
    Par invitef92e4536 dans le forum Électronique
    Réponses: 8
    Dernier message: 03/02/2009, 19h24
  2. Déclaration des entrées sorties sur PIC 16fXXX
    Par invite2be78364 dans le forum Électronique
    Réponses: 4
    Dernier message: 24/05/2008, 17h36
  3. [PIC]Stockage variables dans mémoires
    Par invite3c35244f dans le forum Électronique
    Réponses: 5
    Dernier message: 25/04/2008, 19h53
  4. declaration d'un binaire sur PIC
    Par invitec35bc9ea dans le forum Électronique
    Réponses: 11
    Dernier message: 20/03/2008, 14h52
  5. Aide sur les variables d'un PIC
    Par invite83652f77 dans le forum Électronique
    Réponses: 4
    Dernier message: 12/06/2006, 19h17
Dans la rubrique Tech de Futura, découvrez nos comparatifs produits sur l'informatique et les technologies : imprimantes laser couleur, casques audio, chaises gamer...