weatt123456789 发表于 2018-10-11 17:07:54

STC15驱动WS2821时序,请教关于机器周期计算

本帖最后由 weatt123456789 于 2018-10-12 12:16 编辑

void WS2821data_1()
        {
               P20=1;      //30M晶体,22个NOP,从1到0,应该是0.73US+ P20=1(算2个周期)=1/30*24=0.8US,正确
               _nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_(); _nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();
               
               P20=0;      //30M晶体,1个NOP+P20=0(算2个周期)= 3个周期+函数调用算3个周期=6个周期=0.2US?哦什么实际是0.4US
               _nop_();                        
        }


void main()
{
        GPIO_INIT();
        P20=1;delay_ms(200);
       
        while(1)//就不是
        {
                WS2821data_1();WS2821data_1();WS2821data_1();WS2821data_1();WS2821data_1();WS2821data_1();
        }
}


请教一下,30M晶体,输出高电平0.8US,低电平0.4US,
为啥 ,1个NOP(1个周器)+P20=0(2个周期)+ 函数调用(算3个周期)=6个周期 = 1/30*6=0.2US?哦什么实际是0.4US?
                                                                                                      12个周期才是0.4US,多出来的6个周期 在哪?
while(1) 是几个周期?


还有一个问题? WS2821b 规格书上说 60US的低电平,可以刷新灯具,可是我得用300US才有效?

su33691 发表于 2018-10-11 17:58:23

if()也是要消耗时钟周期的。

wye11083 发表于 2018-10-11 21:28:34

你上网找找半双工uart的例程,好像都在用uart收发1wire。

weatt123456789 发表于 2018-10-11 22:04:15

本帖最后由 weatt123456789 于 2018-10-12 12:58 编辑

su33691 发表于 2018-10-11 17:58
if()也是要消耗时钟周期的。

我用软件模拟波形,测量波形宽度再调整,也不用一条条去算了,但是,我产生了一下新的问题

weatt123456789 发表于 2018-10-24 02:00:08

wye11083 发表于 2018-10-11 21:28
你上网找找半双工uart的例程,好像都在用uart收发1wire。

我用PWM做了,30M情况下,37个周期1.25us,13=0.416,27=0.833
稳准狠

小李非刀 发表于 2018-10-24 21:10:55

要计算周期数,最好看反汇编。15系列IO操作要3个时钟。

liaihua1997 发表于 2018-10-24 21:42:05

WS2821是哪家的芯片啊,怎么找不到规格书的

weatt123456789 发表于 2018-10-25 13:07:12

liaihua1997 发表于 2018-10-24 21:42
WS2821是哪家的芯片啊,怎么找不到规格书的

八好意思,弄错了,是2812
页: [1]
查看完整版本: STC15驱动WS2821时序,请教关于机器周期计算