bonjour a tous,
j'ai un probleme entre avec la communication I2C entre mon pic 18f4550 et une EEPROM 24C64.
En fait le but du programme est que a chaque fois que j'emmets une impulsion sur le le portD.bit0 j'envoie la conversion en byte de mes 2 LM335 en memoire en respectant l'adresse.
Cependant durant ma simulation Isis j'ai un resulat bizarre.
il ya un start hold time violated...temps qui serait trop cout mais je ne vois pas comment le regler car c'est fait automatiquement par le PIC.
De plus il me fait deux fois la copie en RAM ce qui fait j'ai deux fois la meme recopie et ca me bouffe deux emplacement memoire.
bon deja voici le code
Code:#include <p18F4550.h> #include <adc.h> #include <i2c.h> #include <delays.h> #include "project.h" unsigned int adresse_1; //**********************************MAIN**************************** void main (void) { unsigned int Temperature0; unsigned int Temperature1; unsigned char Byte1; unsigned char Byte2; adresse_1=0x0000; UserInit(); while(1) { PORTCbits.RC0=1; //led de control inactivite PORTCbits.RC2=1; if (PORTD=1) { //on attend une impulsion sur le bouton poussoir PORTD0 pour faire une conversion analogique et la stockee dans la memoire //on recupere l'adresse de stockage suivante PORTCbits.RC2=0; Temperature0=ConvAna(0);//conversion capteur1 Temperature1=ConvAna(1);//conversion capteur2 Byte1=Conv_word_to_byte (Temperature0); Byte2=Conv_word_to_byte (Temperature1); // mise en memoire de byte1 et byte2 suivant I2C send_I2C (Byte1,Byte2); } } //on attend une impulsion sur le bouton poussoir PORTD1 pour lire la valeur en memoire en incrementant //l'adresse de lecture a chaque impulsion } //********************Conversion A/D ***************************** unsigned int ConvAna (int Analog) { //conversion des entrees AN0 et AN1 unsigned int AnaValue; if (Analog==0) { SetChanADC(ADC_CH0); } else { SetChanADC(ADC_CH1); } ConvertADC(); // Debut conversion while(BusyADC()); AnaValue=ReadADC(); return AnaValue; } //********************conversion Word to byte*********************** unsigned char Conv_word_to_byte (unsigned int word) { unsigned int value; value = (( word >>2)&0x00FF); return value; } //**********************envoi I2C en memoire************************* unsigned int send_I2C (unsigned char Byte1,unsigned char Byte2) { OpenI2C (MASTER,SLEW_OFF); IdleI2C(); StartI2C(); IdleI2C(); WriteI2C(0xA0);//ecriture adresse memoire IdleI2C(); WriteI2C((adresse_1>>8)&0xFF);//envoi byte poids fort IdleI2C(); WriteI2C((adresse_1)&0xFF);//envoi byte poids faible IdleI2C(); WriteI2C(Byte1);//ecriture en memoire IdleI2C(); adresse_1++;//incrementation adresse WriteI2C(Byte2);//ecriture en memoire IdleI2C(); adresse_1++;//incrementation adresse EEAckPolling(0xA0); while (SSPCON2bits.PEN); } //*********************UserInit***************************************** void UserInit(void) { TRISD=0xFF; //portD en entree PORTD=0x00; TRISC=0x00; PORTC=0x00; //I2c Control DDRBbits.RB0 = 1; //Configure SCL //as Input DDRBbits.RB1 = 1; //Configure SDA //as Input //config TRISB en entree pour b1 et b0 en I2C mode SSPADD=0x18; // 10Mhz pour 100khz //entree analogique pour A0-A3 soit 4 entree OpenADC(ADC_FOSC_64 & ADC_RIGHT_JUST & ADC_6_TAD,ADC_CH0 & ADC_INT_OFF & ADC_VREFPLUS_VDD & ADC_VREFMINUS_VSS,7); //TAD=TOSC*K1=1/20E6*32=1,6us (TADmin=0,7us) //TACQ=TAD*K2=1,3us*6=8us (TACQmin=6,4us) //AN0-AN7 }
cela vient il d'une mauvaise ecriture de code I2c ou bien autre chose
pouvez vous m'aider s'il vous plait
PS; en piece jointe, le schema ISIS car ca peut venir de la...on ne sait jamais.
-----