Bonjour,
Le sujet de mon post concerne l'optimisation d'un programme (ou plutôt bibliothèque de composant) qui fonctionne, mais pour lequel je m'interroge sur une meilleure façon de coder.
En effet j'essaie de reprendre certains de nos programmes afin de mieux dissocier la couche fonctionnelle (haut niveau) de la couche bas niveau (matérielle), pour que d'une part ce soit plus clair pour celui qui repassera derrière, et d'autre part pour que ce soit plus structuré et donc plus facile à faire évoluer.
Je travaille actuellement avec un microcontrôleur de la famille PIC24E, et l'environnement MPLABX (v5.20) et XC16 (v1.41).
Ma situation est plus précisément ce cas de figure :
J'ai une carte principale avec un microcontrôleur (PIC24E) et deux cartes esclaves (chacune avec des fonctions différentes) mais sur lesquelles on retrouve le même convertisseur numérique/analogique AD5660.
Les deux convertisseurs utilisent le même périphérique SPI, et bien sur deux Chip Select différents.
Actuellement l'appel des fonctions se fait de la façon "AD5660_1" et "AD5660_2", le problème est que d'un point de vue code, ça oblige à modifier la bibliothèque du composant AD5660, alors que dans l'idéal j'aimerais que celle-ci soit générique, peut importe le nombre de composants, et peu importe si ils utilisent le même périphérique SPI ou non.
Code actuel :
Structure de code souhaitée :Code:/* AD5660_1_CS_low - Set Chip Select (CS) low. * parameter : void. * return : void. */ void AD5660_1_CS_low(void) { AD5660_1_CS=0; } /* AD5660_1_CS_high - Set Chip Select (CS) high. * parameter : void. * return : void. */ void AD5660_1_CS_high(void) { AD5660_1_CS=1; } /* AD5660_2_CS_low - Set Chip Select (CS) low. * parameter : void. * return : void. */ void AD5660_2_CS_low(void) { AD5660_2_CS=0; } /* AD5660_2_CS_high - Set Chip Select (CS) high. * parameter : void. * return : void. */ void AD5660_2_CS_high(void) { AD5660_2_CS=1; } /* AD5660_1_configureHardware - Configure CS pin and SPI peripheral. * parameter : void. * return : void. */ void AD5660_1_configureHardware(void) { AD5660_1_CS_TRIS=OUTPUT; // Configure Chip Select pin as output AD5660_1_CS_high(); // Initialize Chip Select at '1' : un-select device SPI1_configure(MASTER,NO_BUFFER,MODE_8_BIT,AD5660_PPRE,AD5660_SPRE,AD5660_CKE,AD5660_CKP,AD5660_SMP); } /* AD5660_2_configureHardware - Configure CS pin and SPI peripheral. * parameter : void. * return : void. */ void AD5660_2_configureHardware(void) { AD5660_2_CS_TRIS=OUTPUT; // Configure Chip Select pin as output AD5660_2_CS_high(); // Initialize Chip Select at '1' : un-select device SPI1_configure(MASTER,NO_BUFFER,MODE_8_BIT,AD5660_PPRE,AD5660_SPRE,AD5660_CKE,AD5660_CKP,AD5660_SMP); } /* AD5660_1_sendByte - Send data byte to AD5660 1 through SPI. * parameter wByte : Data to send. * return status : 0 = success; negative = fail. */ int AD5660_1_sendByte(unsigned char wByte) { int status=0; SPI1_configure(MASTER,NO_BUFFER,MODE_8_BIT,AD5660_PPRE,AD5660_SPRE,AD5660_CKE,AD5660_CKP,AD5660_SMP); AD5660_1_CS_low(); SPI1_transferData((unsigned short)wByte); AD5660_1_CS_high(); return status; } /* AD5660_2_sendByte - Send data byte to AD5660 2 through SPI. * parameter wByte : Data to send. * return status : 0 = success; negative = fail. */ int AD5660_2_sendByte(unsigned char wByte) { int status=0; SPI1_configure(MASTER,NO_BUFFER,MODE_8_BIT,AD5660_PPRE,AD5660_SPRE,AD5660_CKE,AD5660_CKP,AD5660_SMP); AD5660_2_CS_low(); SPI1_transferData((unsigned short)wByte); AD5660_2_CS_high(); return status; }
Une idée de comment faire? MerciCode:--- HardwareProfile.h --- // - AD5660 (1) #define AD5660_1_CS_TRIS _TRISG12 #define AD5660_1_CS _LATG12 // - AD5660 (2) #define AD5660_2_CS_TRIS _TRISD6 #define AD5660_2_CS _LATD6 --- AD5660.h --- #define AD5660_NUM 2 typedef struct { (void*)CS_low(void); (void*)configureHardware(void); (int*)sendByte(unsigned char wByte); } _AD5660_struct_; extern _AD5660_struct_ AD5660_device[AD5660_NUM]; --- AD5660.c --- #include "HardwareProfile.h" #include "AD5660.h" #include "spi1.h" _AD5660_struct_ AD5660_device[AD5660_NUM]; void AD5660_CS_low(char AD5660_num) { AD5660_device[AD5660_num].CS_low(); } void AD5660_configureHardware(char AD5660_num) { AD5660_device[AD5660_num].configureHardware(); } int AD5660_sendByte(char AD5660_num,char data) { return (AD5660_device[AD5660_num].sendByte(data)) }
-----