comparison 1wire.c @ 32:b0cb873c0206

Isolate the bus frobbing parts and the delays into a separate header. This means the user only has to edit a single file to suit their situation and allows the code to work with active drive systems as well as passive pullups (ie 1 vs 2 IO pins)
author darius
date Sun, 23 Apr 2006 22:57:16 +0930
parents 02b67e09ca12
children 0aa6bf4b98ae
comparison
equal deleted inserted replaced
31:4e417d84365e 32:b0cb873c0206
28 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 28 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
29 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 29 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
30 * SUCH DAMAGE. 30 * SUCH DAMAGE.
31 */ 31 */
32 32
33 /*
34 * No user servicable parts inside
35 *
36 * Modify 1wire-config.h
37 */
38
33 #include <stdio.h> 39 #include <stdio.h>
34 #include <avr/io.h> 40 #include <avr/io.h>
35 #include <avr/pgmspace.h> 41 #include <avr/pgmspace.h>
36 #include <util/delay.h> 42 #include <util/delay.h>
37 #include "1wire.h" 43 #include "1wire.h"
38 #include "1wire-delay.h" 44 #include "1wire-config.h"
39 45
40 #if OW_DEBUG 46 #if OW_DEBUG
41 void uart_putsP(const char *addr); 47 void uart_putsP(const char *addr);
42 void uart_puts(const char *addr); 48 void uart_puts(const char *addr);
43 void uart_getc(); 49 void uart_getc();
46 52
47 static uint8_t OW_LastDevice = 0; 53 static uint8_t OW_LastDevice = 0;
48 static uint8_t OW_LastDiscrepancy = 0; 54 static uint8_t OW_LastDiscrepancy = 0;
49 static uint8_t OW_LastFamilyDiscrepancy = 0; 55 static uint8_t OW_LastFamilyDiscrepancy = 0;
50 56
51 static void 57 /*-----------------------------------------------------------------------------
52 OWdelay(void) { 58 * Configure the IO port as we need
53 DELAY_I; 59 */
60 void
61 OWInit(void) {
62 OWBUSINIT();
63 OWSETBUSHIGH();
54 } 64 }
55 65
56 /*----------------------------------------------------------------------------- 66 /*-----------------------------------------------------------------------------
57 * Generate a 1-Wire reset, return 0 if presence pulse was found, 1 if it 67 * Generate a 1-Wire reset, return 0 if presence pulse was found, 1 if it
58 * wasn't, or 2 if the line appears to be being held low. 68 * wasn't, or 2 if the line appears to be being held low.
59 * 69 *
60 * (NOTE: Does not handle alarm presence from DS2404/DS1994) 70 * (NOTE: Does not handle alarm presence from DS2404/DS1994)
61 */ 71 */
62 uint8_t 72 uint8_t
63 OWTouchReset(void) { 73 OWTouchReset(void) {
64 DELAY_G; 74 OWDELAY_G;
65 75
66 if (!(OWIREINPORT & _BV(OWIREINPIN))) 76 /* Check the bus isn't being held low (ie it's broken) Do it after
77 * the delay so we guarantee we don't see a slave from a previous
78 * comms attempt
79 */
80 if(OWREADBUS() == 0)
67 return 2; 81 return 2;
68 82
69 OWIREOUTPORT &= ~(_BV(OWIREOUTPIN)); 83 OWSETBUSLOW();
70 OWIREDDR |= _BV(OWIREOUTPIN); 84 OWDELAY_H;
71 DELAY_H; 85 OWSETBUSHIGH();
72 OWIREDDR &= ~(_BV(OWIREOUTPIN)); 86 OWDELAY_I;
73 DELAY_I; 87
74 88 return(OWREADBUS());
75 return(OWIREINPORT & _BV(OWIREINPIN) ? 1 : 0);
76 } 89 }
77 90
78 /*----------------------------------------------------------------------------- 91 /*-----------------------------------------------------------------------------
79 * Send a 1-wire write bit. 92 * Send a 1-wire write bit.
80 */ 93 */
81 void 94 void
82 OWWriteBit(uint8_t bit) { 95 OWWriteBit(uint8_t bit) {
83 OWdelay(); 96 OWDELAY_I;
97
84 if (bit) { 98 if (bit) {
85 OWIREOUTPORT &= ~(_BV(OWIREOUTPIN)); 99 OWSETBUSLOW();
86 OWIREDDR |= _BV(OWIREOUTPIN); 100 OWDELAY_A;
87 DELAY_A; 101 OWSETBUSHIGH();
88 OWIREDDR &= ~(_BV(OWIREOUTPIN)); 102 OWDELAY_B;
89 DELAY_B;
90 } else { 103 } else {
91 OWIREOUTPORT &= ~(_BV(OWIREOUTPIN)); 104 OWSETBUSLOW();
92 OWIREDDR |= _BV(OWIREOUTPIN); 105 OWDELAY_C;
93 DELAY_C; 106 OWSETBUSHIGH();
94 OWIREDDR &= ~(_BV(OWIREOUTPIN)); 107 OWDELAY_D;
95 DELAY_D;
96 } 108 }
97 } 109 }
98 110
99 /*----------------------------------------------------------------------------- 111 /*-----------------------------------------------------------------------------
100 * Read a bit from the 1-wire bus and return it. 112 * Read a bit from the 1-wire bus and return it.
101 */ 113 */
102 uint8_t 114 uint8_t
103 OWReadBit(void) { 115 OWReadBit(void) {
104 OWdelay(); 116 OWDELAY_I;
105 117
106 OWIREOUTPORT &= ~(_BV(OWIREOUTPIN)); 118 OWSETBUSLOW();
107 OWIREDDR |= _BV(OWIREOUTPIN); 119 OWDELAY_A;
108 DELAY_A; 120 OWSETBUSHIGH();
109 OWIREDDR &= ~(_BV(OWIREOUTPIN)); 121 OWDELAY_E;
110 DELAY_E; 122 return(OWREADBUS());
111 return(OWIREINPORT & _BV(OWIREINPIN) ? 1 : 0);
112 } 123 }
113 124
114 /*----------------------------------------------------------------------------- 125 /*-----------------------------------------------------------------------------
115 * Write a byte to the 1-wire bus 126 * Write a byte to the 1-wire bus
116 */ 127 */
190 else { 201 else {
191 OWWriteByte(OW_MATCH_ROM_CMD); 202 OWWriteByte(OW_MATCH_ROM_CMD);
192 for (i = 0; i < 8; i++) 203 for (i = 0; i < 8; i++)
193 OWWriteByte(ROM[i]); 204 OWWriteByte(ROM[i]);
194 } 205 }
195
196 OWWriteByte(cmd); 206 OWWriteByte(cmd);
197 } 207 }
198 208
199 /*----------------------------------------------------------------------------- 209 /*-----------------------------------------------------------------------------
200 * Search algorithm from App note 187 (and 162) 210 * Search algorithm from App note 187 (and 162)
275 OWWriteByte(OW_SEARCH_ALRM_CMD); /* issue the alarming search command */ 285 OWWriteByte(OW_SEARCH_ALRM_CMD); /* issue the alarming search command */
276 else 286 else
277 OWWriteByte(OW_SEARCH_ROM_CMD); /* issue the search command */ 287 OWWriteByte(OW_SEARCH_ROM_CMD); /* issue the search command */
278 288
279 /* pause before beginning the search */ 289 /* pause before beginning the search */
280 OWdelay(); 290 OWDELAY_I;
281 OWdelay(); 291 OWDELAY_I;
282 OWdelay(); 292 OWDELAY_I;
283 293
284 /* loop to do the search */ 294 /* loop to do the search */
285 do { 295 do {
286 /* read a bit and its compliment */ 296 /* read a bit and its compliment */
287 bit_test = OWReadBit() << 1; 297 bit_test = OWReadBit() << 1;
288 bit_test |= OWReadBit(); 298 bit_test |= OWReadBit();