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

QQ登錄

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

搜索
查看: 2230|回復(fù): 8
收起左側(cè)

定時(shí)器中斷控制RGB燈帶

[復(fù)制鏈接]
ID:1041297 發(fā)表于 2022-8-16 09:31 | 顯示全部樓層 |閱讀模式
大伙,我想問(wèn)下,我現(xiàn)在有條燈帶,上面有30顆燈,
手冊(cè)是這樣的
T0H    0碼,高電平時(shí)間  0.3
T1H    1碼,高電平時(shí)間  0.9
T0L     0碼,低電平時(shí)間 0.9
T1L     1碼,低電平時(shí)間 0.3

Trst     Reset碼,低電平時(shí)間   80

輸出0的話就是一個(gè)T0H和一個(gè)T0L(占空比)
輸出1的話就是一個(gè)T1H和一個(gè)T1L(占空比)

現(xiàn)在要用定時(shí)器中斷實(shí)現(xiàn)這個(gè)過(guò)程,就是他這個(gè)0.3us我在定時(shí)器寫出來(lái)了,應(yīng)該是這樣
void inital_Timer3()
{
        TH3=(65536-5)>>8;
        TL3=(65536-5);
        T3CON=0x04; //打開(kāi)中斷
       
}

然后三十顆燈我給了一個(gè)數(shù)組,全亮藍(lán)色,最終的結(jié)果要的是一直亮藍(lán)色
uint8_t rgb_data[90]=
{
        0X00,0X00,0XFF,0X00,0X00,0XFF,0X00,0X00,0XFF,0X00,0X00,0XFF,0X00,0X00,0XFF,0X00,0X00,0XFF,0X00,0X00,0XFF,0X00,0X00,0XFF,0X00,0X00,0XFF,0X00,0X00,0XFF,
        0X00,0X00,0XFF,0X00,0X00,0XFF,0X00,0X00,0XFF,0X00,0X00,0XFF,0X00,0X00,0XFF,0X00,0X00,0XFF,0X00,0X00,0XFF,0X00,0X00,0XFF,0X00,0X00,0XFF,0X00,0X00,0XFF,
        0X00,0X00,0XFF,0X00,0X00,0XFF,0X00,0X00,0XFF,0X00,0X00,0XFF,0X00,0X00,0XFF,0X00,0X00,0XFF,0X00,0X00,0XFF,0X00,0X00,0XFF,0X00,0X00,0XFF,0X00,0X00,0XFF,
};


然后我一個(gè)位一個(gè)位的移給燈,一個(gè)RGB燈是24位
void Blue_Control(uint8_t *rgb_data)
{
        uint8_t i,j,temp,z;
       
                for(i=0;i<90;i++)
                {
                        temp=rgb_data[i];
                        for(j=0;j<8;j++)   //一個(gè)十六進(jìn)制有8位
                        {
                                z=(temp&0x80);//每次取高位,每取完一次就左移
                                if(z)   //為真就是邏輯1,那就是1的占空比比較大,就會(huì)輸出1
                                {
                                        P0_6=1;
                                        //inital_Timer3();
                                        //inital_Timer3();
                                        //inital_Timer3();
                                        P0_6=0;
                                        //inital_Timer3();
                                }
                                else//為假就是邏輯0,那就是0的占空比比較大,就會(huì)輸出0
                                {
                                        P0_6=1;
                                        //inital_Timer3();
                                        P0_6=0;
                                        //inital_Timer3();
                                        //inital_Timer3();
                                        //inital_Timer3();
                                }
                                temp=temp<<1; //左移
                        }
                }
}

請(qǐng)問(wèn)怎么在中斷里面實(shí)現(xiàn)這個(gè)全亮的過(guò)程,還有他這個(gè)0.3us又不能寫在這些電平后面,不知道0.3us要怎么整,請(qǐng)大伙給我講講,謝謝.

回復(fù)

使用道具 舉報(bào)

ID:99525 發(fā)表于 2022-8-16 12:19 | 顯示全部樓層
時(shí)序看著跟ws2812差不多,可以參考ws2812的代碼
回復(fù)

使用道具 舉報(bào)

ID:213173 發(fā)表于 2022-8-16 17:07 | 顯示全部樓層
0.3us這么短的延時(shí)只能用連續(xù)_nop_();實(shí)現(xiàn),不宜使用定時(shí)器中斷。
回復(fù)

使用道具 舉報(bào)

