久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

標(biāo)題: STF15單片機(jī)關(guān)于一個(gè)延遲函數(shù)的問題 [打印本頁(yè)]

作者: dfk51    時(shí)間: 2020-12-16 00:23
標(biāo)題: STF15單片機(jī)關(guān)于一個(gè)延遲函數(shù)的問題
下面的程序使用了一個(gè)5ms的定時(shí)器,對(duì)變量sys_tick進(jìn)行了+1的操作.
程序的功能是使LED燈亮一秒,熄一秒.

目前程序運(yùn)行后,通過邏輯分析儀分析 P2_3的電平輸出,高低電平持續(xù)的時(shí)候大部分是準(zhǔn)時(shí)的,但是有時(shí)會(huì)少于1000ms,會(huì)出現(xiàn)800多ms,500多ms的情況.

如果每次延遲的時(shí)候去掉下面紅字部分的注釋則能正常.請(qǐng)問程序出現(xiàn)的問題在哪?

#include <stdint.h>
void Timer0Init(void) //5毫秒@11.0592MHz

{
    AUXR |= 0x80; //定時(shí)器時(shí)鐘1T模式
    TMOD &= 0xF0; //設(shè)置定時(shí)器模式
    TL0 = 0x00; //設(shè)置定時(shí)初值
    TH0 = 0x28; //設(shè)置定時(shí)初值
    TF0 = 0; //清除TF0標(biāo)志
    TR0 = 1; //定時(shí)器0開始計(jì)時(shí)
    ET0 = 1;
}

typedef uint32_t size_tick;


volatile size_tick sys_tick = 0;


void Timer0Int() __interrupt TF0_VECTOR
{
    ++sys_tick;
}



void Delay(uint16_t ms)
{
    size_tick tick_num = ms / 5;
    // sys_tick = 0; // 如果這行注釋去掉的話定時(shí)是正確的
    size_tick cur_tick = sys_tick;
    while (sys_tick - cur_tick < tick_num)
    {;}
}



void main()
{
    EA = 1; //開總中斷
    Timer0Init();
    while (1)
    {

        P2_3 = 0;
        Delay(1000);


        P2_3 = 1;
        Delay(1000);


    }
}


另外,我在每次延遲后通過串口輸出 sys_tick的值. 理論上 sys_tick每次輸出的值應(yīng)該是相隔200左右 ( 1000ms/5ms = 200 ).
但是總是在固定時(shí)候輸出是啊小于200的.
200
400
600
800
1000
1201
1402
1536
1737
1938
2048
2249
2450
2560
2761
2962
3072
3273
3474




作者: wulin    時(shí)間: 2020-12-16 00:23
dfk51 發(fā)表于 2020-12-16 19:16
STC15單片機(jī)

按你的思路給你改寫了,但通常不會(huì)有人這么寫延時(shí)函數(shù),浪費(fèi)資源。
  1. #include <STC15F2K60S2.H>
  2. sbit P2_3 = P2^3;
  3. bit flag=0;
  4. unsigned int num;

  5. void Timer0Init(void)                //1毫秒@11.0592MHz
  6. {
  7.         AUXR |= 0x80;                //定時(shí)器時(shí)鐘1T模式
  8.         TMOD &= 0xF0;                //設(shè)置定時(shí)器模式
  9.         TL0 = 0xCD;                //設(shè)置定時(shí)初值
  10.         TH0 = 0xD4;                //設(shè)置定時(shí)初值
  11.         TF0 = 0;                //清除TF0標(biāo)志
  12.         TR0 = 1;                //定時(shí)器0開始計(jì)時(shí)
  13.         ET0 = 1;                //開T0中斷
  14.         EA = 1;                 //開總中斷
  15. }

  16. void Timer0Int()interrupt 1
  17. {
  18.         if(flag==1 && num>0)
  19.                 num--;
  20. }

  21. void Delay(unsigned int ms)
  22. {
  23.         flag=1;
  24.         num=ms;
  25.         while(num);
  26.         flag=0;
  27. }

  28. void main()
  29. {
  30.         Timer0Init();
  31.         while(1)
  32.         {
  33.                 P2_3 = 0;
  34.                 Delay(1000);
  35.                 P2_3 = 1;
  36.                 Delay(1000);
  37.         }
  38. }
