Pb de types C18 sur 18F - Resultat de calcul faux
Répondre à la discussion
Affichage des résultats 1 à 15 sur 15

Pb de types C18 sur 18F - Resultat de calcul faux



  1. #1
    invite5dd9c328

    Arrow Pb de types C18 sur 18F - Resultat de calcul faux


    ------

    Bonjour,

    J'ai un projet de contrôle de servos par un PIC embarqué sur un modèle réduit. Je me heurte à des difficultés d'exécution de calculs sur le PIC 18F4520.

    Mon code est le suivant (le code complet est en PJ) :
    void main (void)
    {
    long delai = 45;
    long val_l;

    open_usart();
    imp_long(delai);
    val_l = 1000*delai/180 + 65535 - 1000;
    imp_long(val_l);
    imp_long(delai);
    }

    J'imprime via le RS232 et mon resultat est :
    45
    -1063745088
    5640192

    alors que j'attend (ça fonctionne sur le simulateur de MPLAB!) :
    45
    64785
    45

    A l'aide ! Je n'arrive pas à trouver de solution (même en décomposant le calcul).

    Merci de vos pistes.

    -----
    Fichiers attachés Fichiers attachés

  2. #2
    invite5637435c

    Re : Pb de types C18 sur 18F - Resultat de calcul faux

    Salut,

    il est probable que ta variable val_l contienne déjà une valeur, il faut juste que tu l'initialises à une valeur bien connue comme 0 par exemple avant la phase de calcul, ainsi le résultat+0 sera égal au résultat du calcul uniquement.

  3. #3
    invite5dd9c328

    Re : Pb de types C18 sur 18F - Resultat de calcul faux

    Salut,

    Merci beaucoup de ta réponse Hulk. J'ai modifié selon tes indications. J'obtiens maintenant :
    45
    -1000210432
    45
    En net progrès puisque la variable délai n'est pas modifiées par le calcul. Mais je n'ai toujours pas 45*1000 = 45000 en 2ème ligne (j'ai simplifié le calcul)!
    Ca marche toujours avec le debugger.

    Mon code du main() a maintenant cette tête :
    open_usart();
    imp_long(delai);

    val_l = 0;
    val_l = 1000*delai;
    imp_long(val_l);
    imp_long(delai);

    while(1);

    Je pense qu'il s'agit d'un problème de transtypage mais je n'arrive pas à trouver de solution : j'ai essayé de forcer le type avec val_l = (long)1000*(long)delai mais ça ne change pas le résultat.

    Si quelqun a déjà eu ce problème, il me sauverait.
    Merci d'avance.

  4. #4
    invite5637435c

    Re : Pb de types C18 sur 18F - Resultat de calcul faux

    Qu'utilises-tu comme compilateur C?

  5. A voir en vidéo sur Futura
  6. #5
    invite5637435c

    Re : Pb de types C18 sur 18F - Resultat de calcul faux

    Ta variable est déclarée dans le main mais est utilisée au travers d'une autre fonction qui est appelée par le main, je pense qu'elle doit plutôt être globale que locale et donc son initialisation doit être faite à l'extérieur du main me semble-t-il.

  7. #6
    invite5dd9c328

    Re : Pb de types C18 sur 18F - Resultat de calcul faux

    J'utilise le compilateur C18 dans l'IDE MPLAB avec ses options par défaut le Linker Script 18f4520.lkr.

    Ca marche toujours pas. J'obtiens :
    45
    -1000199992
    34605

    Et j'ai modifié comme ça (initialisation à la déclaration globale) :
    long val_l = 0;

    void main (void)
    {
    long delai = 45;

    open_usart();
    imp_long(delai);
    val_l = (long)1000*(long)delai;
    imp_long(val_l);
    imp_long(delai);

    while(1);
    }

    Ca a une bonne tête d'instabilité !

  8. #7
    invite5637435c

    Re : Pb de types C18 sur 18F - Resultat de calcul faux

    Essaie ça.
    Fichiers attachés Fichiers attachés

  9. #8
    invite5dd9c328

    Re : Pb de types C18 sur 18F - Resultat de calcul faux

    J'ai exécuté ton code.

    Le résultat est :
    45
    3025951
    45
    en boucle (car il reset en fin de main).

    Je vais essayer de passer en revue toutes les options de comilation. Le volume du code asm généré par le compilo me donne pas envie de tout relire. L'étape suivante sera de réinstaller MPLAB et C18.

  10. #9
    invite5dd9c328

    Re : Pb de types C18 sur 18F - Resultat de calcul faux

    Salut,

    Merci encore pour ton aide Hulk.
    Un petit complément : j'ai forcé l'option de compilation de MCC18 'promote integer' (l'option qui me semblait la plus proche de mes problème avec les memory models). Rien a faire, j'ai toujours le même problème d'exécution du code - même avec le code de Hulk.

    Je continue à fouiller et je prend toutes les pistes d'enquêtes .

  11. #10
    invite5637435c

    Re : Pb de types C18 sur 18F - Resultat de calcul faux

    Je n'utilise pas C18 mais il me semble qu'il y a un soucis avec les initialisations de variables, puisque le résultat que tu obtiens est à chaque fois différent.

    Essaye avec un calcul plus simple (addition) puis avec une simple multiplication, puis en combinant les 2 opérations, pour voir où ça foire.

    Je ne sais pas comment PIC18 gère les entiers non signés, les float long etc...il se peut qu'une mauvaise déclaration lui fasse prendre par défaut un autre type sans qu'il le signale.

  12. #11
    invite5637435c

    Re : Pb de types C18 sur 18F - Resultat de calcul faux

    Et comme ça dis moi ce que ça donne.
    Fichiers attachés Fichiers attachés

  13. #12
    invite5dd9c328

    Re : Pb de types C18 sur 18F - Resultat de calcul faux

    Salut Hulk,
    Merci encore de ton aide.

    J'ai compilé ton code en mettant :
    * la déclaration de val en unsigned int car il n'accepte pas de déclaration de fonction avec des arguments sans type (même si je pense que le type par défaut doit être int)
    * en changeant le ltoa en itoa (car du coup, on a un int et non un long).
    (Le code obtenu est joint)

    Le résultat est :
    45
    -1115
    45

    Ce qui reste étonnant car -1115 en unsigned int, cela fait 65536-1115 soit 64421 et le résultat du calcul (en dur avec le define) est 64785!
    Par contre le debugger de MPLAB donne aussi 64421 pour val_l
    J'ai peur que dans le cas du premier calcul avec le (1000*delai), une valeur intermédiaire du calcul déborde du int. Qu'en penses-tu ?

    J'ai fais le test avec un calcul plus simple (64000 + delai). Ca marche : On trouve -1491 sur le PIC(cela correspond à 65536-1491=64035). Mais on est loin du calcul initial

    Pour info, le but de ma fonction est de calculer l'initialisation du timer pour la durée du signal Vcc de commande d'un servo en fonction de l'angle voulu.
    J'ai déjà été confronté à des problèmes de ce genre que j'ai contourné depuis mes quelques semaines de programmation. Je les ai contourné mais j'aimerai comprendre.

    Quel compilateur utilises-tu ?

  14. #13
    invite5dd9c328

    Re : Pb de types C18 sur 18F - Resultat de calcul faux

    Et la pièce jointe que j'avais oubliée !
    Désolé.
    Fichiers attachés Fichiers attachés

  15. #14
    invite5dd9c328

    Unhappy Re : Pb de types C18 sur 18F - Resultat de calcul faux

    Bonjour,

    J'ai totalement résinstallé MPLAB et C18 : Même résultat.
    J'ai aussi fait le test de compil, transfert et HyperTerminal sur un autre poste (sous XP, mon poste habituel étant sous 98) : Même résultat.

    2 solutions :
    * le 18F4520 se comporterait bizzarement : j'y crois pas car il fonctionne bien sur les I/O, les timers, etc... seuls les calculs posent pb
    * le code généré n'est pas ce que j'attend : et là, il faut que je trouve quelle option de compil est en cause (car mon code semble juste).

    Quelqu'un peut-il me donner un avis sur mon bout de code

    Merci d'avance. The Jack.

  16. #15
    invite5dd9c328

    RESOLU : Pb de types C18 sur 18F - Resultat de calcul faux

    Ca y est ! J'ai la solution !
    Il fallait en fait indiquer une compilation en 'Extended mode' dans les options de 'MPLAB C18'.
    Le comportement du programme pour les calculs et les printf (et fonctions associées) est maintenant normal.

    Attention : Pour le 18f4520, il faut ignorer le message d'erreur en fin de compil qui indique que le bit 'Extended' n'est pas mis !

    Merci encore à Hulk de s'être intéressé à mon problème.

    A votre dispo si vous voulez d'autres détails.

Discussions similaires

  1. Mode capture sur 18F
    Par invited6358b87 dans le forum Électronique
    Réponses: 0
    Dernier message: 24/02/2007, 16h54
  2. Calcul du noyau d'un morphisme de K-ev... et résultat illogique !
    Par invite965db33f dans le forum Mathématiques du supérieur
    Réponses: 3
    Dernier message: 24/01/2007, 18h00
  3. Chaudière biomasse : avis sur les devis !
    Par invite94738589 dans le forum Habitat bioclimatique, isolation et chauffage
    Réponses: 19
    Dernier message: 30/12/2006, 16h02
  4. Calcul de thermique, résultat surprenant
    Par invite7ffb6ca0 dans le forum Physique
    Réponses: 2
    Dernier message: 22/05/2006, 13h27
Dans la rubrique Tech de Futura, découvrez nos comparatifs produits sur l'informatique et les technologies : imprimantes laser couleur, casques audio, chaises gamer...