je travaille actuellement sur un petit projet 18f4550 avec MplabX et son Compilo XC8..
c'est un tout petit projet qui recupere des valeurs de temparature analogique que je transfert via liaison serie sur un hyper terminal (ou une fenetre QTCreator)...jusqu'ici tout est ok
je souhaiterai à présent envoyer ces valeurs dans une colonne de feuille excel en tps reel...
quelqu'un aurait une idée ou meme une petite routine?
j'ai essayé "PLX-DAQ_R2.xlsm"--> sans succes
voici mon code
Code : Tout sélectionner
/*
* File: Ihm_Temp.c
* Author: Acer_Franck
*
* Crée le 15 février 2021, 18:59
*/
#include <xc.h>
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include "config_intosc.h" //Inclusion du fichier d'en tete pour les Bits de Configuration du Pic
//Prototype des Fct ADC
void ADC_Init();
int ADC_Read(int);
//Prototype de Gestion du Temps
void MS_delay(unsigned int );
//Prototype des Fct USART
void USART_Init(long baud_rate);
void USART_TxChar(char);
void USART_SendString(const char *);
#define V_Ref 5.00 //Tension de Référence- 5Volts
#define F_CPU 8000000/64
#define Baud_value (((float)(F_CPU)/(float)baud_rate)-1)
void main() {
//--> Déclaration des variables
int digital_Adc; //Variable de lecture directe
float voltage; //Variable de type Float pour la conversion
char data_Capt_An00[6];// Tableau de 06 Char
char data_Capt_An01[6];// Tableau de 06 Char
char data_Capt_An02[6];// Tableau de 06 Char
char data_Capt_An03[6];// Tableau de 06Char
char data_Capt_An04[6];// Tableau de 06Char
//--> Initialisation des Options d'Oscillateur OSCCON
OSCCON = 0x72; /*Oscillateur Interne sur 8 MHz*/
//--> Initialisation des Fct
ADC_Init(); /*Initialisation du Convertisseur 10-bit ADC*/
USART_Init(9600); /*Initialisation del'USART à 9600 baud rate*/
//------------------------------------------------------------------------------
// DEBUT DU PROGRAMME PRINCIPAL
while (1)
{
//--> 1ere Conversion A/D sur AN00
digital_Adc = ADC_Read(0); // Appel de la Fct de Lecture du canal 0
voltage = digital_Adc * ((float) V_Ref / (float) 1023); //Calcul de la Conversion des valeurs Analogique en Numerique
sprintf(data_Capt_An00, "AN00%.2f", voltage); //Conversion de la valeur Entiere en Chaine ASCII
USART_SendString(data_Capt_An00);// Appel de la Fct USART de Transmission de la chaine ASCII
USART_TxChar(0x0D); // Appel de la Fct USART de Transmission du Caractere (\r), de retour chariot comme separateur
MS_delay(10);
//--> 2me Conversion A/D sur AN01
digital_Adc = ADC_Read(1); // Appel de la Fct de Lecture du canal 1
voltage = digital_Adc * ((float) V_Ref / (float) 1023); //Calcul de la Conversion des valeurs Analogique en Numerique
sprintf(data_Capt_An01, "AN01%.2f", voltage); //Conversion de la valeur Entiere en Chaine ASCII
USART_SendString(data_Capt_An01); // Appel de la Fct USART de Transmission de la chaine ASCII
USART_TxChar(0x0D); // Appel de la Fct USART de Transmission du Caractere (\r), de retour chariot comme separateur
MS_delay(10);
//--> 3me Conversion A/D sur AN02
digital_Adc = ADC_Read(2); // Appel de la Fct de Lecture du canal 0
voltage = digital_Adc * ((float) V_Ref / (float) 1023); //Calcul de la Conversion des valeurs Analogique en Numerique
sprintf(data_Capt_An02, "AN02%.2f", voltage); //Conversion de la valeur Entiere en Chaine ASCII
USART_SendString(data_Capt_An02);// Appel de la Fct USART de Transmission de la chaine ASCII
USART_TxChar(0x0D); // Appel de la Fct USART de Transmission du Caractere (\r), de retour chariot comme separateur
MS_delay(10);
//--> 4me Conversion A/D sur AN03
digital_Adc = ADC_Read(3); // Appel de la Fct de Lecture du canal 1
voltage = digital_Adc * ((float) V_Ref / (float) 1023); //Calcul de la Conversion des valeurs Analogique en Numerique
sprintf(data_Capt_An03, "AN03%.2f", voltage); //Conversion de la valeur Entiere en Chaine ASCII
USART_SendString(data_Capt_An03); // Appel de la Fct USART de Transmission de la chaine ASCII
USART_TxChar(0x0D); // Appel de la Fct USART de Transmission du Caractere (\r), de retour chariot comme separateur
MS_delay(10);
//--> 5me Conversion A/D sur AN04
digital_Adc = ADC_Read(4); // Appel de la Fct de Lecture du canal 1
voltage = digital_Adc * ((float) V_Ref / (float) 1023); //Calcul de la Conversion des valeurs Analogique en Numerique
sprintf(data_Capt_An04, "AN04%.2f", voltage); //Conversion de la valeur Entiere en Chaine ASCII
USART_SendString(data_Capt_An04); // Appel de la Fct USART de Transmission de la chaine ASCII
USART_TxChar(0x0D); // Appel de la Fct USART de Transmission du Caractere (\r), de retour chariot comme separateur
MS_delay(10);
}
// FIN DU PROGRAMME PRINCIPAL
//------------------------------------------------------------------------------
}
/*****************************Initialisation du Convertisseur A/D***********************/
void ADC_Init() {
TRISA = 0xff; /*PortA en Entrée*/
ADCON1 = 0x0E; // La reference de Tension est VDD - Configuration des Pin en Mode Analogique
ADCON2 = 0x92; // Justification du resultat à Droite, 4Tad and Fosc/32.
ADRESH = 0; //Effacer le registre d'Adresse de poids Fort de sortie de l'ADC
ADRESL = 0;//Effacer le registre d'Adresse de poids Faible de sortie de l'ADC
}
/*****************************Lecture du Convertisseur A/D***********************/
int ADC_Read(int channel)
{
int digital_Adc;
ADCON0 = (ADCON0 & 0b11000011) | ((channel << 2) & 0b00111100); //Inibition de la conversion ( ADON=0) et Canal 'int channel'selectionné ex:(CHS3CHS2CHS1CHS0=0000)
ADCON0 |= ((1 << ADON) | (1 << GO)); //Validation de ADC et debut de conversion
while (ADCON0bits.GO_nDONE == 1); // Delai d'attente de Fin de Conversion: Go/done=0 Conversion Terminée
digital_Adc = ((ADRESH * 256) | ADRESL); //Combinaison des 8-bit de poids faibles et des 2-bit de poids forts
return (digital_Adc);
}
/*****************************USART Initialisation*******************************/
void USART_Init(long baud_rate)
{
float temp;
TRISC6 = 0; //Pin RC6 en Sortie Tx
TRISC7 = 1; //Pin RC7 en Entrée Rx
temp = Baud_value;
SPBRG = (int) temp; //Baud rate=9600, SPBRG = (F_CPU /(64*9600))-1
TXSTA = 0x20; //Registre de 8 Bit pour la validation de l'Emission(TX) enable
RCSTA = 0x80; //Registre de 8 Bit pour la validation de la Reception(RX) enable
}
/******************Fonction d'EMMISION d'un Caractere sur HYPERTERMINAL*****************************************/
void USART_TxChar(char out)
{
while (TXIF == 0); //attente du drapeau d'interruption de transmission
TXREG = out; //attendre que le drapeau d'interruption de transmission soit activé,indiquant que TXREG est prêt pour une autre transmission
}
/******************Fonction d'EMMISION de la DATA sur HYPERTERMINAL*****************************************/
void USART_SendString(const char *out)
{
while (*out != '\0')
{
USART_TxChar(*out);
out++;
}
}
/******************Fonction de Gestion du Temps*****************************************/
void MS_delay(unsigned int val)
{
unsigned int i,j;
for(i=0;i<=val;i++)
for(j=0;j<81;j++);//Ce compteur assigne 1 ms pour une freq de 8MHz
}
par avance,
merci

