初级会员

- 积分
- 145
- 金钱
- 145
- 注册时间
- 2015-4-18
- 在线时间
- 17 小时
|
发表于 2015-12-8 19:43:08
|
显示全部楼层
回复【10楼】正点原子:
---------------------------------
原子哥,我在UCOSIII上添加了DS18B20程序,用仿真器跟踪每一步都可以执行,但就是DS18B20的值为0.
也就是“mtemperature=DS18B20_Get_Temp(); ”这一步,mtemperature的值一直是0,换了传感器依然是0,但如果裸机跑的话,18B20工作正常
#include "led.h"
#include "delay.h"
#include "sys.h"
#include "usart.h"
#include "includes.h"
#include "can.h"
#include "beep.h"
#include "lcd.h"
#include "ds18b20.h"
#include "dht11.h"
#include "key.h"
/************************************************
ALIENTEK????STM32??·?°?UCOS???é
??4-1 UCOSIII UCOSIII????
?????§????www.openedv.com
??±??ê????http://eboard.taobao.com
??×????????????¨????????"??????×?"????·?????STM32×?????
?????????í??×?????????????
×÷??????????×? @ALIENTEK
************************************************/
//UCOSIII???????????????§???ò??????????ALIENTEK
//????????????·???????UCOSIII??5??????????????
//??????0??????·???·??????í???? OS_IntQTask()
//??????1???±?????????? OS_TickTask()
//??????2???¨?±???? OS_TmrTask()
//??????OS_CFG_PRIO_MAX-2?????????? OS_StatTask()
//??????OS_CFG_PRIO_MAX-1?????????? OS_IdleTask()
//?????§????www.openedv.com
//??±??ê????http://eboard.taobao.com
//?????????í??×?????????????
//×÷??????????×? @ALIENTEK
//????±???
short Stemp; //DS18B20??????
//short temperature; //DHT11??????
u8 Shumidity; //DHT11??????
//??????????
#define START_TASK_PRIO 3
//?????????ó??
#define START_STK_SIZE 512
//?????????é
OS_TCB StartTaskTCB;
//????????
CPU_STK START_TASK_STK[START_STK_SIZE];
//????????
void start_task(void *p_arg);
//??????????
#define CAN_TASK_PRIO 4
//?????????ó??
#define CAN_STK_SIZE 256
//?????????é
OS_TCB CANTaskTCB;
//????????
CPU_STK CAN_TASK_STK[CAN_STK_SIZE];
void CAN_task(void *p_arg);
//??????????
#define WARING_TASK_PRIO 5
//?????????ó??
#define WARING_STK_SIZE 128
//?????????é
OS_TCB WARINGTaskTCB;
//????????
CPU_STK WARING_TASK_STK[WARING_STK_SIZE];
//????????
void WARING_task(void *p_arg);
////??????????
//#define FLOAT_TASK_PRIO 6
////?????????ó??
//#define FLOAT_STK_SIZE 128
////?????????é
//OS_TCB FloatTaskTCB;
////????????
//__align(8) CPU_STK FLOAT_TASK_STK[FLOAT_STK_SIZE];
////????????
//void float_task(void *p_arg);
int main(void)
{
OS_ERR err;
CPU_SR_ALLOC();
delay_init(); //???±??????????
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);//?è????????????·?×é??×é2??2??????????????2???ì????????
uart_init(115200); //????????????115200
LED_Init(); //????????LED??????????????
LCD_Init(); //??????LCD
KEY_Init(); //°??ü??????
BEEP_Init(); //·??ù?÷??????
//??????CAN?¤×÷????
CAN_Mode_Init(CAN_SJW_1tq,CAN_BS2_8tq,CAN_BS1_9tq,4,CAN_Mode_LoopBack);//CAN???????·??????,?¨????500Kbps
OSInit(&err); //??????UCOSIII
OS_CRITICAL_ENTER();//??????????
//???¨????????
OSTaskCreate((OS_TCB * )&StartTaskTCB, //?????????é
(CPU_CHAR * )"start task", //??????×?
(OS_TASK_PTR )start_task, //????????
(void * )0, //????????????????????
(OS_PRIO )START_TASK_PRIO, //??????????
(CPU_STK * )&START_TASK_STK[0], //?????????ù???·
(CPU_STK_SIZE)START_STK_SIZE/10, //????????????????
(CPU_STK_SIZE)START_STK_SIZE, //?????????ó??
(OS_MSG_QTY )0, //??????????????????????????×??ó????????,??0?±????????????
(OS_TICK )0, //?±?????±??????×??±???±?????¤??????0?±???????¤????
(void * )0, //???§????????????
(OS_OPT )OS_OPT_TASK_STK_CHK|OS_OPT_TASK_STK_CLR, //????????
(OS_ERR * )&err); //??·????????í?ó?±??·?????
OS_CRITICAL_EXIT(); //??????????
OSStart(&err); //????UCOSIII
while(1);
}
//????????????
void start_task(void *p_arg)
{
OS_ERR err;
CPU_SR_ALLOC();
p_arg = p_arg;
CPU_Init();
#if OS_CFG_STAT_TASK_EN > 0u
OSStatTaskCPUUsageInit(&err); //????????
#endif
#ifdef CPU_CFG_INT_DIS_MEAS_EN //????????????????????±??±??
CPU_IntDisMeasMaxCurReset();
#endif
#if OS_CFG_SCHED_ROUND_ROBIN_EN //?±?????±??????×????±?ò
//?????±??????×??÷??????,?±?????¤????1???????±??????????1*5=5ms
OSSchedRoundRobinCfg(DEF_ENABLED,1,&err);
#endif
OS_CRITICAL_ENTER(); //??????????
//???¨LED0????
OSTaskCreate((OS_TCB * )&CANTaskTCB,
(CPU_CHAR * )"CAN task",
(OS_TASK_PTR )CAN_task,
(void * )0,
(OS_PRIO )CAN_TASK_PRIO,
(CPU_STK * )&CAN_TASK_STK[0],
(CPU_STK_SIZE)CAN_STK_SIZE/10,
(CPU_STK_SIZE)CAN_STK_SIZE,
(OS_MSG_QTY )0,
(OS_TICK )0,
(void * )0,
(OS_OPT )OS_OPT_TASK_STK_CHK|OS_OPT_TASK_STK_CLR,
(OS_ERR * )&err);
//???¨WARING????
OSTaskCreate((OS_TCB * )&WARINGTaskTCB,
(CPU_CHAR * )"WARING task",
(OS_TASK_PTR )WARING_task,
(void * )0,
(OS_PRIO )WARING_TASK_PRIO,
(CPU_STK * )&WARING_TASK_STK[0],
(CPU_STK_SIZE)WARING_STK_SIZE/10,
(CPU_STK_SIZE)WARING_STK_SIZE,
(OS_MSG_QTY )0,
(OS_TICK )0,
(void * )0,
(OS_OPT )OS_OPT_TASK_STK_CHK|OS_OPT_TASK_STK_CLR,
(OS_ERR * )&err);
// //???¨????????????
// OSTaskCreate((OS_TCB * )&FloatTaskTCB,
// (CPU_CHAR * )"float test task",
// (OS_TASK_PTR )float_task,
// (void * )0,
// (OS_PRIO )FLOAT_TASK_PRIO,
// (CPU_STK * )&FLOAT_TASK_STK[0],
// (CPU_STK_SIZE)FLOAT_STK_SIZE/10,
// (CPU_STK_SIZE)FLOAT_STK_SIZE,
// (OS_MSG_QTY )0,
// (OS_TICK )0,
// (void * )0,
// (OS_OPT )OS_OPT_TASK_STK_CHK|OS_OPT_TASK_STK_CLR,
// (OS_ERR * )&err);
OS_TaskSuspend((OS_TCB*)&StartTaskTCB,&err); //????????????
OS_CRITICAL_EXIT(); //??????????
}
//CAN????????
void CAN_task(void *p_arg)
{
OS_ERR err;
short mtemperature;
u8 key;
short temperature;
u8 humidity;
u8 define;
u8 snum=0;
u8 rnum=0;
u8 t=0;
u8 cnt=0;
u8 canbuf[8];
u8 res;
u8 mode=CAN_Mode_LoopBack;//CAN?¤×÷????;CAN_Mode_Normal(0)?????¨??????CAN_Mode_LoopBack(1)???·??????
POINT_COLOR=DARKBLUE;//?è??×??????ì??
LCD_ShowString(30,30,200,16,16,"CAN AND DS18B20");
LCD_ShowString(30,50,200,16,16,"KEY0:Send WK_UP:Mode");//?????á??????
LCD_ShowString(30,90,200,16,16,"Send Data Count:"); //?á??·???????,?°·???????
LCD_ShowString(30,110,200,16,16,"DS18B20: . C"); //·???????????
POINT_COLOR=BLACK;
LCD_ShowString(30,170,200,16,16,"Receive Data Count:"); //?á??????????????,?°????????
LCD_ShowString(30,190,200,16,16,"Receive DS18b20: . C");
LCD_ShowString(30,230,200,16,16,"Receive DHT11: C");
LCD_ShowString(30,250,200,16,16,"Receive DHT11: %");
POINT_COLOR=RED;
//DS18B20??????
while(DS18B20_Init())
{
LCD_ShowString(30,70,200,16,16,"DS18B20 Check Error");
delay_ms(200);
LCD_Fill(92,10,239,10+16,WHITE);
delay_ms(200);
}
LCD_ShowString(30,70,200,16,16,"DS18B20 Check OK");
while(1)
{
key=KEY_Scan(0);
//DS18B20????????
if(t%10==0) //??100ms????????
{
POINT_COLOR=GREEN;
mtemperature=DS18B20_Get_Temp();
if(mtemperature<0)
{
LCD_ShowChar(30+8*8,110,'-',16,0); //????????
mtemperature=-mtemperature; //×???????
}else LCD_ShowChar(30+8*8,110,' ',16,0); //????????
LCD_ShowNum(30+9*8,110,mtemperature/10,2,16); //??????????·?
LCD_ShowNum(30+9*8+32,110,mtemperature%10,1,16); //??????????·?
}
//·??????? key==KEY0_PRESS
if(cnt==40)//KEY0°???,·???????????
{
cnt=0;
POINT_COLOR=LBBLUE;
snum+=1;
LCD_ShowNum(30+16*8,90,snum,3,16);
canbuf[1]=mtemperature;//????·?????????
canbuf[0]=1; //??±????? 1 is DS18B20,2 is DHT11
canbuf[2]=0;
res=Can_Send_Msg(canbuf,3);//·???8??×???
POINT_COLOR= BRRED;
if(res)LCD_ShowString(30,130,200,16,16,"DS18B20 Send Data Err"); //?á??·????§°?
else LCD_ShowString(30,130,200,16,16,"DS18B20 Send Data Ok"); //?á??·???????
}
//????CAN?¤×÷????
if(key==KEYUP_PRESS)//WK_UP°???????±?CAN???¤×÷????
{
mode=!mode;
CAN_Mode_Init(CAN_SJW_1tq,CAN_BS2_8tq,CAN_BS1_9tq,4,mode);//CAN???¨??????????, ?¨????500Kbps
POINT_COLOR=RED;//?è??×??????ì??
if(mode==0)//???¨???????è??2????·?°?
{
LCD_ShowString(60,10,200,16,16,"Nnormal Mode ");
}else //???·????,??????·?°?????????????.
{
LCD_ShowString(60,10,200,16,16,"LoopBack Mode");
}
}
//????????
key=Can_Receive_Msg(canbuf);
if(key)//????????????
{
POINT_COLOR=BLUE;//?è??×?????????
rnum+=1;
LCD_ShowNum(30+19*8,170,rnum,3,16);
temperature=canbuf[1];
define=canbuf[0];
humidity=canbuf[2];
POINT_COLOR=GREEN;
//??????DS18B20????
if(define==1)
{
LCD_ShowString(30,210,200,16,16,"DS18B20 Receive Data ok");
LCD_Fill(30+16*8,190,30+16*8+3*8,190+16,WHITE);//???????°??????
if(temperature<0)
{
LCD_ShowChar(30+16*8,190,'-',16,0); //????????
temperature=-temperature; //×???????
}else LCD_ShowChar(30+16*8,190,' ',16,0); //????????
LCD_ShowNum(30+17*8,190,temperature/10,2,16); //??????????·?
LCD_ShowNum(30+17*8+32,190,temperature%10,1,16); //??????????·?
LCD_ShowString(30,270,200,16,16,"DHT111 is Lost ");
LCD_ShowNum(30+14*8,230,000,3,16); //????????
LCD_ShowNum(30+14*8,250,000,3,16); //????????
}
//??????DHT11????
else if(define==2)
{
POINT_COLOR=BROWN;
LCD_ShowString(30,270,200,16,16,"DHT11 Receive Data ok ");
LCD_ShowNum(30+14*8,230,temperature,3,16); //????????
LCD_ShowNum(30+14*8,250,humidity,3,16); //????????
LCD_ShowNum(30+17*8,190,000,2,16); //??????????·?
LCD_ShowNum(30+17*8+32,190,000,1,16); //??????????·?
LCD_ShowString(30,210,200,16,16,"DS18B20 is Lost ");
}
}
t++;
OSTimeDlyHMSM(0,0,0,10,OS_OPT_TIME_HMSM_STRICT,&err); //???±10ms
if(t==20)
{
LED0=!LED0;//?á??????????????
t=0;
cnt++;
}
}
}
////WARING????????
void WARING_task(void *p_arg)
{
OS_ERR err;
p_arg = p_arg;
while(1)
{
//DS18B20?????ó??23??,·??ù?÷±¨??
if(Stemp/10>25)
{
OSTimeDlyHMSM(0,0,0,800,OS_OPT_TIME_HMSM_STRICT,&err); //???±800ms
BEEP=1;
OSTimeDlyHMSM(0,0,0,100,OS_OPT_TIME_HMSM_STRICT,&err); //???±100ms
BEEP=0;
}else BEEP=0;
// ????????DHT11???????ó??73%??LED1????±¨??
if(Shumidity>73)
{
OSTimeDlyHMSM(0,0,0,700,OS_OPT_TIME_HMSM_STRICT,&err); //???±700ms
LED1=0;
OSTimeDlyHMSM(0,0,0,100,OS_OPT_TIME_HMSM_STRICT,&err); //???±100ms
LED1=1;
}else LED1=1;
OSTimeDlyHMSM(0,0,0,500,OS_OPT_TIME_HMSM_STRICT,&err); //???±500ms
}
} |
|