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

programme utilisation module can(ADC) du pic 16f887
adrienc45
Débutant
Débutant
Messages : 27
Enregistré en : octobre 2015

#1 Message par adrienc45 » ven. 9 oct. 2015 23:04

Bonsoir

Je souhaite acquérir la tension continue ( entre 0 et 5v ) d un signal qui arrive sur RA0/AN0 avec un pic avec horloge externe quartz 20 mhz

j ai fait un programme qui sort le nombre binaire obtenu sur les sorties du port C et D configures en sortie numériques

malheureusement le programme plante au bout de quelques instants ; mais affiche tout de même des choses sur le port c et d

voici mon algorithme sur MikroC :

Code : Tout sélectionner



void main()
{


     ADCON0 = 0b10000000;               // fosc/32 an0
     ADCON1 = 0b00000000;               //   Vref+vdd vref-vss justifie gauche

     ANSEL  = 0b00000001;               /* Configurer la broche AN0 du PORTA en analogique les autres en numerique  */
     ANSELH = 0b00000000;               // an8 a an14 en numerique
     
     TRISA  = 0b11111111;               // PORTA de an0 a an7 est entierement configuré en entrée
     TRISD  = 0b00000000;               // PORTD est configuré en sortie
     TRISC  = 0b00000000;               // PORTC est configuré en sortie

     for( ;; )
     {
          Delay_us(50);
          ADCON0.B1= 1;        // demarrage de la conversion can
          do
          {                   //on patiente pendant la conversion
          }
          while(ADCON0.B1= 1); // attente de la remise a 0 automatique  du bit adcon0.0 qui signifie que le convertisseur as fini son travail
          PORTD = ADRESH;      // affichage des bits poids fort sur le port D
          PORTC = ADRESL;      // affichage des bits poids faible sur le port C
     }

}




Qu' en pensez vous ?

Merci de votre attention :)

programme utilisation module can du pic 16f887
Jérémy
Administrateur du site
Administrateur du site
Messages : 2722
Âge : 44
Enregistré en : juillet 2015
Localisation : Dans le sud
Contact :

#2 Message par Jérémy » sam. 10 oct. 2015 00:10

Bonsoir Adrienc45,

Bienvenue sur le forum Fantas-Pic .

Afin de vérifier la configuration de ADCON il faudrait le type de PIC utilisé ainsi qu'un lien vers sa Data-sheet STP .

Si tu as des comparateurs il faudrait certainement les désactivés :

Code : Tout sélectionner

C1ON_bit = 0;               // Désactivation des comparateurs
C2ON_bit = 0;


Étant moi même débutant attends l'avis d'une personne plus qualifiée que moi . Mais j'ai envie de dire que ton programme est plutôt disons "bizarre" .

Avec MikroC il existe une librairie permettant la lecture très simple d'une valeur analogique et de la stockée dans une variable .
Il s'agit de ADC_Read(x) le "x" représentant le Numéro de la broche . dans ton cas se serait : ADC_Read(0)

Ensuite dans ta boucle tu ne fais aucune mesure analogique ?

Sans data-sheet je peux pas le certifié mais ADCON0.B1 me semble une configuration du registre ADCON0 peut être est ce qui autorise la conversion ?

Ensuite tu écris ceci

Code : Tout sélectionner

do
          {                   //on patiente pendant la conversion
          }
          while(ADCON0.B1= 1); // attente de la remise a 0 automatique  du bit adcon0.0 qui signifie que le convertisseur as fini son travail    

