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 ADC avec un Vref 2.48 V
Jérémy
Administrateur du site
Administrateur du site
Messages : 2722
Âge : 44
Enregistré en : juillet 2015
Localisation : Dans le sud
Contact :

#41 Message par Jérémy » dim. 8 janv. 2017 14:26

Comme j'ai pas microC, c'est pas grave tu as fait l'essai c'est bien.

C'est dommage !


Je ne connais pas l'ASM , mais j'ai l'impression que tu met la valeur ADRESL dans le registre de travail "W" puis le met dans la variable tension :
Ensuite tu récupére l'ADRESH et pareil dans "W" puis apres je suis pas ce à quoi sert ce +1 . mais il manque la multiplication de 256 non ?
C'est en faisant des erreurs, que l'on apprend le mieux !!!

Configuration ADC avec un Vref 2.48 V
paulfjujo
Avatar de l’utilisateur
Expert
Expert
Messages : 2589
Âge : 73
Enregistré en : juillet 2015
Localisation : 01800
Contact :

#42 Message par paulfjujo » dim. 8 janv. 2017 14:56

bonjour jeremy


ADRESH est deja le poids fort de la valeur ADC, donc pas besoin de multiplier par 256.


J'ai testé ton bout de code sur le clicker2 ( car deja en court d'utilisation sur un autre programme..)
et il donne entiere satisfaction
testé ave cun potar de 2,2K entre +3,3V et 0V
mais avec usage ADC NORMAL ( +Vref =VCC et -VRef=0V)


Code : Tout sélectionner



int Tension
=0;    // variable globale !


  
while(1)
   {
  
Tension=0//ADC_Read(0);

     
ADCON0.B1 1;     // On démarre la conversion
     
while (ADCON0.B1); // J'attends que le bit soit effacer à la fin de la conversion
   
_asm {
          
MOVF  ADRESL,W
          MOVWF _Tension
          MOVF  ADRESH
,W
          MOVWF _Tension
+1
         
}
      
WordToStr(Tension,CRam1);
      
UART1_Write_CText("Analog CH1= ");
      
UART1_Write_Text(CRam1);
      
UART1_Write(TAB);

            if (
Tension >= 1010){
                
UART1_Write_Text("Rouge");
                
//Rouge=1;
               
}
             else if (
Tension >= 990){
                
UART1_Write_Text("Orange");
               
// Orange = 1;
               
}
              else if (
Tension >= 970){
               
UART1_Write_Text("Jaune");
               
// Jaune = 1;
               
}
             else if (
Tension 970){
              
UART1_Write_Text("Vert");
               
// Vert = 1;
               
}
               else
                  
UART1_Write_Text("....");
             
Delay_ms(1000);
             
CRLF1();
            
// Rouge = Orange = Jaune = Vert = 0;
             
Delay_ms(100);
      }
 



Code : Tout sélectionner


Cliker2 18F87J50 
Test module  Finger Print sur MikroBus #1
 
