Bonjour à tous,
je suis en train de réaliser une carte comportant un PIC 18f4550 relié à un accéléromètre LIS3LV02DL. J'ai écrit le code sous C18 la compilation se fait sans problème mais lors du debugage le logiciel MPLAB plante .
Une fois arrivé à la ligne StartI2C() il reste dans la boucle infinie mais je n'arrive pas à comprendre pourquoi. Par contre il exécute le IdleI2C() sans problème.
De plus le code est similaire à celui d'un collègue qui utilise un PIC18f2550 sauf que sur sa carte il n'y a aucun problème.
Voici mon code:
Et voici ce qu'il y a dans la commande StartI2C()Code://fichier de déclaration des registres internes du microcontrôleur #include <p18f4550.h> #include <i2c.h> // Configuration des données du PIC #pragma config FOSC = HS //Oscillateur externe 20Mhz #pragma config WDT = OFF // watchdog OFF #pragma config LVP = OFF #pragma config MCLRE = OFF void initialisation(void) { //désactiver le convertisseur analogique numerique ADCON1=0x0F; //désactiver le module CCP CCP1CON=0; //Configuration de l'I2C SSPSTAT=0b10000000; SSPCON1=0b00101000; SSPCON2=0x00; SSPADD=0x01100011; //direction des ports 0=Output, 1= Input TRISBbits.TRISB0=1; //SDA TRISBbits.TRISB1=1; //SCL TRISAbits.TRISA0=0;//LED verte TRISAbits.TRISA1=0;//LED rouge TRISAbits.TRISA2=0;//LED orange TRISAbits.TRISA3=0;//LED jaune PORTAbits.RA0=0; PORTAbits.RA1=0; PORTAbits.RA2=0; PORTAbits.RA3=0; OpenI2C(MASTER,SLEW_OFF); //Ouverture de l'I2C en master mode } /***************************************************************************************************/ unsigned char ReadAccelerometre(unsigned char Registre) { unsigned char bRet = 0x00; IdleI2C(); //Attente du bus OK StartI2C(); //Envoi de message de début(envoie du ST) IdleI2C(); //Attente de la disponibilité du bus WriteI2C(0x3A); //Envoi de l'adresse de l'accéléromètre (0011101)+0(écrire) IdleI2C(); //Attente de la disponibilité du bus WriteI2C(Registre); //Envoi du registre a lire IdleI2C(); RestartI2C();//SR WriteI2C(0x3B);//Envoi de l'adresse de l'accéléromètre (0011101)+1(lire) if (SSPCON2bits.ACKSTAT) //Si AckStat == 1, on n'a pas reçu d'acquittement { PORTBbits.RB4 = 1; StopI2C(); //Envoi de la condition de stop return bRet; } bRet = ReadI2C(); //Lecture I2C NotAckI2C();//Pas d'acquittement car on lit qu'un seul caractère IdleI2C(); StopI2C(); //Envoi du stop return bRet; //Retour de la valeur lue } /***************************************************************************************************/ unsigned char WriteAccelerometre(unsigned char Adresse , unsigned char Value) { unsigned char bRet = 0x00; IdleI2C(); //Attente du bus OK StartI2C(); //Envoi de message de début IdleI2C(); //Attente de la disponibilité du bus WriteI2C(0x3A); //Envoi de l'adresse de l'accéléromètre IdleI2C(); //Attenre de la disponibilité du bus WriteI2C(Adresse);//Envoi de l'adresse du registre IdleI2C(); WriteI2C(Value); //On écrit la valeur IdleI2C(); //Attente de disponibilité du bus if (!SSPCON2bits.ACKSTAT ) //Si on reçoit un acquitement, on retourne 1 { bRet = 0x01; } StopI2C(); return bRet; } /***************************************************************************************************/ void main () { initialisation(); //initialisation du PIC PORTAbits.RA0=1; WriteAccelerometre(0xA0,0xC7);//On active l'accéléromètre en écrivant dans CTRL_REG1 ReadAccelerometre(0x28);//ici 0+OUTX_L(0101000); }
Si jamais quelqun peut m'aider ça m'arrangerait, ça fait trois jour que je sèche..Code:#if defined (I2C_V1) #undef StartI2C void StartI2C( void ) { SSPCON2bits.SEN = 1; // initiate bus start condition } #endif
Merci d'avance.
-----