Bonjour à tous !
Décidément je suis très actif sur le forum ces dernières semaines, j'espère que vous voudrez bien de nouveau m'apporter votre aide. Et par avance, je tiens à remercier tout ceux qui m'ont aidé et m'aideront de nouveau. Venons en au fait !
Pour mon projet de fin d'étude, je dois pouvoir lire la mesure d'un capteur de taux de CO2 depuis mon PIC18F45K22. Voici la référence de ce capteur EE891. Ce capteur à une sortie numérique basée sur le protocole E2 Interface. Ce protocole est très très similaire à l'I2C mais le problème est que mon PIC18F45K22 ne connait pas ce protocole.
Sur le site de la marque du capteur, il y a une note d'application présentant un exemple d'utilisation de l'E2 Interface. Mais personnellement je n'ai jamais créer d'header en C, du coup cette tâche reste relativement flou pour moi. Par conséquent j'ai fait des recherches sur le net et je me suis appuyé sur une petite vidéo présentant cette tâche.
Sous MPLAB X IDE, j'ai donc créé un nouveau projet. Ce projet est pour le moment composé de main.c, e2_interface.c et e2_interface.h dont voici leur code respectif :
main.c
e2_interface.cCode:#include <p18f45k22.h> #pragma config WDTEN = OFF // Watch Dog Timer disabled #pragma config FOSC = INTIO67 // Internal Oscillator Block, RA6 & RA7 enabled #pragma config DEBUG = ON // Background Debug enabled #pragma config LVP = OFF // Low Voltage Programming disabled #pragma config MCLRE = INTMCLR // RE3 enabled, MCLR disabled void main() { }
e2_interface.hCode:#include "e2_interface.h" void E2Bus_start(void) // send Start condition to E2 Interface { set_SDA(); set_SCL(); delay(30*DELAY_FAKTOR); clear_SDA(); delay(30*DELAY_FAKTOR); } /*-------------------------------------------------------------------------*/ void E2Bus_stop(void) // send Stop condition to E2 Interface { clear_SCL(); delay(20*DELAY_FAKTOR); clear_SDA(); delay(20*DELAY_FAKTOR); set_SCL(); delay(20*DELAY_FAKTOR); set_SDA(); delay(20*DELAY_FAKTOR); } /*-------------------------------------------------------------------------*/ void E2Bus_send(unsigned char value) // send Byte to E2 Interface { unsigned char i; unsigned char maske = 0x80; for (i=8;i>0;i--) { clear_SCL(); delay(10*DELAY_FAKTOR); if ((value & maske) != 0) {set_SDA();} else {clear_SDA();} delay(20*DELAY_FAKTOR); set_SCL(); maske >>= 1; delay(30*DELAY_FAKTOR); clear_SCL(); } set_SDA(); } /*-------------------------------------------------------------------------*/ unsigned char E2Bus_read(void) // read Byte from E2 Interface { unsigned char data_in = 0x00; unsigned char maske = 0x80; for (maske=0x80;maske>0;maske >>=1) { clear_SCL(); delay(30*DELAY_FAKTOR); set_SCL(); delay(15*DELAY_FAKTOR); if (read_SDA()) {data_in |= maske;} delay(15*DELAY_FAKTOR); clear_SCL(); } return data_in; } /*-------------------------------------------------------------------------*/ char check_ack(void) // check for acknowledge { bit input; delay(30*DELAY_FAKTOR); set_SCL(); delay(15*DELAY_FAKTOR); input = read_SDA(); delay(15*DELAY_FAKTOR); if(input == 1) return NAK; else return ACK; } /*-------------------------------------------------------------------------*/ void send_ack(void) // send acknowledge { clear_SCL(); delay(15*DELAY_FAKTOR); clear_SDA(); delay(15*DELAY_FAKTOR); set_SCL(); delay(30*DELAY_FAKTOR); clear_SCL(); set_SDA(); } /*-------------------------------------------------------------------------*/ void send_nak(void) // send NOT-acknowledge { clear_SCL(); delay(15*DELAY_FAKTOR); set_SDA(); delay(15*DELAY_FAKTOR); set_SCL(); delay(30*DELAY_FAKTOR); clear_SCL(); set_SDA(); } /*-------------------------------------------------------------------------*/ void delay(unsigned int value) // delay- routine { while (--value != 0); } /*-------------------------------------------------------------------------*/ void set_SDA(void) { SDA = 1; } // set port-pin (SDA) void clear_SDA(void) { SDA = 0; } // clear port-pin (SDA) bit read_SDA(void) { return SDA; } // read SDA-pin status void set_SCL(void) { SCL = 1; } // set port-pin (SCL) void clear_SCL(void) { SCL = 0; } // clear port-pin (SCL)
Code:#include "e2_interface.h" void E2Bus_start(void) // send Start condition to E2 Interface { set_SDA(); set_SCL(); delay(30*DELAY_FAKTOR); clear_SDA(); delay(30*DELAY_FAKTOR); } /*-------------------------------------------------------------------------*/ void E2Bus_stop(void) // send Stop condition to E2 Interface { clear_SCL(); delay(20*DELAY_FAKTOR); clear_SDA(); delay(20*DELAY_FAKTOR); set_SCL(); delay(20*DELAY_FAKTOR); set_SDA(); delay(20*DELAY_FAKTOR); } /*-------------------------------------------------------------------------*/ void E2Bus_send(unsigned char value) // send Byte to E2 Interface { unsigned char i; unsigned char maske = 0x80; for (i=8;i>0;i--) { clear_SCL(); delay(10*DELAY_FAKTOR); if ((value & maske) != 0) {set_SDA();} else {clear_SDA();} delay(20*DELAY_FAKTOR); set_SCL(); maske >>= 1; delay(30*DELAY_FAKTOR); clear_SCL(); } set_SDA(); } /*-------------------------------------------------------------------------*/ unsigned char E2Bus_read(void) // read Byte from E2 Interface { unsigned char data_in = 0x00; unsigned char maske = 0x80; for (maske=0x80;maske>0;maske >>=1) { clear_SCL(); delay(30*DELAY_FAKTOR); set_SCL(); delay(15*DELAY_FAKTOR); if (read_SDA()) {data_in |= maske;} delay(15*DELAY_FAKTOR); clear_SCL(); } return data_in; } /*-------------------------------------------------------------------------*/ char check_ack(void) // check for acknowledge { bit input; delay(30*DELAY_FAKTOR); set_SCL(); delay(15*DELAY_FAKTOR); input = read_SDA(); delay(15*DELAY_FAKTOR); if(input == 1) return NAK; else return ACK; } /*-------------------------------------------------------------------------*/ void send_ack(void) // send acknowledge { clear_SCL(); delay(15*DELAY_FAKTOR); clear_SDA(); delay(15*DELAY_FAKTOR); set_SCL(); delay(30*DELAY_FAKTOR); clear_SCL(); set_SDA(); } /*-------------------------------------------------------------------------*/ void send_nak(void) // send NOT-acknowledge { clear_SCL(); delay(15*DELAY_FAKTOR); set_SDA(); delay(15*DELAY_FAKTOR); set_SCL(); delay(30*DELAY_FAKTOR); clear_SCL(); set_SDA(); } /*-------------------------------------------------------------------------*/ void delay(unsigned int value) // delay- routine { while (--value != 0); } /*-------------------------------------------------------------------------*/ void set_SDA(void) { SDA = 1; } // set port-pin (SDA) void clear_SDA(void) { SDA = 0; } // clear port-pin (SDA) bit read_SDA(void) { return SDA; } // read SDA-pin status void set_SCL(void) { SCL = 1; } // set port-pin (SCL) void clear_SCL(void) { SCL = 0; } // clear port-pin (SCL)
Donc j'aimerais savoir si quelqu'un peut m'indiquer si je suis bien engagé, me donner des conseils ou tout autres éléments d'aide svp ?
-----