bonjour à tous je suis sur projet qui consiste à lire les données d'un accelerometre via l'i2c puis réaliser l'interface i2c/usb pour récuperer les données sur pc.
j'utilise donc le pic 18f87j50,l'accéléromètre MMA7660 de farnell
mon probleme est le suivant quand j'utilise le mode debugger l'horloge tombe.et ensuite quand je simule dans ma variable x(dans la fenetre watch)il m'affiche 0x00.
pourtant j'ai bien mis mes résistance de tirage..
quand je visualise l'horloge (en mode programer) c'est à dire scl je visualise bien la présence de l'horloge.pareil pour sda on voit bien les données qui circule.
voila si quelqu'un peut m'explique mon probleme,cela m'aiderai beaucoup pour la suite.
voici mon code:
//------------------lecture de l'accelerometre MMA7660FC avec pic 18f87j50---------------//
//--------------------------------------liste des librairies utilisées---------------------------//
#include <p18f87j50.h>
#include<delays.h>
#include<i2c.h>
//-----------------------------------fin liste des librairies utilisées-------------------------//
//-----------------------------------configuration du pic utilisé-------------------------------//
#pragma config FOSC=HS
#pragma config WDTEN =OFF
#pragma config CP0=OFF
#pragma config PLLDIV = 3 // (12 MHz crystal used on this board)
#pragma config DEBUG = OFF // watchdog timer disabled
#pragma config XINST = OFF
#pragma config FCMEN = ON // fail-safe clock monitor disabled
#pragma config IESO = ON // two-speed start-up disabled
//-----------------------------------fin configuration du pic utilisé--------------------------//
#define SCL PORTCbits.RC3
#define SDA PORTCbits.RC4
#define xout 0x00
#define yout 0x01
#define zout 0x02
#define mma 0b01001100 //adresse BQ en mode écriture//adresse du bus i2c du pic
//----------------------------declaration des variable--------------------------------------------------//
signed char x; // variable position
signed char y; // variable position
signed char z; // variable position
//---------------------------fin de declaration des vvariables------------------------------------------//
//---------------------------------test accusée de reception de l'esclave---------------------------------------------//
void ack(void) // attend acknowledge (I2C) de l'esclave
{
while(SSP1STATbits.R_W); // attend fin de transmission
while (SSP1CON2bits.ACKSTAT); // attend fin ACK esclave
}
//-------------------------------fin test accusée de reception de l'esclave--------------------------------//
//--------------------------------lecture des donnée------------------------------------//
char lit_i2c(unsigned char adresse)
{ signed char x;
SSP1CON2bits.SEN=1; // START
while (SSPCON2bits.SEN);
SSP1BUF=0x98; // adresse ecriture : bit0=0
ack(); //gestion acquittement esclave
SSP1BUF=0x00; // code commande SMBus de la fonction à lire
ack();
SSP1CON2bits.RSEN=1; // RESTART
while (SSPCON2bits.RSEN); // attente fin RESTART
SSP1BUF=0x99; // adresse lecture :bit0=1
ack();
SSP1CON2bits.RCEN=1; // passe en mode lecture d'un octet
while (SSP1CON2bits.RCEN); // attend reception terminée
x=SSP1BUF; // mémorise abscisse
//*reception du deuxième octet*/
// SSP1CON2bits.ACKDT=0; //ACK
// SSP1CON2bits.ACKEN=1; // enable la sequece d'aquittement en mode reception et transmission ACK data à l'esclave
// while(SSP1CON2bits.ACKEN);//attente fin acknowladge sequence enable
// SSP1CON2bits.RCEN=1; // passe en mode lecture d'un octet
// while (SSP1CON2bits.RCEN); // attend reception terminée
// y=SSPBUF; // mémorise y
//*reception du troisieme octet*/
// SSP1CON2bits.ACKDT=0; //ACK
// SSP1CON2bits.ACKEN=1; // enable la sequece d'aquittement en mode reception et transmission ACK data à l'esclave
// while(SSP1CON2bits.ACKEN);//attente fin acknowladge sequence enable
// SSP1CON2bits.RCEN=1; // passe en mode lecture d'un octet
// while (SSP1CON2bits.RCEN); // attend reception terminée
// z=SSPBUF; // mémorise z
SSP1CON2bits.ACKDT=1; // NON-ACK
SSP1CON2bits.ACKEN=1;
while(SSP1CON2bits.ACKEN);//attente fin acknowladge sequence enable SSP1CON2bits.PEN=1; // STOP
while(SSP1CON2bits.PEN);
return (x);
}
//------------------------------------------fin lecture des données-------------------------------------------------------------------------//
//---------------------------initialisation de l'i2c---------------------------------------------//
void init_i2c(void)
{
DDRCbits.RC3 = 1; // SCL (PORTC,3) en entrée
DDRCbits.RC4 = 1; // SDA (PORTC,4) en entrée
SSP1CON1=0b00101000; // WCOL SSPOV SSPEN CKP SSPM3:SSPM0
// efface WCOL et SSPOV, active I2C, I2C mode maitre horloge=FOSC/(4*(SSPADD+1))
SSP1CON2=0b01000000;
SSP1STATbits.SMP=1; // slew rate inhibé (f<400Khz)
SSP1ADD=31; // horloge =12Mhz /SMBus clock=100Khz au maximum
SSP1CON1bits.SSPEN = 1; // Enable MSSP module
ADCON1=0x0F;
CCP1CON=0;
}
//fin init i2c
//------------------------------programme principale--------------------------------//
void main(void)
{
init_i2c();
while (1)
{
x=lit_i2c(0x00);
}
}
-----