Directory
Projet 
:  18F87J50_GSM2_GPS_7N_UART2_UART1_LCD_I2C_MCP23017_WOE_2016.mcppi
Source MikroC 
:  18F87J50_GSM2_GPS_7N_UART2_UART1_LCD_I2C_WOE_w_h_170108_.c
Q
=8MHZ x PLL => 48MHz  Alim 3,3V
Analog CH1
=   684       Vert
Analog CH1
=   682       Vert
Analog CH1
=   831       Vert
Analog CH1
=  1023       Rouge
Analog CH1
=  1023       Rouge
Analog CH1
=  1023       Rouge
Analog CH1
=  1023       Rouge
Analog CH1
=  1023       Rouge
Analog CH1
=  1023       Rouge
Analog CH1
=  1023       Rouge
Analog CH1
=  1022       Rouge
Analog CH1
=  1023       Rouge
Analog CH1
=  1023       Rouge
Analog CH1
=  1023       Rouge
Analog CH1
=  1023       Rouge
Analog CH1
=   960       Vert
Analog CH1
=  1023       Rouge
Analog CH1
=  1023       Rouge
Analog CH1
=  1023       Rouge
Analog CH1
=  1023       Rouge
Analog CH1
=   984       Jaune
Analog CH1
=   984       Jaune
Analog CH1
=   964       Vert
Analog CH1
=   964       Vert
Analog CH1
=   949       Vert
Analog CH1
=   929       Vert
Analog CH1
=   909       Vert
Analog CH1
=   879       Vert
Analog CH1
=   800       Vert
Analog CH1
=   671       Vert
Analog CH1
=   570       Vert
Analog CH1
=   377       Vert
Analog CH1
=    44       Vert
Analog CH1
=     1       Vert
Analog CH1
=   166       Vert
Analog CH1
=   391       Vert
Analog CH1
=   481       Vert
Analog CH1
=   558       Vert
Analog CH1
=   587       Vert
Analog CH1
=   611       Vert
Analog CH1
=   630       Vert
Analog CH1
=   651       Vert
Analog CH1
=   672       Vert
Analog CH1
=   686       Vert
Analog CH1
=   705       Vert
Analog CH1
=   726       Vert
Analog CH1
=   748       Vert
Analog CH1
=   771       Vert
Analog CH1
=   794       Vert
Analog CH1
=   815       Vert
Analog CH1
=   860       Vert
Analog CH1
=   884       Vert
Analog CH1
=   910       Vert
Analog CH1
=   935       Vert
Analog CH1
=   964       Vert
Analog CH1
=   990       Orange
Analog CH1
=   989       Jaune
Analog CH1
=   995       Orange
Analog CH1
=  1004       Orange
Analog CH1
=  1015       Rouge
Analog CH1
=  1023       Rouge
Analog CH1
=  1023       Rouge
Analog CH1
=  1020       Rouge
Analog CH1
=  1009       Orange
Analog CH1
=   995       Orange
Analog CH1
=   985       Jaune
Analog CH1
=   975       Jaune
Analog CH1
=   975       Jaune
Analog CH1
=   985       Jaune
Analog CH1
=  1005       Orange
Analog CH1
=  1009       Orange
Analog CH1
=   994       Orange
Analog CH1
=   970       Jaune
Analog CH1
=   959       Vert
Analog CH1
=   935       Vert
Analog CH1
=   721       Vert
Analog CH1
=    42       Vert
Analog CH1
=     1       Vert
Analog CH1
=     2       Vert
Analog CH1
=     2       Vert
Analog CH1
=     2       Vert



j'ai un 16F1847 sur une breadboard , je vais essayer aussi avec
alimentation battery Li On 3,2 V et usage Vref ..
à suivre..
Aide toi, le ciel ou FantasPic t'aidera

Configuration ADC avec un Vref 2.48 V
Guest
Confirmé
Confirmé
Messages : 800
Enregistré en : mars 2017

#43 Message par Guest » dim. 8 janv. 2017 15:41

Bonjour Paul merci pour ton test
jeremy lorsque tu fais en C

Tension=ADRESL;

la valeur 8 bits de ADRESL va se placer dans la partie basse de la variable Tension c'est a dire le poids faible comment faire pour placer la partie haute c'est a dire ADRESH soit tu déclares ta variable Tension en tableau char et la tu fais bien

Tension[0]=ADRESL;partie basse
Tension[1]=ADRESH;partie haute

soit tu fais ta manip rotation addition

soit EN ASM
MOVF ADRESL,W; charge la valeur contenue dans ADRESL dans le REGISTRE W
MOVWF _Tension; le contenu du registre W est transféré dans la partie basse de la variable Tension
MOVF ADRESH,W; charge la valeur contenue dans le registre ADRESH dans le registre W
MOVWF _Tension+1;le contenu du registre W est transféré dans la partie haute de la variable Tension. position basse + UNE position donc la partie haute

A+

ps je vois que tu suis en ASM :langue:

Configuration ADC avec un Vref 2.48 V
Jérémy
Administrateur du site
Administrateur du site
Messages : 2722
Âge : 44
Enregistré en : juillet 2015
Localisation : Dans le sud
Contact :

#44 Message par Jérémy » dim. 8 janv. 2017 15:51

