Bonjour,
Ca fait un bon moment que je me prends la tête dessus au niveau de l'adc d'un pic qui me donne des valeurs tres oscillantes lorsque je place un capteur sur la pin dédiée du can.
Mes réf sont l'alim du pic et le seul moment ou il marche bien est lorsque je lui impose le zero du pic ou le 5V. (donne 00h et ffh)
J'ai fait mon code à la sauce bigonoff mais avec un quartz de 4Mhz (XT osc).
Je pensais que cela venait des capteurs mais lorsqu'en debug, avec ICD2, je scrupte les valeurs d'adresh même avec un potentiometre a la moitié de la valeur de l'alim (2,5v) il me donne n'importe quelle valeur.Etant pas un probleme d'impédance (<10kohm) je regardais mes tad (~ 2µs dans mon cas) et ils ont l'air bon.
Je débute donc j'ai pu faire une petite comme une grosse gaffe.
Donc je vous soumets mon programme en espérant trouver une aide sur ce problème qui date d'un mois!
code:
Code:LIST p=16F876 ; Définition de processeur #include <p16F876.inc> ; fichier include __CONFIG _CP_OFF & _DEBUG_ON & _CPD_OFF & _LVP_OFF & _BODEN_OFF & _PWRTE_OFF & _WDT_OFF & _XT_OSC OPTIONVAL EQU B'00000111' ; 110 = 1/64 1/128 ; 111 = 1/128 1/256 INTCONVAL EQU B'01000000' PIE1VAL EQU B'01000000' PIE2VAL EQU B'00000000' ADCON1VAL EQU B'00000100' ; DIRPORTA EQU B'00111111' ; Direction PORTA (1=entrée) DIRPORTB EQU B'00000000' ; Direction PORTB (toutes en 0 = sortie) ; BANK0 macro ; passer en banque0 bcf STATUS,RP0 bcf STATUS,RP1 endm BANK1 macro ; passer en banque1 bsf STATUS,RP0 bcf STATUS,RP1 endm BANK2 macro ; passer en banque2 bcf STATUS,RP0 bsf STATUS,RP1 endm BANK3 macro ; passer en banque3 bsf STATUS,RP0 bsf STATUS,RP1 endm CBLOCK 0x20 ; Début de la zone (0x20 à 0x6F) flags : 1 ; flags divers ; b0 : 0=accéléro; 1=gyro analog : 16 ; valeurs analogique lues (msb,lsb) result : 1 ; résultat partie haute cmpt : 1 ; compteur pour la boucle ET ENDC ; Fin de la zone #DEFINE numpotard flags,0 ; flag de temporisation #DEFINE LED PORTB , 2 ;LED connectée sur le port B au bit 2 (RB2) CBLOCK 0x70 ; Début de la zone (0x70 à 0x7F) w_temp : 1 ; Sauvegarde registre W status_temp : 1 ; sauvegarde registre STATUS ENDC org 0x000 ; Adresse de départ après reset goto init ; Initialiser org 0x004 ; adresse d'interruption movwf w_temp ; sauver registre W swapf STATUS,w ; swap status avec résultat dans w movwf status_temp ; sauver status swappé BANK0 ; passer en banque0 bcf ADCON0, ADON ; éteindre convertiseur movf ADRESH,w ; charger poids fort movwf INDF ; sauver incf FSR, f ; pointer sur poids faible bsf STATUS, RP0 ; passer en banque 1 movf ADRESL, w ; charger poids faible de conversion bcf STATUS, RP0 ; passer en banque 0 movwf INDF ; sauver en zone de sauvegarde incf FSR, f ; pointer sur poids fort suivant bcf PIR1,ADIF ; effacer flag interrupt ;restaurer registres ;------------------- restorereg swapf status_temp,w ; swap ancien status, résultat dans w movwf STATUS ; restaurer status swapf w_temp,f ; Inversion L et H de l'ancien W ; sans modifier Z swapf w_temp,w ; Réinversion de L et H dans W ; W restauré sans modifier status retfie ; return from interrupt init ; initialisation PORTS (banque 0 et 1) ; ------------------------------------ BANK0 ; sélectionner banque0 clrf PORTA ; Sorties PORTA à 0 clrf PORTB ; sorties PORTB à 0 bsf STATUS,RP0 ; passer en banque1 movlw ADCON1VAL ; PORTA en mode digital/analogique movwf ADCON1 ; écriture dans contrôle A/D movlw DIRPORTA ; Direction PORTA movwf TRISA ; écriture dans registre direction movlw DIRPORTB ; Direction PORTB movwf TRISB ; écriture dans registre direction ; Registre d'options (banque 1) ; ----------------------------- movlw OPTIONVAL ; charger masque movwf OPTION_REG ; initialiser registre option ; registres interruptions (banque 1) ; ---------------------------------- movlw INTCONVAL ; charger valeur registre interruption movwf INTCON ; initialiser interruptions movlw PIE1VAL ; Initialiser registre movwf PIE1 ; interruptions périphériques 1 ; timer 2 ( banque 1) ; --------------------- movlw D'210' ; 149+1 passages = 30µs movwf PR2 ; dans comparateur ; initialiser variables ; --------------------- bcf STATUS,RP0 ; repasser en banque 0 movlw analog ; adresse de la zone de stockage movwf FSR ; dans pointeur clrf T2CON ; pré = postdiviseur = 1 ; autoriser interruptions (banque 0) ; ---------------------------------- clrf PIR1 ; effacer flags 1 bsf INTCON,GIE ; valider interruptions goto start ; programme principal tempo call acquire ; lancer acquisition call wait ; attendre 51,2µs clrf result ; effacer résultat BANK0 movlw H'01E';mettre l'adresse de ADRESH dans W movwf FSR ; la mettre dans le pointeur movf INDF,w;charger la valeur addwf result,f ; ajouter au poids faible résultat return wait clrf TMR0 ; effacer timer0 bcf INTCON,T0IF ; effacer flag débordement wait1 btfss INTCON,T0IF ; tester si timer a débordé goto wait1 ; non, attendre return ; fin d'attente ;************************************************* **************************** ; Acquisition de la valeur analogique * ;************************************************* **************************** acquire ; lancer l'acquisition ; -------------------- movlw B'01001001' ; diviseur 32, canal 0, convertisseur ON movwf ADCON0 ; paramétrer convertisseur, lancer acquisition ; attendre 20 µs ; -------------- clrf TMR2 ; effacer timer2 bcf PIR1,TMR2IF ; effacer flag débordement bsf T2CON,TMR2ON ; lancer timer 2 acquire1 btfss PIR1,TMR2IF ; tester si temps écoulé goto acquire1 ; non, attendre bcf T2CON,TMR2ON ; oui, arrêt du timer 2 ; démarrage du convertisseur ; -------------------------- bsf ADCON0,GO ; lancer conversion A/D return ; fin de l'acquisition ;************************************************* **************************** ; PROGRAMME PRINCIPAL * ;************************************************* **************************** start call tempo ; attendre en fonction de la valeur pour le canal movlw h'12' ; charge 'V' dans W addwf result, f; ajout de 1V au résultat pour comparer dépassement btfsc STATUS,C ; tester si débordement, si C=0,on saute et continu ; si C=1,on lance interruption bsf LED ; oui lancer 5V sur RB2 movlw h'24' ; charge 2V dans W (le volt rajouter plus celui à soustraire) subwf result,f ; soustrait W au résultat btfss STATUS,C ; si résultat négatif, la valeur était en dessous de 1V ; si résultat positif C=1 bsf LED ; oui lancer 5V sur RB2 goto start ; non boucler END ; directive fin de programme
-----