1-wire slave emulator for PIC16 microcontroller – owslave
		
			I have a small 1-wire network running different sensors. The network
			is connected to a linux box. I needed to add a humidity sensor to the
			network. There are plenty of different solutions but I found this
				project that was using PIC microcontroller as a bridge between
			1-wire network and Sensirion SHT11 sensor. I thought it was a great
			idea and also, as I had no experience with µC, a great way to learn
			something new. My idea was also that this 1-wire slave could serve for
			communication with other devices using different protocols.
		
		The project that I found was a closed source one, so I decided I
			should write my own program and make my first µC device. I chose
			PIC16F84A for my design, as it was cheap, easy to get and easy to
			program. As I had 10 MHz crystal I decided that I will try to make it
			work at that frequency, although this chip allows crystals up to 20 MHz. I bought a few needed parts according to PIC datasheet and built
			a very simple device.
		SCHEMATIC
		
		PIC works in its basic environment: X1 is 10 MHz quartz, C1 and C2
			are 27 pF capacitors; MCLR is connected to VDD through R1=10 kΩ
			resistor; additionally PIC is decoupled with C3=100 nF. Connecting
			sensors requires a few additional components: two pullup resistors
			R2=R3=10 kΩ (R2 is optional, required only with SHT2x) and decoupling
			capacitor C4=100 nF. Operating voltage for SHT1x is 2.4–5.5 V, while
			for SHT2x it is 2.1–3.6 V (with 5 V described in datasheet as an
			absolute maximum). I am powering both SHT11 and SHT21 with +5 V and it
			works ok, but it is probably too much for the latter. I plan to lower supply voltage of SHT21 to 3.3 V. I connect sensor to
			pins RB4 and RB5 but it may be changed in source file to any other I/O
			port except RB0/INT which must be reserved for 1-wire data line.
		ASSEMBLED BOARD
		
		I decided I should try to program it in C (although it would
			probably be much more efficient in assembler). I needed to find a free
			tool and after some digging I found Hitech PICC compiler which even
			offered me full code optimization during evaluation period. As I have
			limited access to machines running MS Windows I was using rather weird
			set of tools. I was running PICC compiler on OSX writing code in
			Xcode. I programmed my chip using very cheap programmer JDM 2. It was
			connected to serial port of a linux machine and driven by WinPic
			program under wine.
	
	
		The biggest challenge was to keep up with the master. Each 1-wire
			operation is initiated by master device pulling the bus low and
			timings are very tight. If I am not wrong in my calculations my
			microcontroller running at 10MHz performs 2.5 instructions per
			microsecond. For example while master reads byte from a slave, the
			time between master initiates the operation by pulling bus low and the
			time when master is probing line for 0 or 1 state is 15 µs. We are
			thus limited to a little more then 30 instructions which should be ok, but as there are
			many conditions to check on the way and we deal with a poorly
			optimized C code… Anyway, after lots of debugging it started working and here
			are results of my work.
		Owslave supports following 1-wire commands
		ROM commands:
		
			- Read ROM (0x33)
 
			- Match ROM (0x55)
 
			- Skip ROM (0xCC)
 
			- Search ROM (0xF0)
 
		
		and function commands:
		
			- Convert sensor (0x44)
 
			- Read scratchpad (0xBE)
 
		
	
		Implemented ROM commands should make it compatible with any 1-wire
			software. I was testing it with owfs and digitemp on linux and osx as
			well as with Maxim 1-wire java tools. I use DS9097U compatible
			interface between PC and 1-wire network. Regarding humidity sensors I
			tested it with SHT11 and SHT21, as these are the only ones I have. UPDATE: A user reported that he uses owslave sucessfully with SHT71.
		The algorithm is very simple: 1-wire master on PC detects owslave
			(through search ROM procedure) and sends it "convert" command. This
			makes owslave send analogous command to sensor and read back
			measurements into its scratchpad. After a while 1-wire master sends
			"read scratchpad" command and fetches measurments from the slave. It
			gets raw results from the sensor and all the calculations and crc
			checking must be done in master software. Owslave returns 7 bytes:
		
		
			- Humidity MSB
 
			- Humidity LSB
 
			- Humidity CRC
 
			- Temperature MSB
 
			- Temperature LSB
 
			- Temperature CRC
 
			- Sensor type (1 – SHT1x; 2 – SHT2x)
 
		
		I patched digitemp so that it natively recognizes 1-wire slave
			emulator by its family code (I chose 0xBF), gets results from sensors,
			do all the crc checking and calculations. I also patched owfs to support the device, although it was just for testing, as I don't use this program.
		Currently owslave supports two types of sensors:
		
			- SHT1x, SHT7x through Sensirion protocol
 
			- SHT2x through I2C protocol
 
		
		
			The code for contacting SHT sensors was adopted from samples published
			on Sensirion webpage. It should be easy to adapt owslave to any other
			devices communicating with I2C protocol as all the basic
			functions are already included. Owslave design also facilitates adding
			support for other devices.
		
		While returning readings from attached sensors to 1-wire master
			owslave sends also sensor code so that 1-wire master software knows
			what kind of data to expect. Due to limited program space on PIC16F84A
			(1024 words) there may be only one type of supported sensor compiled
			into hex file. That means that one must take a decision which sensor
			will be be used with given device at the stage of compilation.
			Digitemp output:
		baf@vatna:~$ digitemp -w
