Simon Ford
/
OneWireDriver
main.cpp@0:d0b35e0b4294, 2009-11-18 (annotated)
- Committer:
- simon
- Date:
- Wed Nov 18 09:26:15 2009 +0000
- Revision:
- 0:d0b35e0b4294
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
simon | 0:d0b35e0b4294 | 1 | #include "mbed.h" |
simon | 0:d0b35e0b4294 | 2 | |
simon | 0:d0b35e0b4294 | 3 | // DS18B20 converted to run on mbed |
simon | 0:d0b35e0b4294 | 4 | |
simon | 0:d0b35e0b4294 | 5 | #define TEMP_PIN p20 |
simon | 0:d0b35e0b4294 | 6 | |
simon | 0:d0b35e0b4294 | 7 | Serial pc(USBTX, USBRX); // tx, rx |
simon | 0:d0b35e0b4294 | 8 | |
simon | 0:d0b35e0b4294 | 9 | DigitalInOut temperature_pin(TEMP_PIN); |
simon | 0:d0b35e0b4294 | 10 | |
simon | 0:d0b35e0b4294 | 11 | void OneWireReset() { // reset. Should improve to act as a presence pulse |
simon | 0:d0b35e0b4294 | 12 | temperature_pin.output(); |
simon | 0:d0b35e0b4294 | 13 | temperature_pin = 0; // bring low for 500 us |
simon | 0:d0b35e0b4294 | 14 | wait_us(500); |
simon | 0:d0b35e0b4294 | 15 | temperature_pin.input(); |
simon | 0:d0b35e0b4294 | 16 | wait_us(500); |
simon | 0:d0b35e0b4294 | 17 | } |
simon | 0:d0b35e0b4294 | 18 | |
simon | 0:d0b35e0b4294 | 19 | void OneWireOutByte(unsigned char d) { // output byte d (least sig bit first). |
simon | 0:d0b35e0b4294 | 20 | for(int n=8; n!=0; n--) { |
simon | 0:d0b35e0b4294 | 21 | if ((d & 0x01) == 1) { // test least sig bit |
simon | 0:d0b35e0b4294 | 22 | temperature_pin.output(); |
simon | 0:d0b35e0b4294 | 23 | temperature_pin = 0; |
simon | 0:d0b35e0b4294 | 24 | wait_us(5); |
simon | 0:d0b35e0b4294 | 25 | temperature_pin.input(); |
simon | 0:d0b35e0b4294 | 26 | wait_us(60); |
simon | 0:d0b35e0b4294 | 27 | } else { |
simon | 0:d0b35e0b4294 | 28 | temperature_pin.output(); |
simon | 0:d0b35e0b4294 | 29 | temperature_pin = 0; |
simon | 0:d0b35e0b4294 | 30 | wait_us(60); |
simon | 0:d0b35e0b4294 | 31 | temperature_pin.input(); |
simon | 0:d0b35e0b4294 | 32 | } |
simon | 0:d0b35e0b4294 | 33 | |
simon | 0:d0b35e0b4294 | 34 | d=d>>1; // now the next bit is in the least sig bit position. |
simon | 0:d0b35e0b4294 | 35 | } |
simon | 0:d0b35e0b4294 | 36 | |
simon | 0:d0b35e0b4294 | 37 | } |
simon | 0:d0b35e0b4294 | 38 | |
simon | 0:d0b35e0b4294 | 39 | unsigned char OneWireInByte() { // read byte, least sig byte first |
simon | 0:d0b35e0b4294 | 40 | unsigned char d = 0, b; |
simon | 0:d0b35e0b4294 | 41 | for (int n=0; n<8; n++) { |
simon | 0:d0b35e0b4294 | 42 | temperature_pin.output(); |
simon | 0:d0b35e0b4294 | 43 | temperature_pin = 0; |
simon | 0:d0b35e0b4294 | 44 | wait_us(5); |
simon | 0:d0b35e0b4294 | 45 | temperature_pin.input(); |
simon | 0:d0b35e0b4294 | 46 | wait_us(5); |
simon | 0:d0b35e0b4294 | 47 | b = temperature_pin; |
simon | 0:d0b35e0b4294 | 48 | wait_us(50); |
simon | 0:d0b35e0b4294 | 49 | d = (d >> 1) | (b << 7); // shift d to right and insert b in most sig bit position |
simon | 0:d0b35e0b4294 | 50 | } |
simon | 0:d0b35e0b4294 | 51 | return d; |
simon | 0:d0b35e0b4294 | 52 | } |
simon | 0:d0b35e0b4294 | 53 | |
simon | 0:d0b35e0b4294 | 54 | int main() { |
simon | 0:d0b35e0b4294 | 55 | int HighByte, LowByte, TReading, SignBit, Tc_100, Whole, Fract; |
simon | 0:d0b35e0b4294 | 56 | pc.printf("mbed 1 wire interface simple test!\r\n"); |
simon | 0:d0b35e0b4294 | 57 | temperature_pin.output(); |
simon | 0:d0b35e0b4294 | 58 | temperature_pin = 0; |
simon | 0:d0b35e0b4294 | 59 | temperature_pin.input(); // sets the digital pin as input (logic 1) make sure external pullup resistor 4K7 |
simon | 0:d0b35e0b4294 | 60 | wait(1); |
simon | 0:d0b35e0b4294 | 61 | pc.printf("temperature measurements:\r\n"); |
simon | 0:d0b35e0b4294 | 62 | |
simon | 0:d0b35e0b4294 | 63 | while (1) { |
simon | 0:d0b35e0b4294 | 64 | OneWireReset(); |
simon | 0:d0b35e0b4294 | 65 | OneWireOutByte( 0xcc); //Skip ROM command |
simon | 0:d0b35e0b4294 | 66 | OneWireOutByte( 0x44); // perform temperature conversion, strong pullup for one sec |
simon | 0:d0b35e0b4294 | 67 | |
simon | 0:d0b35e0b4294 | 68 | OneWireReset(); |
simon | 0:d0b35e0b4294 | 69 | OneWireOutByte( 0xcc); |
simon | 0:d0b35e0b4294 | 70 | OneWireOutByte( 0xbe); //Read Scratchpad |
simon | 0:d0b35e0b4294 | 71 | |
simon | 0:d0b35e0b4294 | 72 | LowByte = OneWireInByte(); |
simon | 0:d0b35e0b4294 | 73 | HighByte = OneWireInByte(); |
simon | 0:d0b35e0b4294 | 74 | TReading = (HighByte << 8) + LowByte; |
simon | 0:d0b35e0b4294 | 75 | SignBit = TReading & 0x8000; // test most sig bit |
simon | 0:d0b35e0b4294 | 76 | if (SignBit) { // negative |
simon | 0:d0b35e0b4294 | 77 | TReading = (TReading ^ 0xffff) + 1; // 2's comp |
simon | 0:d0b35e0b4294 | 78 | } |
simon | 0:d0b35e0b4294 | 79 | Tc_100 = (6 * TReading) + TReading / 4; // multiply by (100 * 0.0625) or 6.25 |
simon | 0:d0b35e0b4294 | 80 | |
simon | 0:d0b35e0b4294 | 81 | Whole = Tc_100 / 100; // separate off the whole and fractional portions |
simon | 0:d0b35e0b4294 | 82 | Fract = Tc_100 % 100; |
simon | 0:d0b35e0b4294 | 83 | |
simon | 0:d0b35e0b4294 | 84 | if (SignBit) { // If its negative |
simon | 0:d0b35e0b4294 | 85 | pc.printf("-"); |
simon | 0:d0b35e0b4294 | 86 | } |
simon | 0:d0b35e0b4294 | 87 | pc.printf("%d", Whole); |
simon | 0:d0b35e0b4294 | 88 | pc.printf("."); |
simon | 0:d0b35e0b4294 | 89 | if (Fract < 10) { |
simon | 0:d0b35e0b4294 | 90 | pc.printf("0"); |
simon | 0:d0b35e0b4294 | 91 | } |
simon | 0:d0b35e0b4294 | 92 | pc.printf("%d", Fract); |
simon | 0:d0b35e0b4294 | 93 | pc.printf("\r\n"); |
simon | 0:d0b35e0b4294 | 94 | |
simon | 0:d0b35e0b4294 | 95 | wait(5); // 5 second delay. Adjust as necessary |
simon | 0:d0b35e0b4294 | 96 | } |
simon | 0:d0b35e0b4294 | 97 | } |