Bonjour, je cherche depuis deux jours un exemple de programme de PIC en langage c qui permet de faire une converstion analogique numérique mais je trouve pas, avez vous un lien ou PDF ou un truk intéréssant ?
-----
Bonjour, je cherche depuis deux jours un exemple de programme de PIC en langage c qui permet de faire une converstion analogique numérique mais je trouve pas, avez vous un lien ou PDF ou un truk intéréssant ?
Salut,
Avec quel PIC et quel compilateur?
Tu as des librairies qui font tout, sinon tu te tape toute les lectures/écritures de registres à la main (rien de bien compliqué)
Merci pour votre réponse.
je travail sur un PIC18F4550 avec le logiciel de programmation MPLAB v8.20 et le compilateur MPLAB C 18.
Tu as la doc des librairies de C18 ici:
http://ww1.microchip.com/downloads/e...ies_51297f.pdf
Va voir la page 16
2.2.2 Example Use of the A/D Converter Routines
#include <p18C452.h>
#include <adc.h>
#include <stdlib.h>
#include <delays.h>
int result;
void main( void )
{
// configure A/D convertor
OpenADC( ADC_FOSC_32 & ADC_RIGHT_JUST & ADC_8ANA_0REF,
ADC_CH0 & ADC_INT_OFF );
Delay10TCYx( 5 ); // Delay for 50TCY
ConvertADC(); // Start conversion
while( BusyADC() ); // Wait for completion
result = ReadADC(); // Read result
CloseADC(); // Disable A/D converter
}
j'ai trouver cette exemple dans ce PDF mais je ne c'est pas ou est ce qu'ils ont declaré la pin d'entré analogique ?
Sans connaître le PIC, tu as une référence à ADC_CH0 dans la fonction OpenADC
Hello,
J'utilise depuis 2ans le pic 18f4520, je ne pense pas qu'il y ait grande différence avec le tien ...
Voila le code que j'ai pour la conversion :
prototype :
Cliquez pour afficher
//---------------------------------------------------
// Recoit en entrée le canal à convertir
// Fournit en sortie la valeur analogique
int16 Adc_read(unsigned char channel)
{
int16 value;
ADCON0 = (channel << 2) + 0b00000001;
value = ADRESL + ADRESH<<8;
ADGO = 1;
while(ADGO)
continue;
return (value);
}
et :
Cliquez pour afficher
temp_tension = Adc_read( 0x00 ); //Valeur sur channel 0 // tu peux changer la valeur (ici 0x00) pour choisir ton channel !
Voila ! Si tu as des questions hésite pas !
Bonne journée
d'aprés le DATASHEET de mon PIC18F4550 je trouve qu'il contien 13 channel input A/D mais je ne trouve pas exactement les pins associées à ces channels
Dans le chapitre "10-BIT ANALOG-TO-DIGITAL CONVERTER (A/D) MODULE" de la datasheet, tu as les bits à selectionner pour chaque canal
Pour savoir à quelle pin est associé un canal, yaka regarder le brochage au début...
Ca c'est pas compliqué:
Regarde le pins diagrams ( dans les toutes premières pages ...) et les convertisseurs sont notés ANx ( exemple : AN0 pour le Channel 0) !
DEGK , merci pour votre programme mais ca me donne erreur de syntaxe à la ligne "value = ADRESL + ADRESH<<8;"
Re !
Tu as bien mis value en 16bit ?
Remplace quand même la ligne par : value = ((int16)ADRESH<<8) + ADRESL;
Je te promets rien mais chez moi ca fonctionne(ait) tip top !
A+
voila ce que j'ai sur mon écran je ne voie aucune erreur selon ce que vous dites DEGK.
C'est quoi ces int 16 XXXX qui trainent?????
A la rigueur int16, mais sans espace si tu veut avoir une chance que ca marche
Salut,
Je te conseille de mettre à jour MPLAB car tu utilises une version vieille de 2 ou 3 ans...
La dernière version est la v8.80 téléchargeable ici : http://www.microchip.com/MPLAB
Pour les exemples, tu peux chercher les exemples de code pour les périphériques des PIC18 ici : http://www.microchip.com/codeexamples
La dernire colonne permet de filtrer par famille (PIC18, PIC24, PIC32, dsPI33F, dsPIC33E,...)
a+
Bonjour, Merci RISC, j'ai trouver un exemple de programme qui correspond + ou - à ce que je cherche, vue que le programme que j'ai trouvé fait la conversion A/N mais il envoi le résultat par liaison série, alors que moi je souhaitte lire le resultat sur un jeu de LED's, donc j'ai modifier le programme que j'ai trouvé pour que ça donne ca :
#include <p18f4550.h>
#include <adc.h>
#include <stdio.h>
#define BAUDRG 21 // 115.2Kbps from 10MH
void main()
{
int result;
TRISD = 0;
OpenADC(ADC_FOSC_RC & ADC_LEFT_JUST & ADC_20_TAD, ADC_CH0 & ADC_INT_ON & ADC_REF_VDD_VSS, ADC_1ANA);
ConvertADC();
while(BusyADC());
PORTD = ReadADC(); // Read result
CloseADC(); // Disable A/D converter
return;
}
ca compile sans erreurs mais rien ne s'allume sur ma maquette , avez vous des remarques ?
C'est quoi ta maquette?Bonjour, Merci RISC, j'ai trouver un exemple de programme qui correspond + ou - à ce que je cherche, vue que le programme que j'ai trouvé fait la conversion A/N mais il envoi le résultat par liaison série, alors que moi je souhaitte lire le resultat sur un jeu de LED's, donc j'ai modifier le programme que j'ai trouvé pour que ça donne ca :
#include <p18f4550.h>
#include <adc.h>
#include <stdio.h>
#define BAUDRG 21 // 115.2Kbps from 10MH
void main()
{
int result;
TRISD = 0;
OpenADC(ADC_FOSC_RC & ADC_LEFT_JUST & ADC_20_TAD, ADC_CH0 & ADC_INT_ON & ADC_REF_VDD_VSS, ADC_1ANA);
ConvertADC();
while(BusyADC());
PORTD = ReadADC(); // Read result
CloseADC(); // Disable A/D converter
return;
}
ca compile sans erreurs mais rien ne s'allume sur ma maquette , avez vous des remarques ?
Rajoute une boucle while(1) ca sera plus efficace que devoir reset à chaque fois
Bon mon schéma sur quoi je travail , c'est un truk comme ca .
C'est un truk kom ca, ou c'est ca?
En considérant que les résistances sont correctement connectées au bargraph et que le circuit de reset fonctionne, ça devrait pas poser de problèmes.
T'as essayé la boucle while(1)?
L'allumage de ton bargrah marche normalement? si tu fait directement un PORTD = 0xF0, il se passe quoi?
j'ai fait un teste avec PORTD=0xFF et les LED's s'allument correctement y'as pas de problémes au niveau du montage. et en tout cas j'ai essaié un programme de conversion A/N avec le language Proton basic et ca marche parfaitement, mais en C je ne c pas queceque ne va pas.
pour la boucle while(1) vous voulez dir que ca doit etre un truk comme ca ?
#include <p18f4550.h>
#include <adc.h>
#include <stdio.h>
#define BAUDRG 21 // 115.2Kbps from 10MH
void main()
{
int result;
TRISD = 0;
OpenADC(ADC_FOSC_RC & ADC_LEFT_JUST & ADC_20_TAD, ADC_CH0 & ADC_INT_ON & ADC_REF_VDD_VSS, ADC_1ANA);
ConvertADC();
while(BusyADC());
PORTD = ReadADC(); // Read result
Delay10KTCYx(100);
CloseADC(); // Disable A/D converter
while(1);
}
vous avez un exemple ?
Code:#include <p18f4550.h> #include <adc.h> #include <stdio.h> #define BAUDRG 21 // 115.2Kbps from 10MH void main() { int result; TRISD = 0; OpenADC(ADC_FOSC_RC & ADC_LEFT_JUST & ADC_20_TAD, ADC_CH0 & ADC_INT_ON & ADC_REF_VDD_VSS, ADC_1ANA); while(1){ ConvertADC(); while(BusyADC()); PORTD = ReadADC(); // Read result Delay10KTCYx(100); } CloseADC(); // Disable A/D converter }
ca donne rien auss
en fait moi j'utilise pas un port serie, et le signale d'horloge est généré par un quartz, et le scripte correspend correctement normalement à ce que j'ai comme schéma.
j'utilise un programateur de pic PicKit2.
Le schema fourni est exactement le montage TYPE pour tester un CAN avec son potar et afficher la valeur sur un bar graph (normalement sur 10 sorties pour les 10 bits de ton CAN). Donc il doit y avoir un loup. J'espere que le source ne provient pas d'un document scanné. As tu des erreurs de compilation? meme mineures?
non j'ai pas d'erreurs de compilation et mon montage fonctionne avec le programme de proton basic suivant :
Device 18F4550
ALL_DIGITAL TRUE
XTAL 4
' initialisation du ADC
Declare ADIN_RES 10 'resultat sur 10bits
Declare ADIN_TAD FRC 'clock interne
Declare ADIN_STIME 10 '10 us de periode
OSCCON=%1100111 'configure l'oscillateur interne à 4MHz
TRISD = %00000000 'configuration du protD en sortie
ADCON1 = %10000000 'on fixe A0 en entrée analogique
Dim conv As Word
bcl:
conv = ADIn 0 'Convertion sur AN0
PORTD = conv
GoTo bcl
Donc ton programme est foiré. Gaffe a pas te tromper dans les registres du CAN (ADRESH et ADRESL), ensuite le format de tes registres du CAN (signification a gauche, a droite etc...) sinon tu n'auras rien qui s'affiche ou pas grand chose...