久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费
標題:
KEIL RTX51_TINY仿真無法使用單片機T2定時器的解決方法
[打印本頁]
作者:
太空將軍
時間:
2021-12-21 11:38
標題:
KEIL RTX51_TINY仿真無法使用單片機T2定時器的解決方法
最近做板子采用新唐N79E814,由于功能多而繁雜,我決定采用RTX51_TINY (2.02版)作為RTOS系統
由于仿真調試確實方便,所以沒有下載到板子上觀察,使用T1定時器時,仿真沒有問題(T0被RTOS使用)
當我使用定時器2時,發現定時器2的中斷,無論怎么都進不去,接下來花了一天排查各種可能的人為錯誤
經過排查,我堅信,除了給老婆認錯之外(調代碼把老婆丟一邊),我是不可能向代碼認錯的
發現使用KEIL仿真邏輯分析儀波形顯示如下
波形.png
(55.99 KB, 下載次數: 89)
下載附件
2021-12-21 12:03 上傳
定時器T2的EIE寄存器的ET2(開T2中斷)這個位,置1了,但是邏輯分析儀顯示為0,所以,應該是不支持T2的仿真好吧,下載到板子上試一下~~單片機代碼如下:
#include <stdio.h>
#include <rtx51tny.h>
#include "N79E81x.h"
#include "Typedef.h"
#include "Define.h"
#include "LOGIC.h"
/*重要說明**本程序使用N79E814A內部11.0592M*/
/*重要說明**本程序使用N79E814A內部11.0592M*/
//Conf_tny.A51中INT_CLOCK 設置為 9216 正好是 100HZ滴答 時間片是10ms
//Conf_tny.A51中TIMESHARING 設置為0時,輪換執行各任務
//Conf_tny.A51中TIMESHARING 設置為1時,每個任務分得10ms
//Conf_tny.A51中TIMESHARING 設置為2時,每個任務分得20ms
/*因為我自己使用信號來驅動事件,所以TIMESHARING我設置為0*/
/**********************************************************************************/
/* Struct init & I/O init: */
/**********************************************************************************/
struct time ctime = { 12, 0, 0 }; /* storage for clock values */
/***********************************************************************************/
/* Task 0 'init': Initialize */
/***********************************************************************************/
void init (void) _task_ INIT { /* program execution starts here */
ET2 = 1; //開T2中斷使能,EA受到RTOS控制,不用寫EA = 1
os_create_task (CLOCK); /* create clock 1 task */
os_create_task (KEYREAD); /* create key 2 task */
//os_create_task (BUZZOUT); /* create key 2 task */
os_delete_task (INIT); /* del init task (no longer needed) */
}
/***********************************************************************************/
/* Task 1 'clock' @1HZ */
/***********************************************************************************/
void clock (void) _task_ CLOCK {
while (1) { /* loop */
if (++ctime.sec == 60) { /* calculate the second */
ctime.sec = 0;
if (++ctime.min == 60) { /* calculate the minute */
ctime.min = 0;
if (++ctime.hour == 24) { /* calculate the hour */
ctime.hour = 0;
}
}
}
os_wait (K_IVL, 100, 0); /* wait interval: 1 second */
P06 = ~P06; //每秒反轉一次
TF2 = 1; //每秒置位一次T2中斷標志,進入T2中斷
}
}
/***********************************************************************************/
/* Task 2 'keyread': process key from push button or EC12 */
/***********************************************************************************/
struct PressedReg PressedReg = {0,0,0,0,0}; /* 按鍵被按下的次數 */
void keyread (void) _task_ KEYREAD {
UINT8 Count;
BIT Keys_in;
while (1) { /* loop */
Count = 0; /* 10 ms interrupt count */
do
{
os_wait(K_TMO, 1, 0); //os_wait()用于把CPU交給其它任務使用
} while (!Any_KeyPressed);
os_wait(K_TMO,1,0);
do
{
if(Any_KeyPressed&&Keys_in == UnLock)
{
Count = 0;
Keys_in = Locked;
//os_send_signal (BUZZOUT); /* signal to task BUZZOUT: Any_KeyPressed */
os_wait (K_TMO, 1, 0); /* 10ms 消抖 */
if(key1_pressed)
{
PressedReg.key1 ++;
}
if (key2_pressed)
{
PressedReg.key2 ++;
}
if (key3_pressed)
{
PressedReg.key3 ++;
}
if (EC12_key_pressed)
{
PressedReg.EC12_key ++;
}
}
else
{
os_wait (K_TMO, 1, 0);
Count ++;
}
if (All_KeyIdle)
{
Keys_in = UnLock;
Count ++;
os_wait (K_TMO, 1, 0);
}
//你可以更改 100為150,表示1500ms內檢測按下次數
} while (Count<=100); //檢測1000ms內按下多少次,可以響應單擊,雙擊,三擊,四擊,五擊。。。等
if(key1_pressed&&PressedReg.key1==SingleClick) /* 單擊且1秒后還沒放手就是長按*/
{
PressedReg.key1 = LongPressed;
//os_send_signal (BUZZOUT);
}
if (key2_pressed&&PressedReg.key2==SingleClick)
{
PressedReg.key2 = LongPressed;
//os_send_signal (BUZZOUT);
}
if (key3_pressed&&PressedReg.key3==SingleClick)
{
PressedReg.key3 = LongPressed;
//os_send_signal (BUZZOUT);
}
if (EC12_key_pressed&&PressedReg.EC12_key==SingleClick)
{
PressedReg.EC12_key = LongPressed;
//os_send_signal (BUZZOUT); /* signal to task BUZZOUT: Any_KeylongPressed 按下1秒又響了就是長按 */
}
if(
PressedReg.key1 != 0 || \
PressedReg.key2 != 0 || \
PressedReg.key3 != 0 || \
PressedReg.EC12_key != 0 \
)
{
//如果按鍵單擊,雙擊,三擊,四擊,長按,執行此處代碼,或者有按鍵動作,就發送信號給your_TASK
//os_send_signal (your_TASK); /* signal to task Logic: Any_KeyPressed */
}
PressedReg.key1 = 0;
PressedReg.key2 = 0;
PressedReg.key3 = 0;
PressedReg.EC12_key = 0;
}
}
/***********************************************************************************/
/* T2 中斷函數 */
/***********************************************************************************/
void Timer2_ISR(void) interrupt 5 // Vecotr @ 0x2B
{
P07 = ~P07; //反轉LED,使得LED閃爍
TF2 = 0; //清除T2中斷標志
}
/***********************************************************************************/
/* Task 4 'buzzout'蜂鳴器: process buzz from push button or warning */
/***********************************************************************************/
void buzzout (void) _task_ BUZZOUT {
while (1) { /* endless loop */
os_wait(K_SIG,0,0); /* 等待按鍵任務發來信號*/
/* your code PWM開 */
//os_wait(K_TMO,10,0); //讓PWM開100ms,os_wait()不會像delay()函數死死的占用CPU時間,
/* your code PWM關 */
os_switch_task(); /* 把時間交給其它任務 */
}
}
復制代碼
電路.png
(20.45 KB, 下載次數: 78)
下載附件
2021-12-21 12:03 上傳
結果就是,仿真不行,但是實際燒錄運行后,能進入Timer 2 中斷:P06每秒反轉表示正在運行,P07發生翻轉表明進入了中斷
本試驗只用到了task CLOCK和中斷,按鍵部分的代碼只是分享出來,萬一你用得著呢~~~
完整代碼請下載
N79E814.zip
(79.13 KB, 下載次數: 12)
2021-12-21 11:38 上傳
點擊文件名下載附件
下載積分: 黑幣 -5
歡迎光臨 (http://www.zg4o1577.cn/bbs/)
Powered by Discuz! X3.1
主站蜘蛛池模板:
蜜桃视频一区二区三区
|
精品欧美一区免费观看α√
|
国产成人高清视频
|
在线观看成人
|
四虎影院免费在线
|
一级黄片一级毛片
|
亚洲日韩中文字幕一区
|
久热免费在线
|
男女羞羞视频在线免费观看
|
国产免费一区二区
|
二区欧美
|
91精品国产乱码麻豆白嫩
|
精品国产一区二区国模嫣然
|
欧美精品网站
|
亚洲第一区国产精品
|
亚洲国产一区在线
|
国产精品国产a级
|
精品国产乱码久久久久久a丨
|
国产精品久久久久久久久污网站
|
国产91精品久久久久久久网曝门
|
真人毛片
|
老司机狠狠爱
|
国产精品自拍视频
|
欧美国产精品
|
一区二区视频在线观看
|
欧美福利
|
国产亚洲二区
|
国产福利在线
|
久草网在线视频
|
98成人网
|
国产成人区
|
激情久久av一区av二区av三区
|
黄一区二区三区
|
亚洲欧美中文日韩在线v日本
|
亚洲免费在线视频
|
亚洲国产日本
|
成人毛片在线观看
|
黄色一级毛片免费看
|
成人午夜黄色
|
日韩中文字幕视频
|
亚洲视频在线一区
|