Non, faut trouver la source de l´erreur...
Je regarderais ton sift ce soir si j´ai du temps parceque là je suis au boulot
-----
Non, faut trouver la source de l´erreur...
Je regarderais ton sift ce soir si j´ai du temps parceque là je suis au boulot
Je te remercie...
je recherche de mon coté... et je vous tiens au courant
Nicolas
Si ton compilo est malin oui ... sinon il fera une multiplication ... mais c'est pour pinailler ...
D'ailleur, tu m'as dit que :
Envoyé par Seb.26T'es sûr que c'est ADRESH*256+ADRESL qu'il faut faire ??? ... c'est pas plutôt (ADRESH<<2) | (ADRESL&0x03) ...Ce à quoi je t'ai répondu que c'etait pas pareil ...Envoyé par lil-vinceCitation:
c'est pas plutôt (ADRESH<<2) | (ADRESL&0x03)
Pour moi c´est la même chose...
Et entre temps, j'ai vu l'info sur le ADFM ... donc RAS ...
Et c'est bien ((unsigned short)ADRESH)<<8 + ADRESL qu'il faut faire ...
Son problème est donc ailleur ...
PS: il manque des ( ) dans la ligne ((unsigned short)ADRESH)<<8 + ADRESL
c'est (((unsigned short)ADRESH)<<8) + ADRESL qu'il faut mettre ...
Bon, je suis passé j'ai essayé ça:
et avec comme test:Code:Van1=(((unsigned short)ADRESH)<<8) + ADRESL; Van1=(float)Van1*q;
Avec comme tension en AN1 une tension qui varie entre 0 et 5 V, je suis reparti sur un truc tout simple...Code:if(Van1>2.5) { RA3=0; RA4=0; RA5=0; BUZZER=1; } else { RA3=1; RA4=1; RA5=1; BUZZER=0; }
Et la encore ça ne marche pas...
Bon je vais regarder ce qui cloche...
Encore merci
Nicolas
Si ça, ça ne marche pas ... regarde du coté de ton CAN ... il doit pas être activé ou un mauvais canal selectionné ... ou autre ...Bon, je suis passé j'ai essayé ça:
et avec comme test:Code:Van1=(((unsigned short)ADRESH)<<8) + ADRESL; Van1=(float)Van1*q;
Avec comme tension en AN1 une tension qui varie entre 0 et 5 V, je suis reparti sur un truc tout simple...Code:if(Van1>2.5) { RA3=0; RA4=0; RA5=0; BUZZER=1; } else { RA3=1; RA4=1; RA5=1; BUZZER=0; }
Et la encore ça ne marche pas...
Bon je vais regarder ce qui cloche...
Encore merci
Nicolas
Salut,
j'ai la flemme de tout relire mais en pourquoi ne fais-tu pas une attribution de valeur du résultat de conversion sur 10 bits avec 4 leds?
Tu vas me dire pourquoi 4 leds?
J'utilise ça quand je veux visualiser un résultat de conversion (je dispose toujours sur mes cartes proto de 4 leds qui me servent à débugger).
Le principe est de faire afficher en 3 temps les 10 bits de la conversion:
la 1ere série de 4 leds me donne le résultat des bits A0/A1/A2/A3
puis A4/A5/A6/A7 et enfin A8/A9.
Tu prévois une base de temps de 1s pour avoir le temps de visualiser le code et un BP pour déclencher la procédure de récupération des registres.
C'est 4 leds peuvent servir à tout type de surveillance (clignotement, accusé de réception d'une info, passage dans une boucle,....)
@+
bonsoir,
T´as bien déclaré toto en "int" ?toto = ((unsigned short)ADRESH)<<8 + ADRESL;
Sinon, même réponse que Seb.26, plonge toi dans ta doc pour vérifier que t´ais pas oublié une initialisation....
Ou commence par le test que te propose HULK, c´est une bonne idée pour être sur que ca vient du CAN et non pas de ton prog.
C´est une multiplication justement !?Si ton compilo est malin oui ... sinon il fera une multiplication
Pour Seb.26:
Tu le veux ton cable?... mais c'est pour pinailler ...
(j´ais demandé un devis aujourd´hui, faudra que je demande à mon patron si c´est possible)
Bonjour,
bon ce matin j'étais persuadé que ça allait marché...et bein....NON!!
Bon voila mon programme:
Et apres cela...pour une tension supérieure 1,72V les DELs sont éteintes et donc lorsque la tension est inférieur, elle sont allumées...allez savoir pourquoi... et ça pour q=4.89e-3 car pour 4.88e-3, elles ne s'allument jamais..et pour q=4.9e-3, les LEDs sont éteintes lorsque la tension est comprise entre 1,72 et 2,1V sinon elles s'allument....Code://fichier de declaration des registres internes du microcontroleur #include <p18f4525.h> #include <delays.h> #include <adc.h> #include <stdlib.h> //Déclaration des PORTXbits.RXX utilisés #define BUZZER PORTBbits.RB3 #define RA5 PORTAbits.RA5 #define RA4 PORTAbits.RA4 #define RA3 PORTAbits.RA3 //Déclaration des quantum #define q 4.8900e-3 // quantum pour un CAN 10bits 0v-5v //Configuration Bits #pragma config OSC = HS //OSCILLATOR #pragma const config FCMENB = OFF //Fail Safe Clock Monitor Disabled #pragma const config IESOB = OFF //Internal External Osc. Switch Disabled #pragma config PWRT = OFF //Power Up Timer Disabled #pragma const config BOR = BOHW //Brown Out Reset Enabled in HW, SBOREN disabled #pragma const config BORV = 20 //Brown Out Voltage : 2.0V #pragma config WDT = OFF //WATCHDOG HW Disabled - SW Controlled #pragma config DEBUG = OFF //DEBUG Disabled #pragma config LVP = OFF //Low Voltage Programming Disabled //Sous programmes void init_uc(void); void conv_AD_VBatt(void); void calculVbatt(void); //Déclarations des variables float Vbatt=0.00; float Van1=0.00; int toto; /*************************************************************************** *********************Programme Principal************************************ ***************************************************************************/ void main (void) { init_uc(); //Appel SP Initialisation du microcontroleur while(1) { conv_AD_VBatt(); if(Van1<2.5) { RA3=0; RA4=0; RA5=0; BUZZER=0; } if(Van1>=2.5) { RA3=1; RA4=1; RA5=1; BUZZER=0; } }//Fin While(1) }//Fin Programme Principal /*************************************************************************** Nom : void init_uc(void) Role : Configuration et initialisation des Ports E/S ---------------------------------------------------------------------------- Contraintes : Aucune Donnees en entree : Aucune Donnees en sortie : Aucune Donnees glob. modif. : Aucune *****************************************************************************/ void init_uc(void) { ADCON1=0x0D; // Configuration AN0 AN1 en analogique--reste en numérique TRISA=0x03; // PORTA en sortie sauf RA0 RA1 TRISB=0xC7; // RB0->RB2 & RB6-RB7 en entrée -- reste en sortie TRISC=0x00; // PORTC en sortie TRISD=0x00; // PORTD en sortie TRISE=0x00; // PORTE en sortie PORTA=0x00; // PORTB=0x00; /// PORTC=0x00; ////Initialisation à 0 des Ports PORTD=0x00; /// PORTE=0x00; // } /*************************************************************************** Nom : void conv_AD_VBatt(void) Role : ---------------------------------------------------------------------------- Contraintes : Aucune Donnees en entree : Aucune Donnees en sortie : Aucune Donnees glob. modif. : Aucune *****************************************************************************/ void conv_AD_VBatt(void) { ADCON0=0x05; // Sélection AN1 / CAN ON. ADCON2bits.ADFM=1; //justification a droite ADCON0bits.GO_DONE=1; // Start OC while(ADCON0bits.GO_DONE); // attend EOC ADCON0bits.GO_DONE=0; // End OC calculVbatt(); // Calcul de la tension batterie ADCON0=0x00; // CAN OFF. } /*************************************************************************** Nom : void calculVbatt(void) Role : Calcul de la température suite à la convAD ---------------------------------------------------------------------------- Contraintes : Aucune Donnees en entree : Aucune Donnees en sortie : Aucune Donnees glob. modif. : Aucune *****************************************************************************/ void calculVbatt(void) { toto=(((unsigned short)ADRESH)<<8) + ADRESL; Van1=(float)toto*q; //Van1 =(float)(ADRESH<<2 | ADRESL&0x03); //Van1 = (float)ADRESH; //Van1 = Van1*256 + (float)ADRESL; //Van1 = Van1*q; // calcul la tension sur AN1 //Tbatt=(float)(Van0*100-273.15); // Calcul de la température }
Bon je vais essayé autre chose!!!
Bonne journée a vous
Encore merci
Nicolas
Bon je viens de modifier la valeur de ADCON2bits.ADFM, je l'ai mis a 0...normalement je pensai que ça resemblerai a rien....mais non pas du tout ça marche d'où les drole de résultats trouvé tout a lheure...ça avance...
reste a trouver pourquoi j'ai un décalage, car pour le seuil 2,5 le changement d'état se fait 2,03V en entrée sur AN1...
Et surtout:
ADFM: A/D Result Format Select bit
1 = Right justified
0 = Left justified
Je serai donc en justification à gauche??la je ne comprend pas ...je vais y réfléchir...
Et peut on m'expliquer cette ligne SVP:
toto=(((unsigned short)ADRESH)<<8) + ADRESL;
Merci
void conv_AD_VBatt(void)
{
ADCON0=0x05; // Sélection AN1 / CAN ON.
ADCON2bits.ADFM=1; //justification a droite
ADCON0bits.GO_DONE=1; // Start OC
while(ADCON0bits.GO_DONE); // attend EOC
ADCON0bits.GO_DONE=0; // End OC cette ligne est inutile ADCON0 est mis à 0 quand la conversion est finie
calculVbatt(); // Calcul de la tension batterie
ADCON0=0x00; // CAN OFF.
}
il faut introduire une petite tempo de l'ordre de 25µs après avoir activé le convertisseur et avant de lancer une conversion.
Tu ne précise pas non plus au convertisseur la fréquence de conversion ( bits ADCS1:ADCS0)
void calculVbatt(void)
{
toto=(((unsigned short)ADRESH)<<8) + ADRESL;
Van1=(float)toto*q;
//Van1 =(float)(ADRESH<<2 | ADRESL&0x03);
//Van1 = (float)ADRESH;
//Van1 = Van1*256 + (float)ADRESL;
//Van1 = Van1*q; // calcul la tension sur AN1
//Tbatt=(float)(Van0*100-273.15); // Calcul de la température
}
Pourquoi ne pas faire:
Van1=ADRESH;
Van1<<=8;
Van1|=ADRESL; // le résultat de la conversion est contenu dans Van1
@+
ADFM: A/D Result Format Select bit
Bizarre, à mon avis c´est peut-être un hasard si ca marche comme ca...1 = Right justified
0 = Left justified
Je serai donc en justification à gauche??la je ne comprend pas ...je vais y réfléchir...
Tu décales les 2 bits de ADRESH (= 000000XX ) pour avoir XX 00000000Et peut on m'expliquer cette ligne SVP:
toto=(((unsigned short)ADRESH)<<8) + ADRESL;
et tu y ajoute ADRESL (ca remplace les 8 zeros par ADRESL) du coup tu as la forme XX XXXXXXXX (les 8 derniers bits sont ADRESL et les 2 premiers sont ceux qui étaient contenus dans ADRESH)
D´ailleurs, je me demandais si ca marche, car s´il fait le décalage dans ADRESH qui ne fait que 8 bits, il sort les bits utiles et tu as toujours 0 dans ADRESH...
Tu as essayé de rester en entiers pour tes comparaisons?
Sinon, un décalage (offset) peut s´expliquer par la qualité du convertisseur et du capteur, mais 10% ca fait beaucoup!
Donc essaye ce que t´as proposé HULK pendant que j´écrivais:D´ailleurs, je me demandais si ca marche, car s´il fait le décalage dans ADRESH qui ne fait que 8 bits, il sort les bits utiles et tu as toujours 0 dans ADRESH...
avec Van1 = entier et tu fais un comparaison avec des entiers...(et perso je remettrasi la jusification à droite)Pourquoi ne pas faire:
Van1=ADRESH;
Van1<<=8;
Van1|=ADRESL; // le résultat de la conversion est contenu dans Van1
PS: Je ne dit pas que ce que je te dis est ce qu´il faut faire, mais c´est ce que je ferais (décomposer et partir du plus simple -> générateeur de tension en entrée du convertisseur, travail en entier et même pourquoi pas des tests directement sur ADRESH et ADRESL, surtout sur ADRESH pour vérifier ta justification à droite)
D´ailleurs tu devrais essayer de faire:
int x;
x = ADRESH;
if (x == 1) // seuil environ 1,25V
{
RA3 = 1;
RA4 = 0;
RA5 = 0;
}
else if (x == 2) // seuil environ 2,5V
{
RA3 = 0;
RA4 = 1;
RA5 = 0;
}
else if (x == 3) // seuil environ 3, 75V
{
RA3 = 1;
RA4 = 1;
RA5 = 0;
}
else // inferieur à 1,25V
{
RA3 = 0;
RA4 = 0;
RA5 = 0;
}
Si ca ne s´allume pas aux bons endroit, c´est que la jhustification n´est pas bonne ou un autre problème dans le convertisseur...
D´ailleurs, c´est un peu le principe que te proposais HULK la première fois
Bon courage (je sais ce que c´est de se prendre la tête pendant plusieurs jours!)
Bon je viens d'essayer ce que vous m'avez proposé:
-justification a droite
-Calcul du résultat:
-et testVan1=ADRESH;
Van1<<=8;
Van1|=ADRESL;
et la j'ai RA4 qui est est égale à 1 pour une tension AN1 de 0 à 1,5V
et RA3 à 1 pour AN1 allant de 1,5V à 5....
Et t´as essayé mon dernier post?(utilise seulement ADRESH)int x;
x = ADRESH;
Et rajoute à la place de :
fait :else // inferieur à 1,25V
{
RA3 = 0;
RA4 = 0;
RA5 = 0;
}
else if (x == 0)// inferieur à 1,25V
{
RA3 = 0;
RA4 = 0;
RA5 = 0;
}
else
{
RA3 = 1;
RA4 = 1;
RA5 = 1;
}
Bon, déolé, mais j´éteint mon PC parsque sinon je bosse pas (de l´électronique sur un forum ou des cours, c´est pas facile...), je reviens surement vers midi
Mais je pense que tu devrais tester ca(pour comprendre le contenu d´ADREH), et si ca ne marche pas correctement, change la justification, etc...
@+
Fais marcher ton code en 8b déjà ... et comme proposé par HULK, visualise les bits de poids fort sur des led ... ...
T'as pas un debuggeur ???
Bon, l'erreur était au point de vue du temps, HULK ma mis sur la voie...
j'ai donc remis mon nez dans la documentation du convertisseur AN du 18F et j'obtiens comme convertion:
Donc je m'explique:Code:ADCON0=0x05; // Sélection AN1/ADON = 1. ADCON2=0x95; // Justification à droite/Tps d'acquisition=4Tad/Horloge de conversion=16Tosc ADCON0bits.GO_DONE=1; // Start Conversion A/N while(ADCON0bits.GO_DONE); // attend EOC ADCON0bits.GO_DONE=0; // Fin Conversion A/N
-ADCON0 -> sélection de l'entrée analogique / ADON=1 pour la mise en fonctionnement du conAD
-ADCON2 -> Justification à droite donc ADFM=1, et c'est la que ça change, pour les bits ACQT2:ACQT0, j'ai mis '010'=4Tad pour lasser un temps entre le démarrage du CAN et le début de la conversion et ensuite pour le choix de l'horloge de conversion, j'ai mis pour les bits ADCS2:ADCS0, '101'=Fosc16.
Et on connais la suite après...
et donc au final:
avec comme test:
j'obtiens:Code:x = ADRESH; if (x == 1) // seuil environ 1,25V { RA3 = 1; RA4 = 0; RA5 = 0; } else if (x == 2) // seuil environ 2,5V { RA3 = 0; RA4 = 1; RA5 = 0; } else if (x == 3) // seuil environ 3, 75V { RA3 = 1; RA4 = 1; RA5 = 0; } else if (x == 0)// inferieur à 1,25V { RA3 = 0; RA4 = 0; RA5 = 0; } else { RA3 = 1; RA4 = 1; RA5 = 1; }
RA3=RA4=RA5=0 pour an1 allant de 0v à 1,244V
RA3=1 et RA4=RA5=0 pour an1 allant de 1,244V à 2,48V
RA4=1 et RA3=RA5=0 pour an1 allant de 2,48V à 3,72V
et donc RA3=RA4=1 et RA5=0 pour An1 allant de 3,72 à 5V
Donc voili voila, et donc la on a bien la justification a droite, ensuite faut voir pour le décalage ....
Encore merci
bein....je vais surement passer pour un nul, mais j'ai l'ICD2, et je n'ai jamais débugger...je ne sais pas faire, et j'ai pas essayé...T'as pas un debuggeur ???
Et ben voila, je me doutais bien que c´était un problème d´initialisation mais j´avais pas trop le temps de me plonger dans ta doc...j'obtiens:
RA3=RA4=RA5=0 pour an1 allant de 0v à 1,244V
RA3=1 et RA4=RA5=0 pour an1 allant de 1,244V à 2,48V
RA4=1 et RA3=RA5=0 pour an1 allant de 2,48V à 3,72V
et donc RA3=RA4=1 et RA5=0 pour An1 allant de 3,72 à 5V
Bah maintenant, il suffit de faire soit à ma facon:
Van0 = (ADRESH*256 + ADRESL)*q;
soit comme t´as proposé Seb.26, avec un décalage à gauche d´ADRESH...
C´est pareil donc à toi de voir ce qui te parle le plus...
Et la, ca devrais marcher...
(Sinon, t´as compris le principe du test que je t´ais proposé(et que tu viens de faire)?)
Salut,
Alors, c'est le moment de s'y mettre...mais j'ai l'ICD2, et je n'ai jamais débugger...je ne sais pas faire, et j'ai pas essayé
Tu aurais déjà pu lire depuis longtemps les valeurs de l'ADC sans artifice.
David.
Ps: quand à "Van0 = (ADRESH*256 + ADRESL)*q" puisque tu es justifié à droite, pourquoi ne pas directement lire un 16bits au lieu de t'embeter avec des décalages & Co ... ??? ... genre en utilisant ADRES au lieu de ADRESH et ADRESL ...
( perso je pensais que tu étais justifié à gauche, donc qu'il fallait décaler, mais en fait t'as pas besoin dans ton cas ... )
Oui oui, on vient en faite vérifier l'état des 2 bits de ADRESH, si X=1, alors ADRESH=256 ,si x=2 ADRESH=512, et si x=3 ADRESH=768 et si x=0 ADRESH<768...(Sinon, t´as compris le principe du test que je t´ais proposé(et que tu viens de faire)?)
Par contre si vous savez faire avec l'ICD2 je veux bien apprendre ou si vous avez des documentations...
Merci d'avance
Nicolas
Pour ICD2 : tu deselectionne ton ICD2 dans le menu programmateur de MPLab, et tu le selectionne dans le menu Debuger ...
Ensuite, tu place un point d'arret ou tu veux ( double clic sur une ligne du source )
NB: pense à utiliser le fichier de link pour debug ( l'utilisation d'ICD2 bouffe quelques octets en RAM ... mais rien de mechant )
Par contre j'ai toujours un probleme pour le décalage de la tension....
pour q=4,88e-3, quand je fais un test avec un seuil à 2,5 V, en réalité le basculement se fait à 2,98V...
Bizarre...je pourrai combler cela en modifiant le coefficient q, mais jtrouve pas ça réglo!!!
Bah, moi je creuse à la mainEcrire du code sans debuggueur, ça revient un peu à vouloir creuser une piscine sans pelleteuse ...
J´utilise des MSP430 et je les programmes via le BSL donc pas moyen d´utiliser de debuggueur (à ma connaissance) mais vu que je travail avec une liaison série via hyperterminal, je peux afficher tout ce que je veux
Sinon, effectivement, les debuggueurs sont faits pour résoudre facilement ce genre de problème...
Pourtant:Par contre j'ai toujours un probleme pour le décalage de la tension....
Tes seuils sont correctent !j'obtiens:
RA3=RA4=RA5=0 pour an1 allant de 0v à 1,244V
RA3=1 et RA4=RA5=0 pour an1 allant de 1,244V à 2,48V
RA4=1 et RA3=RA5=0 pour an1 allant de 2,48V à 3,72V
et donc RA3=RA4=1 et RA5=0 pour An1 allant de 3,72 à 5V
Cherces dans ce que tu as fait dernièrement...
J'ai essayé d'utiliser le debbuger, mais jy comprend pas grand chose, j'arrive dans un fichier asm avec une fleche a gauche,,,
j'avai mi le break devant Van1=ADRES pour voir le résultat de la convertion, mais???
alors si quelqun peu men dire 2 mots...
En ce qui concerne le décalage, ça vient des tension de références pour le PIC?
La chose qui est faites apres est la multiplication par q, donc mon "q" est faux mais en théorie il est vraiCherces dans ce que tu as fait dernièrement...
et comme q est calculer pour Vdd=5V,...mais ce quest bizarre c'est en pratique Vdd=4.99 donc q serait donc de 4.87e-3 ce qui ne change quasi rien...
merci encore