Bonsoir tout le monde voila , dans le cadre d'un projet a l’université je dois paramétrer un pic 18f46k22 en master I2C afin de réguler la température , hygrométrie , pression et afficher sur un LCD déporté , je viens vers vous après plus de 4 mois d’échec , donc je suis bien imprégné de la doc , de l'I2C , toussa toussa malgré tout rien ne fonctionne , pour être plus précis je fait clignoter une led qui me permet de voir que mon programme tourne bien , mais lorsque j'observe a l' oscilloscope il ne se passe rien les lignes SCL et SDA sont a 5 V mais c'est le calme plat... parlons de câblage j’utilise un quartz de 20 mhz , les sorties scl et sda sont relier en pull-up au 5v avec des résistances de 1K , j'ai une led sur le port E1. J'ai fait deux codes différent le premier avec la librairie i2c fournit par c18 ( je me suis dit que quelqu’un connait peut être ) l'autre "en manuelle" avec la doc...les deux ne donnent rien ...
voici le celui avec la lib
Code:#include <delays.h> #include <i2c.h> #include <p18f46k22.h> void main() { unsigned char addr = 0x12 ; TRISD = 0b00000011; TRISE = 0b00000000; OpenI2C2(MASTER, SLEW_ON); SSP2ADD = 12; // horloge = 20Mhz => 400 Kbit/s IdleI2C2(); // verification bus libre StartI2C2(); //startx WriteI2C2(addr<<1); // adresse decaler vers la gauche (r/w = 0 ) //AckI2C2(); // attente ack WriteI2C2(0x18); //valeur StopI2C2(); // stop while(1) { PORTEbits.RE1 = 1 ; Delay10KTCYx(250);// 500 ms Delay10KTCYx(250);// 500 ms PORTEbits.RE1 = 0 ; Delay10KTCYx(250);// 500 ms Delay10KTCYx(250);// 500 ms }
le deuxieme :
Code:#include <delays.h> #include <p18f46k22.h> void main() { unsigned char addr = 0x12 ; addr = addr<<1 ; // adresse sur 7 bits + bit R/W TRISD = 0b00000011; TRISE = 0b00000000; SSP2STATbits.SMP = 0 ; //slew control 400 kb/s SSP2STATbits.CKE = 0 ; // compatibilité i2c SSP2ADD = 12 ; // vitesse 400 kb/s SSP2CON1bits.SSPEN = 1 ; // module mssp activé SSP2CON1bits.SSPM = 1000 ;//mode master ///////////////////////////////////////////////////////////// //tentative de communication SSP2CON2bits.SEN = 1 ; // condition de start while(SSP2CON2bits.SEN); // verifie que la condition de start a bie eu lieu ( SEN est remis a zero par le hardware ) SSP2BUF = addr ; // on place le une donnée dans le registe SSPxBUF ce qui lance automatiquement l'emmission ( ici l'adrrese ) while(SSP2STATbits.R/W); // on attend la fin de l'emmission SSP2BUF = 250 ; // on place le une donnée dans le registe SSPxBUF ce qui lance automatiquement l'emmission while(SSP2STATbits.R/W); // on attend la fin de l'emmission SSP2CON2bits.PEN = 1 ; // condition de stop while(SSP2CON2bits.PEN); // verifie que la condition de start a bie eu lieu ( PEN est remis a zero par le hardware ) while(1) { PORTEbits.RE1 = 1 ; Delay10KTCYx(250);// 500 ms Delay10KTCYx(250);// 500 ms PORTEbits.RE1 = 0 ; Delay10KTCYx(250);// 500 ms Delay10KTCYx(250);// 500 ms } }
donc si quelqu'un est un pro en PIC qu'il se montre ^^
Personnellement je programme quasiment que sur des Atmel ou Arduino ou Raspberry , j'ai d'ailleurs fini ce projet avec une arduino pour m'assurer quelques points... et je n'ai eu aucun souci avec l'i2c... , mais mon tuteur est branché PIC et il s'en fou de Arduino , Atmel et tout le tralala enfaite j'ai compris qu'il veut que je fasse ça sur pic pour récupéré mon code et l'utiliser dans ses petites affaires ^^ .
bon WE a tous et merci .
-----