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

Configuration des entrées analogiques
Jérémy
Administrateur du site
Administrateur du site
Messages : 1882
Âge : 38
Enregistré en : juillet 2015
Localisation : Dans le sud
Contact :

#1 Message par Jérémy » mer. 27 déc. 2017 08:54 lien vers la Data-Sheet : Cliquez ici

Bonjour à tous,

Tout d'abord j’espère que vous avez passez de bonnes fêtes de Noël !

J'essaye éperdument de configurer des entrées en analogiques pour lire les valeurs qui arrivent dessus. Au final j'e nsuis réduit aà essayer que sur une seule entrées pour le moment !

Peut être que cela est à cause du PPS , mais je n'arrive pas à lire les valeurs "traditionnellement" on va dire .

D'habitude il suffit d'initialiser le partie " conversion ana/num" avec un ADC_Init();
Puis de lire la valeur avec un ADC_Read(3); ou ADC_Get_Sample(3);.

J'ai vérifier la tension sur ma broche RD5 qui varie bien de presque 0V à quasiment Vcc grâce a mon joystick (Potar de 10K).
Plusieurs HIC :

Comment nommer la broche à lire ? d’après la DS(page 10) , la broche RD5 c'est la broche analogique nommée AND5 mais le terme AND5 n'est pas reconnu dans mikroC . Je pense donc qu'il faut mettre le numéro de la broche c'est à dire 3 pour un TQFP 44 pins?