DigiTemp v3.6.0 Copyright 1996-2007 by Brian C. Lane
GNU Public License v2.0 - http://www.digitemp.com
Turning off all DS2409 Couplers
......
Devices on the Main LAN
284E02BC00000078 : DS18B20 Temperature Sensor
2819E5BB000000DE : DS18B20 Temperature Sensor
28E56FBC00000021 : DS18B20 Temperature Sensor
28F3F1BB0000005B : DS18B20 Temperature Sensor
BF54594D454B0094 : OWSLAVE
BF42415254454BC6 : OWSLAVE
baf@vatna:~$ digitemp -a
DigiTemp v3.6.0 Copyright 1996-2007 by Brian C. Lane
GNU Public License v2.0 - http://www.digitemp.com
May 19 00:13:05 Sensor 0 C: 22.12 F: 71.83
May 19 00:13:07 Sensor 1 C: 25.50 F: 77.90
May 19 00:13:08 Sensor 2 C: 15.19 F: 59.34
May 19 00:13:09 Sensor 3 C: 21.12 F: 70.03
May 19 00:13:10 Sensor 4 C: 24.30 F: 75.74 H: 39%
May 19 00:13:11 Sensor 5 C: 22.80 F: 73.04 H: 44%
		OWFS output (also gives info on type of connected sensor):
		baf@vatna:~$ owget /
/28.4E02BC000000
/28.19E5BB000000
/28.E56FBC000000
/28.F3F1BB000000
/BF.54594D454B00
/BF.42415254454B
/bus.0
/uncached
/settings
/system
/statistics
/structure
/simultaneous
/alarm
baf@vatna:~$ owget /BF.54594D454B00
/BF.54594D454B00/SHT1x
/BF.54594D454B00/address
/BF.54594D454B00/alias
/BF.54594D454B00/crc8
/BF.54594D454B00/family
/BF.54594D454B00/humidity
/BF.54594D454B00/id
/BF.54594D454B00/locator
/BF.54594D454B00/r_address
/BF.54594D454B00/r_id
/BF.54594D454B00/r_locator
/BF.54594D454B00/sensor_type
/BF.54594D454B00/temperature
/BF.54594D454B00/type
baf@vatna:~$ owget /BF.42415254454B
/BF.42415254454B/SHT2x
/BF.42415254454B/address
/BF.42415254454B/alias
/BF.42415254454B/crc8
/BF.42415254454B/family
/BF.42415254454B/humidity
/BF.42415254454B/id
/BF.42415254454B/locator
/BF.42415254454B/r_address
/BF.42415254454B/r_id
/BF.42415254454B/r_locator
/BF.42415254454B/sensor_type
/BF.42415254454B/temperature
/BF.42415254454B/type
	Compiling under picc compiler:
	mbp:owslave-0.3 baf$ picc --chip=16F84A --outdir=output owslave.c 1wire.c sht1x.c sht2x.c
Licensed for evaluation purposes only.
This licence will expire on Fri, 29 Apr 2011.
HI-TECH C Compiler for PIC10/12/16 MCUs (PRO Mode)  V9.81
Copyright (C) 2010 Microchip Technology Inc.
owslave.c
1wire.c
sht1x.c
sht2x.c
Memory Summary:
    Program space        used   3C3h (   963) of   400h words   ( 94.0%)
    Data space           used    34h (    52) of    44h bytes   ( 76.5%)
    EEPROM space         used     8h (     8) of    40h bytes   ( 12.5%)
    Configuration bits   used     1h (     1) of     1h word    (100.0%)
    ID Location space    used     0h (     0) of     4h bytes   (  0.0%)
	
		Changelog
		
			- version 0.3 sht2x through i2c added
 
			- version 0.2 sleep added for power saving
 
			- version 0.1 first release with support for sht1x
 
		
		License
		
			- GPL for 1-wire/owslave files
 
			- unknown for shtx.x example files from Sensirion webpage
 
		
		Downloads
		
		Disclaimer
		- of course no warranty, and no animals were harmed during debugging
 
		- notice: It may be possible that this project infringes 1-wire
			license as it uses 1-wire protocol and does not use any Maxim devices.
			It should therefore be used only for educational purposes.