Exemplo n.º 1
0
int ow_read_temperature(void)
{
	char get[10];
	char temp_lsb,temp_msb;
	int k;
	char temp_c;
	//char temp_f;
	ow_reset();
	ow_write_byte(0xCC); //Skip ROM
	ow_write_byte(0x44); // Start Conversion
	delay_usec(119); //wait 120us
	ow_reset();
	ow_write_byte(0xCC); // Skip ROM
	ow_write_byte(0xBE); // Read Scratch Pad
	for (k=0; k<9; k++) {
		get[k] = ow_read_byte();
	}
	temp_msb = get[1]; // Sign byte + lsbit
	temp_lsb = get[0]; // Temp data plus lsb
	if (temp_msb <= 0x80){temp_lsb = (temp_lsb/2);} // shift to get whole degree
	temp_msb = temp_msb & 0x80; // mask all but the sign bit
	if (temp_msb >= 0x80) {temp_lsb = (~temp_lsb)+1;} // twos complement
	if (temp_msb >= 0x80) {temp_lsb = (temp_lsb/2);}// shift to get whole degree
	if (temp_msb >= 0x80) {temp_lsb = ((-1)*temp_lsb);} // add sign bit
	temp_c = temp_lsb; // ready for conversion to Fahrenheit
	//temp_f = (((int)temp_c)* 9)/5 + 32;
	return temp_c;
}
Exemplo n.º 2
0
void ds18b20_recall_eeprom()
{
    ow_reset();
    ow_write_byte(0xCC);
    ow_write_byte(0xB8);
    __delay_us(50);
}
Exemplo n.º 3
0
void
ow_command(uint8_t cmd, uint8_t pin)
{
  ow_reset(pin);
  /* To all devices */
  ow_write_byte(OW_SKIP_ROM, pin);
  ow_write_byte(cmd, pin);
}
Exemplo n.º 4
0
void ds18b20_read_scratch(struct ds18b20 *dev)
{
    unsigned char i;
    //unsigned char data[9];

    //ow_init();
    ow_reset();
    //ow_write_byte(0xCC);
    ow_write_byte(0x55);
    for(i=0;i<8;i++){
        ow_write_byte(dev->romcode[i]);
    }
    
    ow_write_byte(0xBE);
    dev->scratchpad[0] = ow_read_byte();
    dev->scratchpad[1] = ow_read_byte();
    dev->scratchpad[2] = ow_read_byte();
    dev->scratchpad[3] = ow_read_byte();
    dev->scratchpad[4] = ow_read_byte();
    dev->scratchpad[5] = ow_read_byte();
    dev->scratchpad[6] = ow_read_byte();
    dev->scratchpad[7] = ow_read_byte();
    dev->scratchpad[8] = ow_read_byte();

    //printf("data 1 = %x\r\n", dev->scratchpad[0]);
    //printf("data 2 = %x\r\n", dev->scratchpad[1]);
    //printf("data 3 = %x\r\n", dev->scratchpad[2]);
    //printf("data 4 = %x\r\n", dev->scratchpad[3]);
    //printf("data 5 = %x\r\n", dev->scratchpad[4]);
    //printf("data 6 = %x\r\n", dev->scratchpad[5]);
    //printf("data 7 = %x\r\n", dev->scratchpad[6]);
    //printf("data 8 = %x\r\n", dev->scratchpad[7]);
    //printf("data 9 = %x\r\n", dev->scratchpad[8]);

    dev->config = dev->scratchpad[4];
    dev->crc    = dev->scratchpad[8];

    //printf("TempDS = %d\r\n", ((dev->scratchpad[1] << 8) | (dev->scratchpad[0] >> 4)));
    dev->tempi = (((0x07 & dev->scratchpad[1]) << 8) | dev->scratchpad[0]) >> 4;
    if(dev->scratchpad[1] & 0xF0)
        dev->tempi = -dev->tempi;

    dev->tempd = dev->scratchpad[0] & 0x0F;
    if( dev->tempd & 0x08 ){
        dev->tempd = 5;
    }else if( dev->tempd & 0x04 ){
        dev->tempd = 25;
    }else if( dev->tempd & 0x02 ){
        dev->tempd = 125;
    }else if( dev->tempd & 0x01 ){
        dev->tempd = 625;
    }

    //printf("TempDS = %d.%d\r\n", dev->tempi, dev->tempd);
}
Exemplo n.º 5
0
void OneWireInit(void)
{
  RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOE, ENABLE);
  ow_reset();

  ow_write_byte(0xcc);
  ow_write_byte(0x4e);
  ow_write_byte(0);
  ow_write_byte(0);
  ow_write_byte(0x60); // 12 bit
  ow_reset();
}
Exemplo n.º 6
0
void ds18b20_start_convert(struct ds18b20 *dev)
{
    unsigned char i;

    ow_reset();
    ow_write_byte(0x55);

    for(i=0;i<8;i++){
        ow_write_byte(dev->romcode[i]);
    }
    ow_write_byte(0x44);
    __delay_ms(750);
}
Exemplo n.º 7
0
int8_t ow_eeprom_read(ow_rom_code_t *rom, void *data)
{
#if ONEWIRE_BUSCOUNT > 1
    uint8_t busmask = 1 << (ONEWIRE_STARTPIN); // FIXME: currently only on 1st bus
#else
    uint8_t busmask = ONEWIRE_BUSMASK;
#endif
    int8_t ret;

    if (rom == NULL)
        ret = ow_skip_rom();
    else {

        /* check for known family code */
        if (!(rom->family == OW_FAMILY_DS2502E48))
            return -2;

        ret = ow_match_rom(rom);

    }

    if (ret < 0)
        return ret;

    /* transmit command byte */
    ow_write_byte(busmask, OW_FUNC_READ_MEMORY);

    /* transmit address (mac address starts at offset 5 */
    ow_write_byte(busmask, 5);
    ow_write_byte(busmask, 0);

    /* read back crc sum of the command */
    uint8_t crc = ow_read_byte(busmask);

    /* check crc */
    uint8_t crc2 = 0;
    crc2 = _crc_ibutton_update(crc2, OW_FUNC_READ_MEMORY);
    crc2 = _crc_ibutton_update(crc2, 5);
    crc2 = _crc_ibutton_update(crc2, 0);

    if (crc != crc2)
        return -2;

    uint8_t *p = (uint8_t *)data+5;

    /* read 6 byte of data */
    for (uint8_t i = 0; i < 6; i++)
        *p-- = ow_read_byte(busmask);

    return 0;
}
Exemplo n.º 8
0
static int8_t ds18x_access(uint8_t *id)
{
  int i;
  if(!ow_reset(0))
    return -1;
  
  if(ow_write_byte(0, ROM_MATCH) < 0)
    return -1;
  for(i=0;i<8;i++)
    if(ow_write_byte(0, id[i]) < 0)
  	  return -1;

  return 0;
}
Exemplo n.º 9
0
void owchip_geteui(uint8_t* eui) {          // >= 6000us
   uint8_t  id[8];
   int      retry;
   int      crc;
   uint8_t* byte;
   uint16_t oldTactl;
   
   retry = 5;
   memset(eui,0,8);
   
   // store current value of TACTL
   oldTactl   = TACTL;
   
   // start timer in continuous mode at 1MHz
   TACTL      = TASSEL_2 | ID_2 | MC_2;
   
   owpin_init();
   while (retry-- > 0) {
      crc = 0;
      
      if(ow_reset()) {
         ow_write_byte(0x33); //read rom
         for(byte=id+7; byte>=id; byte--) {
            crc = crc8_byte( crc, *byte=ow_read_byte() );
         }
         if(crc==0) {
            // CRC valid
            memcpy(eui,id,8);
         }
      }
   }
   
   // restore value of TACTL
   TACTL = oldTactl;
}
Exemplo n.º 10
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;
}
Exemplo n.º 11
0
int8_t ow_temp_power(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
    int8_t ret;

    if (rom == NULL)
        ret = ow_skip_rom();
    else {
        if (!ow_temp_sensor(rom))
            return -2;

        ret = ow_match_rom(rom);
    }

    if (ret < 0)
        return ret;

    /* transmit command byte */
    ow_write_byte(busmask, OW_FUNC_READ_POWER);

    return (int8_t)(ow_read(busmask));
}
Exemplo n.º 12
0
void ds18b20_read_rom(struct ds18b20 *dev)
{
    //uint8_t romid[8];

    //ow_init();
    ow_reset();
    ow_write_byte(0x33);
    dev->romcode[0] = ow_read_byte();
    dev->romcode[1] = ow_read_byte();
    dev->romcode[2] = ow_read_byte();
    dev->romcode[3] = ow_read_byte();
    dev->romcode[4] = ow_read_byte();
    dev->romcode[5] = ow_read_byte();
    dev->romcode[6] = ow_read_byte();
    dev->romcode[7] = ow_read_byte();


    //printf("id 1 = %x\r\n", dev->romcode[0]);
    //printf("id 2 = %x\r\n", dev->romcode[1]);
    //printf("id 3 = %x\r\n", dev->romcode[2]);
    //printf("id 4 = %x\r\n", dev->romcode[3]);
    //printf("id 5 = %x\r\n", dev->romcode[4]);
    //printf("id 6 = %x\r\n", dev->romcode[5]);
    //printf("id 7 = %x\r\n", dev->romcode[6]);
    //printf("id 8 = %x\r\n", dev->romcode[7]);

    //*(id)     = romid[1] | romid[0];
    //*(id + 1) = romid[3] | romid[2];
    //dev->address[0] = ((((unsigned long)romid[3] << 8) | (unsigned long)romid[2]) << 16) | (((unsigned long)romid[1] << 8) | romid[0]);
    //dev->address[1] = ((((unsigned long)romid[7] << 8) | (unsigned long)romid[6]) << 16) | (((unsigned long)romid[5] << 8) | romid[4]);

    //printf("Address 1 = %ld\r\n", dev->address[0]);
    //printf("Address 2 = %ld\r\n", dev->address[1]);
}
Exemplo n.º 13
0
static void ds18b20_start(void)
{
	ow_reset();

	ow_skip_rom();

	ow_write_byte(DS18B20_CMD_CONVERT_T);
}
Exemplo n.º 14
0
int ow_write_block(int port, uint8_t *block, int len)
{
  uint32_t i;

  for(i=0;i<len;i++)
    *block++ = ow_write_byte(port, *block);

  return 0;
}
Exemplo n.º 15
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;
}
Exemplo n.º 16
0
int8_t ds18x_read_temp(uint8_t *id, int *temp_r)
{
  int i, temp;
  uint8_t data[9];
  
  if(ds18x_access(id) < 0)
    return -1;
mprintf("found.");
  ow_write_byte(0, READ_SCRATCHPAD);
  
  for(i=0;i<9;i++) data[i] = ow_read_byte(0);
  
  temp = ((int)data[1] << 8) | ((int)data[0]);
  if(temp & 0x1000)
    temp = -0x10000 + temp;
  
  ds18x_access(id);
  ow_write_byte(0, CONVERT_TEMP);
  
  if(temp_r) *temp_r = temp;
  return 0;
}
Exemplo n.º 17
0
EOWError ow_write_byte_power(uint8_t config_state, uint8_t write_byte)
{
	uint8_t buffer[2], ret;
	
	buffer[0] = ds2482_write_config_cmd;
	buffer[1] = (config_state | 0x04) & 0xBF;
	
	i2c_write(ds2482_address, buffer, 2);
	ret = i2c_wait();
	if ( ret != TW_NO_INFO) {
		ERROR(ret);
		return eOWNoResponse;
	}

	return ow_write_byte(write_byte);
}
Exemplo n.º 18
0
int8_t ds18x_read_serial(uint8_t *id)
{
  uint8_t i;
  
  if(!ow_reset(0))
    return -1;
  
  if(ow_write_byte(0, ROM_READ) < 0)
    return -1;
  for(i=0;i<8;i++)
  {
    *id = ow_read_byte(0);
    id++;
  }
  
  return 0;
}
Exemplo n.º 19
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;
}
Exemplo n.º 20
0
int8_t ow_temp_read_scratchpad(ow_rom_code_t *rom, ow_temp_scratchpad_t *scratchpad)
{
    uint8_t busmask;
    int8_t ret;

    if (rom == NULL)
        ret = ow_skip_rom();
    else {

        /* check for known family code */
        if (!ow_temp_sensor(rom))
            return -3;

        ret = ow_match_rom(rom);
    }

    if (ret < 0)
        return ret;

    /* transmit command byte */
    ow_write_byte(ONEWIRE_BUSMASK, OW_FUNC_READ_SP);

#if ONEWIRE_BUSCOUNT > 1
    for (uint8_t bus = 0; bus < ONEWIRE_BUSCOUNT; bus++) {
        /* read 9 bytes from each onewire bus */
        busmask = (uint8_t)(1 << (bus + ONEWIRE_STARTPIN));
#else
        busmask = ONEWIRE_BUSMASK;
#endif
        for (uint8_t i = 0; i < 9; i++) {
            scratchpad->bytewise[i] = ow_read_byte(busmask);
        }

        /* check CRC (last byte) */
        if (scratchpad->crc == crc_checksum(&scratchpad->bytewise, 8)) {
            /* return if we got a valid response from one device */
            return 1;
        }
#if ONEWIRE_BUSCOUNT > 1
    }
#endif

    return -2;
}
Exemplo n.º 21
0
void ds18b20_write_scratch(struct ds18b20 *dev)
{
    unsigned char i;
    
    ow_reset();
    //ow_write_byte(0xCC);
    ow_write_byte(0x55);
    for(i=0;i<8;i++){
        ow_write_byte(dev->romcode[i]);
    }
    ow_write_byte(0x4E);
    ow_write_byte(dev->scratchpad[2]);
    ow_write_byte(dev->scratchpad[3]);
    ow_write_byte(dev->config);
}
Exemplo n.º 22
0
void eui64_get(uint8_t* addressToWrite) {    // >= 6000us
   uint8_t  id[8];
   int      retry;
   int      crc;
   uint8_t* byte;
   uint16_t oldTactl;
   
   return;//poipoi
   
   retry = 5;
   memset(addressToWrite,0,8);
   
   // store current value of TACTL
   oldTactl   = TACTL;
   
   // start timer in continuous mode at 1MHz
   TACTL      = TASSEL_2 | ID_2 | MC_2;
   
   owpin_init();
   while (retry-- > 0) {
      crc = 0;
      
      if(ow_reset()) {
         ow_write_byte(0x33); //read rom
         for(byte=id+7; byte>=id; byte--) {
            crc = crc8_byte( crc, *byte=ow_read_byte() );
         }
         if(crc==0) {
            // CRC valid
            *(addressToWrite+0) = 0x14;
            *(addressToWrite+1) = 0x15;
            *(addressToWrite+2) = 0x92;
            memcpy(addressToWrite+3,id+1,5);
         }
      }
   }
   
   // restore value of TACTL
   TACTL = oldTactl;
}
Exemplo n.º 23
0
uint8_t ds18b20_ping(void)
{
	uint8_t i;
	uint8_t n = 0;
	int16_t v;

	if (!ow_read())
	    return 0;

	for (i = 0; i < ow_n_addrs; i++) {
		if (ow_addr(i)[0] == DS18B20_FAMILY_CODE) {
			ow_reset();
			ow_match_rom(i);
			ow_write_byte(DS18B20_CMD_READ_SCRATCHPAD);
			v = ow_read_byte();
			v |= ow_read_byte() << 8;
			if (ds18b20_temps[n]) {
				ds18b20_temps[n] -= ds18b20_temps[n] >> 4;
				ds18b20_temps[n] += v;
			} else {
				ds18b20_temps[n] = v << 4;
			}
		}
Exemplo n.º 24
0
int8_t ow_temp_start_convert(ow_rom_code_t *rom, uint8_t wait)
{
    int8_t ret;

    if (rom == NULL)
        ret = ow_skip_rom();
    else {

        /* check for known family code */
        if (!ow_temp_sensor(rom))
            return -2;

        ret = ow_match_rom(rom);

    }

    if (ret < 0)
        return ret;

    /* transmit command byte */
    ow_write_byte(ONEWIRE_BUSMASK, OW_FUNC_CONVERT);

    OW_CONFIG_OUTPUT(ONEWIRE_BUSMASK);
    OW_HIGH(ONEWIRE_BUSMASK);

    if (!wait)
        return 0;

    _delay_ms(800); /* The specification say, that we have to wait at
                       least 500ms in parasite mode to wait for the
                       end of the conversion.  800ms works more reliably */

    while(!ow_read(ONEWIRE_BUSMASK));

    return 1;
}
Exemplo n.º 25
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;
}
Exemplo n.º 26
0
static PT_THREAD(read_temp(struct pt *pt, const ow_addr_t *addr)) {
	int err;
	uint8_t scratch[9];
	uint8_t crc = 0;

	PT_BEGIN(pt);

	// Reset the bus
	err = ow_reset();
	if (err != 1) {
		shell_output_P(&owtest_command, PSTR("Reset failed.\n"));
		PT_EXIT(pt);
	}

	// Match ROM
	err = ow_write_byte(0x55);
	if (err) {
		shell_output_P(&owtest_command, PSTR("Match ROM failed\n"));
		PT_EXIT(pt);
	}
	for (int i = 0; i < sizeof(*addr); i++) {
		err = ow_write_byte(addr->u[i]);
		if (err) {
			shell_output_P(&owtest_command, PSTR("Match ROM failed\n"));
			PT_EXIT(pt);
		}
	}

	// Start temperature conversion
	err = ow_write_byte(0x44);
	if (err) {
		shell_output_P(&owtest_command, PSTR("Convert T failed\n"));
		PT_EXIT(pt);
	}

	// Conversion timeout
	timer_set(&timeout, DS18B20_CONV_TIMEOUT);
	while (1) {
		_delay_ms(10); // for good measure

		// Read a bit from the bus
		int ret = ow_read_bit();

		// Check for stop conditions
		if (ret == 1) {
			break;
		}
		else if (ret == -1) {
			shell_output_P(&owtest_command, PSTR("Read status failed.\n"));
			PT_EXIT(pt);
		}
		else if (timer_expired(&timeout)) {
			shell_output_P(&owtest_command, PSTR("Conversion has taken too long. Giving up.\n"));
			PT_EXIT(pt);
		}

		// Poll the process and yield the thread
		process_poll(&shell_owtest_process);
		PT_YIELD(pt);
	}

	// Reset and MATCH ROM again
	err = ow_reset();
	if (err != 1) {
		shell_output_P(&owtest_command, PSTR("Reset failed.\n"));
		PT_EXIT(pt);
	}

	// Match ROM
	err = ow_write_byte(0x55);
	if (err) {
		shell_output_P(&owtest_command, PSTR("Match ROM failed\n"));
		PT_EXIT(pt);
	}
	for (int i = 0; i < sizeof(*addr); i++) {
		err = ow_write_byte(addr->u[i]);
		if (err) {
			shell_output_P(&owtest_command, PSTR("Match ROM failed\n"));
			PT_EXIT(pt);
		}
	}

	// Read the scratch pad
	err = ow_write_byte(0xBE);
	if (err) {
		shell_output_P(&owtest_command, PSTR("Read scratch pad failed\n"));
		PT_EXIT(pt);
	}

	for (int i = 0; i < sizeof(scratch); i++) {
		err = ow_read_byte();
		if (err < 0) {
			shell_output_P(&owtest_command, PSTR("Read byte failed\n"));
			PT_EXIT(pt);
		}

		scratch[i] = err;
		crc = _crc_ibutton_update(crc, scratch[i]);
	}

	// Make sure the CRC is valid
	if (crc) {
		shell_output_P(&owtest_command, PSTR("CRC check failed!\n"));
		PT_EXIT(pt);
	}

	// Convert temperature to floating point
	int16_t rawtemp = scratch[0] | (scratch[1] << 8);
	float temp = (float)rawtemp * 0.0625;

	shell_output_P(&owtest_command, 
		PSTR("Scratchpad: %02x%02x %02x%02x %02x %02x%02x%02x %02x\n"),
		scratch[0], scratch[1], // temperature
		scratch[2], scratch[3], // TH,TL alarm thresholds
		scratch[4], // config
		scratch[5], scratch[6], scratch[7], // reserved
		scratch[8]); // CRC

	shell_output_P(&owtest_command, PSTR("Reading: %0.2fC\n"), temp);

	PT_END(pt);
}
Exemplo n.º 27
0
 int ow_search()
 {
    int id_bit_number;
    int last_zero, rom_byte_number, search_result;
    int id_bit, cmp_id_bit;
    unsigned char rom_byte_mask, search_direction;

    // initialize for search
    id_bit_number = 1;
    last_zero = 0;
    rom_byte_number = 0;
    rom_byte_mask = 1;
    search_result = 0;
    search_crc8 = 0;

    // if the last call was not the last one
    if (!search_last_device_flag)
    {
       // 1-Wire reset
       if (!ow_reset())
       {
          // reset the search
          search_last_discrepancy = 0;
          search_last_device_flag = FALSE;
          search_last_family_discrepancy = 0;
          return FALSE;
       }

       // issue the search command
       ow_write_byte(0xF0);

       // loop to do the search
       do
       {
          // read a bit and its complement
          id_bit = ow_read_bit();
          cmp_id_bit = ow_read_bit();

          // check for no devices on 1-wire
          if ((id_bit == 1) && (cmp_id_bit == 1))
             break;
          else
          {
             // all devices coupled have 0 or 1
             if (id_bit != cmp_id_bit)
                search_direction = id_bit;  // bit write value for search
             else
             {
                // if this discrepancy if before the Last Discrepancy
                // on a previous next then pick the same as last time
                if (id_bit_number < search_last_discrepancy)
                   search_direction = ((search_romcode[rom_byte_number] & rom_byte_mask) > 0);
                else
                   // if equal to last pick 1, if not then pick 0
                   search_direction = (id_bit_number == search_last_discrepancy);

                // if 0 was picked then record its position in LastZero
                if (search_direction == 0)
                {
                   last_zero = id_bit_number;

                   // check for Last discrepancy in family
                   if (last_zero < 9)
                      search_last_family_discrepancy = last_zero;
                }
             }

             // set or clear the bit in the ROM byte rom_byte_number
             // with mask rom_byte_mask
             if (search_direction == 1)
               search_romcode[rom_byte_number] |= rom_byte_mask;
             else
               search_romcode[rom_byte_number] &= ~rom_byte_mask;

             // serial number search direction write bit
             ow_write_bit(search_direction);

             // increment the byte counter id_bit_number
             // and shift the mask rom_byte_mask
             id_bit_number++;
             rom_byte_mask <<= 1;

             // if the mask is 0 then go to new SerialNum byte rom_byte_number and reset mask
             if (rom_byte_mask == 0)
             {
                 docrc8(search_romcode[rom_byte_number]);  // accumulate the CRC
                 rom_byte_number++;
                 rom_byte_mask = 1;
             }
          }
       }
       while(rom_byte_number < 8);  // loop until through all ROM bytes 0-7

       // if the search was successful then
       if (!((id_bit_number < 65) || (search_crc8 != 0)))
       {
          // search successful so set LastDiscrepancy,search_last_device_flag,search_result
          search_last_discrepancy = last_zero;

          // check for last device
          if (search_last_discrepancy == 0)
             search_last_device_flag = TRUE;

          search_result = TRUE;
       }
    }

    // if no device found then reset counters so next 'search' will be like a first
    if (!search_result || !search_romcode[0])
    {
       search_last_discrepancy = 0;
       search_last_device_flag = FALSE;
       search_last_family_discrepancy = 0;
       search_result = FALSE;
    }

    return search_result;
 }
Exemplo n.º 28
0
void ow_skip_rom(void)
{
	ow_write_byte(0xcc);
}
Exemplo n.º 29
0
int8_t ow_search(uint8_t reset_search, uint8_t* last_device, uint8_t* device_address)
{
	uint8_t result = eOWSuccess;
	uint8_t bit_number = 1;
	uint8_t last_zero  = 0;
	uint8_t serial_byte_number = 0;
	uint8_t serial_byte_mask = 1;
	uint8_t first_bit, second_bit, direction;
	uint8_t i = 0;

	if (reset_search) {
		last_device      = 0;
		last_discrepancy = 0;
	}

	if (!(*last_device)) {
		result = ow_reset();
		if ( result != eOWSuccess) {
			last_device = 0;
			last_discrepancy = 0;
			return result;
		}

		ow_write_byte(0xF0);	// Send "search ROM command"
	
		do {
			if (bit_number < last_discrepancy) {
				direction = ((search_serial_nbr[serial_byte_number] & serial_byte_mask) != 0);
			} else {
				direction = (bit_number == last_discrepancy);
			}
	
			result = ow_triplet( &direction, &first_bit, &second_bit);
			if ( result != eOWSuccess) {
				return result;
			}
	
			if (first_bit==0 && second_bit==0 && direction==0) {
				last_zero = bit_number;
			}
	
			if (first_bit==1 && second_bit==1) {
				break;
			}
	
			if (direction == 1) {
				search_serial_nbr[serial_byte_number] |=  serial_byte_mask;
			} else {
				search_serial_nbr[serial_byte_number] &= ~serial_byte_mask;
			}
	
			bit_number++;
			serial_byte_mask <<= 1;
			
			if (serial_byte_mask == 0) {
				serial_byte_number++;
				serial_byte_mask = 1;
			}
		} while (serial_byte_number < 8);
	
		result = eOWFailure;
		if (bit_number == 65) {
			last_discrepancy = last_zero;
			*last_device = last_discrepancy==0 ? TRUE : FALSE;
	
			for (i=0; i<8; i++) {
				device_address[i] = search_serial_nbr[i];
			}

			return eOWSuccess;
		}

		if (/*result==eOWFailure ||*/ !search_serial_nbr[0]) {
			last_discrepancy = 0;
			*last_device = 0;
		}
	}
	return result;
}
Exemplo n.º 30
0
void ds18b20_copy_scratch()
{
    ow_reset();
    ow_write_byte(0xCC);
    ow_write_byte(0x48);
}