[C] Aide concatener entiers et char dans tabl

Fermé
archim4ge - 16 mars 2009 à 19:48
mamiemando Messages postés 33387 Date d'inscription jeudi 12 mai 2005 Statut Modérateur Dernière intervention 27 novembre 2024 - 16 mars 2009 à 20:57
Bonjour,

Je suis débutant en programmation C (MPLAB, compilateur CCS) et je reste bloqué sur le problème suivant :

But : Lire les données d'un port (D0-D7) d'un micro (PIC 18F4520) et coder la valeur sur 8bits afin de le transformer en caractère et l'envoyer par RS232.

A ce jour : J'ai un tableau de test de ce genre :

unsigned char tab_test[];
tab_test[0] = 0bXXXXXXXX; ou X représente soit 0 ou 1
tab_test[1] = 0bXXXXXXXX;
etc...

Maintenant j'aimerai que les XXXXXXXX soit remplacés par la valaur de D0,D1,D2,D3,D4,D5,D6,D7 de mon port D.

Avec mon tableau de test je reçoit bien les caractères correspondant au code initial mais dés que j'effectue des tentatives de concaténation avec "sprintf" ou autre le contenu de mon tableau ce retrouve changé.

Si j'écris :

printf("0b%d%d%d%d%d%d%d%d" , d0 , d1 , d2 , d3 , d4 , d5 , d6 , d7); j'obtiens bien "0bXXXXXXXX" dans l'hyperterminal avec XXXXXXXX dépendant de d0-d7. Sachant que d0-d7 sont des int que j'ai initialisé a 0 ou 1 aléatoirement. Mais dés que je veux stocker ce 0bXXXXXXXX dans un tableau le contenu est transformé en fonction du type de tableau (enfin je crois que c'est ce qu'il se passe).

Donc si quelqu'un peut m'aider a mettre en forme mes bits D0-D7 ou me suggérer une autre méthode plus simple je lui en serais très reconnaissant :)

En tout cas merci d'avoir lu mon message et si j'ai pas été claire et compréhensible veuillez m'en excuser et je ferai de mon mieux pour répondre a vos questions.

Cordialement

Un jeune étudiant en détresse :)
A voir également:

4 réponses

mamiemando Messages postés 33387 Date d'inscription jeudi 12 mai 2005 Statut Modérateur Dernière intervention 27 novembre 2024 7 803
16 mars 2009 à 20:57
Les deux marche mais celui de wardog requiert de compiler avec <math.h> (option -lm à la compilation) et est beaucoup plus coûteux d'un point de vue calcul, mais présente l'avantage d'être plus naturelle.Si c'est juste un tout petit programme on s'en fout.

Mais si cette fonction doit être appelée souvent la méthode qui consiste à manipuler des champs de bits (sans mauvais jeu de mot) est beaucoup plus efficace.

Bonne chance
1
Wardog Messages postés 389 Date d'inscription mercredi 5 octobre 2005 Statut Membre Dernière intervention 17 octobre 2009 159
16 mars 2009 à 20:19
Bonsoir,

Bon j'ai pas tout pigé mais je vais tenter de t'aider.


En gros tu as des int de D0 à D7 à 0 ou 1.

Tu veux récupérer la valeur et la mettre dans ton tableau.
Voici un exemple avec 00101010:

#include <stdlib.h>
#include <stdio.h>
#include <math.h>

int main()
{
    unsigned char tab_test[3];
    tab_test[0] = 0;
    tab_test[1] = 0;

    //(bin)00101010 = (dec)42 dans tab_test[0]
    int d0 = 0;
    int d1 = 0;
    int d2 = 1;
    int d3 = 0;
    int d4 = 1;
    int d5 = 0;
    int d6 = 1;
    int d7 = 0;
    
    //conversion binaire à decimale
    tab_test[0] = pow(2,7) * d0 + pow(2,6) * d1 + pow(2,5) * d2 + pow(2,4) * d3 + pow(2,3) * d4 + pow(2,2) * d5 + pow(2,1) * d6 + pow(2,0) * d7;

    //on affiche
    printf("%d", tab_test[0]);
    return (0);
}


0
mamiemando Messages postés 33387 Date d'inscription jeudi 12 mai 2005 Statut Modérateur Dernière intervention 27 novembre 2024 7 803
16 mars 2009 à 20:43
Ce n'est pas du tout la bonne méthode. Supposons que d0 à d7 soit des entiers (ou des booléens) allant de 0 à 1. Ce qui nous intéresse c'est le bit de poids faible. Un entier étant codé sur 32 bits voici comment garantir qu'on a juste éventuellement le bit de poids faible à 1 tu peux éventuellement appliquer un masque & avec 1.
#include <stdio.h>

#define N 8

int main(){
    int d[N];
    unsigned i;
    int res = 0;
    d[0] = 1; // poids faible
    d[1] = 0;
    d[2] = 1;
    d[3] = 0;
    d[4] = 0;
    d[5] = 1;
    d[6] = 0;
    d[7] = 0;
    d[8] = 1; // poids fort

    // garantir que seul le but de poids faible vaut 1 = 0x0001
    // (ici c'est superflu car les d[i] valent 0 ou 1)
    for(i=0;i<N;++i) d[i] &= 1;

    // afficher d (en partant du bit de poids fort)
    for(i=0;i<N;++i) printf("%d",d[N-i-1]);
    printf("\n");

    // construire le résultat (c'est le passage qui t'intéresse)
    for(i=0;i<N;++i) res |= d[i] << i;
    printf("res = %x\n",res);
    return 0;
}

Ici le morceau de code qui t'intéresse c'est d[i] << i qui consiste à décaler la valeur de d[i] de i bits vers la gauche (en particulier le bit de poids faible, qui est de toute façon le seul qui nous intéresse). On fait le ou logique (opérateur |) de tous ces bits pour reconstituer res. Je ne sais pas si tu es familier des masques mais "x |= y" signifie "x = x | y" et "x &= y" signifie "x = x & y".

Bonne chance
0
Ouiiiiii !!! J'ai essaié la methode de wardog et ca marche et la je viens de voir ton message mamiemando donc je vais étudier les deux et voir ce qui me va le mieux!!!

En tout cas merci infiniment, je vais pouvoir avancer cette nuit :)
0