/**
 * 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;
}
Example #2
0
/* 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
}
Example #5
0
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
}
Example #7
0
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;
}
Example #9
0
/* 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;
}