Convertisseur Analogique numérique pic 18f
Répondre à la discussion
Page 1 sur 2 1 DernièreDernière
Affichage des résultats 1 à 30 sur 47

Convertisseur Analogique numérique pic 18f



  1. #1
    Ticlem

    Convertisseur Analogique numérique pic 18f


    ------

    Bonjours à tous,

    Je viens vers vous au sujet des CAN des pic 18F.

    J'arrive à l'aide d'exemple à configurer les registres associés et à réaliser une acquisition de mes signaux analogiques mais sans grande maitrise... merci google.

    J'aimerai comprendre un peu mieux les can de manière global sur le choix de la résolution, le choix de l'horloge (bit ADCS), le temps de conversion....
    Ceci afin de mettre en place une conversion sans devoir chercher des exemples et quelque soit le signal d'entrée.

    Je suis donc ouvert à toutes les informations, formules utiles et autres.

    Merci d'avance et joyeuse Pâques

    -----

  2. #2
    Ticlem

    Re : Convertisseur Analogique numérique pic 18f

    Je vais deja donné mes bases, vous verez il me manque pas mal de savoir! Je suppose que je mesure une donnée entre Mmin et Mmax.
    Mon capteur me fournis donc une tension entre VMmin et VMmax. Je suppose qu'avec un pont diviseur de tension ou autre composant electronique la tension d'entree dans le pic est comprise entre Vref+ et Vref-.

    Je suppose que j'utilise toujours les 10bits de mon can. J'ai donc un quantum de q=Vref+/2"n.

    La resolution sera egale à VMmax-VMmin/q

    Une fois que le resultat de ADRESH et ADRESL ont ete reuni dans une valeur 16bits le resultat (que je nomme resultat) sera donc egale à resolution*resultat en volt. Et pout obtenir l'unite du capteur ben sa depend du capteur.

    Voila corrigez mes erreurs, mais mes connaissances reste faible!

  3. #3
    RISC

    Re : Convertisseur Analogique numérique pic 18f

    Salut,

    Il existe des exemples et tutoriels sur internet pour les PIC18 :

    * EXCELLENT cours universitaire sur tous les périphériques des PIC18 :http://www.ece.msstate.edu/courses/e...dex_pic18.html
    Le professeur (REESE) a d'ailleurs écrit plusieurs livres en anglais de très bonne qualité sur les PIC18 et PIC24H.
    Exemple très détaillé pour les CAN et CNA : http://www.ece.msstate.edu/courses/e...p12_adcdac.pdf

    * tutoriel en français : http://www.aix-mrs.iufm.fr/formation...indexPIC_C.htm

    * exemples de code pour les PIC18 : http://www.microchip.com/codeexamples

    Pour le convertisseur A/N des PIC18 il suffit de faire ceci pour récupérer le résultat d'un ADC 10 ou 12 bits) :
    (en ayant pris soin de choisir la justification à droite...)
    Code:
    unsigned int RESULTAT;
    RESULTAT = (ADRESH << 8) + ADRESL;   // multiplier par 256 ADRESH et ajouter ADRESL
    a+

  4. #4
    Ticlem

    Re : Convertisseur Analogique numérique pic 18f

    Super merci beaucoup, encore de bonne lecture

  5. A voir en vidéo sur Futura
  6. #5
    Ticlem

    Re : Convertisseur Analogique numérique pic 18f

    Salut a tous,

    Une question me vient a l'esprit, comment fait on lorsque le resultat depasse les deux fois 8bits de ADRESH et ADRESL. Il faut diminuer la resolution? Donc soit vref+ et vref- ou le nombre de bit mais comment fait on si on a 5 capteurs analogique avec une resoltion differente a traiter?

    Merci de votre aide bonne soiree

  7. #6
    RISC

    Re : Convertisseur Analogique numérique pic 18f

    Salut,

    Le résultat ne peut pas excéder 10 bits ou 12 bits car les convertisseurs des PIC18 sont sur 10 bits ou 12 bits.
    Donc au plus tu auras :

    RESULTAT = 0x3FF (sur 10 bits)
    RESULTAT = 0xFFF (sur 12 bits)

    Ta tension d'entrée Vin ne peut PAS dépasser AVdd = Vdd = 5V ou tu endommagera le PIC....

    Si ta tension d'entrée est plus élevée il faur faire un pont de résistances pour réduire l'ampitude de Vin.

    Tu trouveras plein de tutos sur les PIC18 ici : http://bepelectronique.free.fr/index...=62&Itemid=219

    a+

  8. #7
    Ticlem

    Re : Convertisseur Analogique numérique pic 18f

    Merci pour votre réponse je vais regarder tout ça mais mon problème est :

    J'ai Vref+ =5V et Vref-=0V, mon convertisseur fait 10bits.

    Voici mon code
    Code:
    while(PORTAbits.RA4 & 1)
    	{		ADCON0bits.CHS0=0;	ADCON0bits.CHS1=0;	ADCON0bits.CHS2=0;
    			mesure();
    			SetDDRamAddr(0);	// positionne le curseur en x,y
    			fprintf(_H_USER,"Thuile=");
    			adcvalue = 0;
    			adcvalue =adcvalue | (ADRESH << 8);
    			adcvalue =adcvalue | (ADRESL);
    			Vin=(float)adcvalue*q;			// calcule la tension
    			ftoa(Vin,chaine,2,'f');		// convertit en chaine
        		SetDDRamAddr(8);
    			putsXLCD(chaine);
    			SetDDRamAddr(13);
    			fprintf(_H_USER,"V");
    Tout fonctionne super jusqu'à ce que me capteur envoi 1.25V ce qui correspond pile-poil à une valeur numérique de 256 soit 100000000 en binaire. Et là le convertisseur recommence à 0.

    Ou est mon erreur?

  9. #8
    Jack
    Modérateur

    Re : Convertisseur Analogique numérique pic 18f

    Débogue et pas à pas en regardant le contenu des variables lorsque tu dépasse 1,25V et tu verras bien la ligne en cause.

    A+

  10. #9
    RISC

    Re : Convertisseur Analogique numérique pic 18f

    Salut,

    Es-tu sur que tu as déclaré :

    unsigned int adcvalue; // adcvalue est un entier sur 16 bits sur le C18

    Es-tu sur que ta conversion ftoa est correcte ??

    Comme l'a dit Jack il FAUT utiliser le mode debug de MPLAB.
    Fais un point d'arrêt, mets les variables dans la fenêtre WATCH et regarde leur valeur ...

    a+

  11. #10
    Ticlem

    Re : Convertisseur Analogique numérique pic 18f

    Citation Envoyé par RISC Voir le message
    Es-tu sur que tu as déclaré :

    unsigned int adcvalue; // adcvalue est un entier sur 16 bits sur le C18
    Ben j'avais déclaré comme long mais c'est changé et j'ai toujours le problème

    Citation Envoyé par RISC Voir le message
    Es-tu sur que ta conversion ftoa est correcte ??
    Oui, c'est la conversion fournise par les cours de aix-marseille donc je pense approuvé plusieurs fois et sur mon afficheur la valeur est juste.

    Citation Envoyé par RISC Voir le message
    Comme l'a dit Jack il FAUT utiliser le mode debug de MPLAB.
    Fais un point d'arrêt, mets les variables dans la fenêtre WATCH et regarde leur valeur ...

    a+
    En effet, il y a rien de mieux, voilà ce qui se passe:

    Pour 1,24V j'ai ADRESL=0xFE et ADRESH=0x00
    et adcvalue prend les valeurs suivantes:
    adcvalue=0x0000;
    adcvalue=0x0007;
    adcvalue=0x00FF;

    Pour 1,25V j'ai ADRESL=0x00 et ADRESH=0x01
    et adcvalue prend les valeurs suivantes:
    adcvalue=0x0000;
    adcvalue=0x0007;
    adcvalue=0x0007;

    donc mon problème vient lorsque j'essai de regrouper les deux registres ADRESH et ADRESL en un seul appelé adcvalue.

  12. #11
    Ticlem

    Re : Convertisseur Analogique numérique pic 18f

    En cherchant un peu j'ai vu que le registre ADRES regroupait directement ADRESH et ADRESL à condition d'etre justifié à droite.
    J'ai donc simplement écris adcvalue=ADRES et c'est bon je peux dépasser les 1.25V.

    Merci de votre aide

  13. #12
    Jack
    Modérateur

    Re : Convertisseur Analogique numérique pic 18f

    Pour 1,25V j'ai ADRESL=0x00 et ADRESH=0x01
    ce qui est normal.
    Mais il faudra m'expliquer comment
    Code:
    adcvalue = adcvalue | (ADRESH << 8);
    peut donner 0x07 avec adcvalue = 0 avant l'instruction.

    A mon avis, tu ne peux pas traiter un registre comme une variable, en particulier pour le décalage. Je te conseille de mémoriser ADRESH et ADRESL dans des variables avant d'effectuer le calcul et tout devrait rentrer dans l'ordre.

    A+

  14. #13
    RISC

    Re : Convertisseur Analogique numérique pic 18f

    Salut Jack,

    Tu as certainement raison. J'ai oublié de caster ADRESH en int
    Je suppose que cela devrait résoudre le PB :

    Code:
    unsigned int RESULTAT;
    RESULTAT = (int)(ADRESH << 8) + ADRESL;   // multiplier par 256 ADRESH et ajouter ADRESL
    Cela dit si ADRES existe comme TICLEM le mentionne pas besoin de s'ennuyer :
    Code:
    unsigned int RESULTAT;
    RESULTAT = ADRES;
    C'est encore plus simple ;=)

    a+

  15. #14
    Ticlem

    Re : Convertisseur Analogique numérique pic 18f

    Je n'ai pas essayer de mettre (int) comme le suggère RISC mais sans aucun doute le registre ADRES existe bel et bien.

    Donc ma conversion est plutot juste est j'ai bien la précision que j'avais calculé donc super. Par contre j'ai ce message d'erreur lorsque que je simule avec proteus :

    [PIC18 ADC] PC=0x1AD8. ADC conversion started before 'wait' time has expired following previous conversion or channel change.

    Voici mon code:

    Code:
    // CD 01/2005
    // test printf sur PICDEM2+ et MCC18 v2.40
    #include <p18f452.h>
    #include <stdio.h> 		// printf
    #include <xlcd.h>
    #include <math.h>
    
    
    #pragma config WDT = OFF
    
    
    /* %%%%%%%%%%%%%%%%%%%%%%% Resolution du convertisseur numérique q=(Vref+ - Vref-)/2^N %%%%%%%%%%%%%%%%%%%%%%%% */
    #define q 4.8828e-3	// quantum pour un CAN 10bits 0v-5v
    /* %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% */
    
    
    // Declaration des variable
    
    unsigned int adcvalue;
    char chaine[30];
    float Vin;
    float Tbat;
    float Temph;
    float Presh;
    
    
    
    // dirige user_putc vers l'afficheur LCD du PD2+
    
    int _user_putc (char c)
    {
    	putcXLCD(c);
    }
    
    
    
    /* %%%%%%%%%%%%%%%%%%%%%%% fonction de conversion en numérique %%%%%%%%%%%%%%%%%%%%%%%% */
    void mesure (void)
    {
    ADCON0bits.GO_DONE=1;		// SOC
    while(ADCON0bits.GO_DONE);	// attend EOC Ligne en cause d'après proteus
    adcvalue = ADRES; //reuni ADRESH et ADRESL (si justification à droite)
    Vin=(float)adcvalue*q;			// calcule la tension à partir de la valeur numérique avec q la résolution
    }
    /* %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% */
    
    
    
    
    /* %%%%%%%%%%%%%%%%%%%%%%% Conversion adc tension batterie (ecran 1) %%%%%%%%%%%%%%%%%%%%%%%% */
    void tension (void)
    {			SetDDRamAddr(0);	// positionne le curseur en début de 1er ligne
    			fprintf(_H_USER,"Vbat=");
    			ADCON0bits.CHS0=0;	ADCON0bits.CHS1=0;	ADCON0bits.CHS2=1; //choix de la voie
    while(PORTAbits.RA4 & 1)
    	{ 		mesure();
    			Tbat=Vin+10;			// calcule la tension
    			ftoa(Tbat,chaine,1,'f');		// convertit en chaine
        		SetDDRamAddr(6);
    			putsXLCD(chaine);
    			SetDDRamAddr(12);
    			fprintf(_H_USER,"V");
    	}
    }
    /* %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% */
    
    
    
    
    
    /* %%%%%%%%%%%%%%%%%%%%%%% Conversion adc température et pression (ecran 2) %%%%%%%%%%%%%%%%%%%%%%%% */
    void temperature_et_pression (void)
    {			SetDDRamAddr(0);	// positionne le curseur sur début ligne 1
    			fprintf(_H_USER,"Thuile=");
    			SetDDRamAddr(0x40);	// positionne le curseur sur debut ligne 2
    			fprintf(_H_USER,"Phuile=");
    while(PORTAbits.RA4 & 1)
    	{		ADCON0bits.CHS0=0;	ADCON0bits.CHS1=0;	ADCON0bits.CHS2=0; //choix du la voie
    			mesure(); //fait la mesure
    			Temph=(Vin-0.5)/0.01;
    			ftoa(Temph,chaine,1,'f');		// convertit en chaine
        		SetDDRamAddr(8);
    			putsXLCD(chaine);
    			SetDDRamAddr(13);
    			fprintf(_H_USER,"Cel");
    
    			ADCON0bits.CHS0=1;	ADCON0bits.CHS1=0;	ADCON0bits.CHS2=0;
    			mesure(); //fait la mesure
    			Presh=(((Vin/5.1)-0.04)/0.00369)/100;
    			ftoa(Presh,chaine,2,'f');		// convertit en chaine
        		SetDDRamAddr(0x48);
    			putsXLCD(chaine);
    			SetDDRamAddr(0x4D);
    			fprintf(_H_USER,"Bars");
    	}
    }
    /* %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% */
    
    
    
    
    
    
    /* %%%%%%%%%%%%%%%%%%%%%%% Appui sur le bouton %%%%%%%%%%%%%%%%%%%%%%%% */
    void touche(void)
    {
    while(!(PORTAbits.RA4 & 1))
     // efface l'afficheur LCD
     SetDDRamAddr(0);
     fprintf(_H_USER,"                    ");
     SetDDRamAddr(0x40);
     fprintf(_H_USER,"                    ");
     WriteCmdXLCD( CURSOR_OFF & BLINK_OFF);
    }
    /* %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% */
    
    
    
    
    /* %%%%%%%%%%%%%%%%%%%%%%% Programme principal %%%%%%%%%%%%%%%%%%%%%%%% */
    void main(void)
    {
    	TRISA=0b00111111;		// PORTA en entrée pour S2
    
    	ADCON0=0b11000001;
    	ADCON1=0b10000000;
    
    	SPBRG = 25; /* configure la vitesse (BAUD) 9600 N 8 1*/
    	TXSTA = 0x24;
    	RCSTA = 0x90; /* active l'USART*/
    
    	OpenXLCD(FOUR_BIT & LINES_5X7 );	//initialise PIC pour LCD sur PD2
    	WriteCmdXLCD( CURSOR_OFF & BLINK_OFF);
        SetDDRamAddr(0);					//ligne 0 de l'afficheur
    	fprintf (_H_USART, "Precisions de 0.488 degC et 0.2 kPa = 0.002 Bars"); // vers USART
    	
    	while(1)
    		{
    
    			temperature_et_pression();
    			touche();
    
    			tension();
    			touche();
    
    		
    
    		}
    }
    
    /* Position Curseur :
    #define L1C1				0x00			 positionnement du curseur ligne 1, colonne 1
    #define L1C2				0x01			 positionnement du curseur ligne 1, colonne 2
    #define L1C3				0x02			 positionnement du curseur ligne 1, colonne 3
    #define L1C4				0x03			 positionnement du curseur ligne 1, colonne 4
    #define L1C5				0x04			 positionnement du curseur ligne 1, colonne 5
    #define L1C6				0x05			 positionnement du curseur ligne 1, colonne 6
    #define L1C7				0x06			 positionnement du curseur ligne 1, colonne 7
    #define L1C8				0x07			 positionnement du curseur ligne 1, colonne 8
    #define L1C9				0x08			 positionnement du curseur ligne 1, colonne 9
    #define L1C10				0x09			 positionnement du curseur ligne 1, colonne 10
    #define L1C11				0x0A			 positionnement du curseur ligne 1, colonne 11
    #define L1C12				0x0B			 positionnement du curseur ligne 1, colonne 12
    #define L1C13				0x0C			 positionnement du curseur ligne 1, colonne 13
    #define L1C14				0x0D			 positionnement du curseur ligne 1, colonne 14
    #define L1C15				0x0E			 positionnement du curseur ligne 1, colonne 15
    #define L1C16				0x0F			 positionnement du curseur ligne 1, colonne 16
    #define L2C1				0x40			 positionnement du curseur ligne 2, colonne 1
    #define L2C2				0x41			 positionnement du curseur ligne 2, colonne 2
    #define L2C3				0x42			 positionnement du curseur ligne 2, colonne 3
    #define L2C4				0x43			 positionnement du curseur ligne 2, colonne 4
    #define L2C5				0x44			 positionnement du curseur ligne 2, colonne 5
    #define L2C6				0x45			 positionnement du curseur ligne 2, colonne 6
    #define L2C7				0x46			 positionnement du curseur ligne 2, colonne 7
    #define L2C8				0x47			 positionnement du curseur ligne 2, colonne 8
    #define L2C9				0x48			 positionnement du curseur ligne 2, colonne 9
    #define L2C10				0x49			 positionnement du curseur ligne 2, colonne 10
    #define L2C11				0x4A			 positionnement du curseur ligne 2, colonne 11
    #define L2C12				0x4B			 positionnement du curseur ligne 2, colonne 12
    #define L2C13				0x4C			 positionnement du curseur ligne 2, colonne 13
    #define L2C14				0x4D			 positionnement du curseur ligne 2, colonne 14
    #define L2C15				0x4E			 positionnement du curseur ligne 2, colonne 15
    #define L2C16				0x4F			 positionnement du curseur ligne 2, colonne 16
    */
    Je ne maitrise pas bien les temps necessaire mais je sais que j'ai respecté "The ADC clock period (Tad) cannot be less than 1.6 us" en selectionnant dans les registres ADCON1 et ADCON2 les bit tel que j'ai clock conversion = FRC (clock derived from the internal A/D RC oscillator). (j'ai pas envie de traduire de peur de faire une mauvaise traduction).

    Je ne sais pas bien vers ou chercher.

  16. #15
    Ticlem

    Re : Convertisseur Analogique numérique pic 18f

    Pas d'avis sur cette erreur?

  17. #16
    RISC

    Re : Convertisseur Analogique numérique pic 18f

    Salut,

    J'ai l'impression que tu n'as pas complètement et correctement initialisé ton convertisseur A/N.
    Il commencer par faire cela correctement.

    Retournes à mon post #3 et lis les exemples d'initialisation de l'ADC...


    Ton message d'erreur est très explicite : il FAUT attendre un certain temps entre 2 conversions (voir la datasheet). Apparemment ton setup viole cette spec...

    a+

  18. #17
    Ticlem

    Re : Convertisseur Analogique numérique pic 18f

    Salut, merci de ton aide

    J'ai lu tous les liens, cherché des exemples mais je seche un peu.

    J'ai un quartz de 20MHz j'ai donc modifié les bits ADCS2 et ADCS[0:1] de manière à avoir 32Tosc mais j'ai toujours l'erreur.

    JE ne vois pas ce que j'ai oublié d'initialiser.

    Dans mon application j'ai pas mal de capteur, je veux simplement afficher le résultat de chaque capteur sur chaque ligne du LCD et avec un bouton changer "d'ecran" et visualiser deux autres capteurs etc etc... c'est pour cela que je change de voie.

    Suis je obliger d'activer les interruptions adc? je ne pense pas avoir besoin de les utiliser dans mon cas.

    Mais mon niveau de novice ne me fait pas prendre assez de recule!

  19. #18
    Ticlem

    Re : Convertisseur Analogique numérique pic 18f

    J'ai vu qu'il existait dans le dossier de mcc18 un .h correspondant au convertisseur mais je n'en vois pas ce qui me manque!

  20. #19
    RISC

    Re : Convertisseur Analogique numérique pic 18f

    Salut,

    Quelle version du compilateur C30 utilises-tu ???
    J'ai cru voir que c'était la version v2.40...qui est très très ancienne...
    Si c'est le cas télécharge la dernière version du C18 Lite (v3.41 ?) et installe là : http://www.microchip.com/compilers

    Avant de faire un programme aussi complexe, commence par faire un tout petit programme qui ne fait que la conversion A/N.
    Ensuite tu pourras l'intégrer dans ton projet.

    a+

  21. #20
    Ticlem

    Re : Convertisseur Analogique numérique pic 18f

    Bonsoir, non non j'utilise bien la version v3.41

    J'ai essayé de reprendre étape par étape.
    Avec ce code :
    Code:
    /* Test de l'adc sur soft simple */
    // CD 01/2005
    // test printf sur PICDEM2+ et MCC18 v2.40
    #include <p18f452.h>
    #include <stdio.h> 		// printf
    #include <xlcd.h>
    #include <math.h>
    
    
    #pragma config WDT = OFF
    
    
    /* %%%%%%%%%%%%%%%%%%%%%%% Resolution du convertisseur numérique q=(Vref+ - Vref-)/2^N %%%%%%%%%%%%%%%%%%%%%%%% */
    #define q 4.8828e-3	// quantum pour un CAN 10bits 0v-5v
    /* %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% */
    
    
    // Declaration des variable
    
    unsigned int adcvalue;
    char chaine[30];
    float Vin;
    float Temph;
    float Presh;
    
    
    // dirige user_putc vers l'afficheur LCD du PD2+
    
    int _user_putc (char c)
    {
    	putcXLCD(c);
    }
    
    
    
    /* %%%%%%%%%%%%%%%%%%%%%%% fonction de conversion en numérique %%%%%%%%%%%%%%%%%%%%%%%% */
    void mesure (void)
    {
    ADCON0bits.GO_DONE=1;		// SOC
    while(ADCON0bits.GO_DONE);	// attend EOC
    adcvalue = ADRES; //reuni ADRESH et ADRESL (si justification à droite)
    Vin=(float)adcvalue*q;			// calcule la tension à partir de la valeur numérique avec q la résolution
    }
    /* %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% */
    
    
    
    /* %%%%%%%%%%%%%%%%%%%%%%% Conversion adc température %%%%%%%%%%%%%%%%%%%%%%%% */
    void temperature (void)
    {			SetDDRamAddr(0);	// positionne le curseur sur début ligne 1
    			fprintf(_H_USER,"Vin=");
    			SetDDRamAddr(0x40);	// positionne le curseur sur debut ligne 2
    			fprintf(_H_USER,"Temp=");
    		
    while(PORTAbits.RA4 & 1)
    		{	ADCON0bits.CHS0=0;	ADCON0bits.CHS1=0;	ADCON0bits.CHS2=0; //choix du la voie
    			mesure(); //fait la mesure
    			Temph=(Vin-0.5)/0.01;
    			ftoa(Temph,chaine,3,'f');		// convertit en chaine
        		SetDDRamAddr(0x46);
    			putsXLCD(chaine);
    			ftoa(Vin,chaine,3,'f');		// convertit en chaine
        		SetDDRamAddr(5);
    			putsXLCD(chaine);
        }
    }
    /* %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% */
    
    
    /* %%%%%%%%%%%%%%%%%%%%%%% Programme principal %%%%%%%%%%%%%%%%%%%%%%%% */
    void main(void)
    {
    	TRISA=0b00111111;		// PORTA en entrée pour S2
    
    	ADCON0=0b10000001;
    	ADCON1=0b10000000;
    
    	
    	while(1)
    		{
    
    			temperature();
    		}
    }
    Avec ce code je n'ai pas d'erreur du à l'ADC ni au programme, enfin je ne penses pas.
    Proteus indique comme message "Logic contentions detected on net #00005 ( et le même avec #00003)", la par contre je n'ai aucune idée de sa signification. Mais apparement c'est lorsque j'arrete la simulation.

    Du coup j'ajoute du code voici l'etape suivante :
    Code:
    /* Test de l'adc sur soft simple */
    // CD 01/2005
    // test printf sur PICDEM2+ et MCC18 v2.40
    #include <p18f452.h>
    #include <stdio.h> 		// printf
    #include <xlcd.h>
    #include <math.h>
    
    
    #pragma config WDT = OFF
    
    
    /* %%%%%%%%%%%%%%%%%%%%%%% Resolution du convertisseur numérique q=(Vref+ - Vref-)/2^N %%%%%%%%%%%%%%%%%%%%%%%% */
    #define q 4.8828e-3	// quantum pour un CAN 10bits 0v-5v
    /* %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% */
    
    
    // Declaration des variable
    
    unsigned int adcvalue;
    char chaine[30];
    float Vin;
    float Temph;
    float Presh;
    
    
    // dirige user_putc vers l'afficheur LCD du PD2+
    
    int _user_putc (char c)
    {
    	putcXLCD(c);
    }
    
    
    
    /* %%%%%%%%%%%%%%%%%%%%%%% fonction de conversion en numérique %%%%%%%%%%%%%%%%%%%%%%%% */
    void mesure (void)
    {
    ADCON0bits.GO_DONE=1;		// SOC
    while(ADCON0bits.GO_DONE);	// attend EOC
    adcvalue = ADRES; //reuni ADRESH et ADRESL (si justification à droite)
    Vin=(float)adcvalue*q;			// calcule la tension à partir de la valeur numérique avec q la résolution
    }
    /* %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% */
    
    
    
    /* %%%%%%%%%%%%%%%%%%%%%%% Conversion adc température %%%%%%%%%%%%%%%%%%%%%%%% */
    void temperature (void)
    {			SetDDRamAddr(0);	// positionne le curseur sur début ligne 1
    			fprintf(_H_USER,"Vin=");
    			SetDDRamAddr(0x40);	// positionne le curseur sur debut ligne 2
    			fprintf(_H_USER,"Temp=");
    			ADCON0bits.CHS0=0;	ADCON0bits.CHS1=0;	ADCON0bits.CHS2=0; //choix du la voie
    while(PORTAbits.RA4 & 1)
    		{	mesure(); //fait la mesure
    			Temph=(Vin-0.5)/0.01;
    			ftoa(Temph,chaine,3,'f');		// convertit en chaine
        		SetDDRamAddr(0x46);
    			putsXLCD(chaine);
    			ftoa(Vin,chaine,3,'f');		// convertit en chaine
        		SetDDRamAddr(5);
    			putsXLCD(chaine);
        }
    }
    /* %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% */
    
    /* %%%%%%%%%%%%%%%%%%%%%%% Conversion adc pression %%%%%%%%%%%%%%%%%%%%%%%% */
    void pression (void)
    {			SetDDRamAddr(0);	// positionne le curseur sur début ligne 1
    			fprintf(_H_USER,"Vin=");
    			SetDDRamAddr(0x40);	// positionne le curseur sur debut ligne 2
    			fprintf(_H_USER,"Pres=");
    			ADCON0bits.CHS0=1;	ADCON0bits.CHS1=0;	ADCON0bits.CHS2=0; //choix du la voie
    while(PORTAbits.RA4 & 1)
    {	 		mesure(); //fait la mesure
    			Presh=(((Vin/5.1)-0.04)/0.00369)/100;
    			ftoa(Presh,chaine,2,'f');		// convertit en chaine
        		SetDDRamAddr(0x46);
    			putsXLCD(chaine);
    			ftoa(Vin,chaine,3,'f');		// convertit en chaine
    			SetDDRamAddr(5);
    			putsXLCD(chaine);
    }
    }
    /* %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% */
    
    /* %%%%%%%%%%%%%%%%%%%%%%% Appui sur le bouton %%%%%%%%%%%%%%%%%%%%%%%% */
    void touche(void)
    {
    while(!(PORTAbits.RA4 & 1))
     // efface l'afficheur LCD
     SetDDRamAddr(0);
     fprintf(_H_USER,"                    ");
     SetDDRamAddr(0x40);
     fprintf(_H_USER,"                    ");
     WriteCmdXLCD( CURSOR_OFF & BLINK_OFF);
    }
    /* %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% */
    
    
    /* %%%%%%%%%%%%%%%%%%%%%%% Programme principal %%%%%%%%%%%%%%%%%%%%%%%% */
    void main(void)
    {
    	TRISA=0b00111111;		// PORTA en entrée pour S2
    
    	ADCON0=0b10000001;
    	ADCON1=0b10000000;
    
    
    	while(1)
    		{
    
    			temperature();
    			touche();
    
    			pression();
    			touche();
    		}
    }
    Avec ce code le message d'erreur "[PIC18 ADC] PC=0x1AD6. ADC conversion started before 'wait' time has expired following previous conversion or channel change" apparait à chaque fois que j'appuie sur le bouton afin d'activer la fonction touche.

    Du coup le problème ne vient pas de la configuration de mon adc. Mais bien du passage entre les deux fonctions temperature et pression. Donc comment faire pour afficher la valeur demes différent capteur sur l'ecran avec un bouton de selection?

    Merci de votre aide en tout cas
    Dernière modification par Ticlem ; 25/04/2012 à 22h36.

  22. #21
    RISC

    Re : Convertisseur Analogique numérique pic 18f

    Salut,

    Tu vas avoir de gros problèmes...tu fais "virtuellement" tourner ton PIC sur l'oscillateur interne...4MHz je crois.
    Avec te calculs flottants et tes printf, tu assomes ton PIC18 !!!
    Commence par lire le chapitre sur les "Special features" et ajoute un quartz 10MHz à ton schéma. Puis tu actives la PLL x4.
    Ton PIC pourra ainsi tourner à 40MHz au lieu de 4MHz...

    a+

  23. #22
    Ticlem

    Re : Convertisseur Analogique numérique pic 18f

    Salut,

    Merci de ton aide,

    Actuellement j'ai mis un quartz de 20MHz avec deux condo de 33pF et j'ai bien modifier dans Mplab l'oscillateur sur HS. Et je n'ai pas activé de PLL, j'ai meme rien touché je maitrise pas bien.

    Mais sinon quand je double clique sur le pic l'oscillateur interne est bien de 4MHz.

    S'il faut je peux envoyer les fichiers ISIS

  24. #23
    RISC

    Re : Convertisseur Analogique numérique pic 18f

    Salut,

    Quel PIC utilises-tu ? (Apparemment un très vieux PIC18F452...)
    Pourquoi ne pas utiliser un PIC18F4520 plus récent.
    Si tu mets un quartz mais que tu ne configures pas les bits de configuration...cela ne sert à rien puisque tu continues à utiliser l'oscillateur interne.
    Je t'ai donné plusieurs liens LIS LES. Certains exemples de programmes initialisent les bits de configuration au début ( #pragma config... )

    Pour ce qui concerne ton schéma ISIS, poste le sur le forum

    a+
    Poste ton schéma

  25. #24
    Ticlem

    Re : Convertisseur Analogique numérique pic 18f

    Citation Envoyé par RISC Voir le message
    Salut,

    Quel PIC utilises-tu ? (Apparemment un très vieux PIC18F452...)
    Pourquoi ne pas utiliser un PIC18F4520 plus récent.
    Si tu mets un quartz mais que tu ne configures pas les bits de configuration...cela ne sert à rien puisque tu continues à utiliser l'oscillateur interne.
    Je t'ai donné plusieurs liens LIS LES. Certains exemples de programmes initialisent les bits de configuration au début ( #pragma config... )

    Pour ce qui concerne ton schéma ISIS, poste le sur le forum

    a+
    Poste ton schéma
    Alors j'utilise le pic 18f452 car c'est celui utilisé dans les cours de aix-mrs, que je lis encore et encore, je l'ai mis sur mon téléphone, imprimé, bref je le lis mais je suis novice et des notions peuvent m'échapper même si je fais de mon mieux. Mais ca ne me dérange pas de changer de pic, ce n'ai que ma base de départ ce 18f452.
    Concernant les bits de configuration effectivement j'ai pas mis de #pragma config mais maintenant (si j'ai bien compris) avec mplab dans la fenêtre "configure" puis "configuration bits" on peut les programmer sans devoir les ecrires dans le .c et c'est que je fais donc j'ai bien configurer l'oscillateur en HS.
    Images attachées Images attachées  
    Dernière modification par Ticlem ; 27/04/2012 à 22h37.

  26. #25
    invite03481543

    Re : Convertisseur Analogique numérique pic 18f

    Salut,

    vérifie juste que tu as sélectionné la bonne valeur de quartz dans ton simulimachin...
    @+

  27. #26
    Ticlem

    Re : Convertisseur Analogique numérique pic 18f

    Salut à tous,

    Oui oui j'ai bien mis 20hz sur proteus.

    Je n'arrive pas à transmettre le .DSN de ISIS, si vous le savez je peux vous le transmettre.

    Je lance le programme avec la fonction Debug with proteus dans Mplab, donc je ne sors jamais l'environnement Mplab pour tester le programme.

    Je ne vois pas où est ce que j'aurai fait une erreur sur le quartz ou le temps.

  28. #27
    Ticlem

    Re : Convertisseur Analogique numérique pic 18f

    Pas de reponse, si je realise mon projet sur platine avec un quartz de 20MHz sa tournerai bien alors?

  29. #28
    invite03481543

    Re : Convertisseur Analogique numérique pic 18f

    Pour compiler ton prog dans MPLAB selectionne "release" et non pas "debug".
    Tu generes ton Hex puis tu l'importe dans ISIS, puis tu testes.

    Sinon rien ne justifie un quartz 20MHz dans cette application, si ca ne marche toujours pas recommence avec 4MHz ca ira bien, tu selectionneras XT dans ce cas.
    @+

  30. #29
    RISC

    Re : Convertisseur Analogique numérique pic 18f

    Salut,
    Citation Envoyé par Ticlem Voir le message
    Concernant les bits de configuration effectivement j'ai pas mis de #pragma config mais maintenant (si j'ai bien compris) avec mplab dans la fenêtre "configure" puis "configuration bits" on peut les programmer sans devoir les ecrires dans le .c et c'est que je fais donc j'ai bien configurer l'oscillateur en HS.
    NON si tu fais comme cela tu vas avoir des problèmes.
    Suis les conseils que je t'ai deja donnés et ne suppose pas si tu ne sais pas...
    Programme les bits de configuration DANS LE PROGRAMME en utilisant #pragma config ...

    C'est la seule méthode qui marche TOUJOURS quelquesoit le debugger (Proteus, vrai simulateur , outil,...
    a+
    Dernière modification par RISC ; 30/04/2012 à 22h28.

  31. #30
    Ticlem

    Re : Convertisseur Analogique numérique pic 18f

    Bonjour à tous,

    J'ai suivi tout vos conseils mais le problême est toujours là.
    Du coup j'ai une hypothèse, le soucis peut venir du bouton que j'utilise pour pouvoir switcher d'un capteur à l'autre. Cette raison est d'autant plus vrai que le message d'erreur n'apparait que lorsque j'appuie sur le bouton ( ou inversement je n'ai pas ce message d'erreur tant que je n'appuie pas sur le bouton).

    Aurais je un autre moyen de gérer ce changement de voie de conversion?

    Merci de votre aide

Page 1 sur 2 1 DernièreDernière

Discussions similaires

  1. Convertisseur Analogique-Numerique
    Par tonyjk dans le forum Électronique
    Réponses: 8
    Dernier message: 24/03/2012, 17h07
  2. Convertisseur analogique/numerique
    Par zanzeoo dans le forum Électronique
    Réponses: 9
    Dernier message: 29/02/2012, 11h52
  3. Convertisseur analogique numérique
    Par invite0802bd67 dans le forum Électronique
    Réponses: 4
    Dernier message: 05/03/2011, 18h20
  4. Convertisseur analogique -> numérique
    Par inviteb5e46059 dans le forum Électronique
    Réponses: 2
    Dernier message: 13/02/2010, 19h17
  5. Convertisseur analogique numérique
    Par mrpatate212 dans le forum Électronique
    Réponses: 13
    Dernier message: 23/12/2007, 21h26
Découvrez nos comparatifs produits sur l'informatique et les technologies.