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

Autres architectures Assembleur Discussion :

[ST72254G] Calculer sin x


Sujet :

Autres architectures Assembleur

  1. #1
    Nouveau Candidat au Club
    Inscrit en
    Janvier 2003
    Messages
    4
    Détails du profil
    Informations forums :
    Inscription : Janvier 2003
    Messages : 4
    Points : 1
    Points
    1
    Par défaut [ST72254G] Calculer sin x
    salut tout le monde
    mon probléme et le suivant :
    je veux générer une routine qui calcule sinx en asm
    j'ai quelques questions:
    - est ce qu'on peut gérer des reéls (float en asm) si oui est ce que c possible sur un microcontrolleur (sur ST7 )?

    - comment gérer ce sin x? les algorithme ......

    et merci d'avance
    "Emptyness is filling me to the point of agony..."

  2. #2
    Membre régulier
    Profil pro
    Inscrit en
    Mai 2002
    Messages
    91
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2002
    Messages : 91
    Points : 96
    Points
    96
    Par défaut
    Dans les ressource du dernier Masm 8.0 tu trouveras pleins de fonctions pour les Mathématiques et en particulier FpuSin.

    Même si tu utilises un autre compilateur tu dois pouvoir l'adapter.
    @+

  3. #3
    Membre à l'essai
    Inscrit en
    Février 2003
    Messages
    25
    Détails du profil
    Informations forums :
    Inscription : Février 2003
    Messages : 25
    Points : 11
    Points
    11
    Par défaut
    salut

    Tu peux utiliser les instructions FPU pour faire cela
    dans toi cas, c'est la commande FSIN qu'il faut que tu utilises
    Cette fonction remplace ST(0) par son sinus
    Il y a une seule condition pour que cette commande marche, c'est que ST(0) soit compris entre -2^63 et 2^63 (ca laisse de la marge

    Bigbang

  4. #4
    Membre régulier Avatar de NeoMan
    Profil pro
    Inscrit en
    Avril 2002
    Messages
    171
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2002
    Messages : 171
    Points : 76
    Points
    76
    Par défaut
    sinon la fonction sin et cos peuvent être approché très efficacement par de simple polynôme... Si ça t'intéresse je t'expliquerais (là je dois partir)...
    Vas-y court petit bug! Profites! On verra bien qui rira le dernier...

  5. #5
    Membre régulier
    Profil pro
    Inscrit en
    Mai 2002
    Messages
    91
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2002
    Messages : 91
    Points : 96
    Points
    96
    Par défaut
    NeoMan, tu parles de quoi exactement ?

    j'en connais un truc mais la tienne est peut-être différente. Ca m'intéresserai en tout cas que tu me l'explique soit dans un post soit par mail.

    Celle que je connais c'est la tranformation de n'importe quelle fonction vers une forme approchée polynomiale, mais ce n'est valable qu'au voisinage d'une valeur donc ça peut pas vraiment remplacer une fonction sin.

    J'aimerai bien appendre la tienne si c'est possible ?
    @+

  6. #6
    Nouveau Candidat au Club
    Inscrit en
    Janvier 2003
    Messages
    4
    Détails du profil
    Informations forums :
    Inscription : Janvier 2003
    Messages : 4
    Points : 1
    Points
    1
    Par défaut
    Merci tout le monde pour votre aide!
    le truc le FPU c bien !!!! je vais me documenter
    mais je voudrais savoir si c encore possible d'utiliser la FPU sur des microcontrolleur j'utilise un ST72254G????!!! et merci
    "Emptyness is filling me to the point of agony..."

  7. #7
    Membre régulier

    Profil pro
    Inscrit en
    Décembre 2002
    Messages
    65
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2002
    Messages : 65
    Points : 105
    Points
    105
    Par défaut
    Bonsoir,

    Sur un ST7, pas de FPU donc pas de sin intégré.

    Le plus simple est d'utiliser une table précalculée. Tu peux générer cette table sur PC en C par exemple et l'intégrer dans ton source asm. Un quadrant suffit (voire même une moitité de quadrant), on applique ensuite les formules du collège pour les autres quadrants. J'ai appliqué cette méthode pour un programme sur ST7.

    L'approche développement limité (polynome ....) est faisable mais le ST7 (8bits) est un peu léger pour faire des calculs de puissance dans le cas ou on veut un minimum de précision.

    Note: voir le ST9, s'il n'y a pas une unité flottante.

    Bon courage.
    golem
    +++

  8. #8
    Nouveau Candidat au Club
    Inscrit en
    Janvier 2003
    Messages
    4
    Détails du profil
    Informations forums :
    Inscription : Janvier 2003
    Messages : 4
    Points : 1
    Points
    1
    Par défaut
    Merci pour tous!
    je crois que la solution proposée par golem est la plus adaptée ç mon cas. Cependant elle pose un certain nombres de problèmes vu que le ST7 à une RAM assez limitée 128 octect alors il faut plutôt essayer de d'optimiser.....
    "Emptyness is filling me to the point of agony..."

  9. #9
    Membre éclairé
    Profil pro
    Inscrit en
    Juillet 2002
    Messages
    842
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2002
    Messages : 842
    Points : 696
    Points
    696
    Par défaut
    Tout dépend de la precision que tu veux. Les Developpements limités sont une bonne approximation du sinus. Ca dépend dee ce que tu veux. Pour ne pas avoir besoin de trop augmenter l'ordre du dl pour gagner du temps, il faut se rappeller que sinus est periodique :)) (jusque la je crois que ca va) et qu'il y a des symetries (plein) et dont deux très interessante, ayant pour axe : x = PI/2 et x = -PI/2. Ce qui veut dire que si tu peux calculer par dl le sinus allant de e-PI/2 à PI/2 c'est bon tu peux tout calculer. C'est pareil ca déepnd de la précision que tu veux, mais sur un si petit interval, l'ordre 2 est déja pas mal precis.

    De la même manière comme tu as plein de symetrie, si tu utilise un table tu n'aura qu'a stocker des valeurs dee sin x pour 0 < x < PI/2 ce qui te laisse un peu de place. 128 octets devrait te permettrre de stocker jusqu'a 32 valeurs (a moins que tu veuilles encore moins de precision) mais tu doit certaienemt avoir besoin d'un peu de place pour autre chose.

    Voila, a toi de dire la precision dont tu as besoin

  10. #10
    Membre régulier

    Profil pro
    Inscrit en
    Décembre 2002
    Messages
    65
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2002
    Messages : 65
    Points : 105
    Points
    105
    Par défaut
    Bonsoir,

    Tu n'es pas limité ici par la taille de la RAM, mais par les mémoires non volatiles (flash, E²PROM ...), puisque typiquement une table serait stockée dans ce type de mémoire.

    Il n'est effectivement pas possible de fixer à l'avance le contenu de la RAM ...

    Selon le modèle tu as plus ou moins d'espace en flash ... En général c'est quelque chose comme 256, 512, 1024 octets..

    Tu peux eventuellement (c'est à verifier) stocker dans la mémoire programme, en général bien plus vaste (16k, 32k, 64k ...) pour la relire ensuite comme des datas. Je sais que ça se fait sur les PIC, pour les ST7 c'est moins sur.

    Bon courage.


    golem
    +++

  11. #11
    Nouveau Candidat au Club
    Inscrit en
    Janvier 2003
    Messages
    4
    Détails du profil
    Informations forums :
    Inscription : Janvier 2003
    Messages : 4
    Points : 1
    Points
    1
    Par défaut
    Encore Merci une fois de plus,
    Bon j'ai étudier le pb de plus prés. Ce que propose Golem est la solution la plus adaptée. Pour le stockage en mémoire flash c possible. De plus l'espace sur cette mémoire semble presque infini (64Kb). Cependant, je trouve qu'une optimisation au niveau du stockage n'est pas mal non plus.

    L'idée que j'ai eu est la suivante :
    D'abord on travaille seulment sur [0,pi/2] et on génère le reste par symétrie et translation.
    Vu que le ST7 ne gère que des entiers en génère plutôt le fonction
    f(x)=128*sin(x)

    au lieu de stocker les valeurs du sinus calculées aux pts xi par PC on stock seulment les valeurs de différences D(i)=128*(sin(xi+1)-sin(xi)).

    En effet, pour des xi assez proche les D(i) prennent des valeurs entre 0 et 3 et ainsi ils pouvent être stocker sur 2 bits seulment et ainsi on arrive à compressez.

    Pour générer le sinus sur le ST7:
    1) le registre A<- 0
    2) pour i=1 to N faire
    A<- A+ D(i)
    sortir A
    fpour
    Rq: à chaque fois on extrait D(i) qui est stockée sur 2 bits à partir des 8 bits grâce à un masque et une rotation. cela permet une compression de 75% .

    Cette idée peut être utilisée pour toutes fonctions à généerer qui présente une périodicité et qui est continue sur sa période.

    Néaumoins, une possibilité d'optimisation est encore possible dans le cas du sinus. En effet, vue que la dérivée seconde du sinus est négative sur [0,pi/2] on remarque que D(i) est décroissante et par suite on aura:
    D(i+1) <= D(i) cela implique que notre vecteur D sera de la forme suivante:
    (*) D=[3 3 3 3 3 3 2 2 2 2 2 2 2 2 2 2 2 1 1 1 1 1 1 1 0 0 0 0 0 0 0]
    ainsi si on calcule le nombre Ni de répétition du nbr i on peut générer le sinus sans utiliser d'espace mémoire du tout

    example pour illustrer :
    dans le cas (*) on a
    le nbre de 3 est N3=6
    le nbre de 2 est N2= 10
    le nbre de 1 est N1= 7
    le nbre de 0 est N0= 7
    pour généere le sinus on fais :
    1) registre A<- 0
    2) pour i= 0 to 3 faire
    pour j= 0 to Ni faire
    A<- A+ i
    sortir A
    fpourj
    fpouri
    et c tout

    PS: pour générer les valeurs de D(i) une optimisation de l'algorithme est encore possible vu que lorsqu'on stock les valeurs de D(i) l'arrondi en entier induit des erreures qui peuvnent s'accumuler. l'idée serai d'introduire les anciennes valeures des D(k) (k de 1->i-1) pour calculer le D(i)....
    "Emptyness is filling me to the point of agony..."

  12. #12
    Futur Membre du Club
    Profil pro
    Inscrit en
    Février 2003
    Messages
    8
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Février 2003
    Messages : 8
    Points : 9
    Points
    9
    Par défaut
    Pour calculer le resultat de l'opperation sinx, il existe un truc trés simple, mais de la a dire comment l'implementer en asm...
    Cela dit cella s'appelle la suite de Taylor (ou celle de Mc Laurin pour le x <= 1).
    Le principe est simple (plus ou moins); c'est d'ailleur celui utilisée en grande partie dans un instrument qui est la calculette. Cela démontre la grande rapidité de la technique.
    Cela dit je ne suis pas sur de la suite a 100% et il en faut un e trés bonne connaissance afin de pourvoir l'utiliser dans un programme de facon valable.
    Je te conseile de chercher dans ce sens.

  13. #13
    Membre éclairé
    Profil pro
    Inscrit en
    Juillet 2002
    Messages
    842
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2002
    Messages : 842
    Points : 696
    Points
    696
    Par défaut
    oui ce sont les D.L. cités plus hauts plusieures fois Thomas. C'est pas mal la compression, mais j'ai l'impression que c'est un peu long a calculer. Enfin tout dépend de la rapidité dont vous avez besoin. Il n'y a peut etre pas besoin d'une telle economie si ?

  14. #14
    Futur Membre du Club
    Profil pro
    Inscrit en
    Février 2003
    Messages
    8
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Février 2003
    Messages : 8
    Points : 9
    Points
    9
    Par défaut
    a mon avis il s'agit de la meilleur façon de faire sans recourire à un code externe. S'il veut crér un code uniquement pour sinx sans s'encombrer d'un grande librairie mathématique...

Discussions similaires

  1. Calculer un sin hyperbolique
    Par quentinh390 dans le forum C
    Réponses: 5
    Dernier message: 28/09/2008, 15h12
  2. [TP7] Calculer sin, cos, tan, sqrt via le FPU
    Par zdra dans le forum Assembleur
    Réponses: 8
    Dernier message: 25/11/2002, 05h09
  3. Calcul des numéros de semaine d'un calendrier
    Par Invité dans le forum Algorithmes et structures de données
    Réponses: 4
    Dernier message: 06/11/2002, 22h29
  4. Récupérer 10 nb différents avec un calcul aléatoire
    Par BXDSPORT dans le forum Langage
    Réponses: 3
    Dernier message: 04/08/2002, 03h35
  5. Algo de calcul de FFT
    Par djlex03 dans le forum Traitement du signal
    Réponses: 15
    Dernier message: 02/08/2002, 18h45

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