IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

 C Discussion :

interprétation de macro


Sujet :

C

  1. #1
    Futur Membre du Club
    Inscrit en
    Août 2008
    Messages
    56
    Détails du profil
    Informations forums :
    Inscription : Août 2008
    Messages : 56
    Points : 8
    Points
    8
    Par défaut interprétation de macro
    Bonjour,

    je travaille sur le PIC24FJ128GA010, avec un afficheur LCD 4*20, il ya déjà du code concernant les configurations basiques des principales fonctionnalités de la carte, dont celle du LCD. je dois programmer toutes les autres fonctions, en utilisant les config déjà fournies qui pourront m'être utiles..

    Seulement il y a certaines macros que je n'arrive pas à interprêter et donc à utiliser. Est-ce que qlq 1 pourrait me dire ce qu'il comprend par ce code:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    #define mLCDCtl(__lcd_cmd)	       _uLCDchar = __lcd_cmd | 0x08; _uLCDstate = 6;
    (Overview: Set the display control, on/off, cursor.)

    Je comprends plus ou moins le rôle de cette macro selon la phrase ci-dessus, mais à aucun moment elle n'a été utilisée dans leur programme, sachant que j'ai bien vérifié pendant l'exécution sur la cible réelle que l'écran affiche bien des choses, donc normalement cette macro est censée être utilisée qlq part!

    Merci pour vos réponses et j'espère que j'ai été claire

  2. #2
    Modérateur
    Avatar de Obsidian
    Homme Profil pro
    Développeur en systèmes embarqués
    Inscrit en
    Septembre 2007
    Messages
    7 374
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Développeur en systèmes embarqués
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2007
    Messages : 7 374
    Points : 23 631
    Points
    23 631
    Par défaut
    Citation Envoyé par nikita_sophie Voir le message
    #define mLCDCtl(__lcd_cmd) _uLCDchar = __lcd_cmd | 0x08; _uLCDstate = 6;


    Je comprends plus ou moins le rôle de cette macro selon la phrase ci-dessus, mais à aucun moment elle n'a été utilisée dans leur programme, sachant que j'ai bien vérifié pendant l'exécution sur la cible réelle que l'écran affiche bien des choses, donc normalement cette macro est censée être utilisée qlq part!
    Un indice serait le nombre de variable du style « _uLCDxxxxxx » différentes que l'on trouve dans leur API.

    Pour le reste, tu dois principalement communiquer avec ton LCD comme si c'était un terminal, en balançant des caractères de contrôles, avec éventuellement une ou deux lignes à côté pour changer de mode. Sans les spécifications de ton afficheur, on ne peut pas t'en dire plus.

    À en voir le nom de la macro, elle sert à envoyer facilement un code de contrôle à ton LCD et au vu de son contenu, elle définit un caractère à balancer en prenant ton numéro de code et en forçant le bit 3 à un.

    Il y a donc de fortes chances pour que les caractères 16 à 31 (pas au dessus, à mon avis) servent à mettre l'afficheur dans un état particulier. Et les programmeurs qui ont codé le reste des sources doivent sans doute balancer directement ces caractères plutôt que d'utiliser une macro pour les générer.

  3. #3
    Futur Membre du Club
    Inscrit en
    Août 2008
    Messages
    56
    Détails du profil
    Informations forums :
    Inscription : Août 2008
    Messages : 56
    Points : 8
    Points
    8
    Par défaut
    Citation Envoyé par Obsidian Voir le message
    Pour le reste, tu dois principalement communiquer avec ton LCD comme si c'était un terminal, en balançant des caractères de contrôles, avec éventuellement une ou deux lignes à côté pour changer de MODE. Sans les spécifications de ton afficheur, on ne peut pas t'en dire plus.
    Peux-tu m'en dire un peu plus sur le changement de mode?
    Mon afficheur est de type EW20400YLY, mais sur sa doc il n'y a pas plus de détails à ce niveau.

    Citation Envoyé par Obsidian Voir le message
    À en voir le nom de la macro, elle sert à envoyer facilement un code de contrôle à ton LCD et au vu de son contenu, elle définit un caractère à balancer en prenant ton numéro de code et en forçant le bit 3 à un.
    A quoi tu vois qu'on force le bit 3 à un?


    Il y a encore autre chose que je ne comprends pas, le paramètre "__lcd_cmd" est de quel type?

    Merci encore

  4. #4
    Membre confirmé Avatar de KindPlayer
    Profil pro
    Inscrit en
    Février 2007
    Messages
    471
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2007
    Messages : 471
    Points : 477
    Points
    477
    Par défaut
    le "| 0x08" force le bit 3 à 1
    La science est ce que nous comprenons suffisamment bien pour l'expliquer à un ordinateur. L'art, c'est tout ce que nous faisons d'autre.
    Donald E. Knuth

  5. #5
    Expert éminent sénior
    Avatar de Emmanuel Delahaye
    Profil pro
    Retraité
    Inscrit en
    Décembre 2003
    Messages
    14 512
    Détails du profil
    Informations personnelles :
    Âge : 67
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Points : 20 985
    Points
    20 985
    Par défaut
    Citation Envoyé par nikita_sophie Voir le message
    Il y a encore autre chose que je ne comprends pas, le paramètre "__lcd_cmd" est de quel type?
    Le type de la variable passée en paramètre. Je rappelle qu'une macro ne fait que remplacer un texte par un autre. (le préprocesseur agit avant la compilation, comme une sorte de générateur de code C). Les paramètres ne sont donc pas typés.
    Pas de Wi-Fi à la maison : CPL

  6. #6
    Modérateur
    Avatar de Obsidian
    Homme Profil pro
    Développeur en systèmes embarqués
    Inscrit en
    Septembre 2007
    Messages
    7 374
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Développeur en systèmes embarqués
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2007
    Messages : 7 374
    Points : 23 631
    Points
    23 631
    Par défaut
    Citation Envoyé par nikita_sophie Voir le message
    Peux-tu m'en dire un peu plus sur le changement de mode? Mon afficheur est de type EW20400YLY, mais sur sa doc il n'y a pas plus de détails à ce niveau.
    Il nous faut les spécifications. Il nous faut aussi la manière dont ton PIC est relié à ton afficheur, et ensuite voir la liste de ce qu'ils envoient et comment. Autrement dit, du reverse engineering.

    Pas forcément très long dans ce contexte, mais sans le code, je ne peux rien dire, évidemment.

    A quoi tu vois qu'on force le bit 3 à un?
    À l'opération « OU » bit-à-bit et son opérande 8, soit 1000 en binaire.
    Il y a encore autre chose que je ne comprends pas, le paramètre "__lcd_cmd" est de quel type?

    Merci encore
    Il n'y en a pas au niveau de la macro, qui ne se contente que de faire de la substitution lexicale. Tu pourrais taper n'importe quoi, ce serait restitué de la même façon. C'est à la compilation (l'étape suivante) que l'interprétation de l'expression qui en résulte sera menée.

    Dans ton cas précis, toutefois, il y a des chances que la macro attende un char ou unsigned char, sur huit bits.

    Et de rien ! :-)

  7. #7
    Futur Membre du Club
    Inscrit en
    Août 2008
    Messages
    56
    Détails du profil
    Informations forums :
    Inscription : Août 2008
    Messages : 56
    Points : 8
    Points
    8
    Par défaut
    ah mais oui c'est un masque pour forcer le bit 3 à 1 !

    Pour les macros, c'est en fait la première fois que je les rencontre et c'est pourquoi je ne savais pas comment ça fonctionnait (le typage..). Est-ce qu'il y aurait des tutoriels à ce sujet?

  8. #8
    Expert éminent sénior
    Avatar de Emmanuel Delahaye
    Profil pro
    Retraité
    Inscrit en
    Décembre 2003
    Messages
    14 512
    Détails du profil
    Informations personnelles :
    Âge : 67
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Points : 20 985
    Points
    20 985
    Par défaut
    Citation Envoyé par nikita_sophie Voir le message
    ah mais oui c'est un masque pour forcer le bit 3 à 1 !

    Pour les macros, c'est en fait la première fois que je les rencontre et c'est pourquoi je ne savais pas comment ça fonctionnait (le typage..). Est-ce qu'il y aurait des tutoriels à ce sujet?
    Concernant la manipulation des bits, ceci peut aider :

    http://emmanuel-delahaye.developpez.com/bits.htm
    http://emmanuel-delahaye.developpez..../ed/inc/bits.h
    Pas de Wi-Fi à la maison : CPL

  9. #9
    Futur Membre du Club
    Inscrit en
    Août 2008
    Messages
    56
    Détails du profil
    Informations forums :
    Inscription : Août 2008
    Messages : 56
    Points : 8
    Points
    8
    Par défaut
    merci !

  10. #10
    Modérateur
    Avatar de Obsidian
    Homme Profil pro
    Développeur en systèmes embarqués
    Inscrit en
    Septembre 2007
    Messages
    7 374
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Développeur en systèmes embarqués
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2007
    Messages : 7 374
    Points : 23 631
    Points
    23 631
    Par défaut
    Citation Envoyé par nikita_sophie Voir le message
    Pour les macros, c'est en fait la première fois que je les rencontre et c'est pourquoi je ne savais pas comment ça fonctionnait (le typage..). Est-ce qu'il y aurait des tutoriels à ce sujet?
    Le chapitre du cours de casteyde christian concernant le préprocesseur dans les cours et tutoriels pour apprendre la langage C : http://c.developpez.com/cours/

    Mais le cours entier est une pépite !

  11. #11
    Futur Membre du Club
    Inscrit en
    Août 2008
    Messages
    56
    Détails du profil
    Informations forums :
    Inscription : Août 2008
    Messages : 56
    Points : 8
    Points
    8
    Par défaut
    bonjour!
    merci pour le lien, je vais le lire et je vous ferai part de mon retour

  12. #12
    Nouveau Candidat au Club
    Homme Profil pro
    Développeur en systèmes embarqués
    Inscrit en
    Mai 2013
    Messages
    1
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Charente Maritime (Poitou Charente)

    Informations professionnelles :
    Activité : Développeur en systèmes embarqués
    Secteur : Industrie

    Informations forums :
    Inscription : Mai 2013
    Messages : 1
    Points : 1
    Points
    1
    Par défaut Précisions sur le fonctionnement de la "macro"
    Bonjour à tous.
    Le principe du #define est le suivant:

    #define bloc1 bloc2

    Lorsque le compilateur fait un premier passage dit de "pre-process" il remplace le bloc1 par le bloc2.

    Très couramment, bloc1 et bloc2 sont des constantes. Si cette constante est utilisée de nombreuses fois dans le programme, alors le mécanisme de #define permet de ne changer la valeur qu'une seule fois lors d'une évolution et d'être certain que le compilateur va substituer autant de fois que d'apparitions dans le code source: pas de risque d'oubli.

    Si le bloc1 de la macro comprend des parenthèses, il y a aussi un argument entre ces parenthèses lors de l'invocation de la macro dans le source. Lorsque le compilateur substitue le bloc1 par le bloc2 dans le source il place dans le bloc2 l'argument qu'il a trouvé dans la ligne de code à la place de l'argument générique de la déclaration de la macro.
    En plus le bloc peut contenir une expression autorisée en langage C, comme le forçage d'un bit par un OU logique.
    Merci à tous de votre aide, je me suis permis de clarifier plus explicitement le fonctionnement de ces macros parce que j'avais un peu de mal et cette discussion était utile.
    Une question reste: l'avantage d'une macro par rapport à une fonction C ?
    Probablement la clarté du source ? (pour celui qui l'écrit!). parce qu'il y a une limite: chaque appel de macro ré-écrit le code source de la macro; c'est donc favorable pour des blocs courts (comme dans l'exemple).
    A+.

Discussions similaires

  1. Macro Calmar, redressement+interprétation
    Par kiwi3113 dans le forum SAS STAT
    Réponses: 5
    Dernier message: 27/07/2015, 14h49
  2. Réponses: 4
    Dernier message: 03/05/2010, 14h11
  3. Interprétation de macro-variable
    Par ash_rmy dans le forum Macro
    Réponses: 4
    Dernier message: 14/06/2008, 14h42
  4. interprêtation de la macro tirage avec remise
    Par nostress dans le forum Macro
    Réponses: 6
    Dernier message: 09/06/2008, 15h58
  5. Interprétation macro variable date
    Par ash_rmy dans le forum Macro
    Réponses: 7
    Dernier message: 05/05/2008, 13h37

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo