Bonjour à tous,
Dans un premier temps, merci à ceux qui prendront le temps de lire ceci et de m'aider.
Avant de poser ma question, voici le détail de mon application:
- J'utilise un µC PIC16F1937-I/P en 40 broches que je programme avec MPLAB IDE via un ICD 3 de microchip. Le compilo utilisé est HI-TEC-C.
- L'application est relativement simple, il s'agit d'une lecture analogique de 3 tensions (un réglage de vitesse via un potentiomètre sur RA0/AN0, un niveau de luminosité via une LDR sur RA1/AN1, une température via une CTN sur RA2/AN2).
- Le schéma HW est celui-ci:
J'ai dans un premier temps paramétré l'ADC et mes ports comme suit (Je mets le paramétrage en entier mais seul le PORTA vous interessera):
Code c : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19 void main(void) { //ADC configuration ADCON0=0; // select Fosc/2 ADCON1=0; // select left justify result. A/D port configuration 0 ADON=1; // turn on the A2D conversion module //Définition des E/S pour chaque Port ANSELA = 0b00000111; //RA0, RA1 et RA2 en analogique. 1 = Analogique ANSELB = 0x00; //Port B en numérique. 0 = Numérique ANSELE = 0x00; //Port E en numérique. TRISA = 0b10111111; //RA6 en sortie. 1 = Entrée, 0 = sortie TRISB = 0x00; //Port B en sortie TRISC = 0x00; //Port C en sortie TRISD = 0x00; //Port D en sortie TRISE = 0b00000111; //RE0 RE1 et RE2 en entrée, }
J'ai dans un second temps, intégrer la fonction locale (en dehors du main) read_a2d qui est la suivante:
Code c : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11 //Fonction locale n°1A : Lecture tension analogique unsigned char read_a2d(unsigned char channel) { channel&=0x07; // truncate channel to 3 bits ADCON0&=0xC5; // clear current channel select ADCON0|=(channel<<3); // apply the new channel select ADGO=1; // initiate conversion on the selected channel while(ADGO)continue; return(ADRESH); // return 8 MSB of the result }
Puis une fois cela fait, j'ai ensuite écrit les 3 fonctions locales (en dehors du main) permettant de lire la LDR, le potentiomètre et la CTN. Et c'est là que vous allez constater mon gros level en C ;-)
Code c : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7 //Fonction locale n°1B : Lecture_consigne_vitesse unsigned char lecture_consigne_vitesse(void) { tension_vitesse = read_a2d(0); //Lecture tension potar vitesse sur RA0/AN0. return(tension_vitesse); //Renvoi de la valeur. }
Code c : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7 //Fonction locale n°1C : Mesurer la luminosité ambiante unsigned char mesurer_luminosite(void) { tension_ldr = read_a2d(1); //Lecture tension LDR sur RA1/AN1. return(tension_ldr); //Renvoi de la valeur. }
Code c : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7 //Fonction locale n°1D : Mesurer la température sur CTN unsigned char mesurer_temperature(void) { tension_ctn = read_a2d(2); //Lecture tension CTN sur RA2/AN2. return(tension_ctn); //Renvoi de la valeur. }
J'appelle ensuite ces 3 fonctions de manière régulière et indépendante dans une boucle while(1) lors de l'execution de mon programme. Sauf que voilà... il y a que la fonction Lecture_consigne_vitesse() sur la voie RAO/AN0 qui fonctionne, les autres ne fonctionnent pas.
Les variables tension_ldr et tension_ctn restent à la valeur a laquelle elles ont été initiées lorsque je les ai créées...
Après de multiples recherches sur le net, j'ai constaté que pour une lecture sur RA0/AN0, le paramètre "channel" de la fonction read_a2d(channel) est à 1. J'ai donc aussi essayé read_a2d(1) pour une lecture sur AN0/RA0 et là stupeur, la lecture du potentiomètre fonctionne toujours...
Je suis donc incapable de sélectionner correctement le channel de l'ADC que je souhaite lire (AN0, AN1 ou AN2), et je soupçonne que la lecture sur AN0/RA0 écrase tout le reste, je sollicite donc votre aide car depuis le temps que je suis dessus, j'ai probablement perdu beaucoup de lucidité...
Merci d'avance.
Partager