/** * funkcia precita registre,teplotu zo zariadenia DS18B20,\n * urcena pre pracu s viacerimi zariadeniami na zbernici * @param REG[9] vystupny smernik kde sa ulozia hodnoty registrov * @param ROM[8] vstupny smernik urcujuci konkretne zariadenie * @return ak vrati 0 operacia prebehla uspesne, ak nie nastala chyba */ char read_tempreature(uchar REG[9],uchar ROM[8]) { unsigned int i; inicializacia(); reset_onewire(); TX_WR(0x55);// match ROM CR_WR(RST_SLOT|TX_SLOT);//prikaz reset+vysielanie while(CR_RD()&BUSY);//cakanie na ukoncenie vysielania if (!(CR_RD()&PRESENSE))return NO_PRESENSE;//kontrola presense pulzu for (i=0;i<=7;i++){//rom TX_WR(ROM[i]); CR_WR(CR_RD()|TX_SLOT); while(CR_RD()&BUSY); } TX_WR(0xBE);//prikaz posli teplotu CR_WR(CR_RD()|TX_SLOT);//prikaz vysielanie while(CR_RD()&BUSY);//cakanie na ukoncenie vysielania reset_onewire(); for (i=0;i<9;i++){ CR_WR(CR_RD()|RX_SLOT);//primanie dat while(CR_RD()&BUSY); REG[i] = RX_RD(); if (i==8 && CRC_RD()){ return WRONG_CRC; } } return TRANSACTION_OK; }
/* mid-level functions */ int8_t noinline ow_read_rom(ow_rom_code_t *rom) { #if ONEWIRE_BUSCOUNT > 1 uint8_t busmask = 1 << (ONEWIRE_STARTPIN); // FIXME: currently only on 1st bus #else uint8_t busmask = ONEWIRE_BUSMASK; #endif /* reset the bus */ if (!reset_onewire(busmask)) return -1; /* transmit command byte */ ow_write_byte(busmask, OW_ROM_READ_ROM); /* read 64bit rom code */ for (uint8_t i = 0; i < 8; i++) { /* read byte */ rom->bytewise[i] = ow_read_byte(busmask); } /* check CRC (last byte) */ if (rom->crc != crc_checksum(rom->bytewise, 7)) return -2; return 1; }
/** * funkcia precita teplotu,registre zo zariadenia DS18B20, \n * citanie iba ak je na zbernici jedino zriadenie * @param REG[8] smernik vracajuci hodnotu vycitanych registrov * @return ak vrati 0 operacia prebehla uspesne, ak nie nastala chyba */ char read_temperature_single(uchar REG[9]){ unsigned int i; inicializacia(); reset_onewire(); TX_WR(0xCC);//preskoc match ROM CR_WR(RST_SLOT|TX_SLOT);//prikaz reset+vysielanie while(CR_RD()&BUSY);//cakanie na ukoncenie vysielania if (!(CR_RD()&PRESENSE))return NO_PRESENSE;//kontrola presense pulzu TX_WR(0xBE);//prikaz posli teplotu CR_WR(CR_RD()|TX_SLOT);//prikaz vysielanie while(CR_RD()&BUSY);//cakanie na ukoncenie vysielania for (i=0;i<8;i++){ CR_WR(CR_RD()|RX_SLOT);//primanie dat while(CR_RD()&BUSY); REG[i] = RX_RD(); if (i==8 && CRC_RD()){ return WRONG_CRC; //printf("chyba v CRC 0x%x",CRC_RD()); } } return TRANSACTION_OK;//funkcia prebehla uspesne }
/** * funkcia vysle prikaz do zariadenia DS18B20 na prevod teploty,\n * urcena pre pracu s viacerimi zariadeniami * @param ROM[8] vstupny smernik urcujuci konkretne zariadenie * @return ak vrati 0 operacia prebehla uspesne, ak nie nastala chyba */ char conversion( uchar ROM[8]) { uchar i; inicializacia(); reset_onewire(); TX_WR(0x55);//match ROM CR_WR(RST_SLOT|TX_SLOT);//prikaz reset+vysielanie while(CR_RD()&BUSY);// cakanie na ukoncenie vysielania if (!(CR_RD()&PRESENSE))return NO_PRESENSE;//kontrola presense pulzu for (i=0;i<=7;i++){//rom TX_WR(ROM[i]); CR_WR(CR_RD()|TX_SLOT); while(CR_RD()&BUSY); } TX_WR(0x44);//prikaz vykonaj konverziu teploty CR_WR(CR_RD()|TX_SLOT); while(CR_RD()&BUSY); return TRANSACTION_OK;//funkcia prebehla uspesne }
int8_t noinline ow_skip_rom(void) { /* reset the bus */ if (!reset_onewire(ONEWIRE_BUSMASK)) return -1; /* transmit command byte */ ow_write_byte(ONEWIRE_BUSMASK, OW_ROM_SKIP_ROM); return 1; }
/** * funkcia vysle prikaz do zariadenia/zariadeni DS18B20 na prevod teploty,\n * urcena pre pracu s jedinym zariadenim na zbernici. \n * Tuto funkciu mozno pouzit aj ak je na zbernici viacero zariadeni,\n * prevod sa vykona na vsetkych zariadeniach naraz * @return ak vrati 0 operacia prebehla uspesne, ak nie nastala chyba */ char conversion_single(void) { inicializacia(); reset_onewire(); TX_WR(0xCC);//preskoc match ROM CR_WR(RST_SLOT|TX_SLOT);//prikaz reset+vysielanie while(CR_RD()&BUSY);// cakanie na ukoncenie vysielania if (!(CR_RD()&PRESENSE))return NO_PRESENSE;//kontrola presense pulzu TX_WR(0x44);//prikaz vykonaj konverziu teploty CR_WR(CR_RD()|TX_SLOT); while(CR_RD()&BUSY); return TRANSACTION_OK;//funkcia prebehla uspesne }
int8_t noinline ow_match_rom(ow_rom_code_t *rom) { /* reset the bus */ if (!reset_onewire(ONEWIRE_BUSMASK)) return -1; /* transmit command byte */ ow_write_byte(ONEWIRE_BUSMASK, OW_ROM_MATCH_ROM); /* transmit rom code */ for (uint8_t i = 0; i < 8; i++) { for (uint8_t j = 0; j < 8; j++) { ow_write(ONEWIRE_BUSMASK, (uint8_t)(rom->bytewise[i] & _BV(j))); } } return 1; }
/** * funkcia precita ROM jedneho zariadenia DS18B20 \n * je urcena pre pracu s jedinym zariadenim na zbernici * @param ROM[8] smernik vracauci ROM * @return ak vrati 0 operacia prebehla uspesne, ak nie nastala chyba */ char read_rom(uchar ROM[8]) { uchar i; inicializacia(); reset_onewire(); TX_WR(0x33);//prikaz posli ROM CR_WR(RST_SLOT|TX_SLOT);//prikaz vysielanie+reset while(CR_RD()&BUSY);//cakanie na ukoncenie vysielania if (!(CR_RD()&PRESENSE))return NO_PRESENSE;//kontrola presense pulzu for (i=0;i<=7;i++){ CR_WR(CR_RD()|RX_SLOT);//primanie dat while(CR_RD()&BUSY); ROM[i]=RX_RD(); if (i==7 && CRC_RD()){ return WRONG_CRC; } } return TRANSACTION_OK; }
/* high-level functions */ int8_t noinline ow_search_rom(uint8_t busmask, uint8_t first) { /* reset discover state machine */ if (first) { ow_global.last_discrepancy = -1; /* reset rom code */ for (uint8_t i = 0; i < 8; i++) ow_global.current_rom.bytewise[i] = 0; } else { /* if last_discrepancy is below zero, discovery is done */ if (ow_global.last_discrepancy < 0) return 0; } int8_t discrepancy = -1; /* reset the bus */ if (!reset_onewire(busmask)) return -1; /* transmit command byte */ ow_write_byte(busmask, OW_ROM_SEARCH_ROM); for (uint8_t i = 0; i <64; i++) { /* read bits */ uint8_t bit1 = ow_read(busmask); uint8_t bits = (uint8_t)((ow_read(busmask) << 1) | bit1); if (bits == 3) { /* no devices, just return */ return 0; } else if (bits == 0) { if (i == ow_global.last_discrepancy) { /* set one */ ow_set_address_bit(&ow_global.current_rom, i, 1); /* transmit one next time */ bit1 = 1; } else if (i > ow_global.last_discrepancy) { /* set zero */ ow_set_address_bit(&ow_global.current_rom, i, 0); discrepancy = (int8_t)i; } else { uint8_t rom_bit = (uint8_t)(ow_global.current_rom.bytewise[i / 8] & _BV(i % 8)); if (rom_bit == 0) discrepancy = (int8_t)i; /* transmit last bit next time */ bit1 = rom_bit; } } else { /* normal case, no discrepancy */ ow_set_address_bit(&ow_global.current_rom, i, bit1); } OW_CONFIG_OUTPUT(busmask); /* select next bit */ ow_write(busmask, bit1); } ow_global.last_discrepancy = discrepancy; /* new device discovered */ return 1; }
//!-------------------------------------------------------------------------- //! Reset the 1-Wire bus and return the presence of any device //! @return TRUE : device present //! FALSE : no device present //! int OWReset() { inicializacia(); reset_onewire(); return TRUE; }