[C30 Compiler] - Manipulation de données
Répondre à la discussion
Affichage des résultats 1 à 11 sur 11

[C30 Compiler] - Manipulation de données



  1. #1
    invite3c35244f

    [C30 Compiler] - Manipulation de données


    ------

    Bonjour,

    j'utilisais auparavant un librairie pour gérer un glcd avec un PIC (8bits). J'utilisais le compilateur C18 de Microchip.
    Et pour gérer les bits de données de mon afficheur avec le PIC18, j'écrivais dans mon code:
    Code:
    #define GLCD_WData LATD
    Donc lorsque je mettais 0x30 dans GLCD_WData, j'avais la même chose sur le PORT D.

    Mais maintenant, j'utilise le compilateur C30 pour les microcontroleurs 16 bits, et lorsque je souhaite gérer mon afficheur de la même manière, ça fonctionne pas!
    En effet, LATD sera donc un mot de 16 bits, mes bits de données sont cablés de RD0 à RD7, et si je fais la même chose que précédemment, mettre 0x30 dans GLCD_WData, ça me met bien LATD = 0x0030, en forçant les bits RD8 à RD15 à 0!!!! ce que je ne souhaite pas !

    Comment faire pour éviter cela, c'est à dire de mettre le contenu de GLCD_WData de RD0 à RD7 tout en gardant la valeur des bits RD8 à RD15?

    J'espère que mon explication est assez claire !!

    Merci d'avance

    -----

  2. #2
    invite3c35244f

    Re : [C30 Compiler] - Manipulation de données

    J'ai réussi a trouver une astuce, mais ça m'oblige a remplacer pas mal de chose dans la librairie...

    je remplace:

    Code:
    GLCD_WData = data;
    tout en sachant que GLCD_WData -> #define GLCD_WData LATD,
    par:

    Code:
    uint_GLCD_WData = data&0x00FF;
    LATD = PORTD&0xFF00;
    LATD = LATD|uint_GLCD_WData;
    Y aurait pas un moyen plus simple?
    merci d'avance!

  3. #3
    katmai

    Re : [C30 Compiler] - Manipulation de données

    Salut,

    Personnellement j'ai du mal à voir comment tu peux faire plus simple.

    Par contre c'est peut-être l'occasion de faire une macro C pour affecter les données que tu veux sur ton port. Ce qui rendrait les modifications futures plus simples en modifiant uniquement la macro.

    Par exemple pour le pic30 :
    #define GLCD_WData(data) { LATD = ( (PORTD & 0xFF00) | (data & 0x00FF) ); }

    et pour le pic18 :
    #define GLCD_WData(data) { LATD = data; }

    Après c'est vrai que tu ne vas pas changer d'architecture tous les 2 jours.

    A+

  4. #4
    RISC

    Re : [C30 Compiler] - Manipulation de données

    Salut,

    Je pense qu'il existe une solution plus efficace en terme de taille de code :
    Tu copies le fichier header pour ton PIC (exemple pour un dsPIC33FJ256GP710) à partir du compilateur dans ton projet.

    Tu modifies le fichier header de ton PIC pour ajouter une union qui accède à la partie haute ou basse du LATD et idem pour le PORTD :
    Code:
    extern volatile unsigned int  LATD __attribute__((__sfr__));
    typedef struct tagLATDBITS {
    union {
     struct {
      unsigned LATD0:1;
      unsigned LATD1:1;
      unsigned LATD2:1;
      unsigned LATD3:1;
      unsigned LATD4:1;
      unsigned LATD5:1;
      unsigned LATD6:1;
      unsigned LATD7:1;
      unsigned LATD8:1;
      unsigned LATD9:1;
      unsigned LATD10:1;
      unsigned LATD11:1;
      unsigned LATD12:1;
      unsigned LATD13:1;
      unsigned LATD14:1;
      unsigned LATD15:1;
      };
     struct {
      unsigned LATDL:8;
      unsigned LATDH:8;
      };
     };
    } LATDBITS;
    extern volatile LATDBITS LATDbits __attribute__((__sfr__));
    Ensuite il suffit de faire :
    LATDbits.LATDL = 0x030;

    a+
    Dernière modification par RISC ; 09/08/2012 à 07h20.

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

    Re : [C30 Compiler] - Manipulation de données

    Bonjour,

    me revoila... merci pour le conseil RISC, c'est top !!

  7. #6
    invite3c35244f

    Re : [C30 Compiler] - Manipulation de données

    Bonjour,

    je ne ré-ouvre pas de sujet, ça parle de la même chose... quasi

    J'ai une donnée de type long, exemple : 0x12345678, quelle manipulation rapide faire (si elle existe) pour pouvoir récupérer la donnée sous ce format : 0x78563412.
    On y arrive en faisant des OU, des ET et des décalages, mais y t'il une autre solution?

    Merci d'avance

  8. #7
    invite3c35244f

    Re : [C30 Compiler] - Manipulation de données

    Car pour le moment, voila ce que je comptais faire:

    Code:
    long_DataRegister = 0x12345678;
    Octet1Temp = ((long_DataRegister>>24)&0x000000FF);
    Octet2Temp = ((long_DataRegister>>8)&0x0000FF00);
    Octet3Temp = ((long_DataRegister<<8)&0x00FF0000);
    Octet4Temp = ((long_DataRegister<<24)&0xFF000000);
    long_DataRegister = Octet1Temp+Octet2Temp+Octet3Temp+Octet4Temp;
    Y a plus simpe?

  9. #8
    Seb.26

    Re : [C30 Compiler] - Manipulation de données

    Citation Envoyé par jorg1n Voir le message
    J'ai une donnée de type long, exemple : 0x12345678, quelle manipulation rapide faire (si elle existe) pour pouvoir récupérer la donnée sous ce format : 0x78563412.
    On y arrive en faisant des OU, des ET et des décalages, mais y t'il une autre solution?
    idem que pour tes 16b : tu fais un union de ton 32b sur 4*8b (B0, B1, B2 et B3 au hasard) et tu accède à chaque octet indépendamment ... ensuite tu reconstruis dans un autre union identique mais dans l'ordre que tu veux ...

    Bonus : http://www.siteduzero.com/tutoriel-3...es-unions.html

    PS: ton code ci-dessus ne marche probablement pas ;o)
    Dernière modification par Seb.26 ; 13/09/2012 à 15h07.
    << L'histoire nous apprend que l'on apprend rien de l'histoire. >>

  10. #9
    RISC

    Re : [C30 Compiler] - Manipulation de données

    Salut Jorg,

    Alors, on a des PB avec les "indiens" (endian) ;=)
    Pas de solution magique mais il faut simplement prendre en compte le fait que les 16bits sont très efficace pour les décalages (décalage de n bits en 1 cycle) et préferrer ce type d'instructions pour faire les manipulations nécessaires.
    Perso, j'essaierai plusieurs méthodes en C et je regarderai le code assembleur dans le simulateur pour voir le plus efficace

    a+

  11. #10
    invite3c35244f

    Re : [C30 Compiler] - Manipulation de données

    Bonjour à tous les 2,

    PS: ton code ci-dessus ne marche probablement pas ;o)
    ça fonctionne en simu... pourquoi ça ne marcherait pas?

    Merci d'avance

  12. #11
    Seb.26

    Re : [C30 Compiler] - Manipulation de données

    Citation Envoyé par jorg1n Voir le message
    ça fonctionne en simu... pourquoi ça ne marcherait pas ?
    car j'avais lu trop vite et en diagonale ... ... en effet, ça marche.

    NB: les masques sur les ">>24" et "<<24" ne servent à rien : le décalage a déjà fait le boulot.
    << L'histoire nous apprend que l'on apprend rien de l'histoire. >>

Discussions similaires

  1. Le rapport Campbell ; Découverte majeure ou manipulation de données scientifiques ?
    Par invite5b9698d8 dans le forum Traitement et origine du cancer
    Réponses: 122
    Dernier message: 31/07/2020, 11h16
  2. [C / Compilateur C30 Microchip] - Utilisation des données de types "unsigned long"
    Par invite3c35244f dans le forum Programmation et langages, Algorithmique
    Réponses: 2
    Dernier message: 28/11/2011, 14h18
  3. Exemples C30 + dsPIC33FJ
    Par invitecb49b6c0 dans le forum Électronique
    Réponses: 0
    Dernier message: 20/02/2010, 21h58
  4. Comment compiler une librairie sous MPLAB C30 (Microchip) pour PIC24?
    Par invitea674c8fa dans le forum Électronique
    Réponses: 4
    Dernier message: 08/10/2009, 09h30
  5. (C++ Builder) Compiler des données externes!
    Par invite4347dbc7 dans le forum Logiciel - Software - Open Source
    Réponses: 0
    Dernier message: 12/05/2008, 20h50
Dans la rubrique Tech de Futura, découvrez nos comparatifs produits sur l'informatique et les technologies : imprimantes laser couleur, casques audio, chaises gamer...