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

 找回密碼
 立即注冊(cè)

QQ登錄

只需一步,快速開(kāi)始

搜索
查看: 2434|回復(fù): 10
打印 上一主題 下一主題
收起左側(cè)

stc15W105單片機(jī)怎么最快將DI口數(shù)據(jù)賦給DO口?

[復(fù)制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
問(wèn)題:DI口輸入一組400*24bit的數(shù)據(jù),如何使用單片機(jī)實(shí)現(xiàn):前40*24bit的數(shù)據(jù)不接收,剩下的數(shù)據(jù)全部轉(zhuǎn)給DO口輸出,并保證輸出數(shù)據(jù)的準(zhǔn)確性,不亂碼。輸入數(shù)據(jù)0碼高電平時(shí)間為300ns左右。


已嘗試方法:
使用單片機(jī)型號(hào)為stc15W105


#include <IAP15F105W.h>/**
  * @Brief  IO口初始化
  * @param  null
  * @retval null
  */
sbit DI = P3^2;
sbit DO = P3^3;
void IO_Init(void)
{
        P3M0 |= 0x08;        //P33設(shè)置成推挽輸出
        P3M1 &= 0xF7;
      
        P3M1 |= 0x04;        //P32設(shè)置成高阻輸入
        P3M0 &= 0xFB;
        DO=0;


        //把P32腳設(shè)置為下降沿觸發(fā)方式
        //P32是外部中斷0輸入腳
        IT0 = 1;        //外部中斷0觸發(fā)方式,=1下降沿觸發(fā),=0雙邊沿觸發(fā)
        EX0 = 1;        //允許外部中斷0中斷
}
bit flag;
unsigned int count;//定時(shí)器計(jì)數(shù)值

void main(void)
{
      
        count=0;
        IO_Init();    //初始化
        EA = 1;       //開(kāi)中斷
        while(1)
        {
         if(flag)     //當(dāng)過(guò)了20*24bit之后,輸出等于輸入
         {
                 DO = DI;
         }      
                ;
  }
}
      
      
void Int0_Routine(void)   interrupt 0  //外部中斷0服務(wù)函數(shù)
        {
                if(DI ==1)
                {
                        DO =1;
                }
                else
                {
                        DO=0;
                }
                if(count<960)
                {
                count++;
                }else
                {
                        flag=1;
                }
                TR0=0;
        }
      

void Timer0_Routine(void)   interrupt 1  //定時(shí)器0中斷服務(wù)函數(shù)
        {
                count = 0;
                flag=0;
        }  
     
發(fā)現(xiàn)處理速度過(guò)慢,導(dǎo)致輸出數(shù)據(jù)0碼高電平時(shí)間達(dá)到us級(jí),全被判為1碼
嘗試過(guò)不進(jìn)行計(jì)數(shù),直接將DO=DI,使DI口所有數(shù)據(jù)全部轉(zhuǎn)發(fā),發(fā)現(xiàn)一部分0碼數(shù)據(jù)的高電平時(shí)間仍達(dá)到了600ns,導(dǎo)致亂碼。

希望有大佬能幫忙解答
分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏 分享淘帖 頂 踩
回復(fù)

使用道具 舉報(bào)

沙發(fā)
ID:688692 發(fā)表于 2022-4-3 00:09 | 只看該作者
這個(gè)是做WS2812的驅(qū)動(dòng)的吧。單片機(jī)指令周期都一兩百ns了,用程序來(lái)處理肯定來(lái)不及了。數(shù)據(jù)400個(gè)一組也就是1.2kb,先存下來(lái)再轉(zhuǎn)發(fā)內(nèi)存也不夠用。不借助外部硬件恐怕是難。你程序直接中轉(zhuǎn)都達(dá)到600ns的原因是因?yàn)檠h(huán)跳轉(zhuǎn)和中斷出入的代碼。單單MOVE bit指令也要3個(gè)周期,就算跑到33MHZ也要100ns所以純軟件是不夠的。

其實(shí)外部借助兩顆二極管就可以了,做個(gè)簡(jiǎn)易的與門(mén)。收到前期bit后開(kāi)通這個(gè)與門(mén),這樣信號(hào)就能通過(guò)這個(gè)與門(mén)向后傳遞。也就沒(méi)有速度上的問(wèn)題了,4148處理1MHz這樣的信號(hào)問(wèn)題還是不大的。
回復(fù)

使用道具 舉報(bào)

