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

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    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 : 34
    Localisation : France, Haut Rhin (Alsace)

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

    Informations forums :
    Inscription : Janvier 2012
    Messages : 68
    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 : 36
    Localisation : France, Hauts de Seine (Île de France)

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

    Informations forums :
    Inscription : Juin 2005
    Messages : 1 049
    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
    Membre confirmé
    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 : 34
    Localisation : France, Haut Rhin (Alsace)

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

    Informations forums :
    Inscription : Janvier 2012
    Messages : 68
    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
    Membre confirmé
    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 : 34
    Localisation : France, Haut Rhin (Alsace)

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

    Informations forums :
    Inscription : Janvier 2012
    Messages : 68
    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 : 36
    Localisation : France, Hauts de Seine (Île de France)

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

    Informations forums :
    Inscription : Juin 2005
    Messages : 1 049
    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 026
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 32
    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 026
    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
    Membre émérite 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
    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)

  8. #8
    Membre confirmé
    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 : 34
    Localisation : France, Haut Rhin (Alsace)

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

    Informations forums :
    Inscription : Janvier 2012
    Messages : 68
    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 */

  9. #9
    Membre confirmé
    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 : 34
    Localisation : France, Haut Rhin (Alsace)

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

    Informations forums :
    Inscription : Janvier 2012
    Messages : 68
    Par défaut
    Oups c'est une erreur, le registre T1CON doit bien être à 0x01 (en mode 2x8bits), et même en mode 16 bits ça ne fonctionne pas =(

  10. #10
    Membre émérite 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
    Par défaut
    Peux-tu vérifier la valeur de o->period avec ton debugger ?

  11. #11
    Membre confirmé
    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 : 34
    Localisation : France, Haut Rhin (Alsace)

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

    Informations forums :
    Inscription : Janvier 2012
    Messages : 68
    Par défaut
    Elle reste à zéro, mais je ne voit pas pourquoi =(

  12. #12
    Membre émérite 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
    Par défaut
    Par curiosité, peux-tu essayer ça :
    o->period = 65535 - (unsigned int)reg;

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