Bonjour à tous, et merci de votre intérêt pour mon problème, car en langage C je suis pas terrible alors programmer un PIC ....
Voilà, je doit effectuer une conversion de voie analogique en numérique grâce au module A/N du Pic 18F4550. J'ai en tous 12 voir analogique de AN0 à AN11 ( j'utilise pas le AN12 ). Et je doit transférer vers de l'usb, le resultat.
J'aimerais traiter les 12 conversions en interruption et transmettre les 12 résultats par 1 seul envoie sur l'usb et le transmettre en ascii et pas en binaire, car convertir et envoyer juste 1 octet serait + simple à programmer mais plus long à traiter par un pc. Pour simplifier un peu j'ai prit que les 8bits de poids les + fort ( que ADRESH sur 8 bits ). Si vous pouvez m'aider un peu car perso les interruptions je maîtrise pas trop. Donc j'avoue que c'est un peu le bordel dans mon prog et pour l'instant j'essaie de faire que la voix AN0.
Sur un autre forum on m'as dit de modifier déjà ça :/** I N C L U D E S ****************************** ****************************/
#include <p18f4550.h>
#include "typedefs.h"
#include "usb.h"
#include "io_cfg.h"
#include "usbdrv.h"
/** C O N F I G U R A T I O N ****************************** ******************/
// Note: For a complete list of the available config pragmas and their values,
// see the compiler documentation, and/or click "Help --> Topics..." and then
// select "PIC18 Config Settings" in the Language Tools section.
#if defined(PIC18F4550_PICDEM_FS_U SB) // Configuration bits for PICDEM FS USB Demo Board
#pragma config PLLDIV = 5 // (20 MHz crystal on PICDEM FS USB board)
#pragma config CPUDIV = OSC1_PLL2
#pragma config USBDIV = 2 // Clock source from 96MHz PLL/2
#pragma config FOSC = HSPLL_HS
#pragma config FCMEN = OFF
#pragma config IESO = OFF
#pragma config PWRT = OFF
#pragma config BOR = ON
#pragma config BORV = 2
#pragma config VREGEN = ON //USB Voltage Regulator
#pragma config WDT = OFF
#pragma config WDTPS = 32768
#pragma config MCLRE = ON
#pragma config LPT1OSC = OFF
#pragma config PBADEN = OFF //NOTE: modifying this value here won't have an effect
//on the application. See the top of the main() function.
//By default the RB4 I/O pin is used to detect if the
//firmware should enter the bootloader or the main application
//firmware after a reset. In order to do this, it needs to
//configure RB4 as a digital input, thereby changing it from
//the reset value according to this configuration bit.
// #pragma config CCP2MX = ON
#pragma config STVREN = ON
#pragma config LVP = OFF
// #pragma config ICPRT = OFF // Dedicated In-Circuit Debug/Programming
#pragma config XINST = OFF // Extended Instruction Set
#pragma config CP0 = OFF
#pragma config CP1 = OFF
// #pragma config CP2 = OFF
// #pragma config CP3 = OFF
#pragma config CPB = OFF
// #pragma config CPD = OFF
#pragma config WRT0 = OFF
#pragma config WRT1 = OFF
// #pragma config WRT2 = OFF
// #pragma config WRT3 = OFF
#pragma config WRTB = OFF // Boot Block Write Protection
#pragma config WRTC = OFF
// #pragma config WRTD = OFF
#pragma config EBTR0 = OFF
#pragma config EBTR1 = OFF
// #pragma config EBTR2 = OFF
// #pragma config EBTR3 = OFF
#pragma config EBTRB = OFF
#else
#error Not a supported board (yet), make sure the proper board is selected in usbcfg.h, and if so, set configuration bits in __FILE__, line __LINE__
#endif
/** V A R I A B L E S ****************************** **************************/
#pragma udata
/** P R I V A T E P R O T O T Y P E S ****************************** *********/
char *conv_char_chaine (char val); //convertie une valeur en centaine, dizaine, unité ascii
void init_timer0 (void);
void interrupt_prog_int (void);
/** D E C L A R A T I O N S ****************************** ********************/
static volatile float input;
static volatile char res[10], asc[3], T0IF;
static volatile int i;
/****************************** ****************************** ******************
* Function: void main(void)
*
* PreCondition: None
*
* Input: None
*
* Output: None
*
* Side Effects: None
*
* Overview: Main program entry point.
*
* Note: None
****************************** ****************************** *****************/
void main(void)
{
ADCON0bits.ADON = 1 ; // A/D convert ON
ADCON0bits.CHS0 = 0 ; // Choisir la voie a convertir => AN0
ADCON0bits.CHS1 = 0 ; // Choisir la voie a convertir => AN0
ADCON0bits.CHS2 = 0 ; // Choisir la voie a convertir => AN0
ADCON0bits.CHS3 = 0 ; // Choisir la voie a convertir => AN0
ADCON1bits.PCFG0 = 0 ; // Configuration des ports A/D = Tout les ports en analogique
ADCON1bits.PCFG1 = 1 ; // Configuration des ports A/D
ADCON1bits.PCFG2 = 0 ; // Configuration des ports A/D
ADCON1bits.PCFG3 = 0 ; // Configuration des ports A/D
ADCON1bits.VCFG0 = 0 ; // references de tension a utiliser par le CAN => Vref+ = Vdd
ADCON1bits.VCFG1 = 0 ; // references de tension a utiliser par le CAN => Vref- = Vss
ADCON2bits.ADCS0 = 1 ; // configurer horloge selection (pour un quartz de 20 Mhz)
ADCON2bits.ADCS1 = 0 ; // configurer horloge selection
ADCON2bits.ADCS2 = 1 ; // configurer horloge selection
ADCON2bits.ACQT0 = 0 ; // configurer un temps d'acquisition (configuration manuelle)
ADCON2bits.ACQT1 = 0 ; // configurer un temps d'acquisition
ADCON2bits.ACQT2 = 0 ; // configurer un temps d'acquisition
ADCON2bits.ADFM = 0 ; // justification à gauche
ADRESH=0x00 ; // Mise à zero du registre ADRESH
ADCON0bits.GO_DONE=1;
res[0]= 0x00; //Initialisation des buffers de résultat
i=0;
T0IF=1;
for (i=0; i<11; i++)
{
if ( T0IF )
{
ADCON0bits.GO_DONE=1;
}
if (ADCON0bits.ADON=0) // Teste bit de fin de conversion, si ADON=0 : la conversion est terminée
{
ADCON0bits.GO_DONE=0;
res[i]=ADRESH; // On place le résultat dans un tableau
T0IF=0;
}
}
asc[i]=conv_char_chaine(res[i]); //Conversion binaire => ASCII
/*-----------------------------envoie des données sur le bus -----------------------------------*/
if(!mHIDTxIsBusy()) // Test si la connexion est occupée
{
HIDTxReport(asc,0); // Envoie de donnée sur l'usb fonction définie dans le hid.c
}
}//end main
/*----------------------------------------------------------------------------------------------*/
char *conv_char_chaine(char val) // Conversion binaire => ASCII
{
unsigned char uni, diz,cent,z;
char chaine[3];
if(val>=99)cent=val/100;
if(val<=99)cent=0;
z=val-cent;
if(z>=9)diz=z/10;
if(z<=9)diz=0;
diz= val-(cent*100);
uni= val-(cent*100)-(diz*10);
chaine[0]=cent|0x30;
chaine[1]=diz|0x30;
chaine[2]=uni|0x30;
return(chaine);
}
/*----------------------------------------------------------------------------------------------*/
void init_timer0 (void) // Initialisation du timer
{
T0CON.PSA =0; // Prédiviseur affecté au timer 0
T0CON.T0CS= 0; // Timer 0 utilise l'horloge interne
T0CON.PS2 = 1; // Prédivision de 256
T0CON.PS1 = 1;
T0CON.PS0= 1;
}
/*----------------------------------------------------------------------------------------------*/
void interrupt_prog_int (void)
{
if ( T0IF ) // Test sur le bit d'interruption de débordement du timer
{
T0IF = 0; // RAZ du bit de débordement
T0CON.TMR0 = 0; // RAZ du timer pour qu'il recommence à compter jusque 65536
}
}
void conv_char_chaine(unsigned char val, char *chaine) // Conversion binaire non signe => ASCII
{
unsigned char uni, diz,cent,z;
if( val>99 )
{
z=val/100
chaine[0]=z|0x30;
val=val-z*100;
}
else
chaine[0]='0';
if( val>9 )
{
z=val/10
chaine[1]=z|0x30;
val=val-z*10;
}
else
chaine[1]='0';
chaine[2]=val|0x30;
}
C'est correcte ?
Merci d'avance
-----