找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 2115|回复: 8
打印 上一主题 下一主题
收起左侧

定时器中断控制RGB灯带

[复制链接]
跳转到指定楼层
楼主
ID:1041297 发表于 2022-8-16 09:31 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
大伙,我想问下,我现在有条灯带,上面有30颗灯,
手册是这样的
T0H    0码,高电平时间  0.3
T1H    1码,高电平时间  0.9
T0L     0码,低电平时间 0.9
T1L     1码,低电平时间 0.3

Trst     Reset码,低电平时间   80

输出0的话就是一个T0H和一个T0L(占空比)
输出1的话就是一个T1H和一个T1L(占空比)

现在要用定时器中断实现这个过程,就是他这个0.3us我在定时器写出来了,应该是这样
void inital_Timer3()
{
        TH3=(65536-5)>>8;
        TL3=(65536-5);
        T3CON=0x04; //打开中断
       
}

然后三十颗灯我给了一个数组,全亮蓝色,最终的结果要的是一直亮蓝色
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,
};


然后我一个位一个位的移给灯,一个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++)   //一个十六进制有8位
                        {
                                z=(temp&0x80);//每次取高位,每取完一次就左移
                                if(z)   //为真就是逻辑1,那就是1的占空比比较大,就会输出1
                                {
                                        P0_6=1;
                                        //inital_Timer3();
                                        //inital_Timer3();
                                        //inital_Timer3();
                                        P0_6=0;
                                        //inital_Timer3();
                                }
                                else//为假就是逻辑0,那就是0的占空比比较大,就会输出0
                                {
                                        P0_6=1;
                                        //inital_Timer3();
                                        P0_6=0;
                                        //inital_Timer3();
                                        //inital_Timer3();
                                        //inital_Timer3();
                                }
                                temp=temp<<1; //左移
                        }
                }
}

请问怎么在中断里面实现这个全亮的过程,还有他这个0.3us又不能写在这些电平后面,不知道0.3us要怎么整,请大伙给我讲讲,谢谢.

分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:99525 发表于 2022-8-16 12:19 | 只看该作者
时序看着跟ws2812差不多,可以参考ws2812的代码
回复

使用道具 举报

板凳
ID:213173 发表于 2022-8-16 17:07 | 只看该作者
0.3us这么短的延时只能用连续_nop_();实现,不宜使用定时器中断。
回复

使用道具 举报

地板
ID:624769 发表于 2022-8-16 23:48 | 只看该作者
通常,中断触发需要 1个时钟, PC 入栈1个时钟, PC 出战 1个时钟, 跳转到中断 2个时钟 中断 返回 最少要2个时钟, 这么一来,不算中断执行时间,不算保护现场的时间,最快的速度, 7个时钟就没了, 你单片机什么速度,0.3us 用定时器中断来操作?
回复

使用道具 举报

5#
ID:1041297 发表于 2022-8-17 08:30 | 只看该作者
wulin 发表于 2022-8-16 17:07
0.3us这么短的延时只能用连续_nop_();实现,不宜使用定时器中断。

nop不是一个1us吗
回复

使用道具 举报

6#
ID:1041297 发表于 2022-8-17 08:33 | 只看该作者
雪玉寐影 发表于 2022-8-16 12:19
时序看着跟ws2812差不多,可以参考ws2812的代码

对,就是ws2812的
回复

使用道具 举报

7#
ID:161164 发表于 2022-8-17 09:17 | 只看该作者

12T单片机 12Mhz才是1nop 1us
回复

使用道具 举报

8#
ID:123289 发表于 2022-8-17 09:34 | 只看该作者
构思不太好!
看看这样行不行:
1、用5个字节(40位)表示灯珠的【显示状态】:
    前30位(S30)用1/0对应30个灯珠的明暗,
   后10位(T10) 用数字表求此状态显示保持的时间。
2、将所有显示状态分成N组,每组【显示状态】用上述5个字节表达。
例如:全亮X秒:5个字节 = 11111111,11111111,11111111,111111??,???????;
例如:全暗X秒:5个字节 = 00000000,00000000,00000000,000000??,???????。
         ????????? = 时间 = X秒
处理:
1、中断服务程序:用一个变量(TE)计时,当计时结束时,做个标记:B_TE=1。
2、主程序:当B_TE=1时,做下列事:(B_TE=0,啥也不做,B_TE=1是上次显示结束了)
     2.1、清除B_TE=0,准备下次再用(表示本次已在显示过程中);
     2.2、取出下一个【显示状态】5个字节,将其中的T10放入TE中计时(这是本次状态显示的时间)。
     2.2、将其中的S30送出显示(这是本次30个灯珠明暗显示状态)。
             消隐技巧(有总闸时):关总闸 - 送数 - 开总闸。
如此,程序非常简单,显示极其灵活:
楼主只要将需要显示状态、时间,分分节拍,每个节拍做成5个字节,形成一个显示库。
再从库从依序取数(5个字节)、操作,想显示什么就显示什么,显示内容修改、设计都很方便。移位、斜行、汉字、动画都不在话下。灯带、方阵列随便玩。
楼主:你看这个方案如何?
编程不在写程序,而在方案、架构的设计。
回复

使用道具 举报

9#
ID:213173 发表于 2022-8-17 09:37 | 只看该作者

你这是指12M时钟12T单片机的一个_nop_();延时时间,如果选用更高时钟频率的1T单片机,一个机器周期就得另算了。例如:24MHz时钟1T单片机的一个_nop_();延时时间约0.04167us。
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表