Conversion Analogique-Numérique pic 16f877
Répondre à la discussion
Affichage des résultats 1 à 16 sur 16

Conversion Analogique-Numérique pic 16f877



  1. #1
    invite55f29a9f

    Conversion Analogique-Numérique pic 16f877


    ------

    Bonjour,

    Je me suis mis depuis peu à la programmation en C sur le pic 16f877, je débute et je n'arrive pas à comprendre la subtilité de la conversion analogique numérique avec le pic 16f877, d'ou ma venue sur le forum
    Apres lecture de la datasheet du composant, j'ai écrit le programme ci-dessous qui devrait convertir une donnée analogique (entrée AN0) et allumer des leds en fonction du résultat de la conversion. Le programme ne plante pas (je suissous sourceBoost), mais il ne fait pas ce qu'il faut.

    Ci-dessous mon code :

    Code:
    #include <system.h>
    
    #pragma DATA _CONFIG, _HS_OSC & _WDT_OFF
    #pragma CLOCK_FREQ 20000000
    
    int can(void)
    {
    	set_bit(adcon0,GO);
    		while (adcon0.GO == 1){}
    	return ADRESH;
    }
    
    void main( void ){
    
    unsigned char valeur;
    	
    	clear_bit(adcon1,ADFM);
    	set_bit(adcon1,PCFG3);
    	set_bit(adcon1,PCFG2);
    	set_bit(adcon1,PCFG1);
    	clear_bit(adcon1,PCFG0);
    	
    	trisa = 0xFF;
    	trisc = 0x00;
    	trisd = 0x00;
    	portc = 0x00;
    	portd = 0x00;
    	
    	set_bit(adcon0,ADCS1);
    	clear_bit(adcon0,ADCS0);
    
    	clear_bit(adcon0,CHS2);
    	clear_bit(adcon0,CHS1);
    	clear_bit(adcon0,CHS0);
    	set_bit(adcon0,ADON);
    	
    	delay_ms(2);
    	
    	while(1){
    		valeur = can();
    		
    		if(valeur == 0b00000000){
    			set_bit(portc,2); // Cette led ne s'allume jamais, même pour une entrée nul.
    		}
    		if(valeur > 0b00000010){
    			set_bit(portd,0); // Cette led reste allumée quelque soit la valeur en entrée AN0
    		}
    	}
    }
    Merci d'avance pour votre aide.

    Flareski.

    -----

  2. #2
    zotchi52

    Re : Conversion Analogique-Numérique pic 16f877

    Bonjour,
    La conversion A/N consiste à lire une tension sur AN0 et la convertir en nombre entier situé entre 0 et 1023 (10 bits), les valeurs 0 et 1023 correspondent aux tensions de référence Vref+ et Vref- que tu dois les configurer en positionnant les bits PCFG3,2,1,0

    Dans ton programme tu as choisi RA3 et RA2 comme référence donc si tu mets 5v sur RA3 et sur AN0 t'auras 0000 0011 1111 1111 comme résultat.

    Ce lien explique très bien la CAN (en anglais) http://www.winpicprog.co.uk/pic_tutorial11.htm

  3. #3
    invite55f29a9f

    Re : Conversion Analogique-Numérique pic 16f877

    Bonjour et merci pour la réponse
    Quelle configuration dois-je prendre pour choisir l'entrée AN0, pour la conversion et les tension VDD et VSS pour les tensions de références.
    Au vue du schéma il faudrait que je configure PCFG3 à 1, PCFG2 à 1, PCFG1 à 1, PCFG0 à 0, c'est pourtant ce qu'il me semble avoir fait.
    J’avoue être un peu perdu.

    Flareski

  4. #4
    r4ph

    Re : Conversion Analogique-Numérique pic 16f877

    Tu trouveras toutes ces réponses dans la datasheet du 16f877vau chapitre CAN. Regarde c¸a et reviens si il y a des choses que tu comprends pas.

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

    Re : Conversion Analogique-Numérique pic 16f877

    Je suis aller voir le lien fourni par zotchi52 et j'ai relut la datasheet du pic 16f877 et j'arrive au même code que fourni dans mon premier message. Mais je n'arrive pas à comprendre pourquoi la valeur contenue dans ADRESH, ne varie pas en fonction de ma valeur en entrée AN0.
    Si quelqu'un pouvait me donner un petit bout de programme qui fonctionne pour que je puisse enfin comprendre.

    Merci d'avance.

    Flareski.

  7. #6
    invite55f29a9f

    Re : Conversion Analogique-Numérique pic 16f877

    Personne n'a un petit bout de code qui fonctionne avec le compilateur boostC pour une conversion A/N avec le pic 16f877, ou au moins me dire ce qui ne fonctionne pas dans mon code.

    Merci d'avance.

    Flareski.

  8. #7
    zotchi52

    Re : Conversion Analogique-Numérique pic 16f877

    Bonjour,
    Tout d’abord je m'excuse car je me suis trompé sur ta configuration des tensions de référence, le CAN est configuré sur Vss et Vdd. ensuite, j'ai du mal à déchiffrer la dernière boucle ( j'utilise pascal et assembleur) :

    valeur = can(); //peux tu m'expliquer ce que fait ton programme sur cette ligne.

    Edit: et quel est le type ta donnée analogique ?
    Dernière modification par zotchi52 ; 15/05/2012 à 15h25.

  9. #8
    invite55f29a9f

    Re : Conversion Analogique-Numérique pic 16f877

    Bonjour,

    Je pense que c'est de la que vient le problème, mais je ne suis pas sure, en faite le rôle de la fonction can() est de réaliser la conversion analogique/numérique, et de me renvoyer la valeur binaire de la conversion (du moins ce qu'elle devrait faire), par la suite je test cette valeur pour afficher deux leds en fonction du résultat, je débute donc je ne sais pas si je manipule correctement les données.
    Je réalise la conversion d'une tension sur la borne AN0, cette tension est issue d'un potentiomètre.

    Flareski

  10. #9
    zotchi52

    Re : Conversion Analogique-Numérique pic 16f877

    La je comprends,
    Code:
    while(1){
    		valeur = can();
    		
    		if(valeur == 0b00000000){
    			set_bit(portc,2); // En mettant AN0 à la masse, normalement elle doit s'allumer, j'ai tester la conversion sous ISIS y a toujours quelques µV
                                                    //à convertir, même lorsque le potentiomètre est à 0
    		}
    		if(valeur > 0b00000010){
    			set_bit(portd,0); // Cette led reste allumée quelque soit la valeur en entrée AN0
    		}
    	}
    Et si tu mettais une boucle if-else au lieu de deux boucle if ?
    Tu as tester ton programme en simulation ou en pratique ?

  11. #10
    invite55f29a9f

    Re : Conversion Analogique-Numérique pic 16f877

    J'ai testé mon programme en directe, sur une platine. J'ai fais comme tu as dis j'ai relié directement l'entrée AN0 à la masse mais rien ne change, je n'arrive pas à comprendre d'ou peut provenir l'erreur, j'ai pourtant suivis ce qui est marqué sur la datasheet pour la configuration et la conversion mais il doit y avoir un truc qui m'échappe.

  12. #11
    zotchi52

    Re : Conversion Analogique-Numérique pic 16f877

    Et si tu déclares valeur en int au lieu de char , désolé mes connaissances en C se limite à de simples programmes de calculatrice.

  13. #12
    Thetimax

    Re : Conversion Analogique-Numérique pic 16f877

    Bonjour!!

    Peut etre que ca pourrait venir de ceci
    while (adcon0.GO == 1){}
    , cette expression veut dire " tant que GO_bit = 1, continu"
    Tu devrais peut etre mettre 0 ????

    A+


    edit: la variable "valeur" est bien un char puisque elle retourne les 8 bit de ADRESH
    Dernière modification par Thetimax ; 16/05/2012 à 20h22.

  14. #13
    r4ph

    Re : Conversion Analogique-Numérique pic 16f877

    Salut, voila un petit exemple de code fonctionnel en C sur compilateur hitech C lite pour voir quelles initialisations faire et comment rechercher l'information. (PIC16F690)
    initialisation de l'ADC puis la boucle while(1) affiche sur un LCD 2x16 la valeur de ADRESH en checkant a chaque fois le flag GO, tu peux remplacer par ce que tu veux, comme allumer les leds d'un port.

    Remarque que c'est bien un exemple et qu'il faut vérifier dans la datasheet du 16F877. En général les fonction de base des perifériques et le nom des registres se ressemble d'un PIC a l'autre mais il y a souvent des subtilités. Remarque aussi que l'on utilise pas le même compilateur et que de ce fait la syntaxe peut être un peu différentes. Les fonctions relatives au LCD sont dans un fichier header et ne font pas partie de celle fournies par le compilateur.


    Code:
    // programme principal
    
    void main (void)
    {
    
    
    	// initialisations ports
    
    	ANSEL = 0x01;	// I/O digital; RA0 analog
    	ANSELH = 0x00;	// I/O digital;
    	TRISA = 0x01;	// RA0 en entrée
    
    
    	init_lcd();
    
    	// initiations ADC
    	
    	ADFM = 0;	// justifié vers la gauche (ADRESH 8 bits de poids fort)
    	VCFG = 0;	// Vref = Vdd
    	ADCON1 = 0b01010000;	// Horloge ADC  (FOSC/16 = 4uS)
    	ADON = 1;	// ADC alimenté
    
    	putstring_lcd("ADC:");
    
    	
    	GO = 1;	// demarre conversion AD
    	
    	
    
    
    	while (1) // boucle infinie
    	{
    		if (!GO)// conversion finie
    		{
    			gotoline1_lcd(6);
    			putbyte10_lcd(ADRESH);//affiche valeur CAN
    			GO = 1;// demarre une nouvelle conversion
    		}		
    		
    
    	}
    
    
    
    } // end programme principal

    A bientôt!

  15. #14
    misselectro45

    Re : Conversion Analogique-Numérique pic 16f877

    Bonjour à tous! j'aimerai vous demander comment afficher les résultats de la conversion analogique/ numérique du PIC 16F876. J'aimerai les afficher sur les Ports C. Je me suis déja assez documenté mais je ne comprend pas bien les notions des timers et des interruptions. Voici un bout de mon programme si quelqu'un veut bien y jetter un coup d'oeil. Je l'ai compilé mais j'ai pas obtenir le résultat souhaité. Merci d'avance!

    Code:
    ;***************************************************************************************
    ;* *
    ;* Réalisation d'une carte d'entrées/sorties analogiques pour banc de réglage *
    ;* *
    ;***************************************************************************************
    ;* *
    ;* NOM: projet.asm *
    ;* Date: 05/05/2014*
    ;* Auteurs: VELONKASINA Leslie Roumina *
    ;* *
    ;***************************************************************************************
    ;* *
    ;* Fichiers requis: P16F876.inc *
    ;* *
    ;***************************************************************************************
    ;* *
    ;* Notes: On utilise un oscillateur 4 MHz *
    ;* Les 12 bits de sortie sont disponibles après conversion numérique analogique sur le PORTC *
    ;***************************************************************************************
    
    LIST p=16F876                ; Définition du processeur
    #include <p16F876.inc>        fichier include appel de la librairie
    
    
    ;les fichiers CONFIG
    ; _CP_OFF Pas de protection
    ; _DEBUG_OFF RB6 et RB7 en utilisation normale
    ; _WRT_ENABLE_OFF Le programme ne peut pas écrire dans la flash
    ; _CPD_OFF Mémoire EEprom déprotégée
    ; _LVP_OFF RB3 en utilisation normale
    ; _BODEN_OFF Reset tension hors service
    ; _PWRTE_ON Démarrage temporisé
    ; _WDT_OFF Watchdog hors service
    ; _XT_OSC Oscillateur XT
    __CONFIG _CP_OFF & _DEBUG_OFF & _WRT_ENABLE_OFF & _CPD_OFF & _LVP_OFF &
    _BODEN_OFF & _PWRTE_ON & _WDT_OFF & _XT_OSC
    
    
    ;*********************************************************************************
    ;                           * ASSIGNATIONS SYSTEME *
    ;*********************************************************************************
    ; DIRECTION DES PORTS I/O, AFFECTATION DES E/S
    ; --------------------------------------------
    ; (1=entrée ; 0=sortie)
    DIRPORTA EQU B'00000001' ; Direction PORTA (registre TRISA)
    ; RA0 : entrée analogique
    ; RA1 : N.C.
    ; RA2 : N.C.
    ; RA3 : N.C.
    ; RA4 : N.C.
    ; RA5 : N.C.
    ; on récupère le résultat de la conversion A->N
    ; dans les registres ADRESH (Bank0) et ADRESL (Bank1)
    
    DIRPORTB EQU B'00000000' ; Direction PORTB
    ; RB0 : 2bits du bus de sortie
    
    DIRPORTC EQU B'00000000' ; Direction PORTC
    ; RC0 à RC7 : 8 bits du bus de sortie
    
    
    ; REGISTRE ADCON1 (ANALOGIQUE/DIGITAL)
    ; -------------------------------------------------------------
    ADCON1VAL EQU B'00001110' ; Registre ADCON1 (configuration du port A/D)
    ; PCFG = 1110 => 1 entrée analogique (RA0)
    ; ADFM = 0 => justification à gauche
    ; bit0 : PCFG0 : Port ConFiGuration control bit0
    ; bit1 : PCFG1 : Port ConFiGuration control bit1
    ; bit2 : PCFG2 : Port ConFiGuration control bit2
    ; bit3 : PCFG3 : Port ConFiGuration control bit3
    ; bit4 : Non implémenté
    ; bit5 : Non implémenté
    ; bit6 : Non implémenté
    ; bit7 : ADFM : A/D result ForMat select
    
    ; REGISTRE ADCON0 (ANALOGIQUE/DIGITAL)
    ; -------------------------------------------------------------
    ; ADCS1 | ADCS0 | Diviseur | Fréquence Max du quartz
    ; -----------+----------+-------------+----------------------------------------------------------
    ; 0 | 0 | Fosc/2 | 1.25 MHz
    ; 0 | 1 | Fosc/8 | 5 MHz => fe = 500 KHz
    ; 1 | 0 | Fosc/32 | 20 MHz => fe = 125 KHz
    ; 1 | 1 | Osc RC | Si > 1 MHz, uniquement en mode sleep
    ; CHS = B'000' => choix du canal A/D 0 (pin RA0)
    
    ADCON0VAL EQU B'01000000' ; Registre ADCON0 (configuration du port A/D)
    
    ; bit0 : ADON : A/D ON bit
    ; bit1 : Non implémenté
    ; bit2 : GO/DONE : A/D conversion status bit
    ; bit3 : CHS0 : analog Channel Select bit0
    ; bit4 : CHS1 : analog Channel Select bit1
    ; bit5 : CHS2 : analog Channel Select bit2
    ; bit6 : ADCS0 : A/D conversion Clock Select bit0
    ; bit7 : ADCS1 : A/D conversion Clock Select bit1
    
    
    ; REGISTRE INTCON (contrôle interruptions standard)
    ; --------------------------------------------------------------------
    INTCONVAL EQU B'11000000'
    ; bit0 : RBIF : flag interruption RB4/RB7
    ; bit1 : INTF : flag RB0/Int
    ; bit2 : T0IF : flag tmr0
    ; bit3 : RBIE : masque interruption RB4/RB7
    ; bit4 : INTE : masque interruption RB0/Int
    ; bit5 : T0IE : masque interruption tmr0
    ; bit6 : PEIE : masque autorisation générale périphériques
    ; bit7 : GIE : masque autorisation générale interruption
    
    ; REGISTRE PIE1 (contrôle interruptions périphériques)
    ; --------------------------------------------------------------------
    PIE1VAL EQU B'01000001'
    ; bit0 : TMR1IE : masque interruption débordement tmr1
    ; bit1 : TMR2IE : masque interruption TMR2 = PR2
    ; bit2 : CCP1IE : masque interruption CCP1
    ; bit3 : SSPIE : masque interruption port série synchrone
    ; bit4 : TXIE : masque interruption transmission USART
    ; bit5 : RCIE : masque interruption réception USART
    ; bit6 : ADIE : masque interruption convertisseur A/D
    ; bit7 : PSPIE : Toujours 0 sur le PIC 16F876
    
    ; REGISTRE T1CON (configuration du Timer 1)
    ; ----------------------------------------------------------
    T1CONVAL EQU B'00110001'
    ; bit0 : TMR1ON : TiMeR 1 ON bit
    ; bit1 : TMR1CS : TiMeR 1 Clock Source select bit
    ; bit2 : T1SYNC : Timer 1 external clock input SYNChronisation control bit
    ; bit3 : T1OSCEN : Timer 1 OSCillator ENable control bit
    ; bit4 ; T1CKPS0 : Timer 1 oscillator ClocK Prescale Select bit 0
    ; bit5 : T1CKPS1 : Timer 1 oscillator ClocK Prescale Select bit 1
    ; bit6 : Inutilisé : lu comme ‘0’
    ; bit7 : Inutilisé : lu comme ‘0’
    ; T1CKPS1 | T1CKPS0 | Valeur du pré-diviseur
    ; -------------+-------------+------------------------------
    ; 0 | 0 | 1 -> 65536 cycles (65ms à 4MHz)
    ; 0 | 1 | 2
    ; 1 | 0 | 4
    ; 1 | 1 | 8 -> 524288 cycles (0.5s à 4MHz)
    
    
    ;*********************************************************************************
    ;*                          MACROS *
    ;*********************************************************************************
    ; Changement de banques
    ; --------------------------------
    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
    
    
    
    
    ;****************************************************************************
    ;                      VARIABLES ZONE COMMUNE *
    ;****************************************************************************
    ; Zone de 16 bytes
    ; -----------------------
    CBLOCK 0x70        ; Début de la zone (0x70 à 0x7F)
    w_temp : 1         ; Sauvegarde registre W
    status_temp : 1    ; Sauvegarde registre STATUS
    ENDC               ; Fin de la zone
    
    
    ;****************************************************************************
    ;*                     DECLARATIONS DES VARIABLES *
    ;****************************************************************************
    ; Zone de 80 bytes
    ; ---------------------------------------------------------------------------
    ; Allocation de l_espace mémoire de la bank0 et déclaration des variables
    CBLOCK 0x20                ; Début de la zone (0x20 à 0x6F)
    menu : 1                   ; pointeur de menu
    cmpt1 : 1                  ; compteur n°1
    cmpt2 : 1                  ; compteur n°2
    resultConv : 1             ; résultat 8 bits de la conversion Analogique -> Numérique
    resultConv2 : 1            ; ancien résultat 8 bits de la conversion Analogique -> Numérique
    sourceInt : 1              ; source d_interruption
    vartemp : 1                ; variable temporaire
    vardigit : 1               ; variable de digit
    varparam : 1               ; variable de paramètre
    var1 : 1                   ; variable n°1
    var2 : 1                   ; variable n°2
    var3 : 1                   ; variable n°3
    ENDC                       ; Fin de la zone
    
    
    ;*************************************************************************
    ;*                       DEMARRAGE SUR RESET *
    ;*************************************************************************
    org 0x000 ; Adresse de départ après reset
    goto INIT ; Initialiser
    
    
    ;*************************************************************************
    ;*                       ROUTINE INTERRUPTION *
    ;*************************************************************************
    ;sauvegarder les registres
    ;-------------------------------
    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
    
    
    ; Test et appel des différentes interruptions
    ;-----------------------------------------------------
    
    ; Interruption convertisseur A/D
    ; ------------------------------
    bsf STATUS , RP0       ; sélectionner banque1
    btfss PIE1 , ADIE      ; tester si interrupt autorisée
    goto intsw4            ; non sauter
    bcf STATUS , RP0       ; oui, sélectionner banque0
    btfss PIR1 , ADIF      ; tester si interrupt en cours
    goto intsw4            ; non sauter
    call intad             ; oui, traiter interrupt
    bcf PIR1 , ADIF        ; effacer flag interupt
    goto restorereg        ; et fin d_interrupt
    
    ; Restaurer registres
    RESTORE ; -----------------------
    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 interruption
    
    
    ;*************************************************************************
    ;*                         INITIALISATIONS *
    ;*************************************************************************
    INIT
    ; initialisation PORTS (banques 0 et 1)
    ; -------------------------------------------------
    BANK0               ; sélectionner la banque0
    clrf PORTA          ; Sorties PORTA à 0
    clrf PORTB          ; Sorties PORTB à 0
    clrf PORTC          ; Sorties PORTC à 0
    movlw ADCON0VAL     ; Configuration du mode digital/analogique
    movwf ADCON0        ; écriture dans le registre de contrôle A/D
    bsf STATUS,RP0      ; sélectionner banque1
    movlw ADCON1VAL     ; PORTA en mode digital/analogique
    movwf ADCON1        ; écriture dans le registre de contrôle A/D
    movlw DIRPORTA      ; Direction PORTA
    movwf TRISA         ; écriture dans le registre direction
    movlw DIRPORTB      ; Direction PORTB
    movwf TRISB         ; écriture dans le registre direction
    movlw DIRPORTC      ; Direction PORTC
    movwf TRISC         ; écriture dans le registre direction
    
    ; initialisation des registres d_interruptions (banque 1)
    ; ---------------------------------------------------------------------
    movlw INTCONVAL ; charger valeur registre interruption
    movwf INTCON ; initialiser interruptions
    movlw PIE1VAL ; Initialiser registre
    movwf PIE1 ; interruptions périphériques 1
    bcf STATUS,RP0 ; passer en banque 0
    clrf TMR1L ; effacer timer1, 8 lsb
    clrf TMR1H ; effacer timer1, 8 msb
    movlw T1CONVAL ; charger valeur registre interruption
    movwf T1CON ; initialiser interruptions
    
    ; initialisation variables
    ; -----------------------------
    clrf menu                   ; initialisation de « menu » pour qu’il pointe vers le menu général
    clrf choixParam             ; initialisation du de la variable de choix du paramètre à modifier
    movlw 0x02
    clrf resultConv             ; initialisation de la variable de conversion A/N
    goto START                  ; programme principal
    
    
    ;*****************************************************************
    ;*                   CONVERSION Analogique -> Numerique *
    ;*****************************************************************
    ;* entree : *
    ;* *
    ;* sortie : resultConv *
    ;* *
    
    ;*****************************************************************
    CONV
        movf resultConv,w       ; Chargement du resultat de la conversion precedente
        movwf resultConv2       ; Stockage de l_ancien resultat de la conversion
    ; 1 - lancement du convertisseur : ADON = 1
    
    ; --------------------------------------------------------
    bsf ADCON0,ADON
    ; 2 - attendre que l_acquisition soit effectuee (Tacq = 19.7 microsec)
    
    ; -------------------------------------------------------
    movlw 0x07                  ; nb de boucles
    movwf cmpt1                 ; initialiser compteur de boucles
    LOOPACQ                     ; (LOOPACQ = 22 microsec pour cmpt1=x07 et osc=4MHz)
    decfsz cmpt1,f              ; decrementer le compteur de boucles
    goto LOOPACQ                ; if = 0 -> LOOPACQ
    ; 3 - demarrer la conversion en positionnant le bit GO du registre ADCON0
    
    ; ------------------------------------------------------------------------------------------------
    bsf ADCON0,GO
    ; 4 - attendre que la conversion soit terminee (2Tad = 3.2 microsec)
    
    ; --------------------------------------------------------
    movlw 0x01                  ; nb de boucles
    movwf cmpt1                 ; initialiser compteur de boucles
    LOOPAD                      ; (LOOPAD = 4 microsecs pour cmpt1=x01 et osc=4MHz)
    decfsz cmpt1,f              ; decrementer le compteur de boucles
    goto LOOPAD                 ; if = 0 -> LOOPAD
    ; 5 - Lire le resultat de la conversion dans ADRESH
    
    ; ---------------------------------------------------------------
    movf ADRESH,w               ; Chargement du registre ADRESH
    movwf resultConv            ; Stockage des 8 bits du resultat de la conversion
    return
    
    
    ;*********************************************************************************
    ;*                        PROGRAMME PRINCIPAL *
    ;*********************************************************************************
    START
    org 0x300
    CALL CONV                    ; routine d_acquisition et de conversion du signal d_entrée analogique
    ; (une première acquisition est nécessaire
    LOOP
    CALL CONV                    ; routine d_acquisition et de conversion du signal d_entrée analogique
    movwf PORTC                  ; Ecriture sur le PORTC des 8 bits du résultat de la conversion
    goto LOOP
    end
    Dernière modification par JPL ; 05/05/2014 à 16h55. Motif: Ajout de la balise Code (#)

  16. #15
    freepicbasic

    Re : Conversion Analogique-Numérique pic 16f877

    dans l'int "intsw4" va nulle part

    Il est ou ?
    intad
    c est surement là le problème

    l'assembleur devrait envoyer des messages, je suppose que tu ne l'a pas mis sur le forum...
    de plus le TMR1 est mis en route , je ne vois pas sa gestion !

    à mon avis l'int est planté ...
    A+, pat

  17. #16
    paulfjujo

    Re : Conversion Analogique-Numérique pic 16f877

    Citation Envoyé par flareski Voir le message
    je n'arrive pas à comprendre d'ou peut provenir l'erreur,.
    Essaie de rajouter une tempo dans ta boucle principale ..
    et bien tester le bit NOT_DONE de ADCON0 qui finalise l'acquisition
    exemple reel testé OK :

    Code:
    Loop
     movlw 0x81	;ana0
     movwf Voie
    call Acquis_Ana
    call delay_100mS	
    goto Loop
    
    
    ;********** Subroutines **************** 
    Acquis_Ana             ;armemement acquisition Analogique
        bank0
        movf Voie,w
      movwf ADCON0
        bsf ADCON0,ADON     ; set Analog Converter ON (ADCON0,0=1)
        call delay_25uS
        bsf ADCON0,GO_DONE  ; set GO on start conversion (ADCON0,2=1)
        call delay_25uS
      ;  bcf RETENUE     ; Positif
    not_yet
        btfsc ADCON0,NOT_DONE  ; conversion AD ok ?(ADCON0,2=0 ???)
        goto not_yet
        bank0
        movf ADRESH,w
    ;----------------
     movwf PORTC
    ;----------------
        return

Discussions similaires

  1. Conversion analogique numérique PIC
    Par inoxxam dans le forum Électronique
    Réponses: 9
    Dernier message: 03/04/2010, 22h42
  2. Conversion analogique numerique
    Par invitef0934d70 dans le forum Électronique
    Réponses: 1
    Dernier message: 28/11/2008, 11h50
  3. conversion analogique numérique
    Par Cedrix57 dans le forum Électronique
    Réponses: 4
    Dernier message: 07/08/2008, 15h12
  4. Conversion analogique-numerique pic 18f4520
    Par invitea6488f97 dans le forum Électronique
    Réponses: 1
    Dernier message: 17/05/2008, 21h29
  5. Conversion analogique numérique
    Par ombeni dans le forum Électronique
    Réponses: 5
    Dernier message: 30/12/2007, 11h06
Découvrez nos comparatifs produits sur l'informatique et les technologies.