Bonjour,
J'ai un soucis avec la programmation.
Je dois lire la température sur un capteur LM92 en I2C avec un oscilloscope.
Avant tout j'ai fais un STAMP PIC 16F690
Stamp 16F690.PNG
Puis après j'ai relier un affichage 3x12 LCD I2C. Je n'ai pas eu beaucoup de problème à le faire fonctionner.
Avec l'aide d'un driver (fichier de fonctions), j'ai afficher des choses sur les 3 lignes.
schéma display.PNG
Après ce petit projet, j'essaie de programmer afin que je puisse lire la température sur de l'I2C (SCL,SDA)
LM92 temperature I2C.PNG
Pouvez m'aider au niveau de la programmation??Code:WIZARD #include <16F690.h> #device adc=8 #FUSES NOWDT //No Watch Dog Timer #FUSES HS //High speed Osc (> 4mhz for PCM/PCH) (>10mhz for PCD) #FUSES NOPUT //NO Power Up Timer #FUSES NOMCLR //Master Clear pin used for I/O #FUSES NOBROWNOUT //No brownout reset #use delay(clock=8000000) #define LED PIN_C6 #define FLAG_CTRL_1 PIN_B5 #use i2c(Master,Slow,sda=PIN_B4,scl=PIN_B6) FICHIER.C // -------------------------------------------------------------------- // Include Files // -------------------------------------------------------------------- #include "Temperature_I2C.h" #include "Fonction.c" //--------------------------------------------------------------------- // Definitions & byte //--------------------------------------------------------------------- #byte OSCCON = 0x8F #define TEMPERATURE_ADD 0b10010001 //0x91 //--------------------------------------------------------------------- // Variable Globale //--------------------------------------------------------------------- //--------------------------------------------------------------------- // Programme principal //--------------------------------------------------------------------- void main() { setup_comparator(NC_NC_NC_NC);// This device COMP currently not supported by the PICWizard setup_timer_0(RTCC_INTERNAL|RTCC_DIV_128|RTCC_8_bit); //32.7 ms overflow setup_comparator(NC_NC_NC_NC);// This device COMP currently not supported by the PICWizard disable_interrupts(INT_TIMER0); enable_interrupts(GLOBAL); bit_set(OSCCON,4); bit_set(OSCCON,5); bit_set(OSCCON,6); delay_ms(100); //time for LCD power-up (see datasheet) LCD_I2C_Config (); //LCD configuration while(TRUE) { i2c_start(); //Start i2c_write(TEMPERATURE_ADD ); //Address and R/W //i2c_write(0b00000000);//temperature (Read only) i2c_write(0b01101000); i2c_read(0); i2c_write(0b01001000); // i2c_read(0) >> 8; //i2c_read(1); /* i2c_read()<<8; //Read first byte <<8 i2c_read();*/ i2c_stop(); //End delay_us(200); } }
l'Adresse du LM 92 est 0X91 10010 A0 A1 X X-> read/write A1 et A0 => GND
donc 0b10010001
J'ai regarder la datasheet du LM92, il y a 12 bits que je dois gérer ! mais avec l'I2C on peut que 8 bits, comment on fait pour ne pas avoir un ACK entre 2 i2c_read() ?
-----