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. #21
    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 =(

  2. #22
    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 ?

  3. #23
    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 =(

  4. #24
    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;

  5. #25
    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
    Erreur de frappe ça ^^ Tjs le même problème =(

  6. #26
    Expert confirmé
    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
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
        double reg;
    .... 
        reg = (_period * _freq) / 1000000;
    Le fait de mettre reg en double ne résoud rien, le calcul continue à être fait en entier et n'empêche pas le dépassement de capacité des int.
    Seul le résultat sera mis en double, ce qui dans ce cas ne sert à rien.

    Si on veut faire le calcul en double, il faut caster en double au moins l'une des deux valeurs _period ou _freq

  7. #27
    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 saisis la subtilité ^^

    Mais j'en suis tjs au même point, je ne voit tjs pas pourquoi.. Le problème vient bien du calcul, car si je force period à 55535 tout fonctionne bien.

  8. #28
    Expert confirmé
    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
    Par défaut
    Tu apportes des modifications au code, ça ne marche pas mais tu ne donnes pas le nouveau code que tu utilises.
    On n'est pas devin.

  9. #29
    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 pardon ^^

    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 = 0x01;
     
        reg = ((double)_period *(double)_freq) / 1000000;
        o->period = 65535 - (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;
    }

  10. #30
    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
    Peut-on voir le bout de code qui fait appel à cette fonction ?

  11. #31
    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
    Voici le main
    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
    23
    24
    25
    26
    27
    void main(){
     
        unsigned int count;
        count = 0;
        ADCON1 = 0x00000110;
        ecu_init();
        o_clock_init(&clock,10000000,1000);
        TRISEbits.TRISE0 = 0;
     
        while(1){
            o_clock_run(&clock);
            if(clock.ev == 1)
            {
                count++;
                if(count == 500)
                {
                    if(LATEbits.LATE0 == 1)
                    {
                        PORTEbits.RE0 = 0;
                    } else {
                        PORTEbits.RE0 = 1;
                    }
                    count = 0;
                }
            }
        }
    }
    et le o_clock_run
    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
    void o_clock_run(struct o_clock *o)
    {
        if(o->ev == 1)
        {
            o->ev = 0;
        }
        if(TMR1IF==1)
        {
            o->ev = 1;
            unsigned char lsb = (unsigned char) ((o->period) & 0x00FF);
            unsigned char msb = (unsigned char) (((o->period) >> 8) & 0x00FF);
            TMR1H = msb;
            TMR1L = lsb;
            TMR1IF = 0;
        }
    }

  12. #32
    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
    Où est déclaré clock et comment ?
    Le plus simple est de mettre l'intégralité de ton code s'il n'est pas très gros.

    Est-ce que tu utilises le debugger sur la cible ou avec un simulateur ?
    Quelle est la valeur lue sur reg ?

  13. #33
    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
    Voici l'intégralité du main

    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
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    #include <xc.h>
    #include "clock.h"
    #include "ecu.h"
     
    struct o_clock  clock;
     
     
     
    void main(){
     
        unsigned int count;
        count = 0;
        ADCON1 = 0x00000110;
        ecu_init();
        o_clock_init(&clock,10000000,1000);
        TRISEbits.TRISE0 = 0;
     
        while(1){
            o_clock_run(&clock);
            if(clock.ev == 1)
            {
                count++;
                if(count == 500)
                {
                    if(LATEbits.LATE0 == 1)
                    {
                        PORTEbits.RE0 = 0;
                    } else {
                        PORTEbits.RE0 = 1;
                    }
                    count = 0;
                }
            }
        }
    }
    et le clock.h

    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 */
    Je débug avec l'ICD3 sur cible, mais je ne l'ai pas à coté de moi en ce moment, je teste ce soir, mais o->period ne veut pas décoller de 0, et je ne comprend pas pourquoi.

    Si à la place du calcul je met:

    et bien tout fonctionne, c'est vraiment au niveau du calcul que ça coince mais je ne comprend pas ou =(

  14. #34
    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
    Alors il y a vraiment un truc que je ne comprend plus ^^

    Je met mon code suivant dans le main
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    unsigned long toto;
        toto = 0;
        toto = ((1000 * 10000000) / 1000000);
    Et il trouve que toto = 1410

    =/ Faut que je lui apprenne les maths je pense =)

  15. #35
    Expert éminent
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 395
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 395
    Par défaut
    Si un unsigned long fait 32 bits, alors c'est normal: 1,000 * 10,000,000 = 10,000,000,000 qui est supérieur à 4,294,967,295 (la plus grosse valeur non-signée qui tienne sur 32 bits).

    10,000,000,000 modulo 4,294,967,296 donne 1,410,065,408 qui divisé par 1,000,000 donne 1,410.
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  16. #36
    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 me suis aperçu de ça après avoir poster le message, je restait borné sur mon 10000.

    J'ai fait la division en premier, et tout ce passe bien =)

    Thank's

  17. #37
    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
    Et je pense que Médinoc a trouvé la solution à ton problème.
    La valeur de _freq ne tient pas dans un "unsigned int" puisque celui-ci fait 16 bits sur ton implémentation.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    void o_clock_init(struct o_clock *o, unsigned int _freq, unsigned int _period);
     
    o_clock_init(&clock,10000000,1000);
    Normalement, tu aurais dû t'en apercevoir puisque le compilateur doit te sortir un warning pour ce cas précis.

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