//---------------------------------------------------------------------- // Main Test for the DS2450 - 1-Wire Quad A/D Converter // int main(int argc, char **argv) { char msg[45]; int NumDevices = 0; int i = 0; int start_address = 0x8; int end_address = 0x11; float prslt[4]; uchar ctrl[16]; int try_overdrive=0; int portnum=0; //------------------------------------------------------ // Introduction header printf("\n/---------------------------------------------\n"); printf(" Channels A to D Application - V2.00\n" " The following is a test to excersize a\n" " DS2450 - 1-Wire Quad A/D Converter \n\n"); printf(" Press any CTRL-C to stop this program.\n\n"); printf(" Output [Serial Number(s) ... Channel 'A' Value ... Channel 'B' Value ... \n" " ... Channel 'C' Value ... Channel 'D' Value] \n\n"); // check for required port name if (argc != 2) { printf("1-Wire Net name required on command line!\n" " (example: \"COM1\" (Win32 DS2480),\"/dev/cua0\" " "(Linux DS2480),\"{1,5}\" (Win32 TMEX)\n"); exit(1); } // attempt to acquire the 1-Wire Net if ((portnum = owAcquireEx(argv[1])) < 0) { OWERROR_DUMP(stdout); exit(1); } // success printf("Port opened: %s\n",argv[1]); // Find the device(s) NumDevices = FindDevices(portnum, &FamilySN[0], 0x20, MAXDEVICES); if (NumDevices>0) { printf("\n"); printf("Device(s) Found: \n"); for (i = 0; i < NumDevices; i++) { PrintSerialNum(FamilySN[i]); printf("\n"); if (SetupAtoDControl(portnum, FamilySN[i], &ctrl[0], &msg[0])) { printf("A/D settings found\n %s\n", msg); } else printf("\n\n\n ERROR, device set up unsuccessful!\n"); if (WriteAtoD(portnum, try_overdrive, FamilySN[i], &ctrl[0], start_address, end_address)) { printf("\nA/D settings written"); } else printf("\n\n\n ERROR, device not found!\n"); } } // (stops on CTRL-C) do { // read the current channels for (i = 0; i < NumDevices; i++) { printf("\n\n"); PrintSerialNum(FamilySN[i]); if (!DoAtoDConversion(portnum, try_overdrive, FamilySN[i])) { printf("\nError doing conversion, verify device present: %d\n", (int)owVerify(portnum,FALSE)); } if (ReadAtoDResults(portnum, try_overdrive, FamilySN[i], &prslt[0], &ctrl[0])) { int c = 0; for (c = 0; c < 4; c++) { printf(" %1.3f ", prslt[c]); } } else { printf("\nError reading channel, verify device present: %d\n", (int)owVerify(portnum,FALSE)); } } } while (!key_abort()); // release the 1-Wire Net owRelease(portnum); printf("Closing port %s.\n", argv[1]); exit(0); return 0; }
// ------------------------------------------------------------------------- // SUBROUTINE - GetDir // // This routine looks at the DS2401 serial numbers or the DS2450 volts to // determine which direction the wind is blowing. // // Returns: The direction in a 0-15 order and 16 for no DS2401s found // int GetDir(int portnum, WeatherStruct *wet) { SwitchProps st; uchar temp_dir[MAXDIR][8]; int i,j; int numdir = 0; int firstmatch = 0, secondmatch = 0; int firstindex = 0; int found = TRUE; int ret = 16; float prslt[4]; temp_dir[0][0] = 0x00; if(wet->weather_a) { st.Chan_A = FALSE; st.Chan_B = TRUE; if(SetSwitch12(portnum, &wet->dsdir[0], st)) { numdir = FindDevices(portnum, &temp_dir[0], DIR_FAMILY, MAXDIR); } else printf("Error on setting up the switch\n"); if(numdir == 0) ret = 16; if(numdir == 2) { for(i=0; i<8; i++) { for(j=0; j<8; j++) if(temp_dir[0][j] != wet->ds2401[i][j]) { found = FALSE; break; } else found = TRUE; if(found) { firstindex = i; firstmatch = conv[i]; found = FALSE; break; } } for(i=0; i<8; i++) { if(i != firstindex) { for(j=0; j<8; j++) { if(temp_dir[1][j] != wet->ds2401[i][j]) { found = FALSE; break; } else found = TRUE; } } if(found) { secondmatch = conv[i]; break; } } if(((firstmatch == 0) || (secondmatch == 0)) && ((firstmatch == 14) || (secondmatch == 14))) ret = 15; else ret = (firstmatch+secondmatch)/2; } if(numdir == 1) { for(i=0; i<8; i++) { found = TRUE; for(j=0; j<8; j++) if(temp_dir[0][j] != wet->ds2401[i][j]) found = FALSE; if(found) { ret = conv[i]; break; } } } st.Chan_A = FALSE; st.Chan_B = FALSE; if(!SetSwitch12(portnum, &wet->dsdir[0], st)) { msDelay(10); if(!SetSwitch12(portnum, &wet->dsdir[0], st)) { printf("Failed to close channel B\n"); } } } else if(wet->weather_b) { // read wind direction for the DS2450 weather station if(DoAtoDConversion(portnum, FALSE, &wet->dsdir[0])) { if(ReadAtoDResults(portnum, FALSE, &wet->dsdir[0], &prslt[0], &wet->ctrl[0])) { for(i=0; i<16; i++) { if( ((prslt[0] <= (float)conv_table[i][0]+0.25) && (prslt[0] >= (float)conv_table[i][0]-0.25)) && ((prslt[1] <= (float)conv_table[i][1]+0.25) && (prslt[1] >= (float)conv_table[i][1]-0.25)) && ((prslt[2] <= (float)conv_table[i][2]+0.25) && (prslt[2] >= (float)conv_table[i][2]-0.25)) && ((prslt[3] <= (float)conv_table[i][3]+0.25) && (prslt[3] >= (float)conv_table[i][3]-0.25)) ) { ret = i; break; } } } else { printf("\n"); printf("\nError reading channel, verify device present: %d\n", (int)owVerify(portnum, FALSE)); } } } return ret; }