En gros tu fais une boucle vide tant ADCON0.B1 = 1 ( qui devrait d'ailleurs s’écrire ADCON0.B1 == 1 ) . Cela peut s’écrire ainsi :

Code : Tout sélectionner

while(ADCON0.B1== 1);
tout simplement .

Je ne connais pas cette fonction ADRESH:

Code : Tout sélectionner

          PORTD = ADRESH;      // affichage des bits poids fort sur le port D
          PORTC = ADRESL;      // affichage des bits poids faible sur le port C   

Mais j'ai un gros doute sur ça validité pour ressortir les bits de poids forts !.

Voila ce que je te propose tiré de l'exemple de MikroC , à essayé .

Code : Tout sélectionner


unsigned int Valeur_ADC 
=; // Création et initialisation de la variable de stockage

void main() {
  ANSELA  = 0b00000001;   // Configure AN0 en analogique
  ANSELB = 0;                 // Configure le PORTB en numérique
  ANSELC = 0;                 // Configure le PORTC en numérique
  C1ON_bit = 0;               // Ici on désactive les comparateurs
  C2ON_bit = 0;
  
  TRISA  
= 0b11111111; // PORTA en entrée
  TRISB  = 0;                 // PORTB en sortie pour leds
  TRISC  = 0;                 // PORTC en sortie pour leds

  LATB = 0;           // On initialise les sorties à 0
  LATC = 0;           // On initialise les sorties à 0

 while (1) {        // Boucle infinie
 
    Valeur_ADC 
= ADC_Read(0);   // Lecture de An0 est stockage de la valeur dans la variable "Valeur_ADC" sur 10bits
    PORTB = Valeur_ADC;         // On envoie les 8 bits de points faibles sur le port B
    PORTC = Valeur_ADC >> 8; // On fait un décalage des 8 bits de poids faibles pour faire apparaitre les 2 bits de poids fort restant sur le PORTC
     
  
} 
}

 


Bonne chance, tiens nous au jus
C'est en faisant des erreurs, que l'on apprend le mieux !!!

programme utilisation module can du pic 16f887
Jérémy
Administrateur du site
Administrateur du site
Messages : 2722
Âge : 44
Enregistré en : juillet 2015
Localisation : Dans le sud
Contact :

#3 Message par Jérémy » sam. 10 oct. 2015 08:32

je viens de remarquer que tu utilise le PIC16F887, je suis donc aller cherche la DS ici :evil:

Image

MAis je crois qu'avec ADC_Read(0) la config ce fait tout seul . Sinon je pense que ADCON0 devrait etre : 0b10000011
Le bit 0 active ou non la conversion , il faut le mettre à 1 je pense .
Attention!! ADC_Read(0) ne focntionne qu'avec une ten sion de reference interne !
C'est en faisant des erreurs, que l'on apprend le mieux !!!

programme utilisation module can du pic 16f887
adrienc45
Débutant
Débutant
Messages : 27
Enregistré en : octobre 2015

#4 Message par adrienc45 » sam. 10 oct. 2015 10:04

ok d accord

mais le probleme avec ADC_read () , c est que les parametres appliques sur ADCON0 et ADCON1 sonts obscurs a l' utilisateur ...

comme par exemple la frequence utilise pour resoudre la conversion analogique numerique ( de fosc a fosc/32 ) , la justification , des parametres comme ca quoi ....

sinon je suis d accord pour dire qu avec cette librairie c est 10 fois plus simple :D

Pour quelle raisons mon programme est bizarre ? j aimerais savoir çà pourrait m aider a m' améliorer dans le domaine qu' est la programmation des pic en c :)

Merci de ton avis en tout cas ;)

je fonctionne deja avec des tensions de reference interne : qui sonts le 5v applique sur l alim vdd du microcontroleur et vss 0v la masse pour vref- du microcontrôleur
Modifié en dernier par adrienc45 le sam. 10 oct. 2015 10:23, modifié 1 fois.

programme utilisation module can du pic 16f887
Jérémy
Administrateur du site
Administrateur du site
Messages : 2722
Âge : 44
Enregistré en : juillet 2015
Localisation : Dans le sud
Contact :

#5 Message par Jérémy » sam. 10 oct. 2015 10:11

sonts obscurs a l' utilisateur ...

des fois c'est pas plus mal ! :D

Je disais "bizarre" , car il n'y as pas de #define ou de déclaration de variable par exemple . Tu attaque direct avec le programme principal ( void main).
Ainsi que ta boucle do-while , que je pense inutile.

As tu essayé avec ma config ?
C'est en faisant des erreurs, que l'on apprend le mieux !!!

programme utilisation module can du pic 16f887
adrienc45
Débutant
Débutant
Messages : 27
Enregistré en : octobre 2015

#6 Message par adrienc45 » sam. 10 oct. 2015 10:43

sinon j avais fait un programme comme celui ci :

Code : Tout sélectionner

unsigned int a;
unsigned int b;

void main()
{
     
     TRISA  
= 0b00000001;               // PORTA seul rao/an0 configuré en entree
     TRISD  = 0b00000000;               // PORTD est configuré en sortie
     TRISC  = 0b00000000;               // PORTC est configuré en sortie
     
     ANSEL  
= 0b00000001;               /* Configurer la broche AN0 du PORTA en analogique et AN1 a AN7 en numerique  */
     ANSELH = 0b00000000;               // an8 a an14 en numerique
     
     ADCON0 
= 0b10000000;               // fosc/32 ; an0
     ADCON1 = 0b00000000;               //   Vref+vdd ;vref-vss; resultat de converstion justifie a gauche dans le registre ADRES( 16 bit ) mais resultat sur 10 bit

     for(;;)
     {
          Delay_us(20);        // attendre que la tension analogique a acquisitionner soit arrive en totalité dans le convertisseur
          ADCON0.B0= 1;        // demarrage de la phase de conversion can
          Delay_us(20);
          do
          
{                    //la boucle sert a  patienter pendant la conversion tant que
          }                    //la remise a 0 automatique  du bit adcon0.b1 n as pas eue lieu , on sort de boucle quand le convertisseur as fini son travail ( drapeau )
          while(ADCON0.B1= 1);
          
          a 
= ADRESH;                   // stockage des 8 bits poids fort du registre haut du resultat du can
          b = ADRESL;                   // stockage des 2 bits poids fort du registre bas du resultat du can
          PORTB = ADRESH;               // affichage des 8 bits poids fort du registre haut du resultat du can sur le port D
          PORTC = ADRESL;               // affichage des 2 bits poids faible du registre bas du resultat du can sur le port C
          Delay_us(4);     // temps d attente entre 2 acquisitions pour interrupteur electronique de l echantilloneur bloqueur
     }



je viens juste de remettre la main dessus .

Qu en penses tu ?

programme utilisation module can du pic 16f887
adrienc45
Débutant
Débutant
Messages : 27
Enregistré en : octobre 2015

#7 Message par adrienc45 » sam. 10 oct. 2015 11:55

j ai essaye ton programme mais il n as pas fonctionne au debut a cause d erreurs sur les noms de registres employés

j ai corrigé ca et ca marche nikel ! merci bien :)