Oui j'ai lu bigonoff :sifflotte: ....... en travers et pas jusqu'au bout, je comprenais rien :lol: , mais je désespère pas un jour de le finir ! avec l'experience peut etre que je prendrais plus de plaisir à le faire !
car pour moi la programmation doit rester un plaisir ! Je m'arrache bien assez de cheveu comme ca ! :twisted:
C'est en faisant des erreurs, que l'on apprend le mieux !!!

Configuration ADC avec un Vref 2.48 V
paulfjujo
Avatar de l’utilisateur
Expert
Expert
Messages : 2589
Âge : 73
Enregistré en : juillet 2015
Localisation : 01800
Contact :

#45 Message par paulfjujo » dim. 8 janv. 2017 17:35

testé sur 16F1847 .. OK
j'ai 1015 pts à 2.030V
PIC alimenté avec ma batterie Li-IOn 3,7V (mesurée 3,97V)
ADC_Get_Sample() est OK pour lire la valeur de l'ADC
mais garder l'init directe avec registres ADC ( sans activer ADC_Init() de la librairie)
Activer aussi la Vref Buffer.

Test fait avec un potar 2,2K entre VCC et 0V

Code : Tout sélectionner


 
 
 
//-- commandes terminal VT220
#define CLS 12     // effacement de page sur Terminal VBRAY
#define CR 13
#define VT 10
#define LF 10
#define TAB 9
#define BELL 7
 
 
 
  
//ac:Pinout_16F1847
 
char TEXTE
[80];
char * txt;
char CRam1[64];

unsigned int i,j,k,l,m;

#define MAXLEN1 80
unsigned char buffer1[MAXLEN1];
unsigned int Index1=0;
unsigned int UART1_DataReady=0;
unsigned int i1=0;
unsigned char c1;

unsigned int Tension  ;
int   Envoi_tension = 0;

void strConstRamCpy(char *dest, const char *source);
void UART1_Write_CText(const char *txt1);
void CRLF1(void);

void RAZ_UART1()
{
      for (i=0;i<MAXLEN1;i++) buffer1[i]=0;
      Index1=0;
      i1=0;
      c1=RCREG;
      c1=0;
      UART1_DataReady=0;
      PIE2.RCIE=;
      RCSTA.CREN=1;
}

void UART1_Write_CText(const char *txt1)
 {
   while (*txt1)
      UART_Write(*(txt1++));
}


// --- Copie le texte depuis ROM vers RAM
void strConstRamCpy(char *dest, const char *source)
 {
  while(*source) *(dest++) = *(source++) ;
  *dest = 0 ;    // terminateur
}

void CRLF1()
{
 UART1_Write(CR);
  UART1_Write(LF);
 }
 
   
void Lecture_T2
()
{
      Tension=ADC_Get_Sample(1);
      WordToStr(Tension,CRam1);
      UART1_Write_CText("Analog CH1= ");
      UART1_Write_Text(CRam1);
      UART1_Write(TAB);

            if (Tension >= 1010){
                UART_Write_Text("Rouge");
                //Rouge=1;
               }
             else if (Tension >= 990){
                UART1_Write_Text("Orange");
               // Orange = 1;
               }
              else if (Tension >= 970){
               UART1_Write_Text("Jaune");
               // Jaune = 1;
               }
             else if (Tension < 970){
              UART1_Write_Text("Vert");
               // Vert = 1;
               }
               else
                  UART1_Write_Text
("....");
             Delay_ms(1000);
             CRLF1();
            // Rouge = Orange = Jaune = Vert = 0;
             Delay_ms(100);
}

