Répondre à la discussion
Affichage des résultats 1 à 28 sur 28

Demande d'aide pour calcul en C sur un AT89S52




  1. #1
    cocoy

    Unhappy Demande d'aide pour calcul en C sur un AT89S52

    Salut,

    Tout d'abord, j'utilise un ATMEL AT89S52. J'ai besoin d'aide pour un calcul qui me permettrait d'envoyer le résultat sur un port de l'ATMEL(j'ai pris le port 1). J'ai une variable f et mon calcul est le suivant:

    P1 = f * (255/100); (f est déclarer)

    La variable f varie de 0 à 100 (de 1 en 1) et P1 doit prendre pour valeur 0 à 255.
    Cependant voila, mon problème lorsque je visualise les broches du port P1, je n'obtient pas du tout ce que je souhaite (si f=100 toutes les broches sont à 0).
    Cependant, si je met directement par exemple P1=255 les broches de P1 sont à 1.

    Aidez moi svp, je vous en remerci par avance.

    A+

    -----


  2. Publicité
  3. #2
    cocoy

    Re : Demande d'aide pour calcul en C sur un AT89S52

    Citation Envoyé par cocoy Voir le message
    Salut,

    Tout d'abord, j'utilise un ATMEL AT89S52. J'ai besoin d'aide pour un calcul qui me permettrait d'envoyer le résultat sur un port de l'ATMEL(j'ai pris le port 1). J'ai une variable f et mon calcul est le suivant:

    P1 = f * (255/100); (f est déclarer)

    La variable f varie de 0 à 100 (de 1 en 1) et P1 doit prendre pour valeur 0 à 255.
    Cependant voila, mon problème lorsque je visualise le résultat de ce calcul sur les broches du port P1, je n'obtient pas du tout ce que je souhaite (si f=100 toutes les broches sont à 0).
    Cependant, si je met directement par exemple P1=255 les broches de P1 sont à 1.

    Aidez moi svp, je vous en remerci par avance.

    A+
    C'est plus clair peut-être

  4. #3
    Seb.26

    Re : Demande d'aide pour calcul en C sur un AT89S52

    Essaye :

    Code:
    unsigned char P1;
    {
      unsigned short temp;
      temp = f;
      temp *= 255; // temp <<= 8;
      P1 = ((unsigned char)temp/100);
    }
    J'ai ajouté la déclaration de P1 pour être sur que P1 soit bien un byte ...

    Le problème a mon avis, c'est que 255/100 = 2

    sinon, autre solution, combien d'octet en ROM va utiliser le code ci dessus ? ( n'oublie pas le code de la librairie pour le * et le / )
    Pourquoi ne pas te mettre un tableau en ROM avec toutes les valeurs ? et ne plus faire le calcul, mais lire la valeur precalculée ?
    << L'histoire nous apprend que l'on apprend rien de l'histoire. >>


  5. #4
    cocoy

    Re : Demande d'aide pour calcul en C sur un AT89S52

    Déjà merci de m'aider!!!
    Le petit programme que tu a écris servirais à quoi? (je suis nul en programmation)

    J'ai pensé la même chose que toi qu'il comprend (255/100)=2 mais comment faire pour qu'il comprenne 2.55?

    Et comment faire un tableau ROM? C'est difficile?

    Re merci de m'aider

  6. #5
    cocoy

    Re : Demande d'aide pour calcul en C sur un AT89S52

    J'ai oublier de préciser P1 c'est le port 1 de l'ATMEL donc si je rajoute ton programme sa ne compile pas.
    A+

  7. A voir en vidéo sur Futura
  8. #6
    Seb.26

    Re : Demande d'aide pour calcul en C sur un AT89S52

    Citation Envoyé par cocoy Voir le message
    J'ai pensé la même chose que toi qu'il comprend (255/100)=2 mais comment faire pour qu'il comprenne 2.55?
    D'ailleurs, à mon avis, il comprend 255/100 = 3 ... car 2.55>2.5 ...
    Dernière modification par Seb.26 ; 06/03/2008 à 15h20.
    << L'histoire nous apprend que l'on apprend rien de l'histoire. >>

  9. #7
    Seb.26

    Re : Demande d'aide pour calcul en C sur un AT89S52

    Citation Envoyé par cocoy Voir le message
    J'ai oublier de préciser P1 c'est le port 1 de l'ATMEL donc si je rajoute ton programme sa ne compile pas.
    A+
    Ok, oups ... alors, vire ma déclaration de P1 ... ... je croyais que c'etait une variable ...
    << L'histoire nous apprend que l'on apprend rien de l'histoire. >>

  10. Publicité
  11. #8
    Seb.26

    Re : Demande d'aide pour calcul en C sur un AT89S52

    PS : c'est important d'aller jusqu'a 255 ? ... 250 te suffit pas ?

    Car si t'es ok pour 250, ça reviens à faire *2.5 ce qui est facile et peu couteux en CPU ...

    X*(250/100) = X*2.5 = X*2 + X/2 = (X<<1) + (X>>1)
    << L'histoire nous apprend que l'on apprend rien de l'histoire. >>

  12. #9
    Seb.26

    Re : Demande d'aide pour calcul en C sur un AT89S52

    Zut, j'ai viré un de mes posts en fausse manip ... le voici :

    Citation Envoyé par cocoy Voir le message
    Déjà merci de m'aider!!!
    Bah ... de nada ... mais merci de dire merci ...

    Citation Envoyé par cocoy Voir le message
    Le petit programme que tu a écris servirais à quoi? (je suis nul en programmation)
    à faire éxactement la même chose que toi : f=P1*(255/100) ...

    Tu peux déjà aussi essayer :
    P1 = ((unsigned char) ( ((unsigned short)f) <<8 ) /100 );

    Citation Envoyé par cocoy Voir le message
    J'ai pensé la même chose que toi qu'il comprend (255/100)=2 mais comment faire pour qu'il comprenne 2.55?
    tu peux pas ... puisque tes valeurs sont des entiers ...

    Citation Envoyé par cocoy Voir le message
    Et comment faire un tableau ROM? C'est difficile?
    pas du tout, pour commencer, tu prend excell, tu fais un colonne avec les valeurs de f ( 0 à 100 ), colonne a coté, tu mets "= f * 2.55", tu demande aucun chiffre après la virgule. Tu as donc toutes tes valeurs P1 pour f allant de 0 à 100, tu mets ça dans un fichier, que tu mest en forme pour que ce soit un .h valide avec dedans un unsigned char[101] contenants toutes tes valeurs ... le mot clef rom ( ou const celon ton compilo ) te permet de le mettre dans le programme, ensuite il te reste plus qu'a aller lire la valeur d'indice f dans le tableau ... 0 cycle CPU comparé à une div ... juste 101 octets en ROM utilisés ...
    << L'histoire nous apprend que l'on apprend rien de l'histoire. >>

  13. #10
    cocoy

    Re : Demande d'aide pour calcul en C sur un AT89S52

    Cela ne fonctionne pas , je suis dessus depuis ce matin ça commence à m'agacer.

    J'ai essayé P1 = ((unsigned char) ( ((unsigned short)f) <<8 ) /100 );
    mais aucun résultat sur les broches.

    unsigned char et unsigned short et <<8 servent à quoi?

    Je veux bien allez jusqu'à 250 mais sur le port P1 après il y aura un latch vu qu'il est sur 8 bits.

  14. #11
    cocoy

    Re : Demande d'aide pour calcul en C sur un AT89S52

    Pour la solution du tableau ROM le début ça va mais après je suis largué

  15. #12
    Jack

    Re : Demande d'aide pour calcul en C sur un AT89S52

    P1 = f * (255/100); (f est déclarer)
    Le problème, c'est que tu fais des opérations sur des entiers, donc 255/100 = 2 (et pas 3 Seb )

    Attention donc à l'ordre des opération:
    P1 = f * (255/100);
    est donc différent de
    P1 = (f * 255)/100;
    Dans ce dernier cas la précision est meilleure. Mais pour cela, il faut que P1 soit sur 16 bits.


    Si ça ne marche pas, tu peux éventuellement passer par une variable intermédiaire:
    int temp;

    temp = (f * 255)/100;
    P1 = temp;

  16. #13
    Seb.26

    Re : Demande d'aide pour calcul en C sur un AT89S52

    Citation Envoyé par Jack Voir le message
    Le problème, c'est que tu fais des opérations sur des entiers, donc 255/100 = 2 (et pas 3 Seb )
    Oups ... je me suis un peu emmêlé les pinceaux en effet ...
    << L'histoire nous apprend que l'on apprend rien de l'histoire. >>

  17. #14
    cocoy

    Re : Demande d'aide pour calcul en C sur un AT89S52

    Citation Envoyé par Jack Voir le message
    Le problème, c'est que tu fais des opérations sur des entiers, donc 255/100 = 2 (et pas 3 Seb )

    Attention donc à l'ordre des opération:
    P1 = f * (255/100);
    est donc différent de
    P1 = (f * 255)/100;
    Dans ce dernier cas la précision est meilleure. Mais pour cela, il faut que P1 soit sur 16 bits.


    Si ça ne marche pas, tu peux éventuellement passer par une variable intermédiaire:
    int temp;

    temp = (f * 255)/100;
    P1 = temp;
    Merci de m'aider également.
    P1 est sur 8 bits
    J'ai tenter P1 = f * (2.55F); (F pour float biensur) et sa marche en revanche mon programme fait 1Ko de plus cela risque de m'ennuyer par la suite :s
    Je vais tenter la variable intermédiaire....

  18. #15
    Seb.26

    Re : Demande d'aide pour calcul en C sur un AT89S52

    Citation Envoyé par Jack Voir le message
    Dans ce dernier cas la précision est meilleure. Mais pour cela, il faut que P1 soit sur 16 bits.

    temp = (f * 255)/100;
    P1 = temp;
    C'est ce que je voulais faire via mon :

    Code:
    P1 = ((unsigned char) ( ((unsigned short)f) *255 ) /100 );
    << L'histoire nous apprend que l'on apprend rien de l'histoire. >>

  19. #16
    Jack

    Re : Demande d'aide pour calcul en C sur un AT89S52

    mon programme fait 1Ko de plus
    Normal, puisqu'il charge les librairies de calcul en flottant.

    tu n'as pas dit si
    P1 = (f * 255)/100;
    fonctionnait

    Tu peux débugger en pas à pas pour suivre l'évolution des variables?
    Si oui, essaie:
    temp = f * 255;
    puis
    temp /= 100;
    P1 = unsigned char(temp);

    Comme çà, s'il y a un problème, tu sauras sur quelle opération. Tu remettras le tout sur une seule ligne à la fin.

  20. #17
    Jack

    Re : Demande d'aide pour calcul en C sur un AT89S52

    P1 = unsigned char(temp);
    Plutôt
    P1 = (unsigned char)temp;

    Sinon, je pense qu'il y a moyen dans ton compilateur d'extraire le byte de poids fort ou de poids faible d'un int.

    A+

  21. #18
    Seb.26

    Re : Demande d'aide pour calcul en C sur un AT89S52

    Citation Envoyé par Jack Voir le message
    Si oui, essaie:
    temp = f * 255;
    puis
    temp /= 100;
    P1 = unsigned char(temp);
    Avec temp qui est un unsigned short ...

    le code complet peut être :

    Code:
    unsigned char f;
    ...
    f = 5;
    ...
    {
      unsigned short temp = f * 255;
      temp /= 100;
      P1 = (unsigned char)temp;
    }
    ...
    Et sinon
    Code:
    P1 = ((unsigned char) (((unsigned short)f)*255/100) );
    fonctionne aussi ...
    << L'histoire nous apprend que l'on apprend rien de l'histoire. >>

  22. #19
    cocoy

    Re : Demande d'aide pour calcul en C sur un AT89S52

    Merci à vous 2 de m'avoir aidé car sa marche

    Je suis bien content, j'ai utilisé la méthode de Jack (désolé de pas avoir compris tes ligne de programme Seb)

    int temp;

    temp = (f * 255)/100;
    P1 = temp;

    Je l'avais tenté (il me semble car j'ai tenté trop de truc) mais avec le calcul suivant f * (255/100)

    Encore merci merci, je reviendrais peut-être demander de l'aide, donc si vous voyez un message de cocoy je serais heureux que vous m'aidez encore

    A++

  23. #20
    Seb.26

    Re : Demande d'aide pour calcul en C sur un AT89S52

    Citation Envoyé par Jack Voir le message
    Sinon, je pense qu'il y a moyen dans ton compilateur d'extraire le byte de poids fort ou de poids faible d'un int.
    Sans faire un union ? ... ça m'interresse aussi ...
    << L'histoire nous apprend que l'on apprend rien de l'histoire. >>

  24. #21
    Seb.26

    Re : Demande d'aide pour calcul en C sur un AT89S52

    Citation Envoyé par cocoy Voir le message
    (désolé de pas avoir compris tes ligne de programme Seb)
    Désolé de pas m'être fait comprendre ...

    @++
    << L'histoire nous apprend que l'on apprend rien de l'histoire. >>

  25. #22
    Seb.26

    Re : Demande d'aide pour calcul en C sur un AT89S52

    Citation Envoyé par cocoy Voir le message
    int temp;
    temp = (f * 255)/100;
    P1 = temp;
    N'oublie pas de mettre tout ça dans un bloc de code { } pour que temp soit ... temporaire ...
    << L'histoire nous apprend que l'on apprend rien de l'histoire. >>

  26. #23
    Jack

    Re : Demande d'aide pour calcul en C sur un AT89S52

    P1 = ((unsigned char) (((unsigned short)f)*255/100) );
    Le problème, c'est que le compilo va optimiser ton 255/100 en le remplaçant par 2.

    Je persiste à dire qu'il faut d'abord effectuer la multiplication avant la division

  27. #24
    Jack

    Re : Demande d'aide pour calcul en C sur un AT89S52

    Sans faire un union ? ... ça m'interresse aussi ...
    Ca dépend des compilos. C'est pas standard.

    A+

  28. #25
    Seb.26

    Re : Demande d'aide pour calcul en C sur un AT89S52

    Citation Envoyé par Jack Voir le message
    Le problème, c'est que le compilo va optimiser ton 255/100 en le remplaçant par 2.
    Heu ... un compilo qui ferait ça n'optimiserait rien du tout, il ferait des bugs ...

    Tu as déjà eu ce genre de problème avec un compilo ??? ... cela voudrait qu'il ne respecterait pas l'ordre d'exécution des opérateurs ...

    << L'histoire nous apprend que l'on apprend rien de l'histoire. >>

  29. #26
    Jack

    Re : Demande d'aide pour calcul en C sur un AT89S52

    Heu ... un compilo qui ferait ça n'optimiserait rien du tout, il ferait des bugs ...

    Tu as déjà eu ce genre de problème avec un compilo ??? ... cela voudrait qu'il ne respecterait pas l'ordre d'exécution des opérateurs ...
    Il me semble, qu'à opérateur équivalents, l'évaluation d'une expression est traitée de la droite vers la gauche. Comme il va rencontrer 255/100 et que ces 2 termes sont constant, il ne va évidemment pas générer du code pour faire la division alors que le résultat est connu. Il va donc remplacer le 255/100 par 2.

    Je n'en suis pas sur à 100%. Dès que j'ai un peu de temps, je testerai.

    A+

  30. #27
    Seb.26

    Re : Demande d'aide pour calcul en C sur un AT89S52

    Citation Envoyé par Jack Voir le message
    Il me semble, qu'à opérateur équivalents, l'évaluation d'une expression est traitée de la droite vers la gauche.
    Ah, justement je croyais que c'était le contraire ...
    << L'histoire nous apprend que l'on apprend rien de l'histoire. >>

  31. #28
    Jack

    Re : Demande d'aide pour calcul en C sur un AT89S52

    Ah, justement je croyais que c'était le contraire ...
    Pour * et / tu as raison.

    http://c.developpez.com/cours/bernar...ne/node101.php

    il faudra tout de même faire le test au niveau de l'optimisation du 255/100

Sur le même thème :

Discussions similaires

  1. demande d'aide calcul
    Par frantzy25 dans le forum Mathématiques du supérieur
    Réponses: 5
    Dernier message: 25/07/2007, 09h49
  2. Demande d'aide pour lecture de fichiers joints [pour groupe antimalware]
    Par Bruno37320 dans le forum Internet - Réseau - Sécurité générale
    Réponses: 3
    Dernier message: 26/05/2007, 08h48
  3. Calcul d'Intégrale - Demande d'aide pour sa résolution
    Par JMF74 dans le forum Mathématiques du collège et du lycée
    Réponses: 6
    Dernier message: 02/06/2006, 08h03
  4. Demande d'aide pour Mars sur un Skywatcher 130/900
    Par SSFRNY dans le forum Matériel astronomique et photos d'amateurs
    Réponses: 17
    Dernier message: 27/12/2005, 18h55
  5. Demande d'aide pour achat pour Barlow*3 et occulaires 6mm et 32mm
    Par SSFRNY dans le forum Matériel astronomique et photos d'amateurs
    Réponses: 6
    Dernier message: 07/12/2005, 18h55