I2C communication entre pic 18f4550 et EEPROM 24C64
Répondre à la discussion
Affichage des résultats 1 à 2 sur 2

I2C communication entre pic 18f4550 et EEPROM 24C64



  1. #1
    inviteac751535

    I2C communication entre pic 18f4550 et EEPROM 24C64


    ------

    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.

    -----
    Images attachées Images attachées  

  2. #2
    invite7a49d0d5

    Cool Re : I2C communication entre pic 18f4550 et EEPROM 24C64

    Bonsoir,

    au niveau de l'oscillateur c'est configuré comment?

    tentes avec de plus grosses résistances de pull-up sur SCL et SDA... genre 4,7K....

    après la simu... moi j'y crois pas...

    vede
    ;O]
    _____________
    ...

Discussions similaires

  1. Transaction I2C entre deux pics 18f4550 (maître-esclave)
    Par invite29cca51d dans le forum Électronique
    Réponses: 9
    Dernier message: 12/04/2011, 15h17
  2. Pic 18f4550 et erreur I2C
    Par invite593714e3 dans le forum Électronique
    Réponses: 5
    Dernier message: 23/05/2010, 01h41
  3. communication I2c pic 16F88
    Par invite4dafc5cd dans le forum Électronique
    Réponses: 0
    Dernier message: 22/04/2009, 13h47
  4. Communication I2C entre 3 pic 16f876
    Par invitee092e9a2 dans le forum Électronique
    Réponses: 0
    Dernier message: 07/04/2008, 19h40
  5. Communication I2C entre PIC et ordinateur / Problème d'interruption
    Par invite68d5b092 dans le forum Électronique
    Réponses: 3
    Dernier message: 01/11/2005, 23h45
Dans la rubrique Tech de Futura, découvrez nos comparatifs produits sur l'informatique et les technologies : imprimantes laser couleur, casques audio, chaises gamer...