ID:624769 發(fā)表于 2022-8-16 23:48 | 顯示全部樓層
通常,中斷觸發(fā)需要 1個(gè)時(shí)鐘, PC 入棧1個(gè)時(shí)鐘, PC 出戰(zhàn) 1個(gè)時(shí)鐘, 跳轉(zhuǎn)到中斷 2個(gè)時(shí)鐘 中斷 返回 最少要2個(gè)時(shí)鐘, 這么一來(lái),不算中斷執(zhí)行時(shí)間,不算保護(hù)現(xiàn)場(chǎng)的時(shí)間,最快的速度, 7個(gè)時(shí)鐘就沒(méi)了, 你單片機(jī)什么速度,0.3us 用定時(shí)器中斷來(lái)操作?
回復(fù)

使用道具 舉報(bào)

ID:1041297 發(fā)表于 2022-8-17 08:30 | 顯示全部樓層
wulin 發(fā)表于 2022-8-16 17:07
0.3us這么短的延時(shí)只能用連續(xù)_nop_();實(shí)現(xiàn),不宜使用定時(shí)器中斷。

nop不是一個(gè)1us嗎
回復(fù)

使用道具 舉報(bào)

ID:1041297 發(fā)表于 2022-8-17 08:33 | 顯示全部樓層
雪玉寐影 發(fā)表于 2022-8-16 12:19
時(shí)序看著跟ws2812差不多,可以參考ws2812的代碼

對(duì),就是ws2812的
回復(fù)

使用道具 舉報(bào)

ID:161164 發(fā)表于 2022-8-17 09:17 | 顯示全部樓層
1314love 發(fā)表于 2022-8-17 08:30
nop不是一個(gè)1us嗎

12T單片機(jī) 12Mhz才是1nop 1us
回復(fù)

使用道具 舉報(bào)

ID:123289 發(fā)表于 2022-8-17 09:34 | 顯示全部樓層
構(gòu)思不太好!
看看這樣行不行:
1、用5個(gè)字節(jié)(40位)表示燈珠的【顯示狀態(tài)】:
    前30位(S30)用1/0對(duì)應(yīng)30個(gè)燈珠的明暗,
   后10位(T10) 用數(shù)字表求此狀態(tài)顯示保持的時(shí)間。
2、將所有顯示狀態(tài)分成N組,每組【顯示狀態(tài)】用上述5個(gè)字節(jié)表達(dá)。
例如:全亮X秒:5個(gè)字節(jié) = 11111111,11111111,11111111,111111??,???????;
例如:全暗X秒:5個(gè)字節(jié) = 00000000,00000000,00000000,000000??,???????。
         ????????? = 時(shí)間 = X秒
處理:
1、中斷服務(wù)程序:用一個(gè)變量(TE)計(jì)時(shí),當(dāng)計(jì)時(shí)結(jié)束時(shí),做個(gè)標(biāo)記:B_TE=1。
2、主程序:當(dāng)B_TE=1時(shí),做下列事:(B_TE=0,啥也不做,B_TE=1是上次顯示結(jié)束了)
     2.1、清除B_TE=0,準(zhǔn)備下次再用(表示本次已在顯示過(guò)程中);
     2.2、取出下一個(gè)【顯示狀態(tài)】5個(gè)字節(jié),將其中的T10放入TE中計(jì)時(shí)(這是本次狀態(tài)顯示的時(shí)間)。
     2.2、將其中的S30送出顯示(這是本次30個(gè)燈珠明暗顯示狀態(tài))。
             消隱技巧(有總閘時(shí)):關(guān)總閘 - 送數(shù) - 開(kāi)總閘。
如此,程序非常簡(jiǎn)單,顯示極其靈活:
樓主只要將需要顯示狀態(tài)、時(shí)間,分分節(jié)拍,每個(gè)節(jié)拍做成5個(gè)字節(jié),形成一個(gè)顯示庫(kù)。
再?gòu)膸?kù)從依序取數(shù)(5個(gè)字節(jié))、操作,想顯示什么就顯示什么,顯示內(nèi)容修改、設(shè)計(jì)都很方便。移位、斜行、漢字、動(dòng)畫都不在話下。燈帶、方陣列隨便玩。
樓主:你看這個(gè)方案如何?
編程不在寫程序,而在方案、架構(gòu)的設(shè)計(jì)。
回復(fù)

使用道具 舉報(bào)

ID:213173 發(fā)表于 2022-8-17 09:37 | 顯示全部樓層
1314love 發(fā)表于 2022-8-17 08:30
nop不是一個(gè)1us嗎

你這是指12M時(shí)鐘12T單片機(jī)的一個(gè)_nop_();延時(shí)時(shí)間,如果選用更高時(shí)鐘頻率的1T單片機(jī),一個(gè)機(jī)器周期就得另算了。例如:24MHz時(shí)鐘1T單片機(jī)的一個(gè)_nop_();延時(shí)時(shí)間約0.04167us。
回復(fù)

使用道具 舉報(bào)

本版積分規(guī)則

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

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

快速回復(fù) 返回頂部 返回列表