Pour le moment je n'ai essayé qu'avec les librairies toutes faites de mikroC ( normalement c'est prévue pour ca), et je n'est pas encore essayer la lecture et configuration manuelle.

Je pense que j'ai oublié quelques choses dans la confiration mais je ne sais pas quoi .

j'ai essayé de mettre le bit ADON à 1 pour activer l'ADC ADON_bit = 1;
J'ai essayé de configurer le bit ADPCH et de le mettre sur RD5 avec ADPCH = 0b011101;

Rien n'a fonctionner .

Je vous joint mon programme en ayant supprimé "normalement" les parties complétement inutile pour simplifier la lecture :

Code : Tout sélectionner

// PROGRAMME pour la télécommande-radio du robot

// DS du PIC : http://ww1.microchip.com/downloads/en/DeviceDoc/40001844D.pdf

#define RESET      LATC.B3  // Sortie
#define CONFIG     LATD.B0  // Sortie
#define CTS        LATC.B4  // Sortie
#define RTS        PORTC.B5 // Entrée
#define DATA_REQ   LATD.B2  // Sortie
#define DATA_IND   PORTD.B3 // Entrée
#define TRX_DIS    LATD.B1  // Sortie

#define LED_R      LATC.B2  // Sortie led rouge
#define LED_V      LATC.B1  // Sortie led verte
#define BP         PORTE.B0 // Entree pour BP

//##################################     Variables    ##############################################
 char i, Compteur, Ok ;
 char Joystick_D_HB, Joystick_D_DG, Joystick_G_HB, Joystick_G_DG;



 #include "Initialisation_AMB8626.h"
 
//#################################################################################################
//#########################################      MAIN      ########################################
//#################################################################################################
void main() {

    // RAZ des broches
    LATA = LATB = LATC = LATD = LATE = 0;

    // registres des I/O
    TRISA = 0xEF;            // RA4 en sortie pour liaison
    TRISB = 0xDF;            // RB5 en sortie Pour UART-TX2
    TRISC = 0xA1;            // En sortie RC1 et RC2 pour led test, RC3 et RC4 pour liaison AMB et RC6 pour Tx1
    TRISD = 0xF8;            // En sortie RC0, RC1 et RC2 pour liaison AMB
    TRISE = 0xFF;            // Tout en entrée

    // registre analogiques
    ANSELA = 0x80;           // RA7 en analogique
    ANSELC = 0x01;           // RC0 en analogique
    ANSELD = 0xA0;           // RD5 et RD7 en analogique
    ANSELB=ANSELE = 0x00;

    // Registre des Pull-UP
    WPUA = 0x0F;             // RA0, RA1, RA2 et RA3 en Pull UP
    WPUB = 0x0F;             // RB0, RB1, RB2 et RB3 en Pull UP
    WPUE = 0x01;             // RE0 en pull up pour BP
    WPUC = WPUD = 0x00;

  // -----------------     Initialisation UART  ----------------------------------
  //-----   UART1
  UART1_Init(57600);
  RC1IE_bit = 1;         // Active les Interruptions sur Rx UART 1
  RC1IF_bit = 0;         // RAZ flag
  //-----   UART2
  UART2_Init(57600);
  RC2IE_bit = 1;         // Active les Interruptions sur Rx UART 2
  RC2IF_bit = 0;         // RAZ flag
/*

  //---------------------------     PPS     --------------------------------------------------
  // Séquence de déverouillage des PPS page 218 de la DS
  INTCON.GIE = 0;               // On désactive les INT
  Unlock_IOLOCK();              // On deverouille les PPS
  RX1PPS = 0x17 ;               // RC7->EUSART1:RX1;
  RC6PPS = 0x09;                // RC6->EUSART1:TX1;
  RX2PPS = 0x0F;                // RB7->EUSART2:RX2;
  RB5PPS = 0x0B;                // RB5->EUSART2:TX2;
  Lock_IOLOCK();                // On verouille les PPS

  //------------------------------   INTERRUPTION    -------------------------------------
  //-----      GLOBAL
  INTCON.PEIE = 1 ;       // On active les INT périphériques
  INTCON.GIE  = 1 ;        // On active toutes les INT
  
  //Initialisation_AMB8626();  // Se trouve dans un Header
 */

  // -----------------     Initialisation de la lecture analogique/numérique  ----------------------------------
  ADC_Init();
 // ADON_bit = 1;
  //ADPCH = 0b011101;
  
  
// séquence de clignotement au demarrage (3 fois)
  for (i=0;i<=5;i++){
     LED_R = ~LED_R ;
     delay_ms(100);
   }

//#################################################################################################
//###############################      BOUCLE PRINCIPALE      #####################################
//#################################################################################################

 while(1){
  

    Joystick_G_HB 
= ADC_Read(15);     // Broche RD5
    delay_ms(200);

    UART1_Write(Joystick_G_HB);
    delay_ms(200);

 }
}


Comme vous pouvez le voir j'envoie la valeur lue en UART pour afficher sur realterm.

Auriez vous une idée pour configurer la broche RD5 en entrée analogique correctement et réussir à lire la valeur ?

Merci
C'est en faisant des erreurs, que l'on apprend le mieux !!!

Configuration des entrées analogiques
paulfjujo
Avatar de l’utilisateur
Confirmé
Confirmé
Messages : 784
Âge : 67
Enregistré en : juillet 2015
Localisation : 01120
Contact :

#2 Message par paulfjujo » mer. 27 déc. 2017 11:19 lien vers la Data-Sheet : Cliquez ici

bonjour Jeremy et à tous,

Ce PIC est particulierement compliqué !

aussi , je pense qu'utiliser MPLAB XPRESS est une solution ( de facilité peut etre ?) ,mais qui doit etre efficace.
pour extraire la methode adéquate d'init ADC.
:furieux: MikroC n'etant pas ausssi évolué ... semble dormir sur ses lauriers ! .. fanés.
si ça continue, je vais migrer aussi .


partie config RD5 analogique
18F47K40_ADC_RD5_config.txt


ou le projet complet ( non testé !)
Test_18F47K40_ADC_RD5.zip


A+
Vous n’avez pas les permissions nécessaires pour voir les fichiers joints à ce message.

Configuration des entrées analogiques
Jérémy
Administrateur du site
Administrateur du site
Messages : 1882
Âge : 38
Enregistré en : juillet 2015
Localisation : Dans le sud
Contact :

#3 Message par Jérémy » mer. 27 déc. 2017 12:38 lien vers la Data-Sheet : Cliquez ici

Merci Paul ,

J'avais oublié ce logiciel c'est une excellente idée .

Par contre en feuilletant rapidement tes fichiers, cela revient a faire la configuration manuelle du coup .

Quid des librairies de mikroC ? car si en effet les librairies de mikroC deviennent inopérantes , effectivement ils va falloir qu'il se bougent le cul. car mon but était quand même d'utiliser les librairies toutes faites . Si maintenant faut se faire ces librairies mikroC devient obsolète.

Je vais peut être ouvrir un fil sur le forum mikroC pour faire monter la pression, car je trouve cela inadmissible.
Je vous tiens au jus de mes avancées.

Si vous voyez d'autres solutions je suis tout ouïe !
C'est en faisant des erreurs, que l'on apprend le mieux !!!

Configuration des entrées analogiques
satinas
Amateur
Amateur
Messages : 185
Enregistré en : novembre 2015

#4 Message par satinas » mer. 27 déc. 2017 12:47 lien vers la Data-Sheet : Cliquez ici

Bonjour à tous,
Jeremy, le C est un langage typé, et tu t'obstines à envoyer des carottes à une fonction qui attend des navets. Relis la documentation des fonctions ADC_Read() et UART1_Write()

Configuration des entrées analogiques
Jérémy
Administrateur du site
Administrateur du site
Messages : 1882
Âge : 38
Enregistré en : juillet 2015
Localisation : Dans le sud
Contact :

#5 Message par Jérémy » mer. 27 déc. 2017 12:51 lien vers la Data-Sheet : Cliquez ici

Salut satinas,

Je suppose que tu fais allusion au char pour stocker la valeur lue qui en fait un INT car sur 10 bit non ?

Je m'en suis rendu compte après mon message . J'ai décidé de créer un nouveau programme test rien pour mettre au point la lecture de mes potars.
Les parties commentées , c'est que j'ai essayé :

Code : Tout sélectionner

// PROGRAMME pour la télécommande-radio du robot

// DS du PIC : http://ww1.microchip.com/downloads/en/DeviceDoc/40001844D.pdf

/*
Fosc = 64Mhz
UART1 = 57600 bauds
UART2 = 57600 bauds
*/


#define LED_R      LATC.B2  // Sortie led rouge
#define LED_V      LATC.B1  // Sortie led verte
#define BP         PORTE.B0 // Entree pour BP

//##################################     Variables    ##############################################
 char i ;
 unsigned int Valeur_lue;



//#################################################################################################
//#########################################      MAIN      ########################################
//#################################################################################################
void main() {

    // RAZ des broches
    LATA = LATB = LATC = LATD = LATE = 0;

    // registres des I/O
    TRISA = TRISB =TRISC =TRISD =TRISE = 0xFF ;  // Tout en entrée

    // registre analogiques
    ANSELD = 0b00100000;           // RD5 en analogique

    // Registre des Pull-UP
    WPUA = WPUB = WPUC = WPUD = WPUE = 0x00;

  // -----------------     Initialisation UART  ----------------------------------
  //-----   UART1
  UART1_Init(57600);

  // -----------------     Initialisation de la lecture analogique/numérique  ----------------------------------
  //ADC_Init();
  ADC_Init_Advanced(_ADC_INTERNAL_REF);

  //ADON_bit = 1;
  //ADPCH = 0b011101;

  // séquence de clignotement au demarrage (3 fois)
  for (i=0;i<=5;i++){
     LED_R = ~LED_R ;
     delay_ms(100);
   }

//#################################################################################################
//###############################      BOUCLE PRINCIPALE      #####################################
//#################################################################################################

 while(1){

    Valeur_lue = ADC_Get_Sample(3);;     // Broche RD5
    delay_ms(200);

    UART1_Write(Valeur_lue);
    delay_ms(200);

 }
}
C'est en faisant des erreurs, que l'on apprend le mieux !!!

Configuration des entrées analogiques
satinas
Amateur
Amateur
Messages : 185
Enregistré en : novembre 2015

#6 Message par satinas » mer. 27 déc. 2017 13:00 lien vers la Data-Sheet : Cliquez ici

void UARTx_Write(char data);

UART1_Write() attend un char, valeur numérique sur 8 bits, censée être le code ascii du caractère à afficher.
Si tu envoies 65 à UART1_Write(), il affiche "A", pas "65"

Configuration des entrées analogiques
paulfjujo
Avatar de l’utilisateur
Confirmé
Confirmé
Messages : 784
Âge : 67
Enregistré en : juillet 2015
Localisation : 01120
Contact :

#7 Message par paulfjujo » mer. 27 déc. 2017 14:22 lien vers la Data-Sheet : Cliquez ici

UART1_Write(Joystick_G_HB);

Si lecture uniquement ADRESH ADC cadré à gauche (ADFM=0) , un byte suffit 0 à 255 , sinon cadré à adroite et un int s'impose (0 à 1023).

Par contre ne pas oublier de traduire la valeur lue en ascii

char txt[7];
.....
ByteToStr ou IntTostr
avec
ByteToStr(Joystick_G_HB,txt);
UART1_Write_Text( txt);

ou IntToStr si integer..

Configuration des entrées analogiques
Jérémy
Administrateur du site
Administrateur du site
Messages : 1882
Âge : 38
Enregistré en : juillet 2015
Localisation : Dans le sud
Contact :

#8 Message par Jérémy » mer. 27 déc. 2017 18:27 lien vers la Data-Sheet : Cliquez ici

Merci de vos remarques tout a faite juste. Dans la précipitation j'en oublie l'essentiel.

Mais ca ne fonctionne toujours pas.

Code : Tout sélectionner

// PROGRAMME pour la télécommande-radio du robot

// DS du PIC : http://ww1.microchip.com/downloads/en/DeviceDoc/40001844D.pdf

/*
Fosc = 64Mhz
UART1 = 57600 bauds
*/


#define LED_R      LATC.B2  // Sortie led rouge
#define LED_V      LATC.B1  // Sortie led verte
#define BP         PORTE.B0 // Entree pour BP

//##################################     Variables    ##############################################
 
char i ;
 
unsigned int Valeur_lue;

 
char txt[7];

//#################################################################################################
//#########################################      MAIN      ########################################
//#################################################################################################
void main() {

    
// RAZ des broches
    
LATA LATB LATC LATD LATE 0;

    
// registres des I/O
    
TRISA TRISB TRISD =TRISE 0xFF ;  // Tout en entrée
    
TRISC 0b11111001;                    // C1 et C2 en sortie pour led
    
    // registre analogiques
    
ANSELD 0b00100000;                   // RD5 en analogique

    // Registre des Pull-UP
    
WPUA WPUB WPUC WPUD WPUE 0x00;

  
// -----------------     Initialisation UART  ----------------------------------
  //-----   UART1
  
UART1_Init(57600);

  
// -----------------     Initialisation de la lecture analogique/numérique  ----------------------------------
  
ADC_Init();
  
//ADC_Init_Advanced(_ADC_INTERNAL_REF);

  //ADON_bit = 1;
  //ADPCH = 0b011101;

//#################################################################################################
//###############################      BOUCLE PRINCIPALE      #####################################
//#################################################################################################

 
while(1){

    
Valeur_lue ADC_Read(3);;     // Broche RD5
    
delay_ms(100);

    
IntTostr(Valeur_lue,txt);
    
UART1_Write_Text(txt);
    
delay_ms(200);

 }
}


//#################################################################################################
//###############################      PROGRAMME SECONDAIRE     ###################################
//################################################################################################# 
C'est en faisant des erreurs, que l'on apprend le mieux !!!

Configuration des entrées analogiques
Jérémy
Administrateur du site
Administrateur du site
Messages : 1882
Âge : 38
Enregistré en : juillet 2015
Localisation : Dans le sud
Contact :

#9 Message par Jérémy » mer. 27 déc. 2017 18:37 lien vers la Data-Sheet : Cliquez ici

Je sens que je vais être bon pour faire manuellement.
C'est formateur mais c'est aussi compliqué et très long .
C'est en faisant des erreurs, que l'on apprend le mieux !!!

Configuration des entrées analogiques
Jérémy
Administrateur du site
Administrateur du site
Messages : 1882
Âge : 38
Enregistré en : juillet 2015
Localisation : Dans le sud
Contact :

#10 Message par Jérémy » jeu. 28 déc. 2017 01:57 lien vers la Data-Sheet : Cliquez ici

Rre,

Bonne nouvelle , en me servant du code de la DS en 555 ( pour mplab) j'ai enfin réussis à visualiser mes tensions lues !

Voici un code qui focntionne

Code : Tout sélectionner

// PROGRAMME pour la télécommande-radio du robot

// DS du PIC : http://ww1.microchip.com/downloads/en/DeviceDoc/40001844D.pdf

/*
Fosc = 64Mhz
UART1 = 57600 bauds
*/

#define LED_R      LATC.B2  // Sortie led rouge
#define LED_V      LATC.B1  // Sortie led verte
#define BP         PORTE.B0 // Entree pour BP

//##################################     VARIABLES    ##############################################
 
char i;
 
unsigned int Valeur_lue;

 
char txt[7];

//#################################################################################################
//#########################################      MAIN      ########################################
//#################################################################################################
void main() {

    
// RAZ des broches
    
LATA LATB LATC LATD LATE 0;

    
// registres des I/O
    
TRISA TRISB TRISD =TRISE 0xFF ;  // Tout en entrée
    
TRISC 0b11111001;                    // C1 et C2 en sortie pour led
    
    // registre analogiques
    
ANSELD 0b00100000;                   // RD5 en analogique

    // Registre des Pull-UP
    
WPUA WPUB WPUC WPUD WPUE 0x00;

  
// -----------------     Initialisation UART  ----------------------------------
  //-----   UART1
  
UART1_Init(57600);

  
// -----------------     Initialisation de l'ADC ----------------------------------
  
ADCON0.ADFM 1;            // Justification à droite
  
ADCON0.ADCS 1;            // Horloge dedié FRC
  
TRISD.B5 TRISD.B7 1;    // met RD5 et RD7 en entrée
  
ANSELD.B5 ANSELD.B7 1;  // met RD5 et RD7 en analogique
  
ADCON0.ADON 1;            // Allume le module ADC

    // séquence de clignotement au demarrage (3 fois)
  
for (i=0;i<=5;i++){
     
LED_R = ~LED_R ;
     
delay_ms(100);
   }


//#################################################################################################
//###############################      BOUCLE PRINCIPALE      #####################################
//#################################################################################################

 
while(1){
 

    
delay_ms(5);
    
ADCON0.ADGO 1;                     // lancement de la conversion
    
while (ADCON0.ADGO);                 // On attend la fin de la conversion
    
ADPCH 0b00011101;                  // On change de broche pour lire la suivante ici RD5
    
Valeur_lue = (ADRESH<<8) + ADRESL;   // On enregistre le résultat
    
IntTostr(Valeur_lue,txt);            // On le convertie en string
    
UART1_Write_Text(txt);               // On l'affiche
   
    
delay_ms(5);
    
ADCON0.ADGO 1;                     // lancement de la conversion
    
while (ADCON0.ADGO);                 // On attend la fin de la conversion
    
ADPCH 0b00011111;                  // On change de broche pour lire la suivante icic RD7
    
Valeur_lue = (ADRESH<<8) + ADRESL;   // On enregistre le résultat
    
IntTostr(Valeur_lue,txt);
    
UART1_Write_Text(txt);
    
UART1_Write(10);
    
UART1_Write(13);


 }
C'est en faisant des erreurs, que l'on apprend le mieux !!!


Retourner vers « Langage C »

Qui est en ligne

Utilisateurs parcourant ce forum : Bing [Bot] et 3 invités