Help probleme sur l'adc d'un pic 16f876 qui donne des valeurs aléatoires
Répondre à la discussion
Affichage des résultats 1 à 12 sur 12

Help probleme sur l'adc d'un pic 16f876 qui donne des valeurs aléatoires



  1. #1
    invite2a4fefe4

    Help probleme sur l'adc d'un pic 16f876 qui donne des valeurs aléatoires


    ------

    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

    -----

  2. #2
    invite2a4fefe4

    Re : Help probleme sur l'adc d'un pic 16f876 qui donne des valeurs aléatoires

    je viens d'essayer le capteur avec un aop en suiveur mcp6041 et ca n'a rien changer...
    Personne n'a une idée?

  3. #3
    invite85a93e3d

    Re : Help probleme sur l'adc d'un pic 16f876 qui donne des valeurs aléatoires

    De combien sont les variations? -sont elles visibles à l'oscilloscope?

    C'est quoi que tu mesure exactement, quel en est la source?

    Met un potar de 4,7 ou 100k entre le Vcc et la masse, et le curseur sur ton ADC, prend un multimètre basique tu mesure la tension entre la masse et le curseur, compare les valeurs mesurées au multimètre et à l'ADC.

  4. #4
    invite2a4fefe4

    Re : Help probleme sur l'adc d'un pic 16f876 qui donne des valeurs aléatoires

    Merci de la réponse rapide canaillou!
    C'est la même valeur pour les 2 car je pense que ce sont de tres rapides variations.
    Le fait d'avoir mis un gros passe bas au capteur semble l'avoir calmé.
    Mais l'adc me donne avec la patte en l'air des variations entre 00het FFh pour adresh donc je ne sais pas pourquoi il est aussi mal réglé.
    pour ce que je mesure c'est un gyrometre pour les variations de vitesse rotative d'un outil

  5. A voir en vidéo sur Futura
  6. #5
    invite85a93e3d

    Re : Help probleme sur l'adc d'un pic 16f876 qui donne des valeurs aléatoires

    C'est normal qu'avec une patte en l'air il fasse n'importe quoi, tu fait antenne à tout les parasites possibles et imaginables...

    Les variations sont toujours présentes avec le potar?

    Le but était de déterminer si le "parasite" vient du micro, du montage ou du capteur...

  7. #6
    invite5637435c

    Re : Help probleme sur l'adc d'un pic 16f876 qui donne des valeurs aléatoires

    Bonjour,

    sans un schéma qui montre ce que tu as fait au niveau alim et découplages on ne peut rien affirmer.
    Sauf que si cela n'a pas été fait dans les règles de l'art ça ne fonctionnera pas correctement puisque la conversion est faite selon un Vref qui se doit d'être stable et propre.
    Il faut d'abord commencer par là, être sur du hard avant de regarder le soft.
    @+

  8. #7
    invite2a4fefe4

    Re : Help probleme sur l'adc d'un pic 16f876 qui donne des valeurs aléatoires

    Merci de vos réponse!
    Finalement il y a un net progrès depuis que j'ai inséré un filtre passe bas passif sur le gyro donc je pense qu'il était trop actif.
    Et en ce qui concerne les valeurs , avec un potard ca me donne aussi des valeurs à très grandes oscillations donc je pense que le problème doit venir du debug de l'ICD2 car pour le moment ça marche en réel.

    l'alim est juste un redresseur du secteur (transfo, pont,condo, 7805) avec de part et d'autre plusieurs condo de découplages de 100µF.
    Maintenenat je vais joindre un accéléro au tout donc je vais voir si ce n'est qu'uncoup de chance ou si c'est vraiment le mode debug de l'ICD2 qui me donne des valeurs aléatoires...

  9. #8
    invitefaaca50b

    Re : Help probleme sur l'adc d'un pic 16f876 qui donne des valeurs aléatoires

    a mon avis, le filtre masque un defaut de conception de la carte a PIC, ou un defaut de soft... Ca a fonctionné mais rien ne dit que ca durera....
    En ce moment, il y a une epidemie de probles sur des ADC. On a decidé d'aborder les ADC des PIC dans cette ecole????

  10. #9
    invite2a4fefe4

    Re : Help probleme sur l'adc d'un pic 16f876 qui donne des valeurs aléatoires

    Oui je ne sais pas si c'est le soft ou le pic donc je vais essayer avec un autre PIC tout neuf et avec un capteur sans filtre.

  11. #10
    invite29971eb1

    Re : Help probleme sur l'adc d'un pic 16f876 qui donne des valeurs aléatoires

    Comme d'habitude, toutes tes capas de découplage sont présentes, bien placées et en nombre suffisant?

    Le signal de l'accéléro donne quoi à l'oscillo? (accéléro seul, puis relié au PIC)

    Avant de vouloir retourner ciel et terre, il vaut mieux s'assurer de la propreté du signal d'entrée.

    Et si tu remplaces ton capteur par un potar sur l'entrée ADC, tu as une lecture stable?

    Avec ces deux tests, tu devrais savoir d'ou vient le problème.

  12. #11
    invite2a4fefe4

    Re : Help probleme sur l'adc d'un pic 16f876 qui donne des valeurs aléatoires

    Alors capa de découplage bien placées (capteur PIC et alim)
    Mon capteur donne un signal bien plus faible que ce que m'annonce le PIC avec l'oscillo.
    Avec un potard même problème avec le PIC, signaux aléatoires donc j'ai mis mon programme car je pensais que ca venait de là.

  13. #12
    invite29971eb1

    Re : Help probleme sur l'adc d'un pic 16f876 qui donne des valeurs aléatoires

    Citation Envoyé par mickmadin Voir le message
    Alors capa de découplage bien placées (capteur PIC et alim)
    Mon capteur donne un signal bien plus faible que ce que m'annonce le PIC avec l'oscillo.
    Avec un potard même problème avec le PIC, signaux aléatoires donc j'ai mis mon programme car je pensais que ca venait de là.
    Effectivement, si ça merdoie avec un potar, il y a un souci côté PIC....et là je passe la main...ces bêtes ne rentrent pas chez moi

Discussions similaires

  1. problème d'utilisation du can d'un pic 16F876 A
    Par invitebf4bef0f dans le forum Électronique
    Réponses: 14
    Dernier message: 25/04/2010, 11h08
  2. reset sur MCLR D'UN PIC 16F84 OU 16F876
    Par invite292dddf1 dans le forum Électronique
    Réponses: 12
    Dernier message: 15/01/2010, 17h40
  3. programation d'un pic 16f876
    Par invite6016e9fe dans le forum Électronique
    Réponses: 2
    Dernier message: 12/04/2009, 22h12
  4. Pic, probleme avec l'ADC
    Par invite07bc4d05 dans le forum Électronique
    Réponses: 0
    Dernier message: 24/03/2009, 15h48
  5. Utilisation de l'USART d'un pic 16f876
    Par invite5665230e dans le forum Électronique
    Réponses: 2
    Dernier message: 31/05/2007, 00h11
Dans la rubrique Tech de Futura, découvrez nos comparatifs produits sur l'informatique et les technologies : imprimantes laser couleur, casques audio, chaises gamer...