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

[C30 Compiler] - Manipulation de données



  1. #1
    jorg1n

    [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

    -----

    Dernière modification par jorg1n ; 08/08/2012 à 15h30.

  2. Publicité
  3. #2
    jorg1n

    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!

  4. #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+

  5. #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.
    Ma marotte ? les microcontrôleurs ;=)

  6. #5
    jorg1n

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

    Bonjour,

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

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

    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

  9. Publicité
  10. #7
    jorg1n

    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?

  11. #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. >>

  12. #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+
    Ma marotte ? les microcontrôleurs ;=)

  13. #10
    jorg1n

    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

  14. #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. >>

Sur le même thème :

Discussions similaires

  1. Le rapport Campbell ; Découverte majeure ou manipulation de données scientifiques ?
    Par javahl dans le forum Traitement et origine du cancer
    Réponses: 120
    Dernier message: 18/06/2016, 10h55
  2. [C / Compilateur C30 Microchip] - Utilisation des données de types "unsigned long"
    Par jorg1n dans le forum Programmation et langages, Algorithmique
    Réponses: 2
    Dernier message: 28/11/2011, 14h18
  3. Exemples C30 + dsPIC33FJ
    Par laurentdu38 dans le forum Électronique
    Réponses: 0
    Dernier message: 20/02/2010, 21h58
  4. Réponses: 4
    Dernier message: 08/10/2009, 09h30
  5. (C++ Builder) Compiler des données externes!
    Par Outti dans le forum Logiciel - Software - Open Source
    Réponses: 0
    Dernier message: 12/05/2008, 20h50