Bienvenue aux nouveaux arrivants sur FantasPic !

- Pensez à lire les règles durant votre visite, il n'y en a pas beaucoup, mais encore faut-il les respecter .
- N’hésitez pas à faire des remarques et/ou suggestions sur le Forum, dans le but de l'améliorer et de rendre vos prochaines visites plus agréables.
- Vous pouvez regarder votre "panneau de l'utilisateur" afin de configurer vos préférences.
- Un passage par "l'utilisation du forum" est recommandé pour connaître les fonctionnalités du forum.

--- L’équipe FantasPic ---
Forum général sur le langage C !

Modérateur : Jérémy

Module ADC et buffer du dsPIC33EP
Simlock
Membre
Membre
Messages : 21
Enregistré en : mai 2016
Localisation : Sur mon siege

#11 Message par Simlock » ven. 27 mai 2016 14:51

Re !

Je reviens car je me penche dessus en ce moment.

Je me sert de la doc que j'ai donné plus haut page 47. Un exemple de code où 4 entrées analogique sont converties sur CH0 (ce qu'il me faut).

J'ai modifier le code pour utiliser seulement AN0, AN1, AN2, AN3 :

Code : Tout sélectionner

void Init_ADC ()
{
    /* Set port configuration */
    ANSELBbits.ANSB0 = 1; // Ensure AN0/RB0 is analog
    ANSELBbits.ANSB1 = 1; // Ensure AN1/RB1 is analog
    ANSELBbits.ANSB2 = 1; // Ensure AN2/RB2 is analog
    ANSELBbits.ANSB3 = 1; // Ensure AN3/RB3 is analog
    ANSELBbits.ANSB4 = 1; // Ensure AN3/RB4 is analog
    ANSELBbits.ANSB5 = 1; // Ensure AN3/RB5 is analog
    
    
//AD1 CLEAR
    AD1CON1 = 0x0000;       // Clock / Mode / Main
    AD1CON2 = 0x0000;       // Channel / Interrupt Config
    AD1CON3 = 0x0000;       // Clock Things
    AD1CON4 = 0x0000;       // DMA Stuff
    AD1CHS0 = 0x0000;       // Channel 0 Setup
    AD1CSSL = 0x0000;       // Channel Scan Selections (Scan AN1, Front Pot and AN15, Rear Pot)
      
    
    AD1CON1bits
.AD12B = 1;  // 12 bit      
    AD1CON1bits.ASAM = 1;   // Sampling begins immediately after last conversion. SAMP bit is auto-set.
    AD1CON1bits.SSRC = 7;
    
    AD1CON2bits
.CSCNA = 1;  // Scan INputs for CH0+ during sample A bit 
    AD1CON2bits.SMPI = 3;
    
    AD1CON3bits
.ADCS = 0x0F;
    AD1CON3bits.SAMC = 0xF;
    
    AD1CSSL 
= 0x007F; // Select AN0, AN1, AN2 and AN3 for scanning
    
    AD1CHS0bits
.CH0SA = 0; // Select AN0 for CH0 +ve input
    AD1CHS0bits.CH0NA = 0; // Select Vref- for CH0 -ve input
  
    AD1CON1bits
.ADON = 1;  // Turn on

 


Et la ou je récupère la conversion :

Code : Tout sélectionner

        while (!_AD1IF);
        _AD1IF = 0;

        if (ADC1BUF0 > 512)
            LED1 = 1;
        else LED1 = 0;
        
        if 
(ADC1BUF1 > 512)
            LED2 = 1;
        else LED2 = 0;
        
        if 
(ADC1BUF2 > 512)
            LED3 = 1;
        else LED3 = 0


Mais la LED2 et la LED3 ne bougent toujours pas. La LED1 change bien d'état en fonction de mon potar. Il y a seulement une conversion sur ADC1BUF0 mais pas le reste.

Je ne comprend toujours pas donc arriverez vous avec ce code à me guider un peu mieux...

Module ADC et buffer du dsPIC33EP
Guest
Confirmé
Confirmé
Messages : 800
Enregistré en : mars 2017

#12 Message par Guest » ven. 27 mai 2016 17:49

bonjour

Pourquoi scanner an0......an6 ->7F
si tu veux an0:an3
AD1CSSH = 0x0000;
AD1CSSL = 0x000F; // Select AN0, AN1, AN2,AN3 pour scanner
Tu as bien mis 4 potentiomètres 1 sur chaque entrée? Car la tournure de ta phrase nous fait penser le contraire, je peux me tromper :wink:
il faudrait voir ,d'optimiser tout cela en passant comme dans l'exemple,directement par les registres plutôt que par leurs bits du registre
par exemple :
ANSB=0x0F;

Fait un test ainsi et repost le code ,c'est plus facile de lire les registres :wink:

sinon je ne vois rien de particulier

A+

PS

Module ADC et buffer du dsPIC33EP
Simlock
Membre
Membre
Messages : 21
Enregistré en : mai 2016
Localisation : Sur mon siege

#13 Message par Simlock » lun. 30 mai 2016 09:15

Que je scanne de AN0 à AN3 ou AN6, je ne pense pas que ça change grand chose. J'ai testé ADC1BUF4 à 6 et aucun résultat non plus. J'ai bien un potar sur chaque entrées.

Les bits de registre c'est parce que je pensais qu'il serait plus facile de voir qu'est ce que j'ai configuré à la lecture. Vu que ça ne fonctionne pas et que c'est des tests...

Code : Tout sélectionner

void Init_ADC ()
{
    
    
//    /* Set port configuration */
    
ANSELBbits.ANSB0 1// Ensure AN0/RB0 is analog
    
ANSELBbits.ANSB1 1// Ensure AN1/RB1 is analog
    
ANSELBbits.ANSB2 1// Ensure AN2/RB2 is analog
    
ANSELBbits.ANSB3 1// Ensure AN3/RB3 is analog
    
ANSELBbits.ANSB4 1// Ensure AN3/RB4 is analog
    
ANSELBbits.ANSB5 1// Ensure AN3/RB5 is analog
    
    
    
AD1CON1 0x04E4// Enable 12-bit mode, auto-sample and auto-conversion
    
AD1CON2 0x040C// Sample 4 channels alternately using channel scanning
    
AD1CON3 0x0F0F// Sample for 15*TAD before converting
    
AD1CON4 0x0000;
    
AD1CSSH 0x0000;
    
AD1CSSL 0x000F// Select AN0, AN1, AN2 and AN3 for scanning
    
    
AD1CHS0bits.CH0SA 0// Select AN5 for CH0 +ve input
    
AD1CHS0bits.CH0NA 0// Select Vref- for CH0 -ve input
    
  
    
AD1CON1bits.ADON 1;  // Turn on
    
 

Module ADC et buffer du dsPIC33EP
Guest
Confirmé
Confirmé
Messages : 800
Enregistré en : mars 2017

#14 Message par Guest » lun. 30 mai 2016 09:31

Bonjour

Sur ADCON2:
-Tu as une raison de ne pas mettre V REF+ à VCC ?
Les 6 derniers bits
-Pourquoi 1100 ?
et pas : 0000
= Increments the DMA address after completion of every sample/conversion operation

Fait AD1CON2=0x300 pour voir

A+

Module ADC et buffer du dsPIC33EP
Simlock
Membre
Membre
Messages : 21
Enregistré en : mai 2016
Localisation : Sur mon siege

#15 Message par Simlock » lun. 30 mai 2016 11:04

Je commence à avoir un résultat. Je m'en excuse mais c'est le module UART qui perturbait ce que je faisais. le mappage UART pointait sur les même broches que les LED sur le prototype microchip que j'utilise.

Ducoup avec AD1CON2 = 0x040C : le résultat AN1 et AN2 est récupéré dans ADC1BUF1 car ma led réagissait avec les deux potar...

Avec AD1CON2 = 0x404 : j'ai bien AN0 dans ADC1BUF0 et AN1 dans ADC1BUF1 mais je ne récupère plus rien après.

Avec AD1CON2 = 0x400 : j'ai seulement AN0 dans ADC1BUF0 et plus rien après.

Merci maï pour ton aide. Avec ADC1CON2 = 0x300 j'ai le même résultat que pour AD1CON2 = 0x400

Enfaite je testais l'exemple de la doc mais tu ne regardes pas au bon endroit du-coup quand tu dis
"Increments the DMA address after completion of every sample/conversion operation"

car j'ai le bit ADDMAEN = 0 soit : ADC interrupt is generated at the completion of every sample/conversion operation

Je ne sais pas ce que ça change réellement pour ADC1BUFx après ^^

Module ADC et buffer du dsPIC33EP
Guest
Confirmé
Confirmé
Messages : 800
Enregistré en : mars 2017

#16 Message par Guest » lun. 30 mai 2016 11:32

Si tu utilises int je ne vois pas sont traitement .Dans l'exemple que j'ai fourni avec un 24F il y a celui ci

et pour Vref+ ???

Module ADC et buffer du dsPIC33EP
Simlock
Membre
Membre
Messages : 21
Enregistré en : mai 2016
Localisation : Sur mon siege

#17 Message par Simlock » lun. 30 mai 2016 12:08

maï a écrit :Si tu utilises int je ne vois pas sont traitement .Dans l'exemple que j'ai fourni avec un 24F il y a celui ci

et pour Vref+ ???


Pour Vref+ je suis pourtant sur VCC. Si VCFG<2:0> = 0 Alors VREFH = AVDD soit VCC dans mon cas et VREFL = AVSS soit GND. Non ?

J'ai enfin quelque chose de correcte. Je remet le code de l'init pour qu'on soit tous d'accord :

Code : Tout sélectionner

void Init_ADC ()
{
    
//    /* Set port configuration */
    
ANSELBbits.ANSB0 1// Ensure AN0/RB0 is analog
    
ANSELBbits.ANSB1 1// Ensure AN1/RB1 is analog
    
ANSELBbits.ANSB2 1// Ensure AN2/RB2 is analog
    
ANSELBbits.ANSB3 1// Ensure AN3/RB3 is analog
    
ANSELBbits.ANSB4 1// Ensure AN3/RB4 is analog
    
ANSELBbits.ANSB5 1// Ensure AN3/RB5 is analog
    
    
AD1CON1 0x04E4;   // Enable 12-bit mode, auto-sample and auto-conversion
    
AD1CON2 0x047E;   // Sample 4 channels alternately using channel scanning
    
AD1CON3 0x0F0F;   // Sample for 15*TAD before converting
    
AD1CON4 0x0000;
    
AD1CSSH 0x0000;
    
AD1CSSL 0x007F;   
    
    
AD1CHS0bits.CH0SA 0// Select AN5 for CH0 +ve input
    
AD1CHS0bits.CH0NA 0// Select Vref- for CH0 -ve input
    
    
AD1CON1bits.ADON 1;  // Turn on
 


Et maintenant j'ai :
ADC1BUF0 = AN0
ADC1BUF1 = AN1
ADC1BUF2 = AN2
ADC1BUF3 = AN3
ADC1BUF4 = AN4
ADC1BUF5 = AN5

Je comprend pas très bien le fonctionnement de SMPI. Je vais essayé de le comprendre mais si quelqu'un comprend qu'il n'hésite pas :-D

J'ai obtenu le résultat que je voulais merci pour ton aide maï. Si jamais je comprend le principe d'ordre de conversion je post !

Module ADC et buffer du dsPIC33EP
Guest
Confirmé
Confirmé
Messages : 800
Enregistré en : mars 2017

#18 Message par Guest » lun. 30 mai 2016 15:32

Bon c'est bien :bravo: AD1CON2 et AD1CSSL pour Vref+ c'est ok je suis a cote de la plaque :wink:
bon suite a toi et plaisir de te lire

A=


Retourner vers « Langage C »

Qui est en ligne

Utilisateurs parcourant ce forum : Aucun utilisateur enregistré et 117 invités