void main()
{

  OSCCON =  0b01110110 ; // Pll disable; Freq=8Mhz; OSC:intern



  TRISB  = 0b00000010;   // RB1 en entrée
  TRISA  = 0b00000011;   // RA1 en entrée le reste en sortie
  ANSELA = 0b00000001;  // RA0 en Analogique
  ANSELB = 0;           // PORTB en Digital


//------------------------------------------------------------------------------
// Réglages du Timer 1 pour 100 ms
  TMR1IE_bit = 0;    // désactiver au départ
  T1CON      = 0x21;
  TMR1IF_bit = 0;
  TMR1H      = 0x3C;
  TMR1L      = 0xB0;

//------------------------------------------------------------------------------
// Réglages du Timer 0 pour 1 ms
  TMR0IE_bit = 0;    // désactiver au départ
  OPTION_REG = 0x82; // Presacler 1:8
  TMR0       = 6;    // Offset
  TMR0IF_bit = 0;

//------------------------------------------------------------------------------
// INTCON  =  Réglages des interruptions
  RCIE_bit = 1;            // INT sur Rx UART activé
  PEIE_bit  = 1;           // INT péripheriques Activé
  GIE_bit   = 1;           // INT Global activé

//------------------------------------------------------------------------------
  UART1_Init(19200);   // Initialisation de l'UART
  Delay_ms(100);

//------------------------------------------------------------------------------
  UART1_Write(CLS);
  Delay_ms(500);
  UART1_Write_CText("\r\nInit ADC voie RA1 Ch1 \r\n");
  C1ON_bit = 0;    // Désactive les comparateurs
  C2ON_bit = 0;
  CPSCON0=0;

  // Configuration de l'ADCON0
  ADCON0 = 0b00000100;  // 00001 = AN1 est selectionné, ADC NOT enable
  // Configuration de l'ADCON1
  ADCON1 = 0b11110011;  // Right jsutified, 110 Fosc/64, ref du moins=GND,  REF+ par FVR reglé sur 2.048V
  ADCON1=0;
  ADCON1.ADFM=1; // Right justied
  //    bit 6-4 ADCS<2:0>: A/D Conversion Clock Select bits
  ADCON1.ADCS2=1; //110 = FOSC/64
   ADCON1.ADCS1=1;
    ADCON1.ADCS0=0;
  ADNREF_bit=0;
  ADPREF1_bit=1;    // +VFR 2.048V buffer  selectionné
  ADPREF0_bit=1;
  // Configuration de Vref
  //REGISTER 14-1: FVRCON: FIXED VOLTAGE REFERENCE CONTROL REGISTER
  FVREN_bit = 1;  // Activation du Vref
  //  FVRRDY_bit = 1;      // Pret a etre utilisé    Read Only !
  TSEN_bit = 0;
  TSRNG_bit = 0;
  CDAFVR0_bit = 0;
  CDAFVR1_bit = 0;
  ADFVR1_bit = 1; // Mise du Vref à 2.048V
  ADFVR0_bit = 0; // ADFVR = 0b10

  Tension=0;
  Envoi_tension = 1;
  ADCON0.ADON=1;     // validation ADC
  Delay_ms(100);
  while(1)
  {
  Lecture_T2();
  Delay_ms(1000);
   }
}
  
  


Code : Tout sélectionner


Analog CH1
=  1003       Orange
Analog CH1
=  1002       Orange
Analog CH1
=   998       Orange
Analog CH1
=   948       Vert
Analog CH1
=   949       Vert
Analog CH1
=   948       Vert
Analog CH1
=   949       Vert
Analog CH1
=  1006       Orange
Analog CH1
=   997       Orange
Analog CH1
=   994       Orange
Analog CH1
=   988       Jaune
Analog CH1
=   981       Jaune
Analog CH1
=   986       Jaune
Analog CH1
=   967       Vert
Analog CH1
=   970       Jaune
Analog CH1
=  1023       Rouge
Analog CH1
=   885       Vert
Analog CH1
=   893       Vert
Analog CH1
=  1023       Rouge
Analog CH1
=   972       Jaune
Analog CH1
=  1023       Rouge
Analog CH1
=  1023       Rouge
Analog CH1
=  1023       Rouge
Analog CH1
=  1023       Rouge
Analog CH1
=  1023       Rouge
Analog CH1
=  1016       Rouge
Analog CH1
=  1017       Rouge
Analog CH1
=  1018       Rouge
Analog CH1
=  1020       Rouge
Analog CH1
=  1019       Rouge
Analog CH1
=  1020       Rouge
Analog CH1
=   936       Vert
Aide toi, le ciel ou FantasPic t'aidera