板凳
ID:624769 發(fā)表于 2022-4-4 00:31 | 只看該作者
把  DI 定在  P3.0  DO定在 P3.1, 通過(guò):
CLK_DIV  |=  0x10;
可以直接在 DO 輸出 DI 的電平,無(wú)需中斷,無(wú)需任何其他代碼,幾乎沒(méi)有延時(shí)。
至于你之前說(shuō)的計(jì)數(shù),可以通過(guò) 外部中斷  EX4  進(jìn)行計(jì)數(shù)
來(lái)控制打開(kāi)DO輸出:CLK_DIV  |=  0x10;  
還是關(guān)閉DO輸出: CLK_DIV  &=  0xEF;
回復(fù)

使用道具 舉報(bào)

地板
ID:1015222 發(fā)表于 2022-4-6 15:30 | 只看該作者
188610329 發(fā)表于 2022-4-4 00:31
把  DI 定在  P3.0  DO定在 P3.1, 通過(guò):
CLK_DIV  |=  0x10;
可以直接在 DO 輸出 DI 的電平,無(wú)需中斷, ...

把DI定在p3.0口后發(fā)現(xiàn)輸入數(shù)據(jù)的電平被拉低且會(huì)使數(shù)據(jù)碼混亂,導(dǎo)致整體不受控,這是什么原因....
回復(fù)

使用道具 舉報(bào)

5#
ID:624769 發(fā)表于 2022-4-7 01:00 | 只看該作者
以夢(mèng)為舟 發(fā)表于 2022-4-6 15:30
把DI定在p3.0口后發(fā)現(xiàn)輸入數(shù)據(jù)的電平被拉低且會(huì)使數(shù)據(jù)碼混亂,導(dǎo)致整體不受控,這是什么原因....

設(shè)置 CLK_DIV |= 0x10;  之后,
P3.1 是 無(wú)縫輸出 P3.0 電平的,這個(gè)過(guò)程類(lèi)似于中繼功能是不會(huì)有任何差錯(cuò)的(硬件電路問(wèn)題除外)。檢查一下你的外部電路,比如,下載電路是否有斷開(kāi)等等。
作為你的問(wèn)題“怎么最快將DI口數(shù)據(jù)賦給DO口?”  就你這個(gè)單片機(jī)而言,這個(gè)方法應(yīng)該是最快的了,沒(méi)有之一。

至于,你說(shuō)的“輸入數(shù)據(jù)的電平被拉低且會(huì)使數(shù)據(jù)碼混亂” 我不太理解, 粗看你貼的代碼, 也沒(méi)看出你程序的運(yùn)行原理,
比如:
1)你 外部中斷設(shè)定的是 下降沿觸發(fā),換句話(huà)說(shuō)只能 DI == 0 的瞬間才觸發(fā),你中斷里卻判斷 DI == 1 還是0。 個(gè)人認(rèn)為這是毫無(wú)意義的行為。
2)雖然你寫(xiě)了定時(shí)期中斷, 但是只看到 TR0 = 0 沒(méi)看到 TR0 =1, 感覺(jué) count = 0 這個(gè)操作,對(duì) 外部中斷沒(méi)有任何實(shí)際作用, 分析不出你貼著兩段代碼的目的。

最后,你解碼必定要有一個(gè)接收解析過(guò)程吧? 按你說(shuō)的時(shí)序要求,這個(gè)解碼,或者解析需要嚴(yán)格時(shí)間控制的吧? 也沒(méi)看你在定時(shí)器里面解碼,所以,諸多不解,看你有什么補(bǔ)充說(shuō)明再說(shuō)吧。
回復(fù)

使用道具 舉報(bào)

6#
ID:1015222 發(fā)表于 2022-4-8 17:00 | 只看該作者
188610329 發(fā)表于 2022-4-7 01:00
設(shè)置 CLK_DIV |= 0x10;  之后,
P3.1 是 無(wú)縫輸出 P3.0 電平的,這個(gè)過(guò)程類(lèi)似于中繼功能是不會(huì)有任何差錯(cuò) ...

不要求解碼,只要轉(zhuǎn)發(fā)就行。前面代碼有的忘注釋掉了,其實(shí)就是想表達(dá)直接用 DO=DI行不通,加上計(jì)數(shù)之后就更加不行了。
以下是我根據(jù)您說(shuō)的方式寫(xiě)的代碼:
#include <IAP15F105W.h>
/**
  * @brief  IO口初始化
  * @param  null
  * @retval null
  */
//sbit DI = P3^0;
//sbit DO = P3^1;

