[Programmation] Question de syntaxe : modification de certaines valeurs d'un port en C.
Répondre à la discussion
Affichage des résultats 1 à 7 sur 7

Question de syntaxe : modification de certaines valeurs d'un port en C.



  1. #1
    CeylordZ

    Question de syntaxe : modification de certaines valeurs d'un port en C.


    ------

    Bonjour,

    je viens à vous car j'ai une question concernant la programmation des pics en C.

    Pour modifier les valeurs bits du PORTA sur un pic de manière générale (ex :18f26k80) on peut faire par exemple :

    PORTA = 0b11110000;
    ou encore PORTA = 0xF0;

    Mais est ce qu'il existe une syntaxe permettant de modifier plusieurs bits à la fois sans modifier le port en entier?
    Sans forcément modifier individuellement (PORTA.A7 =1, PORTA.A6=1,...,PORTA.A0=0).
    Je chercher une manière de modifier par exemple les 4 bits de poids fort en une seule ligne sans toucher aux 4 bits de poids faible.
    Quelque chose du genre : PORTA.(A7-A4) = 1111; ?

    Est ce qu'une telle syntaxe existe en C ?

    Merci d'avance !

    -----

  2. #2
    PA5CAL

    Re : Question de syntaxe : modification de certaines valeurs d'un port en C.

    Bonjour

    Concernant spécifiquement la syntaxe du langage C, il n'existe pas à proprement parler d'opération pour manipuler autre chose que des valeurs entières ou à virgule flottante.

    Le langage permet toutefois de déclarer des champs de bits (bit fields) dans les structures (struct). Mais la norme ne garantit nullement la position des bits dans les champs entiers qui les contiennent. Si l'on ne se réfère pas expressément à un compilateur et à des options de compilation spécifiques, on ne peut prédire si les bits seront cadrés à droite ou à gauche, classés par poids croissants ou décroissants, ni même s'ils seront stockés dans le même entier.


    Si l'on veut mettre à 1 les 4 bits de poids fort du PORTA, on écrit généralement :

    Code:
    PORTA |= 0xF0;
    que le compilateur traduira :
    - au mieux, exclusivement par la mise à 1 des 4 bits de poids fort (ce qu'on espère),
    - au pire, par la lecture du PORTA dans un registre, par la mise à 1 des 4 bits de poids fort de ce registre, puis par l'écriture du registre dans le PORTA ; cette façon de procéder peut être problématique si l'un des 4 bits de poids faible du port est susceptible de changer dans l'intervalle.

    Sur de nombreux micro-contrôleurs, il n'est possible de manipuler qu'un seul bit à la fois (ou un octet entier, mais pas 4 bits à la fois), et l'opération doit forcément être réalisée comme indiqué dans ce dernier point.


    En résumer, il faut :
    - soit écrire des programmes exclusivement en C mais s'en remettre au comportement d'un compilateur particulier, ce qui aboutit à écrire des programmes non portables (c'est ce qu'on fait généralement avec les micro-contrôleurs PIC)
    - soit appeler depuis le code en C des fonctions écrites en langage assembleur, lesquelles peuvent être adaptées en fonction de la cible.

  3. #3
    jiherve

    Re : Question de syntaxe : modification de certaines valeurs d'un port en C.

    bonjour,
    en déclarant une structure on peut le faire mais au final cela reviendra à faire une lecture, un masquage (un "et"), suivi d'un "ou" pour les bits choisis.
    JR
    l'électronique c'est pas du vaudou!

  4. #4
    CeylordZ

    Re : Question de syntaxe : modification de certaines valeurs d'un port en C.

    Merci beaucoup Jiherve et PA5CAL !!
    Je n'avais pas pensé au "masquage" et c'est exactement ce qu'il me fallait !

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

    Re : Question de syntaxe : modification de certaines valeurs d'un port en C.

    Code:
    PORTA |= 0xF0;
    n'est valable que si la lecture du port reflète l'état d'écriture de celui-ci.

    on peut avoir un port en open-drain qui a donc un état en lecture différent de ce qu'on y a écrit.
    dans ce cas, il faudrait avoir une variable interne mémorisant la valeur écrite pour faire le OU dessus puis la copier sur le port.
    Jusqu'ici tout va bien...

  7. #6
    PA5CAL

    Re : Question de syntaxe : modification de certaines valeurs d'un port en C.

    Citation Envoyé par polo974 Voir le message
    Code:
    PORTA |= 0xF0;
    n'est valable que si la lecture du port reflète l'état d'écriture de celui-ci.
    En effet, c'est un point important à prendre en compte.

    D'une manière générale, la manipulation des ports fait apparaître des situations problématiques qui trouvent leur solution, non pas dans des éléments de syntaxe du langage, mais dans l'exécution de séquences d'opérations appropriées.

    Le langage C ayant à la base été conçu pour un modèle d'environnement très différent de celui des micro-contrôleurs, les instructions ne doivent pas être seulement choisies en fonction des effets théoriquement escomptés, mais également en fonction du fonctionnement effectif du matériel. Contrairement à l'informatique classique où des instructions est choisies pour atteindre un objectif purement logiciel, en informatique industrielle ce choix consiste avant tout à contrôler les moyens matériels permettant d'atteindre un comportement souhaité.

  8. #7
    CeylordZ

    Re : Question de syntaxe : modification de certaines valeurs d'un port en C.

    D'accord, merci beaucoup pour vos réponses !

Discussions similaires

  1. Réponses: 22
    Dernier message: 02/02/2014, 19h34
  2. Question sur la décomposition en valeurs singulières
    Par invite7545be06 dans le forum Mathématiques du supérieur
    Réponses: 1
    Dernier message: 09/01/2010, 21h39
  3. question de syntaxe matlab: ode45
    Par Bartolomeo dans le forum Mathématiques du supérieur
    Réponses: 0
    Dernier message: 02/06/2009, 18h28
  4. Question de syntaxe
    Par invitefa769f9f dans le forum Mathématiques du supérieur
    Réponses: 2
    Dernier message: 25/10/2007, 11h30
Dans la rubrique Tech de Futura, découvrez nos comparatifs produits sur l'informatique et les technologies : imprimantes laser couleur, casques audio, chaises gamer...