熱門: 51單片機(jī) | 24小時(shí)必答區(qū) | 單片機(jī)教程 | 單片機(jī)DIY制作 | STM32 | Cortex M3 | 模數(shù)電子 | 電子DIY制作 | 音響/功放 | 拆機(jī)樂(lè)園 | Arduino | 嵌入式OS | 程序設(shè)計(jì)
![]() |
發(fā)布時(shí)間: 2022-4-2 16:43
正文摘要:問(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左右。 已嘗試方法: 使用單 ... |
以夢(mèng)為舟 發(fā)表于 2022-4-12 16:42 所以, 你既然 確定了, CLK_DIV |= 0x10 的中繼輸出 可以滿足你的輸出需要,(如果輸出高電平的驅(qū)動(dòng)力不夠,開(kāi)推挽輸出) 你現(xiàn)在唯一需要的就是: 理清楚,前面放棄數(shù)據(jù)的“過(guò)濾條件”, 達(dá)到這個(gè)條件后, 打開(kāi) 中繼輸出 通道,然后達(dá)到什么條件以后 再次關(guān)閉中繼輸出, 就是那么簡(jiǎn)單的一個(gè)工作而已。 |
你這個(gè)需要的mcu要支持雙邊沿觸發(fā)中斷,并且時(shí)鐘夠快。 現(xiàn)在所有的mcu都能做到。 引腳變化中斷了解下。 |
以夢(mèng)為舟 發(fā)表于 2022-4-8 17:00 把你的代碼改了下,應(yīng)該能做到前20*24bit不接收。
|
其實(shí)不太確定你的意圖, 你的計(jì)數(shù)到底計(jì)數(shù)的什么, 如果是 計(jì)數(shù)480個(gè)下降沿的話, 是不是應(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)。 |
以夢(mèng)為舟 發(fā)表于 2022-4-6 15:30 設(shè)置 CLK_DIV |= 0x10; 之后, P3.1 是 無(wú)縫輸出 P3.0 電平的,這個(gè)過(guò)程類似于中繼功能是不會(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ā),換句話說(shuō)只能 DI == 0 的瞬間才觸發(fā),你中斷里卻判斷 DI == 1 還是0。 個(gè)人認(rèn)為這是毫無(wú)意義的行為。 2)雖然你寫了定時(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ō)吧。 |
188610329 發(fā)表于 2022-4-4 00:31 把DI定在p3.0口后發(fā)現(xiàn)輸入數(shù)據(jù)的電平被拉低且會(huì)使數(shù)據(jù)碼混亂,導(dǎo)致整體不受控,這是什么原因.... |
把 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; |
這個(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)易的與門。收到前期bit后開(kāi)通這個(gè)與門,這樣信號(hào)就能通過(guò)這個(gè)與門向后傳遞。也就沒(méi)有速度上的問(wèn)題了,4148處理1MHz這樣的信號(hào)問(wèn)題還是不大的。 |
Powered by 單片機(jī)教程網(wǎng)