voici le code remis en place et adapté a mon circuit :)

Code : Tout sélectionner



unsigned int Valeur_ADC 
=; // Création et initialisation de la variable de stockage

void main() {
  ANSEL  = 0b00000001;   // Configure pin an0 en analogique


  C1ON_bit = 0;               // Ici on désactive les comparateurs
  C2ON_bit = 0;

  TRISA  = 0b00000001; // PORTA en entrée
  TRISD  = 0x00;                 // PORTD en sortie pour leds
  TRISC  = 0x00;                 // PORTC en sortie pour leds

  PORTD = 0x00;           // On initialise les sorties à 0
  PORTC = 0x00;           // On initialise les sorties à 0

 while (1) {        // Boucle infinie

    Valeur_ADC = ADC_Read(0);   // Lecture de An0 est stockage de la valeur dans la variable "Valeur_ADC" sur 10bits
    PORTD = Valeur_ADC;         // On envoie les 8 bits de points faibles sur le port D
    PORTC = Valeur_ADC >> 8; // On fait un décalage des 8 bits de poids faibles pour faire apparaitre les 2 bits de poids fort restant sur le PORTC

  }
}


je peux mettre en pieces jointe ma simulation sur proteus si tu veux regarder , meme si je me doute que ca t interesse pas vraiment

dans un premier temps , je considere donc le probleme resolu , je reviendrais dessus si besoin d ici peu donc je reste actif sur ce topic tout de meme si j arrive un jour a faire fonctionner mon script sans passer par ADC_read :)

merci encore de l enorme aide apporté :)

maintenant place a mon second et dernier probleme , je cours ouvrir un nouveau sujet pour faire vicire ce forum qui as un grand avenir j espere :)

programme utilisation module can du pic 16f887
Jérémy
Administrateur du site
Administrateur du site
Messages : 2722
Âge : 44
Enregistré en : juillet 2015
Localisation : Dans le sud
Contact :

#8 Message par Jérémy » sam. 10 oct. 2015 12:52

Je ne m'en fou pas, mais la simulation reste de la simulation. ça dépanne , mais ce n'est pas la réalité.

Si quelqu'un de plus calé que moi en la matière peut me confirmer l’écriture de ANSEL Car pou moi ANSEL doit être suivi du numéro du PORT en question ? non ?

Code : Tout sélectionner

j ai essaye ton programme mais il n as pas fonctionne au début a cause d erreurs sur les noms de registres employés

Ca je ne vois pas pourquoi ! chez moi "en réel" ça fonctionne très bien ainsi !

si j arrive un jour a faire fonctionner mon script sans passer par ADC_read

Je pense que c'est chercher des ennuis la ou il n'y en a pas . Utilise la librairie ca t'évitera de nombreux soucis , surtout qu'elle doit faire la même chose que tu essaye de faire , mais avec elle ça fonctionne ;) .
C'est en faisant des erreurs, que l'on apprend le mieux !!!

programme utilisation module can du pic 16f887
mazertoc
Passioné
Passioné
Messages : 201
Enregistré en : juillet 2015
Localisation : Auvernha

#9 Message par mazertoc » sam. 10 oct. 2015 13:26

Jérémy a écrit :Si quelqu'un de plus calé que moi en la matière peut me confirmer l’écriture de ANSEL Car pou moi ANSEL doit être suivi du numéro du PORT en question ? non ?

Les ANSEL et ANSELH sont des noms de registre, non pas d'instructions.

Ce serait peut-être intéressant de créer une rubrique "matériel" pour des questions comme celle-ci,
sans lien avec un langage de programmation.
D'ailleurs beaucoup de questions ne sont pas liées à un langage.

programme utilisation module can du pic 16f887
paulfjujo
Avatar de l’utilisateur
Expert
Expert
Messages : 2597
Âge : 73
Enregistré en : juillet 2015
Localisation : 01800
Contact :

#10 Message par paulfjujo » sam. 10 oct. 2015 19:31

bonsoir,


Attention à l'emploi du Francais à tout prix !
et des abreviations pouvant porter à confusion
Meme si on est sur un site pour promouvoir l'usage du Francais dans les explications et programme.

Le CAN ou bus CAN (Controller Area Network) .. avec ses registres appropries sur certains PIC evolues
Le convertiseur Analogique Numerique ou on utilise à tour de bras ADCxxxx registres..
On est bien obligé de se rapprocher de la terminologie idoine .. celle de la Datasheet.

Qu'en pensez-vous ?

Le Basicois etait un exemple de "francisation" du Basic.. qui à finit dans les oubliettes ...
Aide toi, le ciel ou FantasPic t'aidera


Retourner vers « Langage C »

Qui est en ligne

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