Configuration ADC avec un Vref 2.48 V
paulfjujo
Avatar de l’utilisateur
Expert
Expert
Messages : 2589
Âge : 73
Enregistré en : juillet 2015
Localisation : 01800
Contact :

#46 Message par paulfjujo » dim. 8 janv. 2017 18:57

cette fois OK en ASM,
le probleme était que les registres ADC sont en bank1 ..et la variable tension definie en bank 0.

Code : Tout sélectionner



void Lecture_T2
()
{

  
_asm    {
       
CLRF       0x20     // Tension=0;
    
CLRF      0x21

    BSF       ADCON0
,1
    MOVLW       44
    MOVWF      _Tempo22
Tp0
:
    
DECFSZ    _Tempo221
    
GOTO       Tp0
    NOP
Tb1
:
    
BTFSS      ADCON0,1
    
GOTO       Tb2
    
GOTO       Tb1

Tb2
:

         
MOVLB 1
         MOVF  ADRESH
,W    // en bank1
         
MOVLB 0
         MOVWF _Tension
+1
         MOVLB 1
         MOVF  ADRESL
,W
         MOVLB 0
         MOVWF _Tension
      
}

      
WordToStr(Tension,CRam1);
      
UART1_Write_CText("Lecture Analog CH1 (en ASM)= ");
      
UART1_Write_Text(CRam1);
      
UART1_Write(TAB);

            if (
Tension >= 1010){
                
UART_Write_Text("Rouge");
                
//Rouge=1;
               
}
             else if (
Tension >= 990){
                
UART1_Write_Text("Orange");
               
// Orange = 1;
               
}
              else if (
Tension >= 970){
               
UART1_Write_Text("Jaune");
               
// Jaune = 1;
               
}
             else if (
Tension 970){
              
UART1_Write_Text("Vert");
               
// Vert = 1;
               
}
               else
                  
UART1_Write_Text("....");
             
Delay_ms(1000);
             
CRLF1();
            
// Rouge = Orange = Jaune = Vert = 0;
             
Delay_ms(100);
}
 


Code : Tout sélectionner


Init ADC voie RA1 Ch1
Lecture Analog CH1 avec ADC_Get_Sample 
=   750  Vert
Lecture Analog CH1 
(en ASM)=   750      Vert
Lecture Analog CH1 avec ADC_Get_Sample 
=   582  Vert
Lecture Analog CH1 
(en ASM)=   582      Vert
Lecture Analog CH1 avec ADC_Get_Sample 
=   848  Vert
Lecture Analog CH1 
(en ASM)=   848      Vert
Lecture Analog CH1 avec ADC_Get_Sample 
=   846  Vert
Lecture Analog CH1 
(en ASM)=   846      Vert
Lecture Analog CH1 avec ADC_Get_Sample 
=  1023  Rouge
Lecture Analog CH1 
(en ASM)=  1023      Rouge
Lecture Analog CH1 avec ADC_Get_Sample 
=  1023  Rouge
Lecture Analog CH1 
(en ASM)=  1023      Rouge
Lecture Analog CH1 avec ADC_Get_Sample 
=  1023  Rouge
Lecture Analog CH1 
(en ASM)=  1023      Rouge
Lecture Analog CH1 avec ADC_Get_Sample 
=  1023  Rouge
Lecture Analog CH1 
(en ASM)=  1023      Rouge
Lecture Analog CH1 avec ADC_Get_Sample 
=   997  Orange
Lecture Analog CH1 
(en ASM)=   997      Orange
Lecture Analog CH1 avec ADC_Get_Sample 
=   984  Jaune
Lecture Analog CH1 
(en ASM)=   984      Jaune
Lecture Analog CH1 avec ADC_Get_Sample 
=   989  Jaune
Lecture Analog CH1 
(en ASM)=   989      Jaune
Lecture Analog CH1 avec ADC_Get_Sample 
=   933  Vert
Lecture Analog CH1 
(en ASM)=   933      Vert
Lecture Analog CH1 avec ADC_Get_Sample 
=   900  Vert
Aide toi, le ciel ou FantasPic t'aidera


Retourner vers « Langage C »

Qui est en ligne

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