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 :

Convertir un UNSIGNED INT en deux UNSIGNED CHAR


Sujet :

C

  1. #1
    Nouveau membre du Club
    Homme Profil pro
    Ingénieur développement matériel électronique
    Inscrit en
    Janvier 2012
    Messages
    68
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 33
    Localisation : France, Haut Rhin (Alsace)

    Informations professionnelles :
    Activité : Ingénieur développement matériel électronique
    Secteur : Industrie

    Informations forums :
    Inscription : Janvier 2012
    Messages : 68
    Points : 27
    Points
    27
    Par défaut Convertir un UNSIGNED INT en deux UNSIGNED CHAR
    Bonsoir,

    Voila, je programme des µC PIC et pour paramétrer des registres j'ai l'habitude de les écrire sous cette forme:

    TMR1H = 0xD8;
    TMR1L = 0xF0;

    Mais je souhaite créer une fonction pour paramétrer ces registres automatiquement, seulement je calcule la valeur de TMR1 en manipulant un UNSIGNED INT, et je ne voit pas trop comment découper ce nombre en deux pour le placer dans les deux registres H et L...

    Vous avez des pistes ?

  2. #2
    Membre expert
    Avatar de Metalman
    Homme Profil pro
    Enseignant-Chercheur
    Inscrit en
    Juin 2005
    Messages
    1 049
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Enseignant-Chercheur
    Secteur : Enseignement

    Informations forums :
    Inscription : Juin 2005
    Messages : 1 049
    Points : 3 532
    Points
    3 532
    Par défaut
    Le unsigned char récupère le unsigned int, puis tu fais un >> ou << de 1 (si PIC en 16 bits) et le 2e unsigned char récupère la valeur...
    Je n'ai pas fait des masses de décalages de bits, mais ce sont ces 2 opérateurs qu'il te faut !

    Ou tu magouilles une structure composée de 2 char avec les champs de bit, et tu cast ton unsigned int en cette structure pour accéder à chaque partie

    La 2e méthode est plus "crade"... mais dans tous les cas : attention à l'endianness (big/little endian)
    --
    Metalman !

    Attendez 5 mins après mes posts... les EDIT vont vite avec moi...
    Les flags de la vie : gcc -W -Wall -Werror -ansi -pedantic mes_sources.c
    gcc -Wall -Wextra -Werror -std=c99 -pedantic mes_sources.c
    (ANSI retire quelques fonctions comme strdup...)
    L'outil de la vie : valgrind --show-reachable=yes --leak-check=full ./mon_programme
    Et s'assurer que la logique est bonne "aussi" !

    Ma page Developpez.net

  3. #3
    Nouveau membre du Club
    Homme Profil pro
    Ingénieur développement matériel électronique
    Inscrit en
    Janvier 2012
    Messages
    68
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 33
    Localisation : France, Haut Rhin (Alsace)

    Informations professionnelles :
    Activité : Ingénieur développement matériel électronique
    Secteur : Industrie

    Informations forums :
    Inscription : Janvier 2012
    Messages : 68
    Points : 27
    Points
    27
    Par défaut
    Je vais essayer de voir avec ces bestioles la, c'est un PIC 8 bits, mais je vais voir à ça ^^

    Thank's !

  4. #4
    Nouveau membre du Club
    Homme Profil pro
    Ingénieur développement matériel électronique
    Inscrit en
    Janvier 2012
    Messages
    68
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 33
    Localisation : France, Haut Rhin (Alsace)

    Informations professionnelles :
    Activité : Ingénieur développement matériel électronique
    Secteur : Industrie

    Informations forums :
    Inscription : Janvier 2012
    Messages : 68
    Points : 27
    Points
    27
    Par défaut
    En fait le UNSIGNED CHAR récupère les 8 bits les plus bas de l'INT ?

  5. #5
    Membre expert
    Avatar de Metalman
    Homme Profil pro
    Enseignant-Chercheur
    Inscrit en
    Juin 2005
    Messages
    1 049
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Enseignant-Chercheur
    Secteur : Enseignement

    Informations forums :
    Inscription : Juin 2005
    Messages : 1 049
    Points : 3 532
    Points
    3 532
    Par défaut
    Un char = 8 bits/1 octet... et "normalement" il récupère la valeur la plus basse oui...

    Je ne sais pas si un unsigned char est nécessaire... le dernier bit est inutilisé "normalement"... ou il y une histoire de bit de contrôle dessus...
    Bon... garde-le unsigned ok

    EDIT : à tout hasard, es-tu sûr qu'un int est sur 16 bits sur ce PIC ?
    --
    Metalman !

    Attendez 5 mins après mes posts... les EDIT vont vite avec moi...
    Les flags de la vie : gcc -W -Wall -Werror -ansi -pedantic mes_sources.c
    gcc -Wall -Wextra -Werror -std=c99 -pedantic mes_sources.c
    (ANSI retire quelques fonctions comme strdup...)
    L'outil de la vie : valgrind --show-reachable=yes --leak-check=full ./mon_programme
    Et s'assurer que la logique est bonne "aussi" !

    Ma page Developpez.net

  6. #6
    Inactif  


    Homme Profil pro
    Doctorant sécurité informatique — Diplômé master Droit/Économie/Gestion
    Inscrit en
    Décembre 2011
    Messages
    9 012
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 31
    Localisation : France, Loire (Rhône Alpes)

    Informations professionnelles :
    Activité : Doctorant sécurité informatique — Diplômé master Droit/Économie/Gestion
    Secteur : Enseignement

    Informations forums :
    Inscription : Décembre 2011
    Messages : 9 012
    Points : 23 145
    Points
    23 145
    Par défaut
    Bonjour,

    Citation Envoyé par Metalman Voir le message
    Je ne sais pas si un unsigned char est nécessaire... le dernier bit est inutilisé "normalement"... ou il y une histoire de bit de contrôle dessus...
    Dans un unsigned, il n'y a ni bit de contrôle, ni de bit inutilisés, tous les bits sont utilisés pour coder le nombre, un unsigned char peut donc contenir des valeurs entre 0 et 2^8 - 1 = 255.

    cf FAQ.

  7. #7
    Nouveau membre du Club
    Homme Profil pro
    Ingénieur développement matériel électronique
    Inscrit en
    Janvier 2012
    Messages
    68
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 33
    Localisation : France, Haut Rhin (Alsace)

    Informations professionnelles :
    Activité : Ingénieur développement matériel électronique
    Secteur : Industrie

    Informations forums :
    Inscription : Janvier 2012
    Messages : 68
    Points : 27
    Points
    27
    Par défaut
    J'avoue que la taille de l'entier je ne me suis pas demandé... Je vais voir à ca ^^

  8. #8
    Membre expert
    Avatar de Metalman
    Homme Profil pro
    Enseignant-Chercheur
    Inscrit en
    Juin 2005
    Messages
    1 049
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Enseignant-Chercheur
    Secteur : Enseignement

    Informations forums :
    Inscription : Juin 2005
    Messages : 1 049
    Points : 3 532
    Points
    3 532
    Par défaut
    Citation Envoyé par Neckara Voir le message
    Bonjour,

    Dans un unsigned, il n'y a ni bit de contrôle, ni de bit inutilisés, tous les bits sont utilisés pour coder le nombre, un unsigned char peut donc contenir des valeurs entre 0 et 2^8 - 1 = 255.

    cf FAQ.
    Pour la signification du "unsigned" oui évidemment....

    Mais pour le fait que cela soit un "char", je ne sais pas exactement comment cela se passe...
    J'ai un souvenir que l'ASCII contient 127 caractères, et le dernier bit "servirait" à faire du contrôle... est-ce que les compilos/systèmes font cette distinction char <=> ASCII et modifient le dernier bit en fonction du caractère contenu ?... ou ignorent-ils la signification du caractère et laissent la valeur telle quelle ?
    Je ne sais pas...
    --
    Metalman !

    Attendez 5 mins après mes posts... les EDIT vont vite avec moi...
    Les flags de la vie : gcc -W -Wall -Werror -ansi -pedantic mes_sources.c
    gcc -Wall -Wextra -Werror -std=c99 -pedantic mes_sources.c
    (ANSI retire quelques fonctions comme strdup...)
    L'outil de la vie : valgrind --show-reachable=yes --leak-check=full ./mon_programme
    Et s'assurer que la logique est bonne "aussi" !

    Ma page Developpez.net

  9. #9
    Nouveau membre du Club
    Homme Profil pro
    Ingénieur développement matériel électronique
    Inscrit en
    Janvier 2012
    Messages
    68
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 33
    Localisation : France, Haut Rhin (Alsace)

    Informations professionnelles :
    Activité : Ingénieur développement matériel électronique
    Secteur : Industrie

    Informations forums :
    Inscription : Janvier 2012
    Messages : 68
    Points : 27
    Points
    27
    Par défaut
    TMR1L = (unsigned char)(o->period);
    TMR1H = ((unsigned char)(o->period))>>8;

    J'ai tenter de faire ça, le TMR1L fonctionne bien (j'ai tester en forçant TMR1H), mais le TMR1H ne fonctionne pas, il ne veut pas prendre la bonne valeur.

    Je vous tient au jus !

  10. #10
    Inactif  


    Homme Profil pro
    Doctorant sécurité informatique — Diplômé master Droit/Économie/Gestion
    Inscrit en
    Décembre 2011
    Messages
    9 012
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 31
    Localisation : France, Loire (Rhône Alpes)

    Informations professionnelles :
    Activité : Doctorant sécurité informatique — Diplômé master Droit/Économie/Gestion
    Secteur : Enseignement

    Informations forums :
    Inscription : Décembre 2011
    Messages : 9 012
    Points : 23 145
    Points
    23 145
    Par défaut
    Citation Envoyé par Metalman Voir le message
    Pour la signification du "unsigned" oui évidemment....

    Mais pour le fait que cela soit un "char", je ne sais pas exactement comment cela se passe...
    J'ai un souvenir que l'ASCII contient 127 caractères, et le dernier bit "servirait" à faire du contrôle... est-ce que les compilos/systèmes font cette distinction char <=> ASCII et modifient le dernier bit en fonction du caractère contenu ?... ou ignorent-ils la signification du caractère et laissent la valeur telle quelle ?
    Je ne sais pas...
    Il me semble qu'ils utilisent l'ASCII étendu.

    Si on utilise que de l'ASCII, ils laissent le bit inutilisé ( pour permettre les comparaisons de caractères). Après, si on fait des échanges là on peut utiliser le 8ème bit comme bit de contrôle (mais ne pas oublier de remettre le 8ème bit à 0 une fois la vérification faite).

  11. #11
    Expert éminent sénior
    Avatar de diogene
    Homme Profil pro
    Enseignant Chercheur
    Inscrit en
    Juin 2005
    Messages
    5 761
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Enseignant Chercheur
    Secteur : Enseignement

    Informations forums :
    Inscription : Juin 2005
    Messages : 5 761
    Points : 13 926
    Points
    13 926
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    TMR1H = ((unsigned char)(o->period))>>8;
    ça doit faire 0.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    TMR1H = (unsigned char)(o->period>>8);
    Publication : Concepts en C

    Mon avatar : Glenn Gould

    --------------------------------------------------------------------------
    Une réponse vous a été utile ? Remerciez son auteur en cliquant le pouce vert !

  12. #12
    Nouveau membre du Club
    Homme Profil pro
    Ingénieur développement matériel électronique
    Inscrit en
    Janvier 2012
    Messages
    68
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 33
    Localisation : France, Haut Rhin (Alsace)

    Informations professionnelles :
    Activité : Ingénieur développement matériel électronique
    Secteur : Industrie

    Informations forums :
    Inscription : Janvier 2012
    Messages : 68
    Points : 27
    Points
    27
    Par défaut
    Hummm cela ne fonctionne tjs pas, mais je ne saisis pas ou...
    Voici le code complet:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    void o_clock_init(struct o_clock *o, unsigned int _freq, unsigned int _period)
    {
        unsigned int reg;
     
        IPEN = 0;
        GIE = 1;
        PEIE = 1;
        TMR1IE = 1;
        TMR1IP = 0;
        T1CON = 0x01;
     
        reg = _period*_freq/1000000;
        o->period = 65536 - reg;
     
        TMR1L = (unsigned char)(o->period);
        TMR1H = (unsigned char)(o->period>>8);
        TMR1IF = 0;
    }
    TMR1L et TMR1H sont des registres de 8 bits.

  13. #13
    Membre actif Avatar de moins1
    Homme Profil pro
    Autre
    Inscrit en
    Février 2013
    Messages
    85
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Autre
    Secteur : High Tech - Matériel informatique

    Informations forums :
    Inscription : Février 2013
    Messages : 85
    Points : 222
    Points
    222
    Par défaut
    Et que vaut reg qui sert à définir o->period?

    Parce que ça fonctionne ce bout de code
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    TMR1L = (unsigned char)(o->period);
    TMR1H = (unsigned char)(o->period>>8);
    Si j'ai par exemple 0xDEF3 dans o->period, j'obtiens 0xF3 dans TMR1L et 0xDE dans TMR1H.


  14. #14
    Modérateur

    Avatar de Bktero
    Homme Profil pro
    Développeur en systèmes embarqués
    Inscrit en
    Juin 2009
    Messages
    4 481
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Loire Atlantique (Pays de la Loire)

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

    Informations forums :
    Inscription : Juin 2009
    Messages : 4 481
    Points : 13 679
    Points
    13 679
    Billets dans le blog
    1
    Par défaut
    Sur quelle famille de PIC développes-tu et avec quel compilateur ?

  15. #15
    Nouveau membre du Club
    Homme Profil pro
    Ingénieur développement matériel électronique
    Inscrit en
    Janvier 2012
    Messages
    68
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 33
    Localisation : France, Haut Rhin (Alsace)

    Informations professionnelles :
    Activité : Ingénieur développement matériel électronique
    Secteur : Industrie

    Informations forums :
    Inscription : Janvier 2012
    Messages : 68
    Points : 27
    Points
    27
    Par défaut
    Je suis sur un PIC18F458 (8 bits) et compilateur XC8 Lite.

    Dans l'exemple de mon main, reg vaut 10000, ce qui fait un TMR1 à 0xD8F0

    J'ai essayer en initialisant reg à 0; mais c'est tjs le même résultat. Je ne voit vraiment pas ou il bloque =(

  16. #16
    Modérateur

    Avatar de Bktero
    Homme Profil pro
    Développeur en systèmes embarqués
    Inscrit en
    Juin 2009
    Messages
    4 481
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Loire Atlantique (Pays de la Loire)

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

    Informations forums :
    Inscription : Juin 2009
    Messages : 4 481
    Points : 13 679
    Points
    13 679
    Billets dans le blog
    1
    Par défaut
    OK. Je voulais m'assurer de la taille d'un short int avec ce compiateur. Dans la documentation, c'est la section 5.4.2 Integer Data Types qui nous intéresse : un unsigned short (int) fait bien 16 bits.

    Si dans ton main, tu fais un code comme suit et que tu vas en mode debug vérifier la valeur de chaque variable (avec les watches), les valeurs attendues sont-elles correctes ?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    unsigned short int a = 0xFD13;
    unsigned char lsb = (unsigned char) (a & 0x00FF);
    unsigned char msb = (unsigned char) ((a >> 8) & 0x00FF);

  17. #17
    Nouveau membre du Club
    Homme Profil pro
    Ingénieur développement matériel électronique
    Inscrit en
    Janvier 2012
    Messages
    68
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 33
    Localisation : France, Haut Rhin (Alsace)

    Informations professionnelles :
    Activité : Ingénieur développement matériel électronique
    Secteur : Industrie

    Informations forums :
    Inscription : Janvier 2012
    Messages : 68
    Points : 27
    Points
    27
    Par défaut
    Alors le morceau de code fonctionne dans le main sans soucis.

    Après je me suis dit que la valeur de reg dépassait quelque fois la capacité d'un int alors je l'ai passé en double pour ensuite le caster, mais tjs rien..

    Edit: Je vient de m'apercevoir que la variable period de ma structure clock vaut 0 après être passer dans le calcul.. Ca me semble bizzare =(


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    void o_clock_init(struct o_clock *o, unsigned int _freq, unsigned int _period)
    {
        o->ev = 0;
        double reg;
        reg = 0;
     
        IPEN = 0;
        GIE = 1;
        PEIE = 1;
        TMR1IE = 1;
        TMR1IP = 0;
        T1CON = 0x81;
     
        reg = (_period * _freq) / 1000000;
        o->period = 65536 - (unsigned int)reg;
     
        unsigned char lsb = (unsigned char) ((o->period) & 0x00FF);
        unsigned char msb = (unsigned char) (((o->period) >> 8) & 0x00FF);
        TMR1H = msb;
        TMR1L = lsb;
        TMR1IF = 0;
    }

  18. #18
    Membre éclairé Avatar de crocodilex
    Profil pro
    Inscrit en
    Mars 2006
    Messages
    697
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2006
    Messages : 697
    Points : 858
    Points
    858
    Par défaut
    Peut-on voir la structure o_clock ?
    Que vaut _periode ? Que vaut _freq ?
    Software Failure. Press left mouse button to continue.
    Guru Meditation #0100000C.000FE800

  19. #19
    Membre éclairé Avatar de crocodilex
    Profil pro
    Inscrit en
    Mars 2006
    Messages
    697
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2006
    Messages : 697
    Points : 858
    Points
    858
    Par défaut
    D'après la datasheet, l'ordre d'écriture dans ces registres à une importance en fonction du bit RD16 du registre T1CON.
    Il faut d'abord écrire le MSB puis le LSB.

    Si tu ne veux pas te soucier de l'ordre, je pense qu'il faut mettre RD16 à 0 (donc T1CON=0x01)
    Software Failure. Press left mouse button to continue.
    Guru Meditation #0100000C.000FE800

  20. #20
    Nouveau membre du Club
    Homme Profil pro
    Ingénieur développement matériel électronique
    Inscrit en
    Janvier 2012
    Messages
    68
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 33
    Localisation : France, Haut Rhin (Alsace)

    Informations professionnelles :
    Activité : Ingénieur développement matériel électronique
    Secteur : Industrie

    Informations forums :
    Inscription : Janvier 2012
    Messages : 68
    Points : 27
    Points
    27
    Par défaut
    Je teste ma fonction avec _freq = 10 000 000 et _period = 1000
    Je les écris bien dans ce sens, mais même dans l'autre ça ne fonctionne pas.


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    #ifndef CLOCK_H
    #define	CLOCK_H
     
    #include <xc.h>
     
    struct o_clock {
        unsigned int period; // Periode de l'horloge temps reel en µs
        unsigned char ev; //
    };
     
    void o_clock_init(struct o_clock *o, unsigned int _freq, unsigned int _period);
    void o_clock_run(struct o_clock *o);
     
    #endif	/* CLOCK_H */

Discussions similaires

  1. Conversion char[2] - unsigned int
    Par sebygames dans le forum C
    Réponses: 4
    Dernier message: 14/03/2014, 07h28
  2. Réponses: 1
    Dernier message: 10/08/2012, 09h33
  3. Convertir un unsigned int vers un long double
    Par dafpp dans le forum Débuter
    Réponses: 3
    Dernier message: 28/01/2012, 19h37
  4. [Bases]Manipulation d'int et d'unsigned int
    Par méphistopheles dans le forum C++
    Réponses: 14
    Dernier message: 24/03/2009, 18h56
  5. Réponses: 1
    Dernier message: 15/02/2007, 17h32

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