bonjour, je voudrais savoir si on peut faire des multiplications en C avec des nombres réels sur un pic16F877. En effet aprés une CAN je dois travailler sur la valeur acquise et la multipliée dans une boucle avec des nombres réels.
Cordialement
-----
Aujourd'hui
Publicité
21/09/2007, 20h52
#2
jiherve
Date d'inscription
juin 2006
Localisation
gironde
Âge
68
Messages
20 328
Re : nombres réels avec pic16F877
Bonsoir
Avec une bibliothèque adaptée sans doute , mais ce ne sont que des flottants un des nombreux sous ensembles rationnel des nombre réels !
JR
21/09/2007, 21h11
#3
RISC
Date d'inscription
novembre 2006
Messages
3 758
Re : nombres réels avec pic16F877
Bonjour,
Si tu souhaite faire des calculs en virgule flottante, il suffit d'utiliser un compilateur C capble de le faire.
Pour le PIC16F877, tu peux par exemple utiliser le compilateur C Piclite de Hitech : http://www.htsoft.com/products/compilers/PICClite.php
( version gratuite mais limitée )
Attention cependant : les calculs en virgule flottante peuvent être particulièrement lents sur les 8bits...car ils ne sont pas prévus pour cela.
Il existe différentes possibilités pour éviter ces calculs et rester en format entier (cherche sur internet) ou dans les thread existantes de ce forum.
Si vraiment tu dois faire ces calculs, je te conseille alors plûtot de prendre une architecture plus puissante comme les PIC18 ou PIC24 pour lesquels les compilateurs C sont en téléchargement gratuit (student edition) :
C18 : www.microchip.com/C18
C30 : www.microchip.com/C30
Dans le cas du C30, je te conseille alors le format propriétaire des "fractional" propre à Microchip qui permet de faire de la virgule flottante plus rapidement. L'astuce est que Microchip a prévu de formatter la sortie du CAN directement dans ce format donc pas besoin de conversion de format ;=)
a+
Dernière modification par RISC ; 21/09/2007 à 21h12.
Motif: correction
22/09/2007, 13h54
#4
MANOLOVIT
Date d'inscription
septembre 2007
Messages
5
Re : nombres réels avec pic16F877
Bonjour, je joins mon programme. En effet l'acquisition marche bien mais dés que je veux recuperer une valeur de la boucle for, j'ai une sortie trés bruitée. j'ai un compilateur CC5X. Je demande votre avis pour savoir si c'est possible que le pic16F877 soit capable de faire ces calculs.
Code:
#pragma chip PIC16F877A
//#pragma config = 0x3F39
#pragma delay(clock=20000000)
//#include <math24f.h>
#include "int16CXX.H"
unsigned char val_pot;
void pwm_init(void)
{
TRISC&=0xFD;//sortie CCP2 du PWM partagée avec bit(RC1)
CCP2CON=0x0F;//mode PWM pour CCP2
T2CON=0x04;//config timer 2 pour PWM
PR2=0xFF;//periode PWM = (PR2+1)*4*Tosc*prescalar timer 2
CCPR2L=0x80;//par exemple pour rapport cyclique de 50%
PORTA=1;
PORTB=0;
TRISA=1;
TRISB=0;
ADCON1=0x4E;//justif a gauche des 10 bits + 1 voie analogique AN0(4E-fosc/4)(0E-fosc/8)
ADCON0=0x01;//vitesse de conversion: Fosc/4-2.4Mhz- lecture AN0 (01-fosc/4)(41-fosc/8)
INTCON=1;//pas d'interrupt
ADIF=0;
ADIE=1;
PEIE=1;
}
////////////////////////////////////////////////////////////////////////////////////////////////
void main(void) {
// char chaine[16];//pour LCD
char val_sup ,val_pot, val_inf, sortie, sortiedef, val_test, val_testn, val_tpos, val_tneg;
char f,i,bi,wi;
static const b[7]={0,0.3204,1.4648,3.4790,6.2866,9.8724,13.7787};
static const w[7]={4.7048,-0.8861,-0.4005,-0.2508,-0.3078,-0.0736,-0.3211};
pwm_init();
val_pot=0;
val_inf=0;
sortiedef=0;
val_sup=0;
while (1) {
ADCON0|=0x04;//lance acquisition/conversion avec GO/DONE à 1
while (ADCON0&0x04);//tant que pas finie, on boucle
val_pot=ADRESH;// converison finie, lecture du résultat
val_sup = val_pot;
for(i=1;i<=7;i++)
{
bi=b[i];
wi=w[i];
sortie=0;
val_test=val_inf + bi;
val_testn=val_inf - bi;
val_tpos = val_sup - bi;
val_tneg = val_sup + bi;
if( val_sup > val_test){
sortie =(val_tpos);
sortie*=wi;}
else if(val_sup < val_testn){
sortie=(val_tneg);
sortie*=wi;}
else{sortie=val_inf;
sortie*=wi;}
sortiedef+=sortie;
}
val_inf = val_sup;
PORTB=sortiedef;
}
}
Dernière modification par HULK28 ; 24/09/2007 à 12h32.
Motif: Ajout des balises [CODE][/CODE] pour une meilleure lisibilité
Aujourd'hui
A voir en vidéo sur Futura
24/09/2007, 09h08
#5
MANOLOVIT
Date d'inscription
septembre 2007
Messages
5
Re : nombres réels avec pic16F877
Bonjour c encore moi, pour la boucle For je me suis trompé c'est de 1 jusqu'a 7.
Cordialement
Je l'ai corrigé.
Dernière modification par HULK28 ; 24/09/2007 à 12h34.
Motif: Correction dans la boucle for
24/09/2007, 12h30
#6
invite03481543
Date d'inscription
janvier 2006
Âge
57
Messages
17 734
Re : nombres réels avec pic16F877
Salut,
quand tu dis "bruité", tu entends quoi par là?
En général lorsqu'on veut fait une mesure d'une tension présentant une légère ondulation, on effectue par exemple 5 mesures (ou plus) et on fait la moyenne pour obtenir une valeur centrale représentative.
Tu peux également faire une série de mesures (itération) sur 10 acquisitions, exclure les valeurs min et max et moyenner le reste.
Je ne sais pas si c'est vraiment de cela dont tu veux parler.
@+
Dernière modification par HULK28 ; 24/09/2007 à 12h36.
Aujourd'hui
Publicité
24/09/2007, 16h03
#7
MANOLOVIT
Date d'inscription
septembre 2007
Messages
5
Re : nombres réels avec pic16F877
Ma question c'est juste de savoir si le pic16F877 est capable de parcourir la boucle et faire les calculs avec les nombres réels entre deux acquisitions.
24/09/2007, 18h55
#8
invite03481543
Date d'inscription
janvier 2006
Âge
57
Messages
17 734
Re : nombres réels avec pic16F877
Le problème est que tu déclares par exemple val_test en char or tu écris ici:
val_test=val_inf + bi;
avec bi étant un float, wi un float négatif, etc ...
Je n'ai pas regardé dans les détails mais il semble qu'il y ait des soucis comme ça à plusieurs niveaux.
@+