|
Totofmex
18 messages
 De passage
|
17-01-2012 21:45
Bonjour,
Je voulais faire une conversion A/N avec un ATtiny45 qui possède 256 octets de RAM.
J’utilise AVRstudio5.0 et c’est du C.
Mon petit programme n’utilise rien comme mémoire et le fait de rajouter
float convertion = 0.0 ;
…
….
convertion = resultat * 5.0 / 1024.0;
la mémoire est pleine à 100 % lors du « Build ». Pour moi ce n’est pas normal car si j’ai bien compris un float ne prend que 4 octets. Il devrait me rester quand même pas mal de place.
Je suis donc allé sur les options de compilation pour changer les « optimization » et j’obtiens :
103,1 % avec l’option none
100% avec l’option -O1
100% avec l’option –O2
100% avec l’option –O3
Je n’ai pas touché à la config de AVRstudio (5.0.1223), c’est peut-être juste une mauvaise config.
C’est sur je pourrais prendre un ATtiny85 mais je ne l’ai pas sous la main et j’aimerais comprendre.
Quelqu’un a-t-il une idée ?
Merci
Christophe
Modifié par Totofmex
le 17-01-2012 21:50 Modifié par Totofmex
le 17-01-2012 21:51
|
|
Loblick
447 messages
 Habitué
|
18-01-2012 11:53
Bonjour,
Faire calculer, une division et une multiplication en float à un micro contrôleur 8 bits, disposant de 2k de flash et 256 octets de RAM, relève de la gageure... Ou de la blague de potache!
Je suppose que les float sont codés en IEEE32?
Je te conseille de jeter un œil sur la complexité du codage (en simplifiant, c'est du type M x 2^N, avec MN formant ton nombre sur 32 bits, en prenant comme exemple M codé sur 20 bits et M sur 12 bits)....
Je pense que tu comprendras par toi-même!!
Le mieux dans ce cas est de travailler en virgule fixe, donc avec des entiers sur 32 ou 16 bits... Le codage devient MN, avec M partie entière, N partie décimale.
|
|
Loblick
447 messages
 Habitué
|
18-01-2012 12:00
Pour reprendre ton exemple :
uint16 convertion = 0 ;
…
….
convertion = (uint16)( (uint32) resultat * 500 / 1024);
uint16 : entier non signé sur 16 bits
uint32 : entier non signé sur 32 bits
Le transtypage sur 32 bits est là pour éviter les débordements de calculs qui peuvent arriver lors de la multiplication par 500 (au maximum 1024 * 500 = 512 000, qui tient largement sur un uint32, mais pas sur un uint16)
Dans ce cas, tu récupères le résultat directement en dizaine de mV.
|
|
Totofmex
18 messages
 De passage
|
18-01-2012 17:39
Bonjour,
Merci pour ta réponse Loblick.
J'ai utilisé uint32 pour mes deux variables, ceci pour éviter le "cast".
Le résultat plus que surprenant, car on tombe à 0% de mémoire utilisée. En mode "debug" cela fonctionne bien. Je n'ai pas pu le tester sur ma maquette car j'ai des problèmes depuis ce matin avec mon programmateur. Concernant la formule, je suppose que tu voulais dire 5000 au lieu de 500 pour le 5V de la référence pour la conversion A/N.
Encore merci.
Christophe
|
|
Loblick
447 messages
 Habitué
|
18-01-2012 17:47
Bonjour Christophe,
Il ne manque pas un zéro...
convertion = (uint16)( (uint32) resultat * 500 / 1024); => résultat en dizaine de mV
convertion = (uint16)( (uint32) resultat * 5000 / 1024); => résultat en mV.
Ta conversion se fait en 10 bits (puisque tu divises par 1024)... Le LSB (pas de la quantification) fait 5V/1024 = 4.88mV.... Avec les bruits divers et variés, on peut travailler en dizaine de mV (équivalent à 2 chiffres après la virgule)
Voilà pour ses précisions!!
|