Bonjour à tous,
Pour un projet en électronique, je dois réaliser deux mesures avec un pic, une mesure de tension image du courant (avec un capteur LEM) et une mesure de tension. Dans un premier temps, j'ai réaliser un CAN sur mon PIC. J'arrive à le faire marcher, et je réalise ma mesure sans problème. J'affiche avec des LED les bits de poids fort de la tension mesurée.
Cependant, je n'arrive pas à en a utiliser 2.
Il est en effet, pas possible de faire deux mesure en même temps, je souhaite donc mesure dans une boucle en continue la mesure 1 puis la mesure 2.
Mon principe de code est le suivant :
- Initialisation générale
- Initialisation mesure 1 (Choix du channel A0)
- Mesure 1 et sauvegarde de la valeur
- Initialisation générale (pour tout remettre les paramétré par défaut)
- Initialisation mesure 2 (Choix du channel A1)
- Mesure 2 et sauvegarde de la valeur
- Calcul = Mesure 1 * Mesure 2
Pour savoir si les CAN fonctionnent bien, je souhaite afficher les bits de poids fort de la tension sur 4 led (C0, C1, C2, C3) et afficher les 4 autres bits de poids fort de l'autre tension sur 4 autres led (C4, C5, C6, C7).
Après plusieurs essais, cela ne fonctionne pas.... pourtant avec 1 seul CAN cela fonctionne bien...
MON CODE :En espérant que quelqu'un puisse m'aider,Code:#include <xc.h> #include <stdlib.h> #define _XTAL_FREQ 64000000 char resultHigh1; //Stockage mesure 1 char resultHigh2; //Stockage mesure 2 int puissance; //Valeur puissance void can_init(void) { ADCON0bits.ADON = 0; //Turn ADC Off ADREFbits.ADPREF = 00; //Tension max référence = VDD ADREFbits.ADNREF=0; // Tension min référence = GND ADCON0bits.ADCS = 0; // Fréquence du convertisseur fixée sur l'oscillateur interne ADCLK=0b00111111; // Fosc/128 = 2us ADCON0bits.ADFM =0; //Justification à gauche ADACT=0x00; //Pas de réinitialisation automatique } //On choisit de ne garder que le registre de poids fort : conversion sur 8 bits void can_init1(void) { TRISAbits.TRISA0 = 1; //Set RA0 to input ANSELAbits.ANSELA0 = 1; //Set RA0 to analog ADPCH = 0x00; //RA0 is Analog channel } void can_mesure1(void) { ADRESH=0; TRISC=0b00000000; //Port C en sortie pour l'affichage ANSELC=0x00; //Numérique ADCON0bits.ADON = 1; //Turn ADC On ADCON0bits.GO = 1; //Start conversion while (ADCON0bits.GO); //Wait for conversion done resultHigh1 = ADRESH; //Read result LATCbits.LATC0=ADRESHbits.ADRESH15; LATCbits.LATC1=ADRESHbits.ADRESH14; LATCbits.LATC2=ADRESHbits.ADRESH13; LATCbits.LATC3=ADRESHbits.ADRESH12; } void can_init2(void) { TRISAbits.TRISA1 = 1; //Set RA1 to input ANSELAbits.ANSELA1 = 1; //Set RA1 to analog ADPCH = 0x01; //RA1 is Analog channel } void can_mesure2(void) { ADRESH=0; TRISC=0b00000000; //Port C en sortie pour l'affichage ANSELC=0x00; //Numérique ADCON0bits.ADON = 1; //Turn ADC On ADCON0bits.GO = 1; //Start conversion while (ADCON0bits.GO); //Wait for conversion done resultHigh2 = ADRESH; //Read result LATCbits.LATC7=ADRESHbits.ADRESHbits.ADRESH15; LATCbits.LATC6=ADRESHbits.ADRESHbits.ADRESH14; LATCbits.LATC5=ADRESHbits.ADRESHbits.ADRESH13; LATCbits.LATC4=ADRESHbits.ADRESHbits.ADRESH12; } void calcul(void) { puissance=resultHigh1*resultHigh2; } void main(void) { while (1) { can_init can_init1(); can_mesure1(); can_init can_init2(); can_mesure2(); calcul(); } }[/I][/I]
Vincent
-----