復(fù)制代碼

作者: 小牢頭    時(shí)間: 2020-12-16 13:59
你這程序里定時(shí)器啟動(dòng)后就一直在運(yùn)行,sys_tick是自動(dòng)變的,在不調(diào)用延時(shí)程序時(shí)都會(huì)變化,當(dāng)調(diào)用延時(shí)程序時(shí)如果不預(yù)先清0則sys_tick可能已經(jīng)被定時(shí)器程序增加到某一數(shù)值,當(dāng)然延時(shí)時(shí)間就不準(zhǔn)確了
作者: dfk51    時(shí)間: 2020-12-16 14:31
小牢頭 發(fā)表于 2020-12-16 13:59
你這程序里定時(shí)器啟動(dòng)后就一直在運(yùn)行,sys_tick是自動(dòng)變的,在不調(diào)用延時(shí)程序時(shí)都會(huì)變化,當(dāng)調(diào)用延時(shí)程序時(shí) ...

size_tick cur_tick = sys_tick;
while (sys_tick - cur_tick < tick_num)
{;}

這里的做延遲前是先取sys_tick sys_tick,在后再while循環(huán)里面中斷會(huì)不斷改sys_tick的前和之前的取值對(duì)比.
作者: wulin    時(shí)間: 2020-12-16 17:35
STF15單片機(jī),有這個(gè)型號(hào)的單片機(jī)?
作者: dfk51    時(shí)間: 2020-12-16 19:16
wulin 發(fā)表于 2020-12-16 17:35
STF15單片機(jī),有這個(gè)型號(hào)的單片機(jī)?

STC15單片機(jī)
作者: dfk51    時(shí)間: 2020-12-16 23:06
wulin 發(fā)表于 2020-12-16 21:21
按你的思路給你改寫了,但通常不會(huì)有人這么寫延時(shí)函數(shù),浪費(fèi)資源。

一直占用定時(shí)器確實(shí)不好.你的寫法是可行的.只是我想知道的是我貼出的程序問題出現(xiàn)在哪.因?yàn)槟康牟皇菍?shí)現(xiàn)功能,而是發(fā)現(xiàn)問題和解決問題
作者: dfk51    時(shí)間: 2020-12-16 23:07
想了很久,知道問題在哪了,是原子性的問題.




歡迎光臨 (http://www.zg4o1577.cn/bbs/) Powered by Discuz! X3.1
主站蜘蛛池模板: 成人精品 | 国产精品久久久久久久久久99 | 成人看片在线观看 | 在线免费观看黄网 | 成人av高清在线观看 | 国产精品国产三级国产aⅴ原创 | 99热首页 | 99久久久久久99国产精品免 | 天天躁日日躁xxxxaaaa | 精品一区二区三区四区 | www亚洲成人 | 亚洲色片网站 | 国产粉嫩尤物极品99综合精品 | 亚洲入口 | 亚洲成人一区二区三区 | 成人午夜影院 | 成人免费激情视频 | www视频在线观看 | 日日想夜夜操 | 一区欧美 | 国产 日韩 欧美 中文 在线播放 | 国产做a爱免费视频 | 久久久国产精品视频 | 天天色av| 日韩精品在线一区 | 成人免费视频7777777 | 国产精品av久久久久久毛片 | 国产成人精品一区二 | 97久久久久久 | 国产精品免费一区二区三区四区 | 黄片毛片在线观看 | 成人免费共享视频 | 91影视 | 成人在线免费观看视频 | 午夜视频一区二区三区 | 丁香婷婷成人 | 一二区成人影院电影网 | 久久剧场| 成人久久久| 免费高潮视频95在线观看网站 | 福利视频亚洲 |