Je rencontre des problèmes lors de ma double conversion analogique numérique. J'ai écrit le code ci dessous et mon problème est que j'ai l'impression que mes broches ne sont pas pris en compte. J'ai 2 conversion a faire sauf que le résultat correspond a la mauvaise entrées. Voici mon code
/*
* File: newmain.c
* Author: mohamed
*
* Created on May 22, 2018, 9:11 AM
*/
#include<stdio.h>
#include<math.h>
#include <xc.h>
#pragma config OSC=XT
#pragma config WDT= OFF
#pragma config LVP= OFF
#pragma config BOREN = OFF
#define GO ADCON0bits.GO_DONE
#define _XTAL_FREQ 4000000
void Init_convert_AN(void);
void liaison_serie_oled (void);
void conversion5v(void);
void conversion15v(void);
void transmit_character( char res5v1,char res5v2, char res5v3,char res5v4,char res5v5);
void tempo10ms(unsigned short i);
void transmit_character2(char res15v1, char res15v2, char res15v3, char res15v4, char res15v5);
float res_tension5v;
float res_tension15v;
char res5v1,res5v2,res5v3,res5v4,res5v5,res15v1,res15v2,res15v3,res15v4,res15v5;
float data5v=0;
float data15v=0;
char Tab5v[5]=0;
char Tab15v[5]=0;
// changement de variable
void reverse(char *str, int len)
{
int i=0, j=len-1, temp;
while (i<j)
{
temp = str[i];
str[i] = str[j];
str[j] = temp;
i++; j--;
}
}
int intToStr(int x, char str[], int d)
{
int i = 0;
while (x)
{
str[i++] = (x%10) + '0';
x = x/10;
}
// nombre de digits
//
while (i < d)
str[i++] = '0';
reverse(str, i);
str[i] = '\0';
return i;
}
// Convert un float en chaine de char
void ftoa(float n, char *res, int afterpoint)
{
// on extrait l'entier
int ipart = (int)n;
// on extrait la partie a virgule
float fpart = n - (float)ipart;
// converti entier en string
int i = intToStr(ipart, res, 0);
// check for display option after point
if (afterpoint != 0)
{
res[i] = '.'; // add dot
// Get the value of fraction part upto given no.
// of points after dot. The third parameter is needed
// to handle cases like 233.007
fpart = fpart * pow(10, afterpoint);
intToStr((int)fpart, res + i + 1, afterpoint);
}
}
void main() {
liaison_serie_oled();
Init_convert_AN();
while(1)
{
conversion5v();
tempo10ms(1);
conversion15v();
tempo10ms(1);
}
}
void liaison_serie_oled (void)
{
TXSTA = 0; // Reset TXSTA
RCSTA = 0; // Reset RCSTA
TRISCbits.TRISC6 = 0; // TX output
TRISCbits.TRISC7 = 1; // RX input
BAUDCONbits.BRG16=0; //9600bps a voir selon ecran
TXSTA= 0x24; // Load TXSTA
SPBRG = 25; // Write baudrate to SPBRG
RCSTA = 0x90; //
}
void Init_convert_AN (void)
{
PORTAbits.AN0=1; // AN0 en entree
PORTBbits.AN12=1;
ADCON0=0x01;
ADCON1=0b10000001; // bit 5-4=0 vref+=vdd vref-=vss / bit0-3 AN0
ADCON2=0b10010100; // justif a droite acquisition time, conversion clock
}
void conversion5v (void)
{
tempo10ms(10);
ADCON0bits.CHS0=0;
ADCON0bits.CHS1=0;
ADCON0bits.CHS2=0;
ADCON0bits.CHS3=0;
tempo10ms(10);
GO=1;//demande de conversion
while(GO==0){} // fin de conversion
data5v =((ADRESH<<8)+ADRESL); // recuperation de la tension a 5v
//if((data5v<=1024)&&(data5v>0)){
res_tension5v=(data5v*0.004888125); //
//}
//else{}
__delay_us(1);
ftoa(res_tension5v, Tab5v, 4);
res5v5=Tab5v[0];
res5v4=Tab5v[1];
res5v3=Tab5v[2];
res5v2=Tab5v[3];
res5v1=Tab5v[4];
__delay_us(1);
transmit_character (res5v1,res5v2,res5v3,res5v4,res5v5);
}
void transmit_character( char res5v1,char res5v2, char res5v3,char res5v4,char res5v5)
{
TXREG = 0x00;//le mot à envoyer est placé dans un registre 8 bits TXREG
while (!TXSTAbits.TRMT);
TXREG = 0x06;
while (!TXSTAbits.TRMT);
TXREG =res5v5;//c
while (!TXSTAbits.TRMT);
TXREG =res5v4;
while (!TXSTAbits.TRMT);
TXREG =res5v3; //premier chiffre
while (!TXSTAbits.TRMT);
TXREG =res5v2;
while (!TXSTAbits.TRMT);
TXREG =res5v1;//
while (!TXSTAbits.TRMT);
TXREG = 0x00;
while (!TXSTAbits.TRMT); // fin de char
while(RCREG!=0x06);
{}
}
void conversion15v (void)
{
tempo10ms(10);
ADCON0bits.CHS0=0;
ADCON0bits.CHS1=0;
ADCON0bits.CHS2=1;
ADCON0bits.CHS3=1;
tempo10ms(60);
GO=1;//demande de conversion
while(GO==0){} // fin de conversion
data15v =((ADRESH<<8)+ADRESL); // recuperation de la tension a 5v
if((data15v<=1024)&&(data15v>0)){
res_tension15v=(data15v*0.0146484375); //
}
else{}
__delay_us(1);
ftoa(res_tension15v, Tab15v, 4);
res15v5=Tab15v[0];
res15v4=Tab15v[1];
res15v3=Tab15v[2];
res15v2=Tab15v[3];
res15v1=Tab15v[4];
__delay_us(1);
transmit_character2 (res15v1,res15v2,res15v3,res15v4,res15v5);
}
void transmit_character2(char res15v1, char res15v2, char res15v3, char res15v4, char res15v5)
{
TXREG = 0x00;//le mot à envoyer est placé dans un registre 8 bits TXREG
while (!TXSTAbits.TRMT);
TXREG = 0x06;
while (!TXSTAbits.TRMT);
TXREG =res15v5;//c
while (!TXSTAbits.TRMT);
TXREG =res15v4;
while (!TXSTAbits.TRMT);
TXREG =res15v3; //premier chiffre
while (!TXSTAbits.TRMT);
TXREG =res15v2;
while (!TXSTAbits.TRMT);
TXREG =res15v1;//
while (!TXSTAbits.TRMT);
TXREG = 0x00;
while (!TXSTAbits.TRMT); // fin de char
while(RCREG!=0x06);
{}
}
void tempo10ms(unsigned short i)
{
unsigned short j,k;
for(j=0;j<i;j++)
{
for(k=0;k<5000;k++)
{
}
}
}
Lorsque sur mon entrée AN0 je met 5v et que a mon entrée AN12 je met 0v, le simulateur me donne 15v sur AN0 et 0v sur AN12. Donc en faite ma conversion se trompe d'entrée j'ai l'impression. Aidez moi svp
la fonction transmit sert uniquement a envoyer le résultat sur écran led, en simulation elles sont ignorées. Merci quand meme
Conversion analogique numérique
× Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
× Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.