DS18B20 test program

Dependencies:   mbed

/media/uploads/va009039/ds18b20-lpc812.jpg

original:
https://developer.mbed.org/users/wkinkeldei/code/TempMeasure/file/9e88b2508768/one_wire.cpp https://developer.mbed.org/users/wkinkeldei/code/TempMeasure/

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?

UserRevisionLine numberNew 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