wince读取18b20数据问题

[复制链接]
查看11 | 回复6 | 2021-1-27 06:31:07 | 显示全部楼层 |阅读模式
我用fl2440开发板,在ads下程序读写正常,先移植到了wince上,做了流驱动,然后应用程序调用,可显示是4095.93c。
驱动程序如下:
//18B20DLL.cpp:定义DLL的初始化例程。
#include
#include//包含stdlib.h
#include
#include////MmMapIoSpace
#include
//#include//IOPreg
//#include
#include
#include
staticvolatileS3C2440A_IOPORT_REG*v_pIOPRegs;//S3C2440xGPIOregisters
//#include"stdafx.h"
//#include"TEMP.h"
//温度传感器初始化
voidtmreset(void);
unsignedchartmrbyte(void);
//写一个字节
voidtmwbyte(unsignedchardat);
//将温度值转换为ascii值
voidzh(unsignedcharzhengshu,unsignedcharxiaoshu);
unsignedchartmvalue[6];
//温度测试(主函数)
voidtmtest(void);
//延时函数(微秒)
voidDelay_us(intn);
//温度读取线程
BOOLWINAPI
TEM_DllEntry(HANDLEhInstDll,DWORDdwReason,LPVOIDlpvReserved)
{
return1;
}
typedefstruct
{
intinteger;
intdecimal;
}TemHandle;
//globalvariable
TemHandleg_Tem;
//温度传感器初始化
voiddmsec(unsignedintt)//精确延时函数100约为1.317us
{

unsignedinti;
unsignedintj;
j=1*t;
for(i=0;iGPGCON&=0xfffffffc;//设置寄存器对18b20进行写操作
v_pIOPRegs->GPGCON|=0x01;
v_pIOPRegs->GPGDAT|=0x01;
dmsec(5000);
v_pIOPRegs->GPGDAT&=0xfffe;
dmsec(30000);//DQ=0600us
v_pIOPRegs->GPGDAT|=0x01;
dmsec(5000);//DQ=1
v_pIOPRegs->GPGCON&=0xfffffffc;
}
//读一个字节
unsignedchartmrbyte(void)
{
unsignedintj;
unsignedchari,u=0;
for(i=1;iGPGCON&=0xfffffffc;
v_pIOPRegs->GPGCON|=0x01;

v_pIOPRegs->GPGDAT&=0xfffe;//DQ=0
u>>=1;
v_pIOPRegs->GPGDAT|=0x01;//DQ=1
v_pIOPRegs->GPGCON&=0xfffffffc;
j=v_pIOPRegs->GPGDAT;
if(j&0x01)
u|=0x80;

dmsec(2300);

}
return(u);
}
//写一个字节
voidtmwbyte(unsignedchardat)
{
unsignedcharj;
v_pIOPRegs->GPGCON&=0xfffffffc;
v_pIOPRegs->GPGCON|=0x01;
for(j=1;jGPGDAT&=0xfffe;//DQ=0
dmsec(50);

v_pIOPRegs->GPGDAT|=(dat&0x01);
dmsec(2300);

v_pIOPRegs->GPGDAT|=0x01;//DQ=1;
dat=dat>>1;
}
}
//voidzh(unsignedcharzhengshu,unsignedcharxiaoshu)
//{
//tmvalue[0]=zhengshu/10+0x30;
//tmvalue[1]=zhengshu%10+0x30;
//tmvalue[2]=46;//.
//tmvalue[3]=xiaoshu/10+0x30;
//tmvalue[4]=xiaoshu%10+0x30;
//tmvalue[5]='\0';//空字符
//}
//温度测试(主函数)
voidTEMP(void)
{
//while(1)

inta,b,decimal2;
intdecimal1;
staticBOOLisFirst=true;
tmreset();//复位
dmsec(6000);
tmwbyte(0xcc);//跳过序列号命令
tmwbyte(0x44);//发转换命令44H,

tmreset();//复位
dmsec(100000);
tmwbyte(0xcc);//跳过序列号命令
tmwbyte(0xbe);//发送读取命令
a=tmrbyte();//读取低位温度
b=tmrbyte();//读取高位温度
g_Tem.integer=a/16+b*16;//整数部分
decimal1=(a&0x0f)*10/16;//小数第一位
decimal2=(b&0x0f)*100/16%10;//小数第二位
g_Tem.decimal=decimal1*10+decimal2;//小数两位


}





DWORDTEM_Init(LPCTSTRpContext,LPCVOIDlpvBusContext){
//Virtualaddressmapping
v_pIOPRegs=(volatileS3C2440A_IOPORT_REG*)VirtualAlloc(0,sizeof(S3C2440A_IOPORT_REG),MEM_RESERVE,PAGE_NOACCESS);
if(v_pIOPRegs==NULL)
{
DEBUGMSG(1,(TEXT("v_pIOPRegsisnotallocated\n\r")));
//returnTRUE;
}
if(!VirtualCopy((PVOID)v_pIOPRegs,(PVOID)(S3C2440A_BASE_REG_PA_IOPORT>>8),sizeof(S3C2440A_IOPORT_REG),PAGE_PHYSICAL|PAGE_READWRITE|PAGE_NOCACHE))
{
DEBUGMSG(1,(TEXT("v_pIOPRegsisnotmapped\n\r")));
//returnTRUE;
}

TEMP();
return1;
}
BOOLTEM_Deinit(DWORDhDeviceContext){
VirtualFree((PVOID)v_pIOPRegs,0,MEM_RELEASE);
v_pIOPRegs=NULL;

returnTRUE;
}
//----------------------------------------------------------------------------//
//TEMopen
//----------------------------------------------------------------------------//
DWORDTEM_Open(DWORDhDeviceContext,DWORDAccessCode,DWORDShareMode){
OutputDebugString(L"TEM-TEMOpen\n");
return1;
}
//----------------------------------------------------------------------------//
//TEMclose
//----------------------------------------------------------------------------//
BOOLTEM_Close(DWORDhOpenContext){
OutputDebugString(L"TEM-TEMClose\n");
returnTRUE;
}
//----------------------------------------------------------------------------//
//TEMread
//----------------------------------------------------------------------------//
DWORDTEM_Read(DWORDhOpenContext,LPVOIDpBuffer,DWORDCount){
TEMP();
memcpy(pBuffer,&g_Tem,Count);
return1;
}
//----------------------------------------------------------------------------//
//TEMwrite
//----------------------------------------------------------------------------//
DWORDTEM_Write(DWORDhOpenContext,LPCVOIDpBuffer,DWORDCount){
return1;
}
//----------------------------------------------------------------------------//
//TEMpowerup
//----------------------------------------------------------------------------//
VOIDTEM_PowerUp(DWORDhDeviceContext){
}
//----------------------------------------------------------------------------//
//TEMdown
//----------------------------------------------------------------------------//
VOIDTEM_PowerDown(DWORDhDeviceContext){
}
//----------------------------------------------------------------------------//
//TEMseek
//----------------------------------------------------------------------------//
DWORDTEM_Seek(DWORDhOpenContext,longAmount,DWORDType){
return0;
}

//----------------------------------------------------------------------------//
//TEMIOcontrol
//----------------------------------------------------------------------------//
BOOLTEM_IOControl(DWORDHandle,
DWORDdwIoControlCode,
PDWORDpInBuf,
DWORDnInBufSize,
PDWORDpOutBuf,
DWORDnOutBufSize,
PDWORDpBytesReturned){
returnTRUE;
}
应用程序:
//callc18b20liuqudongDlg.cpp:实现文件
//
#include"stdafx.h"
#include"callc18b20liuqudong.h"
#include"callc18b20liuqudongDlg.h"
#ifdef_DEBUG
#definenewDEBUG_NEW
#endif
//Ccallc18b20liuqudongDlg对话框
typedefstruct
{
intinteger;
intdecimal;
}TemHandle;
HANDLEhTem;
HANDLEhThread;
DWORDWINAPITemThread(PVOID);
Ccallc18b20liuqudongDlg::Ccallc18b20liuqudongDlg(CWnd*pParent/*=NULL*/)
:CDialog(Ccallc18b20liuqudongDlg::IDD,pParent)
{
m_hIcon=AfxGetApp()->LoadIcon(IDR_MAINFRAME);
}
voidCcallc18b20liuqudongDlg::DoDataExchange(CDataExchange*pDX)
{
CDialog::DoDataExchange(pDX);
}
BEGIN_MESSAGE_MAP(Ccallc18b20liuqudongDlg,CDialog)
#ifdefined(_DEVICE_RESOLUTION_AWARE)&&!defined(WIN32_PLATFORM_WFSP)
ON_WM_SIZE()
#endif
//}}AFX_MSG_MAP
END_MESSAGE_MAP()

//Ccallc18b20liuqudongDlg消息处理程序
BOOLCcallc18b20liuqudongDlg::OnInitDialog()
{
CDialog::OnInitDialog();
//设置此对话框的图标。当应用程序主窗口不是对话框时,框架将自动
//执行此操作
SetIcon(m_hIcon,TRUE);//设置大图标
SetIcon(m_hIcon,FALSE);//设置小图标
//TODO:在此添加额外的初始化代码
hTem=CreateFile(TEXT("TEM1:"),GENERIC_READ,0,NULL,OPEN_EXISTING,0,NULL);
if(hTem==INVALID_HANDLE_VALUE)
{
printf("can'topendevice\r\n");
returnFALSE;
}
else
{
printf("OpenTEM1\r\n");
}

hThread=CreateThread(NULL,0,TemThread,NULL,0,NULL);
returnTRUE;//除非将焦点设置到控件,否则返回TRUE
}
#ifdefined(_DEVICE_RESOLUTION_AWARE)&&!defined(WIN32_PLATFORM_WFSP)
voidCcallc18b20liuqudongDlg::OnSize(UINT/*nType*/,int/*cx*/,int/*cy*/)
{
DRA::RelayoutDialog(
AfxGetInstanceHandle(),
this->m_hWnd,
DRA::GetDisplayMode()!=DRA::Portrait?
MAKEINTRESOURCE(IDD_CALLC18B20LIUQUDONG_DIALOG_WIDE):
MAKEINTRESOURCE(IDD_CALLC18B20LIUQUDONG_DIALOG));
}
#endif
//----------------------------------------------------------------------------//
//TemperatureReadThread//
//----------------------------------------------------------------------------//
DWORDWINAPITemThread(PVOIDhdcMain)
{
DWORDdwBytesRead;
TemHandletemvalue;
chartempvalue[3];
CStringstr,str1,str2;
Ccallc18b20liuqudongDlg*pdlg=(Ccallc18b20liuqudongDlg*)(AfxGetApp()->m_pMainWnd);
//hAdcEvent=CreateEvent(NULL,TRUE,FALSE,_T("TE6410_ADC_read"));
while(1)
{
//WaitForSingleObject(hAdcEvent,INFINITE);
ReadFile(hTem,&temvalue,sizeof(TemHandle),&dwBytesRead,NULL);
str1.Format(_T("%d"),temvalue.integer);
str2.Format(_T("%d"),temvalue.decimal);
//str=str1+"."+str2+"℃";
str=str1;
str+=".";
str+=str2;
str+="℃";

pdlg->SetDlgItemTextW(IDC_EDIT1,str);
//printf("convalue=%d!!!!\n",convalue);
Sleep(500);
}
return0;
}

驱动程序就是用ads下的程序,不知道是不是wince在处理高时序的时候有问题啊?大家救命啊到底差在什么地方啊?
分 -->
回复

使用道具 举报

千问 | 2021-1-27 06:31:07 | 显示全部楼层
4095.93c和实际温度差多少,做个系数处理,然后换个实际温度,再试一下。
回复

使用道具 举报

千问 | 2021-1-27 06:31:07 | 显示全部楼层
和实际相差很远,4095.93c根本就不变,手摸探头不变,不受控制!我用的是wince5.0版本
回复

使用道具 举报

千问 | 2021-1-27 06:31:07 | 显示全部楼层
顶!怎么没有知道吗?
回复

使用道具 举报

千问 | 2021-1-27 06:31:07 | 显示全部楼层
顶!怎么没有知道吗?
回复

使用道具 举报

千问 | 2021-1-27 06:31:07 | 显示全部楼层
很简单,ds18b20对总线时序要求非常严格。ads下可理解为单线程,Delay_us函数延时准确;wince下为多线程,Delay_us延时不准确
回复

使用道具 举报

千问 | 2021-1-27 06:31:07 | 显示全部楼层
引用7楼zhsh_email的回复:很简单,ds18b20对总线时序要求非常严格。ads下可理解为单线程,Delay_us函数延时准确;wince下为多线程,Delay_us延时不准确
恩义改改延时的时间看看
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

主题

0

回帖

4882万

积分

论坛元老

Rank: 8Rank: 8

积分
48824836
热门排行