Dependencies:   mbed

Committer:
simon
Date:
Wed Nov 18 09:26:15 2009 +0000
Revision:
0:d0b35e0b4294

        

Who changed what in which revision?

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