欧美极品高清xxxxhd,国产日产欧美最新,无码AV国产东京热AV无码,国产精品人与动性XXX,国产传媒亚洲综合一区二区,四库影院永久国产精品,毛片免费免费高清视频,福利所导航夜趣136

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 1889|回復: 9
打印 上一主題 下一主題
收起左側

STC8H1K16單片機定時器2不是能夠很穩定的進入中斷,大概是什么原因導致的?

[復制鏈接]
跳轉到指定樓層
樓主
ID:1072390 發表于 2023-4-18 09:06 | 只看該作者 回帖獎勵 |倒序瀏覽 |閱讀模式
int main(void)
{
        uint16 ticker = 0;
        P_SW2 |= 0x80;                    //使能訪問 XFR特殊寄存器
        GPIO_Init();
        UART_Init();
        SPI_Init();
        Timer2_Init();
        LCD_Init();
//        WDT_CONTR = 0x24;      //使能看門狗,溢出時間約為1s
        ticker = Timer_count;
        EA = 1;                            //允許中斷
        while(1)
        {
//                WDT_CONTR = 0x34;  //清看門狗,否則系統復位
                if(ticker != Timer_count)
                {
                        ticker = Timer_count;
                        Vk1621_Data_Exch();//數據處理
                        Key_Schedule(); //按鍵處理
                }
        }         
}
void Timer2_Init(void)
{
        AUXR |= 0x04;                        //定時器時鐘1T模式 16位自動重載
        T2L = 0xdf;                        //設置定時初始值
        T2H = 0xff;                        //設置定時初始值
        AUXR |= 0x10;                        //定時器2開始計時
//        INT_CLKO |=0x04;        //使能P13定時器輸出功能
        IE2 |= 0x04;            //使能定時器中斷
}


void TM2_Isr() interrupt 12
{
           count++;//1微秒計數
        if(!(count%1000))      
        {
                Timer_count++;//毫秒計數
                UART_SendChar(Timer_count);//測試數據        
        }
        
}

void SPI_Transivion (void) interrupt SPI_VECTOR
{
        SPSTAT = SPIF + WCOL;        //清0 SPIF和WCOL標志
        if(SPI_RxCnt >= SPI_BUF_LENTH)
        {
                SPI_RxCnt = 0;
        }
        SPI_RxBuffer[SPI_RxCnt] = SPDAT;
        if(SPI_RxBuffer[SPI_RxCnt] == 0x20)
        {
                SPI_RxCnt = 0;
        }
        else
        {
                SPI_RxCnt++;
        }
        SPDAT = Key_Information.KeyData;
        SPI_RxTimerOut = 5;        
}



分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏 分享淘帖 頂 踩
回復

使用道具 舉報

沙發
ID:540903 發表于 2023-4-18 09:43 | 只看該作者
可能原因是定時器2中斷處理函數(TM2_Isr)存在太多的代碼,以至于中斷處理時間過長,導致中斷不穩定。在中斷處理函數中,每次進入中斷都會累加一個計數器(count),并且在計數器達到1000時,會遞增一個毫秒計數器(Timer_count)并發送測試數據到串口。這些操作可能會占用大量的處理時間,并造成中斷處理時間過長
回復

使用道具 舉報

板凳
ID:491577 發表于 2023-4-18 10:11 | 只看該作者
定時器時間太短,中斷程序還沒有處理完下一個中斷又到了,1us中斷太短。
回復

使用道具 舉報

地板
ID:1065084 發表于 2023-4-18 10:50 | 只看該作者
1.硬件條件沒寫清楚:主頻、外設、軟件功能
2.代碼不全,關鍵代碼看不到

以下為猜測答案:
猜測定時器定時為1us。假設串口波特率為115200,串口一個字節為86us,由于沒有展示串口發送部分代碼,如果是查詢機制,那定時器實際實際觸發時間會略大于86us。如果是中斷機制,會因為中斷設置的不同等級發生不同的變化,代碼都不能正常運行。

所以只要將定時器設置為1ms一次,去掉 if(!(count%1000)) ,代碼就可以運行
回復

使用道具 舉報

5#
ID:1034262 發表于 2023-4-18 11:07 | 只看該作者
中斷間隔33個時鐘,太少了,根本忙不過來啊,中斷要入棧、跳轉,執行用戶代碼,出棧,返回,33個時鐘太少了,還沒處理完,又一個中斷來了,就亂了。
回復

使用道具 舉報

6#
ID:1072390 發表于 2023-4-18 11:50 | 只看該作者
coody_sz 發表于 2023-4-18 11:07
中斷間隔33個時鐘,太少了,根本忙不過來啊,中斷要入棧、跳轉,執行用戶代碼,出棧,返回,33個時鐘太少了 ...

主頻33.1776M,使用了定時器2定時1us,確實是定時時間太短了,感謝大佬
回復

使用道具 舉報

7#
ID:1072390 發表于 2023-4-18 11:51 | 只看該作者
hhh402 發表于 2023-4-18 10:11
定時器時間太短,中斷程序還沒有處理完下一個中斷又到了,1us中斷太短。

已經查出問題了,感謝指點
回復

使用道具 舉報

8#
ID:1072390 發表于 2023-4-18 11:53 | 只看該作者
yuxuesuixing 發表于 2023-4-18 10:50
1.硬件條件沒寫清楚:主頻、外設、軟件功能
2.代碼不全,關鍵代碼看不到

主頻33.1776M,外設定時器2定時1us,SIP從機模式中斷接收和發送,串口115200波特率查詢發送的
回復

使用道具 舉報

9#
ID:1072390 發表于 2023-4-18 11:54 | 只看該作者
yuxuesuixing 發表于 2023-4-18 10:50
1.硬件條件沒寫清楚:主頻、外設、軟件功能
2.代碼不全,關鍵代碼看不到

感謝大佬指點
回復

使用道具 舉報

10#
ID:57657 發表于 2023-4-18 12:02 | 只看該作者
sbit test= P3^2; //用示波器或邏輯分析儀抓取,提高晶振頻率使高電平脈寬小于1微秒即可
void TM2_Isr() interrupt 12
{
test=1;
           count++;//1微秒計數
        if(!(count%1000))      
        {
                Timer_count++;//毫秒計數
                UART_SendChar(Timer_count);//測試數據      
        }
       test=0;
}
回復

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規則

小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術交流QQ群281945664

Powered by 單片機教程網

快速回復 返回頂部 返回列表