Répondre à la discussion
Affichage des résultats 1 à 12 sur 12

Entrée analogique pic24f04ka200



  1. #1
    skanka

    Entrée analogique pic24f04ka200


    ------

    Bonjour,
    J'essaye désespérément d'utiliser les entrées analogiques d'un pic24f04ka200.... mais sans succès : la valeur stockée dans le buffer ADC1BUF0 reste à 0.

    Je vous joint le code ci-dessous. Il a pour but de faire varier la période d'un signal carré en fonction d'une tension analogique en entrée (c'est juste un code pour me familiariser avec le pic). Quelqu'un voit-il où est l'erreur ?
    Par ailleurs, je n'arrive pas à utiliser le simulateur de MPLABX pour simuler une entrée analogique (dans la fenêtre I/O pins, le pin en question reste en digital input).

    Merci d'avance de m'aider dans la résolution de ce problème.

    Voilà le code :

    Code:
    #include <xc.h>
    
    // FGS
    #pragma config GWRP = OFF               // General Segment Code Flash Write Protection bit (General segment may be written)
    #pragma config GCP = OFF                // General Segment Code Flash Code Protection bit (No protection)
    
    // FOSCSEL
    #pragma config FNOSC = FRC              // Oscillator Select (Fast RC oscillator (FRC))
    #pragma config IESO = OFF               // Internal External Switch Over bit (Internal External Switchover mode disabled (Two-Speed Start-up disabled))
    
    // FOSC
    #pragma config POSCMOD = NONE           // Primary Oscillator Configuration bits (Primary oscillator disabled)
    #pragma config OSCIOFNC = ON           // CLKO Enable Configuration bit (CLKO output signal active on the OSCO pin; primary oscillator must be disabled or configured for the External Clock mode (EC) for the CLKO to be active (POSCMD<1:0>))
    #pragma config POSCFREQ = HS            // Primary Oscillator Frequency Range Configuration bits (Primary oscillator/external clock input frequency greater than 8 MHz)
    #pragma config SOSCSEL = SOSCHP        // SOSC Power Selection Configuration bits (Secondary oscillator configured for high-power operation)
    #pragma config FCKSM = CSDCMD           // Clock Switching and Monitor Selection (Clock switching is disabled, Fail-Safe Clock Monitor is disabled)
    
    // FWDT
    #pragma config WDTPS = PS32768          // Watchdog Timer Postscale Select bits (1:32,768)
    #pragma config FWPSA = PR128            // WDT Prescaler (WDT prescaler ratio of 1:128)
    #pragma config WINDIS = OFF             // Windowed Watchdog Timer Disable bit (Standard WDT selected; windowed WDT disabled)
    #pragma config FWDTEN = OFF             // Watchdog Timer Enable bit (WDT disabled (control is placed on the SWDTEN bit))
    
    
    // FPOR
    #pragma config BOREN = BOR0             // Brown-out Reset Enable bits (Brown-out Reset disabled in hardware; SBOREN bit disabled)
    #pragma config PWRTEN = ON              // Power-up Timer Enable bit (PWRT enabled)
    #pragma config BORV = 0b10             // Brown-out Reset Voltage bits
    #pragma config MCLRE = ON               // MCLR Pin Enable bit (MCLR pin enabled; RA5 input pin disabled)
    
    // FICD
    #pragma config ICS = PGx2               // Reserved (PGC2/PGD2 are used for programming the device)
    
    // FDS
    #pragma config DSWDTPS = DSWDTPSF       // Deep Sleep Watchdog Timer Postscale Select bits (1:2,147,483,648 (25.7 Days))
    #pragma config DSLPBOR = OFF            // Deep Sleep Zero-Power BOR Enable bit (Deep Sleep BOR disabled in Deep Sleep)
    #pragma config DSWDTEN = OFF            // Deep Sleep Watchdog Timer Enable bit (DSWDT disabled)
    
    
    
    
    void main(void) {
    
    
        PORTA=0;
        PORTB=0;
    
        TRISA=0;
        TRISB=0;
        TRISBbits.TRISB4=1;
    
        T1CON=0b1000000000110000;
        
          
       AD1PCFG=0b1111111111111111;
       AD1PCFGbits.PCFG2=0;
        
     //AD1CON1
     AD1CON1bits.ADSIDL = 0; //continue in idle
     AD1CON1bits.FORM = 0; //integer output
     AD1CON1bits.SSRC = 0b111; //auto convert
     AD1CON1bits.ASAM = 1;  //auto start sampling
     AD1CON1bits.SAMP = 0;  //status bit - no meaning here
     AD1CON1bits.DONE = 0;  //status bit - no meaning here
     //AD1CON2
     AD1CON2bits.VCFG = 0;  //AVDD & AVSS
     AD1CON2bits.CSCNA = 0; //
     AD1CON2bits.BUFS = 0;  //status bit - no meaning here
     AD1CON2bits.SMPI = 0;  //
     AD1CON2bits.BUFM = 0;  //buffer is one 16 word buffer
     AD1CON2bits.ALTS = 0;  //always use MUX A
     //AD1CON3
     AD1CON3bits.ADRC = 0;
     AD1CON3bits.SAMC = 0b11111;  //31 TAD
     AD1CON3bits.ADCS = 0b101;  //5 * TCY
        
     AD1CSSL = 0;	 //No scanned inputs  
       
    
     AD1CON1bits.ADON=1;
    
    
        int a=0;
        while(1)
        {
            while (!AD1CON1bits.DONE);
            a=ADC1BUF0;
            TMR1=0;
            while(TMR1<=a+2)
            {
                PORTAbits.RA2=1;
            }
            TMR1=0;
            while(TMR1<=2+a)
            {
                PORTAbits.RA2=0;
            }
            
        }
        return;
    }

    -----
    Dernière modification par Antoane ; 22/03/2015 à 12h18. Motif: Ajout balises [code]

  2. #2
    HAYAC

    Re : Entrée analogique pic24f04ka200

    Bonjour,

    Dans le code transmis, la variable ADC1BUF0 n'est définie nul par.
    Il me semble logique que sa valeur ne change pas ...

    Cordialement,

  3. #3
    extremgear

    Re : Entrée analogique pic24f04ka200

    ce n'est pas une variable mais un registre .

  4. #4
    HAYAC

    Re : Entrée analogique pic24f04ka200

    Ce qui n’empêche pas le fait de le renseigner, de l'affecter ?!

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

    Re : Entrée analogique pic24f04ka200

    Citation Envoyé par HAYAC Voir le message
    Ce qui n’empêche pas le fait de le renseigner, de l'affecter ?!
    normalement le fihcier xc.h s'occupe de tout .
    et le compilo n'autorise pas la compilation avec une variable non déclarée en principe.

    il y a plusieurs bizzarerie dans le code par exemple :

    Code:
    PORTAbits.RA2=0;
    déconseillé , utiliser LATA de préférence.

    et je ne vois pas ce que l'instruction return; vient faire ici.
    je ne suis pas expert en programmation j'espère que les pros du forum pourront t'aider .

  7. #6
    spown

    Re : Entrée analogique pic24f04ka200

    Bonjour/bonsoir;

    Essayes ca :

    Code:
    #include <xc.h>
    
    // FGS
    #pragma config GWRP = OFF               // General Segment Code Flash Write Protection bit (General segment may be written)
    #pragma config GCP = OFF                // General Segment Code Flash Code Protection bit (No protection)
    
    // FOSCSEL
    #pragma config FNOSC = FRC              // Oscillator Select (Fast RC oscillator (FRC))
    #pragma config IESO = OFF               // Internal External Switch Over bit (Internal External Switchover mode disabled (Two-Speed Start-up disabled))
    
    // FOSC
    #pragma config POSCMOD = NONE           // Primary Oscillator Configuration bits (Primary oscillator disabled)
    #pragma config OSCIOFNC = ON           // CLKO Enable Configuration bit (CLKO output signal active on the OSCO pin; primary oscillator must be disabled or configured for the External Clock mode (EC) for the CLKO to be active (POSCMD<1:0>))
    #pragma config POSCFREQ = HS            // Primary Oscillator Frequency Range Configuration bits (Primary oscillator/external clock input frequency greater than 8 MHz)
    #pragma config SOSCSEL = SOSCHP        // SOSC Power Selection Configuration bits (Secondary oscillator configured for high-power operation)
    #pragma config FCKSM = CSDCMD           // Clock Switching and Monitor Selection (Clock switching is disabled, Fail-Safe Clock Monitor is disabled)
    
    // FWDT
    #pragma config WDTPS = PS32768          // Watchdog Timer Postscale Select bits (1:32,768)
    #pragma config FWPSA = PR128            // WDT Prescaler (WDT prescaler ratio of 1:128)
    #pragma config WINDIS = OFF             // Windowed Watchdog Timer Disable bit (Standard WDT selected; windowed WDT disabled)
    #pragma config FWDTEN = OFF             // Watchdog Timer Enable bit (WDT disabled (control is placed on the SWDTEN bit))
    
    
    // FPOR
    #pragma config BOREN = BOR0             // Brown-out Reset Enable bits (Brown-out Reset disabled in hardware; SBOREN bit disabled)
    #pragma config PWRTEN = ON              // Power-up Timer Enable bit (PWRT enabled)
    #pragma config BORV = 0b10             // Brown-out Reset Voltage bits
    #pragma config MCLRE = ON               // MCLR Pin Enable bit (MCLR pin enabled; RA5 input pin disabled)
    
    // FICD
    #pragma config ICS = PGx2               // Reserved (PGC2/PGD2 are used for programming the device)
    
    // FDS
    #pragma config DSWDTPS = DSWDTPSF       // Deep Sleep Watchdog Timer Postscale Select bits (1:2,147,483,648 (25.7 Days))
    #pragma config DSLPBOR = OFF            // Deep Sleep Zero-Power BOR Enable bit (Deep Sleep BOR disabled in Deep Sleep)
    #pragma config DSWDTEN = OFF            // Deep Sleep Watchdog Timer Enable bit (DSWDT disabled)
    
    
    
    
    void main(void) {
    
    
        PORTA=0;
        PORTB=0;
    
        TRISA=0;
        TRISB=0x0010;
     
        T1CON=0b1000000000110000;
        
          
       AD1PCFG=0xFFFB;  
     AD1CON1=0x00E4;
     AD1CON2=0x0000;
     AD1CON3=0x01F5;
     
     AD1CHS = 2;  
    
       
     AD1CON1bits.ADON=1;
    
    
        int a=0;
        while(1)
        {
            while (!AD1CON1bits.DONE);
            a=ADC1BUF0;
            TMR1=0;
            while(TMR1<=a+2)
            {
                PORTAbits.RA2=1;
            }
            TMR1=0;
            while(TMR1<=2+a)
            {
                PORTAbits.RA2=0;
            }
            
        }
        return 0;
    }

  8. #7
    skanka

    Re : Entrée analogique pic24f04ka200

    Ce qui est dans le while(1) {...} est décoratif : cela sert juste à visualiser la valeur du registre ADC1BUF0 lors de l'implémentation dans le pic.

    J'ai essayé ton code, spown, mais ça ne marche pas mieux.
    J'ai fait quelques simulations pour visualiser les changements de valeurs dans les registres, j'ai conclu que le pic ne prend pas en considération l'ordre de mettre AN2 en entrée analogique. J'ai injecté une valeur dans le registre ADC1BUF0. Après un cycle de conversion, cette valeur est remise à 0.

  9. #8
    spown

    Re : Entrée analogique pic24f04ka200

    Avant de proposer autre chose, peux tu éclairer quelques points.

    Tu fais la lecture sur quelle pin ( physique ) ? qu'est ce qu'il y sur cette pin ? ( poto , thermistor... schéma si possible ) est ce que tu essayes sur un vrai circuit ou juste simulation ? si c'est un vrai circuit, comment tu visualises les résultats ? led, lcd...

  10. #9
    skanka

    Re : Entrée analogique pic24f04ka200

    J'ai essayé sur un vrai circuit, en visualisant la sortie RA2 avec un oscilloscope. Si le code marchait, la fréquence du signal carré en sortie RA2 (pin 4, résistance de 2kOhm pour avoir une charge) serait fonction de la variable a, donc du registre ADC1BUF0, donc de la valeur de tension analogique appliquée en AN2 (pin 6, potentiomètre pour faire varier la tension). Or la fréquence reste fixe ( environ 2,5 kHz).
    Les pins non utilisés sont en output, MCRL est bien à Vdd et l'alimentation est régulée. Je ne pense pas que le problème vienne du montage.

    Dans mon précédent message, je parlais de visualisation des registres : c'était avec le simulateur de MPLABx. Je crois que le simulateur ne permet pas d'entrer une valeur analogique sur un pin. Ce qui me gène aussi c'est qu'il considère AN2 comme un digital input et lit ce pin dans PORT alors que le datasheet dit :"When reading the PORT register, all pins configured as analog input channels will read as cleared (a low level)." .

  11. #10
    antek

    Re : Entrée analogique pic24f04ka200

    Vérifie le code par petits bouts.
    Si tu ne sais pas simuler une tension d'entrée sur ADC, simule une valeur convertie dans le registre adéquat

    Pour convertir une entrée analogique il faut qu'elle soit paramétrée en entrée ET que le CAN soit paramétré pour la considérer comme une entrée analogique ET que le bon canal soit sélectionné

  12. #11
    spown

    Re : Entrée analogique pic24f04ka200

    Bonjour/bonsoir,

    Conseil d'ami, l'embarqué et/ou informatique, on essaye de faire fonctionner bout par bout de code.

    Bon si t'es sur de ton schéma, commence d'abord par le fonctionnement d'ADC , par la suite tu rajoutes ton timer.

    Essaye ca : mais avant, tu mets une led ( ou oscill ) sur RA2 ( vérifie avant si ta led fonctionne). La led devrait s'allumer si tu dépasse 2.5 volt avec ton poto.
    Code:
    #include <xc.h>
    
    // FGS
    #pragma config GWRP = OFF               // General Segment Code Flash Write Protection bit (General segment may be written)
    #pragma config GCP = OFF                // General Segment Code Flash Code Protection bit (No protection)
    
    // FOSCSEL
    #pragma config FNOSC = FRC              // Oscillator Select (Fast RC oscillator (FRC))
    #pragma config IESO = OFF               // Internal External Switch Over bit (Internal External Switchover mode disabled (Two-Speed Start-up disabled))
    
    // FOSC
    #pragma config POSCMOD = NONE           // Primary Oscillator Configuration bits (Primary oscillator disabled)
    #pragma config OSCIOFNC = ON           // CLKO Enable Configuration bit (CLKO output signal active on the OSCO pin; primary oscillator must be disabled or configured for the External Clock mode (EC) for the CLKO to be active (POSCMD<1:0>))
    #pragma config POSCFREQ = HS            // Primary Oscillator Frequency Range Configuration bits (Primary oscillator/external clock input frequency greater than 8 MHz)
    #pragma config SOSCSEL = SOSCHP        // SOSC Power Selection Configuration bits (Secondary oscillator configured for high-power operation)
    #pragma config FCKSM = CSDCMD           // Clock Switching and Monitor Selection (Clock switching is disabled, Fail-Safe Clock Monitor is disabled)
    
    // FWDT
    #pragma config WDTPS = PS32768          // Watchdog Timer Postscale Select bits (1:32,768)
    #pragma config FWPSA = PR128            // WDT Prescaler (WDT prescaler ratio of 1:128)
    #pragma config WINDIS = OFF             // Windowed Watchdog Timer Disable bit (Standard WDT selected; windowed WDT disabled)
    #pragma config FWDTEN = OFF             // Watchdog Timer Enable bit (WDT disabled (control is placed on the SWDTEN bit))
    
    
    // FPOR
    #pragma config BOREN = BOR0             // Brown-out Reset Enable bits (Brown-out Reset disabled in hardware; SBOREN bit disabled)
    #pragma config PWRTEN = ON              // Power-up Timer Enable bit (PWRT enabled)
    #pragma config BORV = 0b10             // Brown-out Reset Voltage bits
    #pragma config MCLRE = ON               // MCLR Pin Enable bit (MCLR pin enabled; RA5 input pin disabled)
    
    // FICD
    #pragma config ICS = PGx2               // Reserved (PGC2/PGD2 are used for programming the device)
    
    // FDS
    #pragma config DSWDTPS = DSWDTPSF       // Deep Sleep Watchdog Timer Postscale Select bits (1:2,147,483,648 (25.7 Days))
    #pragma config DSLPBOR = OFF            // Deep Sleep Zero-Power BOR Enable bit (Deep Sleep BOR disabled in Deep Sleep)
    #pragma config DSWDTEN = OFF            // Deep Sleep Watchdog Timer Enable bit (DSWDT disabled)
    
    
    
    
    void main(void) {
    
        TRISA=0;
        TRISB=0x0010;
      
       AD1PCFG=0xFFFB;  
       AD1CON1=0x00E4;
       AD1CON2=0x0000;
       AD1CON3=0x01F5;
     
       AD1CHS = 2;  
       AD1CON1bits.ADON=1;
    
    
        int a=0;
        while(1)
        {
            //while (!AD1CON1bits.DONE);
            a=ADC1BUF0;
           if ( a >= 512 ) 
                LATAbits.LATA2=1;
            else
            LATAbits.LATA2=0;
            
        }
        return 0;
    }
    Pour simulation sur stimulus, il faut mettre les valeurs directement dans le registre ADC1BUF0 ( 10 bits ) via register injection

  13. #12
    skanka

    Re : Entrée analogique pic24f04ka200

    Merci, j'implémenterai ton code dans le pic fin de semaine prochaine, quand je serai de retour chez moi.
    Pour l'instant je ne sais pas comment utiliser le register injection.

Discussions similaires

  1. interuption sur une entrée analogique
    Par mistral83 dans le forum Électronique
    Réponses: 6
    Dernier message: 07/03/2013, 21h13
  2. entrée analogique 16f628a
    Par gabydu25 dans le forum Électronique
    Réponses: 17
    Dernier message: 10/02/2013, 14h24
  3. [PIC] Alimentation via entrée analogique ?
    Par Seb.26 dans le forum Électronique
    Réponses: 8
    Dernier message: 15/01/2012, 22h19
  4. Entrée analogique sur Microcontorleur PIC
    Par Toofik dans le forum Électronique
    Réponses: 1
    Dernier message: 27/01/2006, 21h47
  5. Potar sur entrée analogique PIC
    Par Marc dans le forum Électronique
    Réponses: 3
    Dernier message: 17/05/2003, 14h58
Découvrez nos comparatifs produits sur l'informatique et les technologies.