Bonjour,
Voilà je programme un PIC18F4620 en C et j'aimerais utiliser mon ADC pour convertir un sinus en entrée (sur le pin AN1) d'une amplitude de 1V, un offset de 3V, et fréq de 50Hz, en une valeur numérique 10 bits comme le permet l'ADC.
Seulement voilà quand je tente de récupérer ADRESH et ADRESL (en les mettant en sortie sur PORTD pour ADRESL, et sur RB1 et RB2 pour les 2 bits de ADRESH) j'obiens 0 pour les deux registres (testé sur des LEDs via une simulation sur Proteus).
Il me semble avoir bien config les pins (I/0) et mon temps d'acquisition ainsi que le Tad respectent les contraintes.
Je commence vraiment à tourner en rond.. Si vous pouviez m'aiguiller c'est très aimable et ce sera plus qu'apprécié !
Merci
P.S: J'utilise INTOSC comme oscillateur, à une fréquence de 4MHz
Code:void interrupt myInterrupt(void) { if(ADIE && ADIF) { /* Steps 5 + 6 */ // Lire les registres et les mettre en sortie LATD = ADRES; LATB = (ADRESH<<1); // seuls RB1 et RB2 nous intéressent // Clear ADIF ADIF = 0; // Attendre un temps 2*Tad minimum (discharge) _delay(100); // On recommence ACQ + Conv, et on sort de l'interruption GODONE = 1; } } int main() { // OSCILLATOR SELECTION OSCCONbits.SCS1 = 1; // internal osc. OSCCONbits.IRCF2 = 1; // ATTENTION A LA FREQUENCE MAXIMALE EN FONCTION DU Tad CHOISI OSCCONbits.IRCF1 = 0; OSCCONbits.IRCF0 = 0; // Step 1 : Configure the A/D module ADCON1 = 0x02; // On n'utilise pas les pins ANx comme Digital I/O, mais uniquement AN0 comme analog input TRISA = 0xFF; // On met tous les pins en mode input (et donc AN0 aussi) // D'après la datasheet c'est la seule chose à faire, car RA0 disabled si AN0 déf en analog input // via ADCON1 TRISB = 0x00; TRISD = 0x00; // Tous les pins D output ADCON0 = 0b00000101; // On active le module A/D et on sélectionne AN1 ADCON2 = 0b10010101; // (Right Justified) ; Tad = 16*Tosc // Step 2 : Configure A/D Interrupt ADIF = 0; ADIE = 1; GIE = 1; // Step 3 : Wait the required acquisition Time (NOT required here because ACQT2:ACQT0 != 000) // Step 4 : Start conversion GODONE = 1; // start (ACQ + CONV) process // Step 5 : Detect that A/D conversion has finished (via interruption) // Step 6 : read ADRESH and ADRESL // Step 7 : Go directly to step 2 for next conversion (step 1 must not be modified in our case) while(1){} return 0; }
-----