Bonjour
J'utilise la carte de développement DV164126 de Microchip sur laquelle se trouve un 18F14K50, cadencé à 12MHz, un bouton poussoir sur RA3, des DEL sur RC0 à RC3 et un potentiomètre sur RB4.
Le principe de mon code est simple : lorsque j'appuie sur mon b-p, le résultat de l'acquisition est "affiché" sur les DEL.
Voici mon code :
Lorsque je programme le PIC, le fonctionnement n'a pas vraiment avoir avec ce qui état prévu. Lorsque j'appuie sur le b-p, il y a deux types de réactions :Code:#include <p18F14K50.h> #include <stdio.h> #include <delays.h> #define USE_AND_MASKS //indique quel type de masque est utilisé pour configuré la ADC #include <adc.h> #pragma config CPUDIV = NOCLKDIV, USBDIV = OFF // CONFIG1L #pragma config FOSC = HS, PLLEN=OFF, PCLKEN = ON, FCMEN = OFF, IESO = OFF // CONFIG1H #pragma config PWRTEN = OFF, BOREN = OFF, BORV = 30 // CONFIG2L #pragma config WDTEN = OFF, WDTPS = 32768 // CONFIG2H #pragma config MCLRE = OFF, HFOFST = OFF // CONFIG3H #pragma config STVREN = ON, LVP = OFF, BBSIZ=OFF, XINST = OFF // CONFIG4L #pragma config CP0 = OFF, CP1 = OFF // CONFIG5L #pragma config CPB = OFF, CPD = OFF // CONFIG5H #pragma config WRT0 = OFF, WRT1 = OFF // CONFIG6L #pragma config WRTB = OFF, WRTC = OFF // CONFIG6H #pragma config EBTR0 = OFF, EBTR1 = OFF // CONFIG7L #pragma config EBTRB = OFF // CONFIG7H // Configuration du ADC void ConfigurationADC(void) { //Fréquence de Fosc/32; mot justifié à droite; temps de conversion 20Tad ; sur le canal 10 //pas d'interruptions, réf sur VDD-VSS OpenADC( ADC_FOSC_32 & ADC_RIGHT_JUST & ADC_20_TAD, ADC_CH10 & ADC_INT_OFF , ADC_REF_VDD_VDD & ADC_REF_VDD_VSS, 0b0000010000000000); } //Acquisition analogique et affichage sur les DEL void AcqAN10AffDEL(void) { int result = 0; ConvertADC(); // Lancement de la conversion while( BusyADC() ); // Ne rien faire tant que la conversion est en cours result = ReadADC(); // Récupération de la valeur acquise if (result < 256 ) //Allumer RC0 si la valeur < 256 { PORTC = 0x01; } else if (result >= 256 && result < 512 ) //allumer RC1 si valeur comprise entre 256 et 512 { PORTC = 0x02; } else if (result >= 512 && result < 768 ) //allumer RC2 si valeur comprise entre 512 et 768 { PORTC = 0x04; } else if (result >= 768 ) { PORTC = 0x08; //allumer RC3 si la valeur est supérieure à 768 } } void main (void) { TRISC = 0xF0; //RC0-RC3 en sorties, RC4-RC7 en entrées CloseADC(); //efface la configuration du CNA des fois qu'il ne le soit pas ou mal //2 a - configuration du ADC ConfigurationADC(); Delay10TCYx( 5 ); //2 b - acquisition AN10 et affichage sur les DEL while (1) { if ((PORTA & 0x08)==0) //Si le bouton poussoir est appuyé, lancer l'acquisition et afficher sur les DEL { AcqAN10AffDEL(); } else //Sinon éteindre toutes les DEL { PORTC = 0x00; } } CloseADC(); }
- RC3 passe à 1 quand la tension est supérieure à 0
- si la tension est proche ou égale à 0V alors RC0 passe à 1 et les trois autres sorties clignotent
Je n'arrive pas à comprendre pourquoi ça ne fonctionne pas, surtout qu'avant de tester sur la carte, j'ai simulé sous Isis et aucun problèmes ...
Merci d'avance pour ceux qui prendront le temps de répondre .
-----