/*****************************************************************************************/ /* R U T I N E _ Z A _ D E L O _ Z _ T E M P A R A T U R N O _ S O N D O _ D S _ 1 8 2 0 */ /*****************************************************************************************/ //#define DS1820_SINGLE //Ÿe je na vodilu samo ena sonda long int temp_ds1820; //to vrednost vraŸa Beri_temp_ds1820 BYTE CRC_vsota; //globalna spremenljivka #include "touch.icp" void Poslji_rom_kodo(BYTE ee_adr_rom_kode) { //PRISOTEN JE LAHKO SAMO EN DS1820 MED BRANJEM KODE /*poçlje 64 bitov(8-famili code,48-serial number,8-CRC) iz EEPROM-a v 8 lokacijah */ BYTE i; for (i=0;i<=7;++i) { //poçlji 8 bajtov v katerih je tudi CRC #if PIC == 84 touch_write_byte(read_eeprom(ee_adr_rom_kode)); #else touch_write_byte(read_ext_eeprom(ee_adr_rom_kode)); #endif ++ee_adr_rom_kode; } } BYTE Beri_rom_kodo(BYTE ee_adr_rom_kode) { //PRISOTEN JE LAHKO SAMO EN DS1820 MED BRANJEM KODE /*tota rutina naj prebere 64 bitov(8-famili code,48-serial number,8-CRC) in jih skrani v EEPROM v 8 lokacijah od vhodnega prar. ee_adr dalje. Ÿe ni tuch_prezent ali Ÿe CRC na koncu ni 0 vrne FALSE. */ BYTE i; if (!touch_present()) goto neusp_exit; //reset in preverjanje present touch_write_byte(0x33); //komanda beri rom kodo CRC_vsota = 0; //zaŸetna vrednost, pozneje jo spreminja touch_read_byte for (i=0;i<=7;++i) { //beri çe 8 bajtov v katerih je tudi CRC,na koncu mora biti CRC_vsota == 0 #if PIC == 84 write_eeprom(ee_adr_rom_kode,touch_read_byte()); #else write_ext_eeprom(ee_adr_rom_kode,touch_read_byte()); #endif ++ee_adr_rom_kode; } touch_present(); //reset vodila if (CRC_vsota) //napaka, CRC ni 0 neusp_exit: //Ÿe ni dallasa ali Ÿe v 1s ni uspeçnega prenosa javi z to kodo return(FALSE); return (TRUE); //CRC je OK } #ifdef DS1820_SINGLE BYTE Beri_temp_ds1820(void) { #else BYTE Beri_temp_ds1820(BYTE ee_adr_rom_kode) { #endif //tota rutina naj sprejma samo prva dva bajta v globalno Temp ostale pa naj // sprejema na slepo samo zaradi izraŸuna CRC , ki ga vrne (0 je vse vredu) //novo ime Beri_temp vsebuje naj tudi reset in skip rom. BYTE i; if (!touch_present()) goto neusp_exit; //reset in preverjanje present #ifdef DS1820_SINGLE touch_write_byte(0xCC); //skip ROM-Ÿe je samo en na vodilu ni poreben naslov #else touch_write_byte(0x55); //komanda match rom, sledi ji rom koda naslovljenega Ds1820 Poslji_rom_kodo(ee_adr_rom_kode); //poçlje kodo ustreznega ds-a, iz EEPROMA #endif touch_write_byte(0xBE); //komanda beri ram CRC_vsota = 0; //zaŸetna vrednost, pozneje jo spreminja touch_read_byte (BYTE)temp_ds1820 = touch_read_byte(); //temp LSB *(&temp_ds1820+1) = touch_read_byte(); //temp MSB for (i=0;i<=6;++i) { //beri çe 7 bajtov v katerih je tudi CRC,na koncu mora biti CRC_vsota == 0 touch_read_byte(); } touch_present(); //reset vodila if (CRC_vsota) //napaka, CRC ni 0 neusp_exit: //Ÿe ni dallasa ali Ÿe v 1s ni uspeçnega prenosa javi z to kodo return(FALSE); return (TRUE); //CRC je OK } BOOLEAN Konec_meritve_ds1820(void) { return ((touch_read_byte() == 0xFF) || (stot_sek_ds1820 == 0)); //Ÿakaj na konec pretvorbe, ali poŸakaj najveŸ 05.s } #ifdef DS1820_SINGLE BOOLEAN Start_meritve_ds1820(void) { #else BOOLEAN Start_meritve_ds1820(BYTE ee_adr_rom_kode) { #endif //Tudi Start_meritve naj bo brez zakasnitve, in naj vrne false,Ÿe ni vse vredu if (!touch_present()) return(FALSE); //reset in preverjanje present #ifdef DS1820_SINGLE touch_write_byte(0xCC); //skip ROM-Ÿe je samo en na vodilu ni poreben naslov #else touch_write_byte(0x55); //komanda match rom, sledi ji rom koda naslovljenega Ds1820 Poslji_rom_kodo(ee_adr_rom_kode); //poçlje kodo ustreznega ds-a, iz EEPROMA #endif touch_write_byte(0x44); //Convert T- zaŸni z merjenjem tempetature stot_sek_ds1820=50; return(TRUE); }