DS18B20 test program
original:
https://developer.mbed.org/users/wkinkeldei/code/TempMeasure/file/9e88b2508768/one_wire.cpp
https://developer.mbed.org/users/wkinkeldei/code/TempMeasure/
one_wire.cpp@1:c03fe1e5f435, 2015-08-31 (annotated)
- Committer:
- va009039
- Date:
- Mon Aug 31 09:53:06 2015 +0900
- Revision:
- 1:c03fe1e5f435
- Parent:
- 0:c85bb83259cc
add lpc812
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
va009039 | 0:c85bb83259cc | 1 | #include "one_wire.h" |
va009039 | 0:c85bb83259cc | 2 | |
va009039 | 0:c85bb83259cc | 3 | /* "borrowed" from snatch59: OneWireCRC and simplified for my needs */ |
va009039 | 0:c85bb83259cc | 4 | |
va009039 | 0:c85bb83259cc | 5 | const int timing[] = {6, 64, 60, 10, 9, 55, 0, 480, 70, 410}; |
va009039 |
1:c03fe1e5f435 | 6 | #if defined(TARGET_LPC812) |
va009039 |
1:c03fe1e5f435 | 7 | static int timing_raw[sizeof(timing)/sizeof(int)]; |
va009039 |
1:c03fe1e5f435 | 8 | |
va009039 |
1:c03fe1e5f435 | 9 | static void wait_raw_setup_lpc800() { |
va009039 |
1:c03fe1e5f435 | 10 | uint32_t us_clk = SystemCoreClock / 1000000; |
va009039 |
1:c03fe1e5f435 | 11 | for(int i = 0; i < sizeof(timing)/sizeof(int); i++) { |
va009039 |
1:c03fe1e5f435 | 12 | timing_raw[i] = timing[i] * us_clk; |
va009039 |
1:c03fe1e5f435 | 13 | } |
va009039 |
1:c03fe1e5f435 | 14 | LPC_SYSCON->SYSAHBCLKCTRL |= (1<<10); // enable MRT |
va009039 |
1:c03fe1e5f435 | 15 | LPC_SYSCON->PRESETCTRL |= (1<<7); // reset MRT |
va009039 |
1:c03fe1e5f435 | 16 | LPC_MRT->CTRL3 |= (1<<1); // one-shot |
va009039 |
1:c03fe1e5f435 | 17 | } |
va009039 |
1:c03fe1e5f435 | 18 | |
va009039 |
1:c03fe1e5f435 | 19 | static void wait_raw_lpc800(uint32_t timeout_raw) { |
va009039 |
1:c03fe1e5f435 | 20 | if (timeout_raw != 0) { |
va009039 |
1:c03fe1e5f435 | 21 | LPC_MRT->INTVAL3 = timeout_raw | (1UL<<31); // and LOAD |
va009039 |
1:c03fe1e5f435 | 22 | LPC_MRT->STAT3 |= 0x01; |
va009039 |
1:c03fe1e5f435 | 23 | while(!(LPC_MRT->STAT3 & 1)) { |
va009039 |
1:c03fe1e5f435 | 24 | ; |
va009039 |
1:c03fe1e5f435 | 25 | } |
va009039 |
1:c03fe1e5f435 | 26 | } |
va009039 |
1:c03fe1e5f435 | 27 | } |
va009039 |
1:c03fe1e5f435 | 28 | #define wait_us wait_raw_lpc800 |
va009039 |
1:c03fe1e5f435 | 29 | #define timing timing_raw |
va009039 |
1:c03fe1e5f435 | 30 | #else |
va009039 |
1:c03fe1e5f435 | 31 | void wait_raw_setup(){} |
va009039 |
1:c03fe1e5f435 | 32 | #endif |
va009039 | 0:c85bb83259cc | 33 | |
va009039 | 0:c85bb83259cc | 34 | OneWire::OneWire(PinName pin) : port(pin) { |
va009039 |
1:c03fe1e5f435 | 35 | wait_raw_setup_lpc800(); |
va009039 | 0:c85bb83259cc | 36 | } |
va009039 | 0:c85bb83259cc | 37 | |
va009039 | 0:c85bb83259cc | 38 | int OneWire::reset() { |
va009039 | 0:c85bb83259cc | 39 | int result = 0; // sample presence pulse result |
va009039 | 0:c85bb83259cc | 40 | |
va009039 | 0:c85bb83259cc | 41 | wait_us(timing[6]); |
va009039 | 0:c85bb83259cc | 42 | port.output(); |
va009039 | 0:c85bb83259cc | 43 | port = 0; |
va009039 | 0:c85bb83259cc | 44 | wait_us(timing[7]); |
va009039 | 0:c85bb83259cc | 45 | port.input(); |
va009039 | 0:c85bb83259cc | 46 | wait_us(timing[8]); |
va009039 | 0:c85bb83259cc | 47 | result = !(port & 0x01); |
va009039 | 0:c85bb83259cc | 48 | wait_us(timing[9]); |
va009039 | 0:c85bb83259cc | 49 | |
va009039 | 0:c85bb83259cc | 50 | return result; |
va009039 | 0:c85bb83259cc | 51 | } |
va009039 | 0:c85bb83259cc | 52 | |
va009039 | 0:c85bb83259cc | 53 | void OneWire::write_bit(int bit) { |
va009039 | 0:c85bb83259cc | 54 | bit = bit & 0x01; |
va009039 | 0:c85bb83259cc | 55 | |
va009039 | 0:c85bb83259cc | 56 | if (bit) { |
va009039 | 0:c85bb83259cc | 57 | // Write '1' bit |
va009039 | 0:c85bb83259cc | 58 | port.output(); |
va009039 | 0:c85bb83259cc | 59 | port = 0; |
va009039 | 0:c85bb83259cc | 60 | wait_us(timing[0]); |
va009039 | 0:c85bb83259cc | 61 | port.input(); |
va009039 | 0:c85bb83259cc | 62 | wait_us(timing[1]); |
va009039 | 0:c85bb83259cc | 63 | } else { |
va009039 | 0:c85bb83259cc | 64 | // Write '0' bit |
va009039 | 0:c85bb83259cc | 65 | port.output(); |
va009039 | 0:c85bb83259cc | 66 | port = 0; |
va009039 | 0:c85bb83259cc | 67 | wait_us(timing[2]); |
va009039 | 0:c85bb83259cc | 68 | port.input(); |
va009039 | 0:c85bb83259cc | 69 | wait_us(timing[3]); |
va009039 | 0:c85bb83259cc | 70 | } |
va009039 | 0:c85bb83259cc | 71 | } |
va009039 | 0:c85bb83259cc | 72 | |
va009039 | 0:c85bb83259cc | 73 | int OneWire::read_bit() { |
va009039 | 0:c85bb83259cc | 74 | int result; |
va009039 | 0:c85bb83259cc | 75 | |
va009039 | 0:c85bb83259cc | 76 | port.output(); |
va009039 | 0:c85bb83259cc | 77 | port = 0; |
va009039 | 0:c85bb83259cc | 78 | wait_us(timing[0]); |
va009039 | 0:c85bb83259cc | 79 | port.input(); |
va009039 | 0:c85bb83259cc | 80 | wait_us(timing[4]); |
va009039 | 0:c85bb83259cc | 81 | result = port & 0x01; |
va009039 | 0:c85bb83259cc | 82 | wait_us(timing[5]); |
va009039 | 0:c85bb83259cc | 83 | |
va009039 | 0:c85bb83259cc | 84 | return result; |
va009039 | 0:c85bb83259cc | 85 | } |
va009039 | 0:c85bb83259cc | 86 | |
va009039 | 0:c85bb83259cc | 87 | void OneWire::write_byte(int data) { |
va009039 | 0:c85bb83259cc | 88 | // Loop to write each bit in the byte, LS-bit first |
va009039 | 0:c85bb83259cc | 89 | for (int loop = 0; loop < 8; loop++) { |
va009039 | 0:c85bb83259cc | 90 | write_bit(data & 0x01); |
va009039 | 0:c85bb83259cc | 91 | |
va009039 | 0:c85bb83259cc | 92 | // shift the data byte for the next bit |
va009039 | 0:c85bb83259cc | 93 | data >>= 1; |
va009039 | 0:c85bb83259cc | 94 | } |
va009039 | 0:c85bb83259cc | 95 | } |
va009039 | 0:c85bb83259cc | 96 | |
va009039 | 0:c85bb83259cc | 97 | int OneWire::read_byte() { |
va009039 | 0:c85bb83259cc | 98 | int result = 0; |
va009039 | 0:c85bb83259cc | 99 | |
va009039 | 0:c85bb83259cc | 100 | for (int loop = 0; loop < 8; loop++) { |
va009039 | 0:c85bb83259cc | 101 | // shift the result to get it ready for the next bit |
va009039 | 0:c85bb83259cc | 102 | result >>= 1; |
va009039 | 0:c85bb83259cc | 103 | |
va009039 | 0:c85bb83259cc | 104 | // if result is one, then set MS bit |
va009039 | 0:c85bb83259cc | 105 | if (read_bit()) result |= 0x80; |
va009039 | 0:c85bb83259cc | 106 | } |
va009039 | 0:c85bb83259cc | 107 | |
va009039 | 0:c85bb83259cc | 108 | return result; |
va009039 | 0:c85bb83259cc | 109 | } |
va009039 | 0:c85bb83259cc | 110 | |
va009039 | 0:c85bb83259cc | 111 | void OneWire::block(char* data, int data_len) { |
va009039 | 0:c85bb83259cc | 112 | for (int loop = 0; loop < data_len; loop++) { |
va009039 | 0:c85bb83259cc | 113 | data[loop] = read_byte(); // original: touchByte(data[loop]); |
va009039 | 0:c85bb83259cc | 114 | } |
va009039 | 0:c85bb83259cc | 115 | } |
va009039 | 0:c85bb83259cc | 116 | |
va009039 | 0:c85bb83259cc | 117 | void OneWire::prepare_read() { |
va009039 | 0:c85bb83259cc | 118 | reset(); |
va009039 | 0:c85bb83259cc | 119 | write_byte(SKIP_ROM); |
va009039 | 0:c85bb83259cc | 120 | write_byte(CONVERT); |
va009039 | 0:c85bb83259cc | 121 | |
va009039 | 0:c85bb83259cc | 122 | // switch on parasite power while waiting. |
va009039 | 0:c85bb83259cc | 123 | port.output(); |
va009039 | 0:c85bb83259cc | 124 | port = 1; |
va009039 | 0:c85bb83259cc | 125 | } |
va009039 | 0:c85bb83259cc | 126 | |
va009039 | 0:c85bb83259cc | 127 | int OneWire::read_temperature() { |
va009039 | 0:c85bb83259cc | 128 | char data[9]; |
va009039 | 0:c85bb83259cc | 129 | short *raw_temp = (short *) data; |
va009039 | 0:c85bb83259cc | 130 | int temperature = -99; |
va009039 | 0:c85bb83259cc | 131 | |
va009039 | 0:c85bb83259cc | 132 | reset(); |
va009039 | 0:c85bb83259cc | 133 | write_byte(SKIP_ROM); |
va009039 | 0:c85bb83259cc | 134 | write_byte(READSCRATCH); |
va009039 | 0:c85bb83259cc | 135 | block(data, 9); |
va009039 | 0:c85bb83259cc | 136 | if (data[5] == 255 && data[7] == 16) { |
va009039 | 0:c85bb83259cc | 137 | temperature = *raw_temp >> 4; |
va009039 | 0:c85bb83259cc | 138 | } |
va009039 | 0:c85bb83259cc | 139 | |
va009039 | 0:c85bb83259cc | 140 | return temperature; |
va009039 | 0:c85bb83259cc | 141 | } |
va009039 |
1:c03fe1e5f435 | 142 | |
va009039 |
1:c03fe1e5f435 | 143 | int OneWire::read_temperature_raw(uint8_t data[], size_t size) { |
va009039 |
1:c03fe1e5f435 | 144 | short *raw_temp = (short *) data; |
va009039 |
1:c03fe1e5f435 | 145 | int temperature = -99; |
va009039 |
1:c03fe1e5f435 | 146 | |
va009039 |
1:c03fe1e5f435 | 147 | reset(); |
va009039 |
1:c03fe1e5f435 | 148 | write_byte(SKIP_ROM); |
va009039 |
1:c03fe1e5f435 | 149 | write_byte(READSCRATCH); |
va009039 |
1:c03fe1e5f435 | 150 | block((char*)data, size); |
va009039 |
1:c03fe1e5f435 | 151 | if (data[5] == 255 && data[7] == 16) { |
va009039 |
1:c03fe1e5f435 | 152 | temperature = *raw_temp >> 4; |
va009039 |
1:c03fe1e5f435 | 153 | } |
va009039 |
1:c03fe1e5f435 | 154 | |
va009039 |
1:c03fe1e5f435 | 155 | return temperature; |
va009039 |
1:c03fe1e5f435 | 156 | } |
va009039 |
1:c03fe1e5f435 | 157 |