最近做板子采用新唐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
|