/* Arlotto 2005 : fonctions ds1621 */ #include #include #include #include "biosdem.h" #define DS1621_W 0x92 #define DS1621_R 0x93 #define ACCESS_CONFIG 0xAC #define READ_TEMP 0xAA #define START_CONVERT 0xEE void i2c_init(void) { char x ; TRISC3 = 1 ; //SDA et SCL en entrée TRISC4 = 1 ; SSPSTAT = 0x80 ; // Pas de controle de slew rate, niveaux i2c SSPCON = 0x28 ; // enable i2c 7bits master mode SSPADD = 9 ; // fclock = 100khz = Fosc/(4(SSPADD+1) x = SSPBUF ; // vide le buffer et raz flags } void init_ds1621(void) { SEN = 1; while(SEN); SSPIF = 0; SSPBUF = DS1621_W ; while(!SSPIF); SSPIF = 0; SSPBUF = ACCESS_CONFIG ; while(!SSPIF); SSPIF = 0; SSPBUF = 0x08; // 1SHOT = 0 ; while(!SSPIF); // Attention POL et 1SHOT non volatile SSPIF = 0; PEN = 1; while(PEN); DelayMs(10); // attend fin écriture EEPROM SEN = 1; while(SEN); SSPIF = 0; SSPBUF = DS1621_W ; while(!SSPIF); SSPIF = 0; SSPBUF = START_CONVERT ; while(!SSPIF); PEN = 1; while(PEN); } unsigned char read_config(void) { unsigned char config ; SEN = 1; while(SEN); SSPIF = 0; SSPBUF = DS1621_W ; while(!SSPIF); SSPIF = 0; SSPBUF = ACCESS_CONFIG ; while(!SSPIF); RSEN = 1; while(RSEN); SSPIF = 0; SSPBUF = DS1621_R ; while(!SSPIF); RCEN = 1; while(!STAT_BF); config = SSPBUF; ACKDT=1; ACKEN = 1; while(ACKEN); PEN = 1; while(PEN); return config ; } int read_temp(void) { char th,tb; SEN = 1; while(SEN); SSPIF = 0; SSPBUF = DS1621_W ; while(!SSPIF); SSPIF = 0; SSPBUF = READ_TEMP ; while(!SSPIF); RSEN = 1; while(RSEN); SSPIF = 0; SSPBUF = DS1621_R ; while(!SSPIF); RCEN = 1; while(!STAT_BF); th = SSPBUF; ACKDT=0; ACKEN = 1; while(ACKEN); RCEN = 1; while(!STAT_BF); tb = SSPBUF; ACKDT=1; ACKEN = 1; while(ACKEN); PEN = 1; while(PEN); return (th<<8)+tb; }