Example #1
0
static void selectdevbyidx(int idx) {
	if(idx < numowdevices) {
		resetbus();
		xferbyte(OW_MATCH_ROM);
		for( int idloop = 0; idloop < 8; idloop++ ) { // Send ROM device ID
			xferbyte(owdeviceids[idx][idloop]);
		}
	}
}
Example #2
0
int OneWire_PerformTemperatureConversion(void) {
	uint8_t scratch[9];

	if(resetbus()) {
		xferbyte(OW_SKIP_ROM); // All devices on the bus are addressed here
		xferbyte(OW_CONVERT_T);
		setpin1();
		BusyWait8(94000<<3); // For 9-bit resolution
		for( int i = 0; i < numowdevices; i++ ) {
			selectdevbyidx(i);
			xferbyte(OW_READ_SCRATCHPAD);
			for(uint32_t iter=0; iter<2; iter++) { // Only read two bytes
				scratch[iter] = xferbyte(0xff);
				//printf("%02x ",scratch[iter]);
			}
			int16_t tmp = scratch[1]<<8 | scratch[0];
			devreadout[i] = tmp;
		}
	} else {
		BusyWait8(94000<<3); // Maintain timing if no sensors are found for the time being
	}
	return numowdevices;
}
static int32_t OneWire_Work(void) {
	static uint8_t mystate = 0;
	uint8_t scratch[9];
	int32_t retval = 0;

	if (mystate == 0) {
		uint32_t save = VIC_DisableIRQ();
		if (resetbus()) {
			xferbyte(OW_SKIP_ROM); // All devices on the bus are addressed here
			xferbyte(OW_CONVERT_T);
			setpin1();
			//retval = TICKS_MS(94); // For 9-bit resolution
			retval = TICKS_MS(100); // TC interface needs max 100ms to be ready
			mystate++;
		}
		VIC_RestoreIRQ( save );
	} else if (mystate == 1) {
		for (int i = 0; i < numowdevices; i++) {
			uint32_t save = VIC_DisableIRQ();
			selectdevbyidx(i);
			xferbyte(OW_READ_SCRATCHPAD);
			for (uint32_t iter = 0; iter < 4; iter++) { // Read four bytes
				scratch[iter] = xferbyte(0xff);
			}
			VIC_RestoreIRQ(save);
			int16_t tmp = scratch[1]<<8 | scratch[0];
			devreadout[i] = tmp;
			tmp = scratch[3]<<8 | scratch[2];
			extrareadout[i] = tmp;
		}
		mystate = 0;
	} else {
		retval = -1;
	}

	return retval;
}
Example #4
0
//--------------------------------------------------------------------------
// Perform the 1-Wire Search Algorithm on the 1-Wire bus using the existing
// search state.
// Return TRUE : device found, ROM number in ROM_NO buffer
// FALSE : device not found, end of search
//
static int OWSearch()
{
	int id_bit_number;
	int last_zero, rom_byte_number, search_result;
	int id_bit, cmp_id_bit;
	uint8_t 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;
	crc8 = 0;
	// if the last call was not the last one
	if (!LastDeviceFlag) {
		// 1-Wire reset
		if (!resetbus()) { // No devices found
			// reset the search
			LastDiscrepancy = 0;
			LastDeviceFlag = false;
			LastFamilyDiscrepancy = 0;
			return false;
		}
		// issue the search command
		xferbyte( OW_SEARCH_ROM );
		// loop to do the search
		do {
			// read a bit and its complement
			id_bit = xferbit( true );
			cmp_id_bit = xferbit( true );
			// 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 < LastDiscrepancy)
						search_direction = ((ROM_NO[rom_byte_number] & rom_byte_mask) > 0);
					else
						// if equal to last pick 1, if not then pick 0
						search_direction = (id_bit_number == LastDiscrepancy);
					// 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)
							LastFamilyDiscrepancy = last_zero;
					}
				}
				// set or clear the bit in the ROM byte rom_byte_number
				// with mask rom_byte_mask
				if (search_direction == 1)
					ROM_NO[rom_byte_number] |= rom_byte_mask;
				else
					ROM_NO[rom_byte_number] &= ~rom_byte_mask;
				// serial number search direction write bit
				xferbit(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(ROM_NO[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) || (crc8 != 0))) {
			// search successful so set LastDiscrepancy,LastDeviceFlag,search_result
			LastDiscrepancy = last_zero;
			// check for last device
			if (LastDiscrepancy == 0)
				LastDeviceFlag = true;
			search_result = true;
		}
	}
	// if no device found then reset counters so next 'search' will be like a first
	if (!search_result || !ROM_NO[0]) {
		LastDiscrepancy = 0;
		LastDeviceFlag = false;
		LastFamilyDiscrepancy = 0;
		search_result = false;
	}
	return search_result;
}