This is a Testing library

Committer:
javiersing
Date:
Mon Nov 28 12:59:53 2016 +0000
Revision:
0:435141e08516
This is a Testing library

Who changed what in which revision?

UserRevisionLine numberNew contents of line
javiersing 0:435141e08516 1 #define MaxROMs 20 // Defines how many devices space is allocated for.
javiersing 0:435141e08516 2 #define FALSE 0
javiersing 0:435141e08516 3 #define TRUE 1
javiersing 0:435141e08516 4 #include "FastIO.h"
javiersing 0:435141e08516 5 unsigned char SPad[9]; // Scratchpad storage
javiersing 0:435141e08516 6 unsigned char ROM[8];
javiersing 0:435141e08516 7 unsigned char lastDiscrep = 0; // last discrepancy
javiersing 0:435141e08516 8 unsigned char doneFlag = 0; // Done flag
javiersing 0:435141e08516 9 unsigned char FoundROM[MaxROMs][8]; // table of found ROM codes
javiersing 0:435141e08516 10 unsigned char numROMs; // Number of found devices.
javiersing 0:435141e08516 11 unsigned char dowcrc;
javiersing 0:435141e08516 12 unsigned char dscrc_table[] = {
javiersing 0:435141e08516 13 0, 94,188,226, 97, 63,221,131,194,156,126, 32,163,253, 31, 65,
javiersing 0:435141e08516 14 157,195, 33,127,252,162, 64, 30, 95, 1,227,189, 62, 96,130,220,
javiersing 0:435141e08516 15 35,125,159,193, 66, 28,254,160,225,191, 93, 3,128,222, 60, 98,
javiersing 0:435141e08516 16 190,224, 2, 92,223,129, 99, 61,124, 34,192,158, 29, 67,161,255,
javiersing 0:435141e08516 17 70, 24,250,164, 39,121,155,197,132,218, 56,102,229,187, 89, 7,
javiersing 0:435141e08516 18 219,133,103, 57,186,228, 6, 88, 25, 71,165,251,120, 38,196,154,
javiersing 0:435141e08516 19 101, 59,217,135, 4, 90,184,230,167,249, 27, 69,198,152,122, 36,
javiersing 0:435141e08516 20 248,166, 68, 26,153,199, 37,123, 58,100,134,216, 91, 5,231,185,
javiersing 0:435141e08516 21 140,210, 48,110,237,179, 81, 15, 78, 16,242,172, 47,113,147,205,
javiersing 0:435141e08516 22 17, 79,173,243,112, 46,204,146,211,141,111, 49,178,236, 14, 80,
javiersing 0:435141e08516 23 175,241, 19, 77,206,144,114, 44,109, 51,209,143, 12, 82,176,238,
javiersing 0:435141e08516 24 50,108,142,208, 83, 13,239,177,240,174, 76, 18,145,207, 45,115,
javiersing 0:435141e08516 25 202,148,118, 40,171,245, 23, 73, 8, 86,180,234,105, 55,213,139,
javiersing 0:435141e08516 26 87, 9,235,181, 54,104,138,212,149,203, 41,119,244,170, 72, 22,
javiersing 0:435141e08516 27 233,183, 85, 11,136,214, 52,106, 43,117,151,201, 74, 20,246,168,
javiersing 0:435141e08516 28 116, 42,200,150, 21, 75,169,247,182,232, 10, 84,215,137,107, 53};
javiersing 0:435141e08516 29
javiersing 0:435141e08516 30 FastInOut<D2> DQ; // Use FastIO library to try an speed improvement and define the pin of input
javiersing 0:435141e08516 31 Serial pc(USBTX, USBRX);
javiersing 0:435141e08516 32
javiersing 0:435141e08516 33 //////////////////////////////////////////////////////////////////////////////
javiersing 0:435141e08516 34 // OW_RESET - performs a reset on the 1-wire bus and returns the presence detect.
javiersing 0:435141e08516 35 unsigned char ow_reset(void) {
javiersing 0:435141e08516 36 unsigned char presence;
javiersing 0:435141e08516 37 DQ.output();
javiersing 0:435141e08516 38 DQ = 0; //pull DQ line low
javiersing 0:435141e08516 39 wait_us(480); // leave it low for 480us
javiersing 0:435141e08516 40 DQ.input(); // allow line to return high
javiersing 0:435141e08516 41 wait_us(70); // wait for presence
javiersing 0:435141e08516 42 presence = DQ; // get presence signal
javiersing 0:435141e08516 43 wait_us(410); // wait for end of timeslot
javiersing 0:435141e08516 44 return(presence); // presence signal returned, 0=presence, 1 = no sensor found.
javiersing 0:435141e08516 45 }
javiersing 0:435141e08516 46
javiersing 0:435141e08516 47 //////////////////////////////////////////////////////////////////////////////
javiersing 0:435141e08516 48 // READ_BIT - reads a bit from the one-wire bus.
javiersing 0:435141e08516 49 unsigned char read_bit(void) {
javiersing 0:435141e08516 50 unsigned char retval;
javiersing 0:435141e08516 51 wait_us(1); // Recovery time
javiersing 0:435141e08516 52 DQ.output();
javiersing 0:435141e08516 53 DQ = 0; // pull DQ low to start timeslot
javiersing 0:435141e08516 54 wait_us(2);
javiersing 0:435141e08516 55 DQ.input(); // Tristate line
javiersing 0:435141e08516 56 wait_us(10); // delay 10 us from start of timeslot
javiersing 0:435141e08516 57 retval=DQ;
javiersing 0:435141e08516 58 wait_us(48); // minimum Read time slot: 60 us.
javiersing 0:435141e08516 59 return(retval); // return value of DQ line
javiersing 0:435141e08516 60 }
javiersing 0:435141e08516 61
javiersing 0:435141e08516 62 //////////////////////////////////////////////////////////////////////////////
javiersing 0:435141e08516 63 // WRITE_BIT - writes a bit to the one-wire bus, passed in bitval.
javiersing 0:435141e08516 64 void write_bit(unsigned char bitval) {
javiersing 0:435141e08516 65 wait_us(1); // Recovery time
javiersing 0:435141e08516 66 DQ.output();
javiersing 0:435141e08516 67 DQ = 0; // pull DQ low to start timeslot
javiersing 0:435141e08516 68 wait_us(10);
javiersing 0:435141e08516 69 if(bitval==1) DQ =1; // return DQ high if write 1
javiersing 0:435141e08516 70 wait_us(50); // hold value for remainder of timeslot
javiersing 0:435141e08516 71 DQ.input(); // Release line
javiersing 0:435141e08516 72 }
javiersing 0:435141e08516 73
javiersing 0:435141e08516 74 //////////////////////////////////////////////////////////////////////////////
javiersing 0:435141e08516 75 // READ_BYTE - reads a byte from the one-wire bus.
javiersing 0:435141e08516 76 unsigned char read_byte(void) {
javiersing 0:435141e08516 77 unsigned char i, value=0;
javiersing 0:435141e08516 78 for (i=0;i<8;i++) {
javiersing 0:435141e08516 79 if(read_bit()) value|=0x01<<i; // reads byte in, one byte at a time and then shifts it left
javiersing 0:435141e08516 80 }
javiersing 0:435141e08516 81 return(value);
javiersing 0:435141e08516 82 }
javiersing 0:435141e08516 83
javiersing 0:435141e08516 84 //////////////////////////////////////////////////////////////////////////////
javiersing 0:435141e08516 85 // WRITE_BYTE - writes a byte to the one-wire bus.
javiersing 0:435141e08516 86 void write_byte(char val) {
javiersing 0:435141e08516 87 unsigned char i;
javiersing 0:435141e08516 88 unsigned char temp;
javiersing 0:435141e08516 89 for (i=0; i<8; i++) {// writes byte, one bit at a time
javiersing 0:435141e08516 90 temp = val>>i; // shifts val right 'i' spaces
javiersing 0:435141e08516 91 temp &= 0x01; // copy that bit to temp
javiersing 0:435141e08516 92 write_bit(temp); // write bit
javiersing 0:435141e08516 93 }
javiersing 0:435141e08516 94 }
javiersing 0:435141e08516 95
javiersing 0:435141e08516 96 //////////////////////////////////////////////////////////////////////////////
javiersing 0:435141e08516 97 // ONE WIRE CRC
javiersing 0:435141e08516 98 unsigned char ow_crc( unsigned char x) {
javiersing 0:435141e08516 99 dowcrc = dscrc_table[dowcrc^x];
javiersing 0:435141e08516 100 return dowcrc;
javiersing 0:435141e08516 101 }
javiersing 0:435141e08516 102
javiersing 0:435141e08516 103 //////////////////////////////////////////////////////////////////////////////
javiersing 0:435141e08516 104 // NEXT
javiersing 0:435141e08516 105 // The Next function searches for the next device on the 1-Wire bus. If
javiersing 0:435141e08516 106 // there are no more devices on the 1-Wire then false is returned.
javiersing 0:435141e08516 107 unsigned char Next(void) {
javiersing 0:435141e08516 108 unsigned char m = 1; // ROM Bit index
javiersing 0:435141e08516 109 unsigned char n = 0; // ROM Byte index
javiersing 0:435141e08516 110 unsigned char k = 1; // bit mask
javiersing 0:435141e08516 111 unsigned char x = 0;
javiersing 0:435141e08516 112 unsigned char discrepMarker = 0; // discrepancy marker
javiersing 0:435141e08516 113 unsigned char g; // Output bit
javiersing 0:435141e08516 114 unsigned char nxt; // return value
javiersing 0:435141e08516 115 int flag;
javiersing 0:435141e08516 116 nxt = FALSE; // set the nxt flag to false
javiersing 0:435141e08516 117 dowcrc = 0; // reset the dowcrc
javiersing 0:435141e08516 118 flag = ow_reset(); // reset the 1-Wire
javiersing 0:435141e08516 119 if(flag||doneFlag) { // no parts -> return false
javiersing 0:435141e08516 120 lastDiscrep = 0; // reset the search
javiersing 0:435141e08516 121 return FALSE;
javiersing 0:435141e08516 122 }
javiersing 0:435141e08516 123 write_byte(0xF0); // send SearchROM command
javiersing 0:435141e08516 124 do { // for all eight bytes
javiersing 0:435141e08516 125 x = 0;
javiersing 0:435141e08516 126 if(read_bit()==1) x = 2;
javiersing 0:435141e08516 127 wait_us(120);
javiersing 0:435141e08516 128 if(read_bit()==1) x |= 1; // and its complement
javiersing 0:435141e08516 129 if(x ==3) // there are no devices on the 1-Wire
javiersing 0:435141e08516 130 break;
javiersing 0:435141e08516 131 else {
javiersing 0:435141e08516 132 if(x>0) // all devices coupled have 0 or 1
javiersing 0:435141e08516 133 g = x>>1; // bit write value for search
javiersing 0:435141e08516 134 else {
javiersing 0:435141e08516 135 // if this discrepancy is before the last discrepancy on a previous Next then pick the same as last time
javiersing 0:435141e08516 136 if(m<lastDiscrep)
javiersing 0:435141e08516 137 g = ((ROM[n]&k)>0);
javiersing 0:435141e08516 138 else // if equal to last pick 1
javiersing 0:435141e08516 139 g = (m==lastDiscrep); // if not then pick 0
javiersing 0:435141e08516 140 // if 0 was picked then record position with mask k
javiersing 0:435141e08516 141 if (g==0) discrepMarker = m;
javiersing 0:435141e08516 142 }
javiersing 0:435141e08516 143 if(g==1) // isolate bit in ROM[n] with mask k
javiersing 0:435141e08516 144 ROM[n] |= k;
javiersing 0:435141e08516 145 else
javiersing 0:435141e08516 146 ROM[n] &= ~k;
javiersing 0:435141e08516 147 write_bit(g); // ROM search write
javiersing 0:435141e08516 148 m++; // increment bit counter m
javiersing 0:435141e08516 149 k = k<<1; // and shift the bit mask k
javiersing 0:435141e08516 150 if(k==0) { // if the mask is 0 then go to new ROM // byte n and reset mask
javiersing 0:435141e08516 151 ow_crc(ROM[n]); // accumulate the CRC
javiersing 0:435141e08516 152 n++; k++;
javiersing 0:435141e08516 153 }
javiersing 0:435141e08516 154 }
javiersing 0:435141e08516 155 }
javiersing 0:435141e08516 156 while(n<8); //loop until through all ROM bytes 0-7
javiersing 0:435141e08516 157 if(m<65||dowcrc) // if search was unsuccessful then
javiersing 0:435141e08516 158 lastDiscrep=0; // reset the last discrepancy to 0
javiersing 0:435141e08516 159 else { // search was successful, so set lastDiscrep, lastOne, nxt
javiersing 0:435141e08516 160 lastDiscrep = discrepMarker;
javiersing 0:435141e08516 161 doneFlag = (lastDiscrep==0);
javiersing 0:435141e08516 162 nxt = TRUE; // indicates search is not complete yet, more parts remain
javiersing 0:435141e08516 163 }
javiersing 0:435141e08516 164 return nxt;
javiersing 0:435141e08516 165 }
javiersing 0:435141e08516 166
javiersing 0:435141e08516 167 //////////////////////////////////////////////////////////////////////////////
javiersing 0:435141e08516 168 // FIRST
javiersing 0:435141e08516 169 // The First function resets the current state of a ROM search and calls
javiersing 0:435141e08516 170 // Next to find the first device on the 1-Wire bus.
javiersing 0:435141e08516 171 unsigned char First(void) {
javiersing 0:435141e08516 172 lastDiscrep = 0; // reset the rom search last discrepancy global
javiersing 0:435141e08516 173 doneFlag = FALSE;
javiersing 0:435141e08516 174 return Next(); // call Next and return its return value
javiersing 0:435141e08516 175 }
javiersing 0:435141e08516 176
javiersing 0:435141e08516 177 //////////////////////////////////////////////////////////////////////////////
javiersing 0:435141e08516 178 // FIND DEVICES
javiersing 0:435141e08516 179 void FindDevices(void) {
javiersing 0:435141e08516 180 unsigned char m;
javiersing 0:435141e08516 181 if(!ow_reset()) { //Begins when a presence is detected
javiersing 0:435141e08516 182 if(First()) { //Begins when at least one part is found
javiersing 0:435141e08516 183 numROMs=0;
javiersing 0:435141e08516 184 do {
javiersing 0:435141e08516 185 numROMs++;
javiersing 0:435141e08516 186 for(m=0;m<8;m++) {
javiersing 0:435141e08516 187 FoundROM[numROMs][m]=ROM[m]; //Identifies ROM
javiersing 0:435141e08516 188 }
javiersing 0:435141e08516 189 pc.printf("ROM CODE =%02X:%02X:%02X:%02X:%02X:%02X:%02X:%02X %d\r\n",
javiersing 0:435141e08516 190 FoundROM[numROMs][7],FoundROM[numROMs][6],FoundROM[numROMs][5],FoundROM[numROMs][4],
javiersing 0:435141e08516 191 FoundROM[numROMs][3],FoundROM[numROMs][2],FoundROM[numROMs][1],FoundROM[numROMs][0],numROMs);
javiersing 0:435141e08516 192 }
javiersing 0:435141e08516 193 while (Next()&&(numROMs<MaxROMs)); //Continues until no additional devices are found
javiersing 0:435141e08516 194 }
javiersing 0:435141e08516 195 }
javiersing 0:435141e08516 196 pc.printf("\n%d devices found.\r\n\n",numROMs);
javiersing 0:435141e08516 197 }
javiersing 0:435141e08516 198 //////////////////////////////////////////////////////////////////////////////
javiersing 0:435141e08516 199 void Read_ScratchPad(unsigned char n) { // Read the n first scratchpad bytes. Old data not wiped.
javiersing 0:435141e08516 200 n=n % 10;
javiersing 0:435141e08516 201 write_byte(0xBE);
javiersing 0:435141e08516 202 for (int j=1;j<=n;j++){SPad[j-1]=read_byte();}
javiersing 0:435141e08516 203 // CRC ********reserved******* Config Tl Th T MSB T LSB
javiersing 0:435141e08516 204 pc.printf("\n ScratchPAD: %X%X%X%X%X%X%X%X%X\n",SPad[8],SPad[7],SPad[6],SPad[5],SPad[4],SPad[3],SPad[2],SPad[1],SPad[0]);
javiersing 0:435141e08516 205 }
javiersing 0:435141e08516 206
javiersing 0:435141e08516 207 //////////////////////////////////////////////////////////////////////////////
javiersing 0:435141e08516 208 // Perform Match ROM
javiersing 0:435141e08516 209 unsigned char Send_MatchRom(unsigned char DeviceNo) {
javiersing 0:435141e08516 210 unsigned char i;
javiersing 0:435141e08516 211 if(ow_reset()) return false;
javiersing 0:435141e08516 212 write_byte(0x55); // match ROM
javiersing 0:435141e08516 213 for(i=0;i<8;i++) {
javiersing 0:435141e08516 214 write_byte(FoundROM[DeviceNo][i]); //send ROM code
javiersing 0:435141e08516 215 }
javiersing 0:435141e08516 216 return true;
javiersing 0:435141e08516 217 }
javiersing 0:435141e08516 218
javiersing 0:435141e08516 219 //////////////////////////////////////////////////////////////////////////////
javiersing 0:435141e08516 220 void ConvT() { // Make all devices on the bus start a temperature conversion.
javiersing 0:435141e08516 221 ow_reset();
javiersing 0:435141e08516 222 write_byte( 0xcc); // Skip ROM command.
javiersing 0:435141e08516 223 write_byte( 0x44); // Convert T command.
javiersing 0:435141e08516 224 }
javiersing 0:435141e08516 225
javiersing 0:435141e08516 226 //////////////////////////////////////////////////////////////////////////////
javiersing 0:435141e08516 227 unsigned int ReadRawTemp(unsigned char device) {
javiersing 0:435141e08516 228 int HighByte, LowByte;
javiersing 0:435141e08516 229 Send_MatchRom(device); // Select device.
javiersing 0:435141e08516 230 write_byte( 0xbe); // Read Scratchpad command.
javiersing 0:435141e08516 231 LowByte=read_byte();
javiersing 0:435141e08516 232 HighByte=read_byte();
javiersing 0:435141e08516 233 return (HighByte << 8) + LowByte;
javiersing 0:435141e08516 234 }
javiersing 0:435141e08516 235
javiersing 0:435141e08516 236 //////////////////////////////////////////////////////////////////////////////
javiersing 0:435141e08516 237 float Get_Temp(unsigned char device) {
javiersing 0:435141e08516 238 int Raw = ReadRawTemp(device);
javiersing 0:435141e08516 239 if((Raw>>8) & 0x80) { // Check if temperature is negative.
javiersing 0:435141e08516 240 Raw = (Raw ^ 0xFFFF) + 1;
javiersing 0:435141e08516 241 Raw *= -1;
javiersing 0:435141e08516 242 }
javiersing 0:435141e08516 243 float temperature = (float)Raw / 16.0;
javiersing 0:435141e08516 244 return temperature;
javiersing 0:435141e08516 245 }
javiersing 0:435141e08516 246
javiersing 0:435141e08516 247 //////////////////////////////////////////////////////////////////////////////