bit flag;
unsigned int count;//外部中斷4計(jì)數(shù)值
void timer0Init(void)                //300微秒@33.1776MHz
{
        AUXR &= 0x7F;                //定時(shí)器時(shí)鐘12T模式
        TMOD &= 0xF0;                //設(shè)置定時(shí)器模式
        TL0 = 0xC3;                //設(shè)置定時(shí)初值
        TH0 = 0xFC;                //設(shè)置定時(shí)初值
        TF0 = 0;                //清除TF0標(biāo)志
        TR0 = 1;                //定時(shí)器0開(kāi)始計(jì)時(shí)
}

void main(void)
{
//        P3M0 &= 0XFE;
//        P3M1 |= 0X01;
        CLK_DIV  &=  0xEF;
        count = 0;
  EA=1;
        ET0=1;
        INT_CLKO |= 0x40;
        flag=0;
        while(1)
        {
                if(flag)
                {
                        CLK_DIV  |=  0x10;
                }
        }
}
void int4_Routine(void) interrupt 16
{
        count++;
        if(count>480)
        {
                flag=1;
        }
        TR0=0;
  timer0Init();      //計(jì)時(shí)300us則復(fù)位
}

void Timer0_Routine(void)   interrupt 1  //定時(shí)器0中斷服務(wù)函數(shù)
        {
           count = 0;
           flag=0;
        }


根據(jù)這個(gè)代碼可以實(shí)現(xiàn)全部轉(zhuǎn)發(fā)不亂碼,但是計(jì)數(shù)沒(méi)有起作用即不能做到前20*24bit不接收,只能做到全部轉(zhuǎn)發(fā)。


以上是DI與DO的波形圖,兩者完全相同。不知道是我的代碼有誤還是什么原因。。。
回復(fù)

使用道具 舉報(bào)

7#
ID:624769 發(fā)表于 2022-4-8 22:07 | 只看該作者
其實(shí)不太確定你的意圖, 你的計(jì)數(shù)到底計(jì)數(shù)的什么, 如果是 計(jì)數(shù)480個(gè)下降沿的話(huà),  是不是應(yīng)該這樣?

void int4_Routine(void) interrupt 16
{
         if(++count==480)
       {
                 CLK_DIV  |=  0x10;
       }
       if(++count>=9600)
      {
               count = 0;
               CLK_DIV  &=  0xEF;
      }
}

這只是一個(gè)建議, 因?yàn)槲覜](méi)理解你希望的 效果,CLK_DIV 你應(yīng)該理解為一個(gè) 開(kāi)關(guān),在你認(rèn)為適當(dāng)?shù)臅r(shí)候,打開(kāi)開(kāi)關(guān) 讓 P3.1 輸出 P3.0 不需要的時(shí)候關(guān)閉。這個(gè)開(kāi)關(guān)只是一個(gè)動(dòng)作,你在某一個(gè)中斷中 設(shè)置 開(kāi)/關(guān) 即可,不需要再while里面反復(fù)去操作這個(gè)開(kāi)關(guān)。你要知道,STC15系列 即便你 頻率定為 35MHz, 1us 可以有35個(gè)機(jī)器時(shí)鐘,處理一個(gè)if 判斷 一個(gè)雙字節(jié)16位數(shù)字  需要20個(gè)時(shí)鐘 已經(jīng)超過(guò) 0.5us了,所以,按你的需要你必須把不必要的步驟精簡(jiǎn)再精簡(jiǎn)。
回復(fù)

使用道具 舉報(bào)

8#
ID:1015222 發(fā)表于 2022-4-12 16:42 | 只看該作者
188610329 發(fā)表于 2022-4-8 22:07
其實(shí)不太確定你的意圖, 你的計(jì)數(shù)到底計(jì)數(shù)的什么, 如果是 計(jì)數(shù)480個(gè)下降沿的話(huà),  是不是應(yīng)該這樣?

void i ...

          其實(shí)就是想用單片機(jī)實(shí)現(xiàn)上圖表現(xiàn)的效果,不一定要用STC的,當(dāng)然了,越便宜越好。
回復(fù)

使用道具 舉報(bào)

9#
ID:887371 發(fā)表于 2022-4-13 14:32 | 只看該作者
以夢(mèng)為舟 發(fā)表于 2022-4-8 17:00
不要求解碼,只要轉(zhuǎn)發(fā)就行。前面代碼有的忘注釋掉了,其實(shí)就是想表達(dá)直接用 DO=DI行不通,加上計(jì)數(shù)之后就 ...

