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 ---
- 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 ---
Modérateur : Jérémy
programme utilisation module can(ADC) du pic 16f887
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 :
Qu' en pensez vous ?
Merci de votre attention
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- Messages : 2722
- Âge : 44
- Enregistré en : juillet 2015
- Localisation : Dans le sud
- Contact :
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 :
É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
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 :
tout simplement .
Je ne connais pas cette fonction ADRESH:
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é .
Bonne chance, tiens nous au jus
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);
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 =0 ; // 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
programme utilisation module can du pic 16f887
-
Jérémy
Administrateur du site- Messages : 2722
- Âge : 44
- Enregistré en : juillet 2015
- Localisation : Dans le sud
- Contact :
je viens de remarquer que tu utilise le PIC16F887, je suis donc aller cherche la DS ici
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 .
ADC_Read(0) ne focntionne qu'avec une ten sion de reference interne !
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 .
ADC_Read(0) ne focntionne qu'avec une ten sion de reference interne !
programme utilisation module can du pic 16f887
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
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
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
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- Messages : 2722
- Âge : 44
- Enregistré en : juillet 2015
- Localisation : Dans le sud
- Contact :
sonts obscurs a l' utilisateur ...
des fois c'est pas plus mal !
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 ?
programme utilisation module can du pic 16f887
sinon j avais fait un programme comme celui ci :
je viens juste de remettre la main dessus .
Qu en penses tu ?
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
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
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
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 =0 ; // 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- Messages : 2722
- Âge : 44
- Enregistré en : juillet 2015
- Localisation : Dans le sud
- Contact :
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 ?
Ca je ne vois pas pourquoi ! chez moi "en réel" ça fonctionne très bien ainsi !
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 .
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 .
programme utilisation module can du pic 16f887
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
Expert- Messages : 2597
- Âge : 73
- Enregistré en : juillet 2015
- Localisation : 01800
- Contact :
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 ...
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 ...
Qui est en ligne
Utilisateurs parcourant ce forum : Aucun utilisateur enregistré et 47 invités