Bonjour,
Je débute en C, je dispose d'un pic18f4685, d'un pickit2 et de mplab v8.63
Je tente d'acquérir les données d'un accéléromètre AXDL345 via i2c.
Cependant, je ne maitrise pas du tout les pointeurs, et je dois stocker les données (x,y,z) dans un tableau, pour ensuite les afficher sur le PORTC et le PORTB à défaut de disposer d'une connexion usb, et/ou d'un écran lcd.
Voici mon code pour récupérer les données de l'accéléromètre
Voila, a chaque fois que j'appuie sur le bouton associé a la récupération des données, toute mes leds s'allume comme si j'avais un 0xFFCode:#define AXDL_W 0x3A// Adresse d'écriture #define AXDL_devid 0x00 // Test adresse #define AXDL_R 0x3B // Adresse de lecture #define AXDL_X0 0x32 // Lecture Valeur X0 #define HIGH 1 #define LOW 0 void init (void); void init_i2c(void); void init_timer(void); void init_adc(void); void data_cap (void); void _DINT(void); void _EINT(void); void adc_conv(int choix); int calcul_xyz(int *buff, int num) unsigned char GetDataByte(unsigned char addW,unsigned char cmd, unsigned char num); int GetDataBytes(int addW, int cmd, int num, int buff[]); int WriteData(int addW, int reg, int data); void main(void) { init(); init_i2c(); init_timer(); while(1) { Delay10KTCYx(1000); LED1=HIGH; LED0=HIGH; Delay10KTCYx(1000); LED1=LOW; LED0=LOW; while(PORTD) { Delay10KTCYx(100); switch(PORTD) { case 0x40:LATB=calcul_xyz(*buff, 0x03); LEDaxdl=HIGH; break; // 64 - RD6 case 0x20:LATB=calcul_xyz(*buff, 0x01); LEDaxdl=HIGH;break; // 32 - RD5 case 0x10:LATB=calcul_xyz(*buff, 0x02); LEDaxdl=HIGH;break; // 16 - RD4 default:Delay10KTCYx(50);LEDaxdl=LOW;LEDhmc=LOW;LATB=0x00;break; } } } } int GetDataBytes(int addW,int cmd,int num, int *buff) { int i=0; StartI2C(); IdleI2C(); WriteI2C(addW); IdleI2C(); WriteI2C(cmd); IdleI2C(); StartI2C(); WriteI2C((addW+0x01)); IdleI2C(); for(i=0;i<=num;i++) { if(!ReadI2C()) { LED9=HIGH; Delay10KTCYx(300); LED9=LOW; } else { LEDread=HIGH; LED8=HIGH; buff[i]=ReadI2C(); AckI2C(); IdleI2C(); WriteI2C(addW); IdleI2C(); WriteI2C((cmd+i)); IdleI2C(); StartI2C(); WriteI2C((addW+0x01)); IdleI2C(); LEDread=LOW; LED8=LOW; } } NotAckI2C(); IdleI2C(); StopI2C(); LEDread=LOW; return *buff; } int calcul_xyz(int *buff, int num) { int x,y,z; x = (((int)buff[1]) << 8) | buff[0]; y = (((int)buff[3]) << 8) | buff[2]; z = (((int)buff[5]) << 8) | buff[4]; switch(num) { case 0x01: return x; break; case 0x02: return y; break; case 0x03; return z; break; default: return 0; break; } }
De plus, je récupère déjà les valeur d'une boussole , et je n'ai aucun problème pour afficher les données sur le portb. Mon code n'est pas en entier, je n'ai pas mit les inits.
Je démarre l'accéléromètre via un init, qui effectue un reset, le met en standby, le configure et ENSUITE démarre l'acquisition des données.
-----