把你的代碼改了下,應(yīng)該能做到前20*24bit不接收。
  1. #include <IAP15F105W.h>
  2. bit flag;
  3. unsigned int count = 480;//外部中斷4計(jì)數(shù)值

  4. void timer0Init(void) // 300微秒@33.1776MHz
  5. {
  6.         AUXR &= 0x7F; //定時(shí)器時(shí)鐘12T模式
  7.         TMOD &= 0xF0; //設(shè)置定時(shí)器模式
  8.         // TL0 = 0xC3;          //設(shè)置定時(shí)初值
  9.         TH0 = 0xFC;          //設(shè)置定時(shí)初值
  10.         TF0 = 0;          //清除TF0標(biāo)志
  11.         TR0 = 1;          //定時(shí)器0開(kāi)始計(jì)時(shí)
  12. }
  13. void main(void)
  14. {
  15.         CLK_DIV &= 0xEF;
  16.         EA = 1;
  17.         ET0 = 1;
  18.         INT_CLKO |= 0x40;
  19.         flag = 0;
  20.         while (1)
  21.         {
  22.         }
  23. }
  24. void int4_Routine(void) interrupt 16
  25. {
  26.         if (!flag)
  27.         {
  28.                 if (--count == 0)
  29.                 {
  30.                         flag = 1;
  31.                         CLK_DIV |= 0x10;
  32.                 }
  33.         }
  34.         else
  35.         {
  36.                 // TL0 = 0xC3;
  37.                 TH0 = 0xFC; //計(jì)時(shí)300us則復(fù)位
  38.         }
  39. }
  40. void Timer0_Routine(void) interrupt 1 //定時(shí)器0中斷服務(wù)函數(shù)
  41. {
  42.         // TL0 = 0xC3;
  43.         TH0 = 0xFC; //計(jì)時(shí)300us則復(fù)位
  44.         flag = 0;
  45.         count = 480;
  46.         CLK_DIV &= 0xEF;
  47. }
復(fù)制代碼
回復(fù)

使用道具 舉報(bào)

10#
ID:887371 發(fā)表于 2022-4-13 14:43 | 只看該作者
你這個(gè)需要的mcu要支持雙邊沿觸發(fā)中斷,并且時(shí)鐘夠快。

現(xiàn)在所有的mcu都能做到。
引腳變化中斷了解下。
回復(fù)

使用道具 舉報(bào)

11#
ID:624769 發(fā)表于 2022-4-13 21:03 | 只看該作者
以夢(mèng)為舟 發(fā)表于 2022-4-12 16:42
其實(shí)就是想用單片機(jī)實(shí)現(xiàn)上圖表現(xiàn)的效果,不一定要用STC的,當(dāng)然了,越便宜越好。

所以, 你既然 確定了, CLK_DIV |= 0x10 的中繼輸出 可以滿(mǎn)足你的輸出需要,(如果輸出高電平的驅(qū)動(dòng)力不夠,開(kāi)推挽輸出)

你現(xiàn)在唯一需要的就是: 理清楚,前面放棄數(shù)據(jù)的“過(guò)濾條件”, 達(dá)到這個(gè)條件后, 打開(kāi) 中繼輸出 通道,然后達(dá)到什么條件以后 再次關(guān)閉中繼輸出, 就是那么簡(jiǎn)單的一個(gè)工作而已。
回復(fù)

使用道具 舉報(bào)

本版積分規(guī)則

手機(jī)版|小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術(shù)交流QQ群281945664

Powered by 單片機(jī)教程網(wǎng)

快速回復(fù) 返回頂部 返回列表
主站蜘蛛池模板: 波多野结衣在线观看一区二区三区 | 91短视频网址 | 黄色播放 | 日韩av一区二区在线观看 | 福利视频1000 | 中文字幕在线观看 | 超碰97免费观看 | 精品乱码一区二区 | 97超碰成人 | 久久久久久a | 久久久精品一区二区 | 日韩三级在线观看 | 嫩草懂你的影院入口 | 国产成在线观看免费视频 | 国产激情一区二区三区 | 成人免费久久 | 99久久精品国产一区二区三区 | 成人av免费| 国产一区二区在线播放 | www日本在线 | 欧美日韩一区二区三区不卡视频 | 麻豆hd | 黄色一级免费看 | 日韩精品一区二区久久 | 成人免费网视频 | 久久国产精99精产国高潮 | 久久久久久久久久久久亚洲 | 伊人性伊人情综合网 | 综合精品久久久 | 涩色视频在线观看 | 久久久久免费 | 岛国av免费看 | 亚洲精品一区二区三区蜜桃久 | 户外露出一区二区三区 | 国产精品一区二区久久久久 | 视频一区二区三区在线观看 | 久草网址 | 欧美黑人一区二区三区 | 日本不卡一区二区三区 | 国产精久久久久久久妇剪断 | 偷牌自拍 |