Bonjour à tous!
Ne connaissant pas trop les PIC, mais souhaitant tout de même m'y mettre (car je connais le C), j'ai débuté par un petit montage (normalement) simple, mais qui ne fonctionne malheureusement pas...
Le principe est simple. J'ai une LED et un capteur de lumière. Quand il n'y a pas de lumière (Vcapteur <0.5V), ma LED s'allume. Au contraire, quand il y a de la lumière, ma LED s'éteint...
Le truc, c'est que je ne sais pas si cela vient de mon montage, de mon programmateur Schaer+ ou de mon code C... (le truc à rendre fou...).
J'avais déjà testé mon programmateur en faisant clignoter la LED à l'aide de mon PIC et ça marchait... Donc, j'pense que cela doit venir de mon PIC ou de mon bout de code C. PIC mort? bout de code C faux? En tout cas, le voici :
Enfin, pour donner un maximum de détails, j'ai vérifié les tensions d'alim (fournies par un 78M05 : +5V) et tout semble correct. La pin Master CLeaR (bar) est reliée au +5V. J'ai mis mon multimetre sur la patte RA0 avec le capteur débranché (de la broche) et je trouve : 0.64V sur la pin du PIC... Est-ce normal (je pense pas...) ? De plus, j'ai effectué la "configuration bit" sur winPIC avec OSC Oscillator = INT RC - Port on RA6, Port on RA7. Quant au reste, je n'y ai pas touché...Code:#include <p18f4525.h> #include <adc.h> void configure_pic_18F4525(void); void config_pic_oscillator(void); void config_pic_ports(void); void config_pic_can(void); int light_state(void); void main(void) { int etat=2; configure_pic_18F4525(); // Configure l'ensemble des "périphériques" utilisés par le PIC pour cette application. while(1) { etat=light_state(); if(etat==1) PORTAbits.RA1=0; // Si lumière detectée, on éteint la LED. if(etat==0) PORTAbits.RA1=1; // Si pas de lumière, on allume la LED. } } void configure_pic_18F4525(void) { config_pic_oscillator(); // Effectue les reglages de l'oscillateur du PIC en mode interne à 8Mhz. config_pic_ports(); // Configure l'ensemble des ports utilisés pour le capteur de lumière config_pic_can(); // Configure l'ADC sur la patte RA0/AN0 pour convertir la tension sortant du capteur de lumière. } void config_pic_oscillator(void) { /**************** CONFIGURATION DE L'OSCILLATEUR DU PIC *********************/ OSCCONbits.SCS1=0; // OSCCONbits.SCS0=1; // Utilisation de l'oscillateur interne du PIC OSCCONbits.IRCF0=1; // OSCCONbits.IRCF1=1; // Fréquence d'utilisation de l'oscillateur = 8Mhz. OSCCONbits.IRCF2=1; // /****************************************************************************/ } void config_pic_ports(void) { TRISAbits.TRISA0=1; // Configure la patte RA0 en entrée pour le capteur de lumière TRISAbits.TRISA1=0; // Configure la patte RA1 en sortie pour la LED. } void config_pic_can(void) { ADCON0bits.CHS3=0; // ADCON0bits.CHS2=0; // Configure le CAN sur la patte (pin) RA0/AN0. ADCON0bits.CHS1=0; // ADCON0bits.CHS0=0; // ADCON0bits.ADON=0; // Active le CAN sur la patte (pin) RA0/AN0. // bit 7 et bit 6 : pas important (toujours à 0). // bit 5 : Vref-=Vss=GND ADCON1=0b00000001; // bit 4 : Vref+=Vdd=+5V // bit3 à 0 (4) : toutes les entrées sont en analogiques. (AN0 à AN12). ADCON2=0b10101100; // bit 7 : justification à droite, // bit 6 : pas important (toujours à 0). // bit 5 à 3 (3) : 12* Tad. (pour conversion sur 10 bits). // bit 2 à 0 (3) : Fosc/4 = 2Mhz. (car oscillateur interne utilisé à 8Mhz, sans PLL). } int light_state(void) { int val_brute=0, statut=2; float Tension=0; OpenADC(ADC_FOSC_2 & ADC_RIGHT_JUST & ADC_12_TAD, ADC_CH0 & ADC_INT_OFF & ADC_REF_VDD_VSS, ADC_2ANA); // "Inutile" si config_pic_can correct, ligne mise pour être sûr que cela marche... :'( ConvertADC(); // Lance une conversion à partir de l'ADC configuré dans config_pic_can. while(BusyADC()); // Tant que la conversion n'est pas terminée, on ne récupère pas la valeur... // Renvoi 1 si conversion en cours (=> reste dans le while), 0 sinon (=> sort du while). val_brute = ReadADC(); Tension = (val_brute * 5)/1023; // Permet de récupérer directement la tension transmise par le capteur de lumière, 5V (max) sur 10bits. if(Tension >= 0.5) statut=1; // Présence de lumière! (car supérieur à 0.5Volts) if(Tension < 0.5) statut=0; // Pas de lumière! CloseADC(); return statut; }
Tout dernier truc, lorsque j'éffectue un "erase" avec WinPIC, il me retourne : "Success" et après quand je fais un "Blank Check", le soft me renvoie : "Device is NOT blank". C'est à ne plus rien comprendre... D'autant plus que j'en suis à mon 5ieme jour où je ne fais que lire, lire et lire des datasheet + commentaires, reply etc.. pour un résultat quasi-nul
Merci de m'aider car là, je sais plus où donner de la tête...
Merci encore et bonne soirée ou bonne journée @ tous.
-----