📄 ad26.c
字号:
//---------------------------------------------------------------------------// Copyright (C) 2000 Dallas Semiconductor Corporation, All Rights Reserved.// // Permission is hereby granted, free of charge, to any person obtaining a // copy of this software and associated documentation files (the "Software"), // to deal in the Software without restriction, including without limitation // the rights to use, copy, modify, merge, publish, distribute, sublicense, // and/or sell copies of the Software, and to permit persons to whom the // Software is furnished to do so, subject to the following conditions:// // The above copyright notice and this permission notice shall be included // in all copies or substantial portions of the Software.// // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS // OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF // MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. // IN NO EVENT SHALL DALLAS SEMICONDUCTOR BE LIABLE FOR ANY CLAIM, DAMAGES // OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, // ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR // OTHER DEALINGS IN THE SOFTWARE.// // Except as contained in this notice, the name of Dallas Semiconductor // shall not be used except as stated in the Dallas Semiconductor // Branding Policy. //--------------------------------------------------------------------------//// ad26.c - Reads the voltage on the 1-Wire// version 1.00//// Include Files#include <stdio.h>#include "ownet.h"#include "ad26.h"int Volt_AD(int portnum, int vdd, uchar *SNum){ uchar send_block[50]; uchar test; int send_cnt=0; int i; ushort lastcrc8; int busybyte; owSerialNum(portnum,SNum,FALSE); // Recall the Status/Configuration page // Recall command send_block[send_cnt++] = 0xB8; // Page to Recall send_block[send_cnt++] = 0x00; if(!owBlock(portnum,FALSE,send_block,send_cnt)) return FALSE; send_cnt = 0; if(owAccess(portnum)) { // Read the Status/Configuration byte // Read scratchpad command send_block[send_cnt++] = 0xBE; // Page for the Status/Configuration byte send_block[send_cnt++] = 0x00; for(i=0;i<9;i++) send_block[send_cnt++] = 0xFF; if(owBlock(portnum,FALSE,send_block,send_cnt)) { setcrc8(portnum,0); for(i=2;i<send_cnt;i++) lastcrc8 = docrc8(portnum,send_block[i]); if(lastcrc8 != 0x00) return FALSE; }//Block else return FALSE; test = send_block[2] & 0x08; if(((test == 0x08) && vdd) || ((test == 0x00) && !(vdd))) return TRUE; }//Access if(owAccess(portnum)) { send_cnt = 0; // Write the Status/Configuration byte // Write scratchpad command send_block[send_cnt++] = 0x4E; // Write page send_block[send_cnt++] = 0x00; if(vdd) send_block[send_cnt++] = send_block[2] | 0x08; else send_block[send_cnt++] = send_block[2] & 0xF7; for(i=0;i<7;i++) send_block[send_cnt++] = send_block[i+4]; if(owBlock(portnum,FALSE,send_block,send_cnt)) { send_cnt = 0; if(owAccess(portnum)) { // Copy the Status/Configuration byte // Copy scratchpad command send_block[send_cnt++] = 0x48; // Copy page send_block[send_cnt++] = 0x00; if(owBlock(portnum,FALSE,send_block,send_cnt)) { busybyte = owReadByte(portnum); while(busybyte == 0) busybyte = owReadByte(portnum); return TRUE; }//Block }//Access }//Block }//Access return FALSE;} float Volt_Reading(int portnum, int vdd, uchar *SNum){ uchar send_block[50]; int send_cnt=0; int i; int busybyte; uchar lastcrc8; ushort volts; float ret=-1.0; if(Volt_AD(portnum,vdd,SNum)) { if(owAccess(portnum)) { if(!owWriteByte(portnum,0xB4)) { //output_status(LV_ALWAYS,(char *)"DIDN'T WRITE CORRECTLY\n"); printf ("DIDN'T WRITE CORRECTLY\n"); return ret; } busybyte = owReadByte(portnum); while(busybyte == 0) busybyte = owReadByte(portnum); } if(owAccess(portnum)) { // Recall the Status/Configuration page // Recall command send_block[send_cnt++] = 0xB8; // Page to Recall send_block[send_cnt++] = 0x00; if(!owBlock(portnum,FALSE,send_block,send_cnt)) return ret; } send_cnt = 0; if(owAccess(portnum)) { // Read the Status/Configuration byte // Read scratchpad command send_block[send_cnt++] = 0xBE; // Page for the Status/Configuration byte send_block[send_cnt++] = 0x00; for(i=0;i<9;i++) send_block[send_cnt++] = 0xFF; if(owBlock(portnum,FALSE,send_block,send_cnt)) { setcrc8(portnum,0); for(i=2;i<send_cnt;i++) lastcrc8 = docrc8(portnum,send_block[i]); if(lastcrc8 != 0x00) return ret; } else return ret; volts = ((int)send_block[6] << 8) | send_block[5]; ret = (float) volts/100; }//Access } return ret;}double Get_Temperature(int portnum,uchar *SNum){ double ret=-1.0; uchar send_block[50]; int send_cnt=0; int i; uchar lastcrc8; owSerialNum(portnum,SNum,FALSE); if(owAccess(portnum)) // Convert Temperature command owWriteByte(portnum,0x44); msDelay(10); if(owAccess(portnum)) { // Read the Status/Configuration byte // Read scratchpad command send_block[send_cnt++] = 0xBE; // Page for the Status/Configuration byte send_block[send_cnt++] = 0x00; for(i=0;i<9;i++) send_block[send_cnt++] = 0xFF; if(owBlock(portnum,FALSE,send_block,send_cnt)) { setcrc8(portnum,0); for(i=2;i<send_cnt;i++) { lastcrc8 = docrc8(portnum,send_block[i]); } printf ("\n"); if(lastcrc8 != 0x00) return ret; } else return ret; ret = ((((unsigned int)send_block[4] << 8) | send_block[3]) >> 3) * 0.03125; }//Access return ret;}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -