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

STC8A8K 用ISP软件计算的软件延时为什么不准

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

我用STC8A8K芯片,用ISP软件选择Y6(STC8A系列)结果如下

void Delay300us()                //@30.000MHz
{
        unsigned char i, j;
        _nop_();
        _nop_();
        i = 12;
        j = 173;
        do
        { while (--j);
        } while (--i);
}
以上用在STC8上,KEIL仿真结果是400US



我用STC8A8K芯片,用ISP软件选择Y5(STC15系列)结果如下
void Delay300us()                //@30.000MHz
{
        unsigned char i, j;
        i = 9;
        j = 190;
        do
        { while (--j);
        } while (--i);
}
用在STC8上,KEIL仿真结果是300US

这是为啥?为啥?为啥?

用KEIL仿真测量的结果

leifeng 发表于 2018-10-12 13:48:43

主频相同吗?

weatt123456789 发表于 2018-10-12 13:51:56

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

leifeng 发表于 2018-10-12 13:48
主频相同吗?

主频相同,我驱动WS2812,如果不对的话,灯应该不会亮,另外,发送0和1的时序是正确的,就是不明白为啥置低刷新为毛手册中要50US,我得300US才可以
KEIL软件里我选择了STC8A8K芯片,并且选择了30M,下载也是30M,灯也能亮

0= 高电平0.4US,低电平0.8
1=高电平0.8US,低电平0.4US
置0 50US点亮,我得置低300US才行,为了验证我特意用了300个NOP试了说明真的要300US才行呀

我下载了两个版本的规格书,时序说明各不相同,也不知为何?

wkman 发表于 2018-10-12 14:19:43

weatt123456789 发表于 2018-10-12 13:51
主频相同,我驱动WS2812,如果不对的话,灯应该不会亮,另外,发送0和1的时序是正确的,就是不明白为啥置 ...

{:titter:} 一般不干这种事,用示波器爪一下时间间隔,差不多了就行,不纠结

su33691 发表于 2018-10-12 14:28:27

STC8A8K芯片,在ISP软件中最高只能设置到27MHZ.
问一下楼主,怎样才能设置到30MHZ?{:lol:}

health 发表于 2018-10-12 16:05:46

keil能仿真STC8?

zenghui 发表于 2018-10-12 17:25:33

keil仿真不了STC的指令时间。ISP软件计算的时间没有问题,我用逻辑分析仪测过的!

modbus 发表于 2018-10-12 17:26:55

su33691 发表于 2018-10-12 14:28
STC8A8K芯片,在ISP软件中最高只能设置到27MHZ.
问一下楼主,怎样才能设置到30MHZ? ...

可以手工输入吧

MYQQ2018 发表于 2018-10-12 20:12:30

keil软仿真只能是标准51

90999 发表于 2018-10-12 20:29:10

选择嵌入汇编吧

weatt123456789 发表于 2018-10-12 21:29:26

su33691 发表于 2018-10-12 14:28
STC8A8K芯片,在ISP软件中最高只能设置到27MHZ.
问一下楼主,怎样才能设置到30MHZ? ...

手动输入就30就可以了,最多达到了30.049,可能有的芯片达不到吧

su33691 发表于 2018-10-12 21:37:24

weatt123456789 发表于 2018-10-12 21:29
手动输入就30就可以了,最多达到了30.049,可能有的芯片达不到吧

谢谢,这样的话,修改频率就太方便了。

weatt123456789 发表于 2018-10-13 08:05:45

while几个周期?for几个周期?

cdust 发表于 2018-10-13 08:59:29

楼主如果做完能不能共享下STC8A8K芯片驱动WS2812的程序,我正好买了东西要做,能不能让我站在楼主的肩膀上一步登月?{:lol:}

weatt123456789 发表于 2018-10-14 18:51:07

cdust 发表于 2018-10-13 08:59
楼主如果做完能不能共享下STC8A8K芯片驱动WS2812的程序,我正好买了东西要做,能不能让我站在楼主的肩膀上 ...

我还在弄,主要是一不小心多个if戓FOR就超过0.4us了,每8个位切换时就超出,我现在写的是高电平0.866US,低电平0.433,我有强迫症,循环时,一个IF就起出0.433了,非得整好它才睡得着

su33691 发表于 2018-10-14 21:18:00

weatt123456789 发表于 2018-10-14 18:51
我还在弄,主要是一不小心多个if戓FOR就超过0.4us了,每8个位切换时就超出,我现在写的是高电平0.866US, ...

我在处理时序要求很严格的通信协议时,喜欢用51来完成。
栗子:
c语言的595发送函数:
void Send_595(u8 dat)
{
        u8 i;
        u8 tmp = dat;
        for(i=0;i<8;i++)
        {
                if(tmp & 0x80)
                {
                        P_HC595_SER = 1;
                }
                else
                {
                        P_HC595_SER = 0;
                }
                _nop_();
                P_HC595_SRCLK = 1;
                _nop_();
                P_HC595_SRCLK = 0;
                tmp = tmp << 1;
        }
}

因为有if,else,发送的数据会有1~2个NOP的差别。
而采用下面的595发送函数:
void Send_595(u8 dat)
{
        u8 i;
        u8 tmp = dat;
        for(i=0;i<8;i++)
        {
                tmp <<= 1;
                P_595_ser = CY;
                _nop_();
                P_595_srclk = 1;
                _nop_();
                P_595_srclk = 0;
        }
}
每个bit数据间隔为12个时钟周期。

weatt123456789 发表于 2018-10-14 23:19:15

void WS2812()
        {       
                unsigned chartempR;
                unsigned chartempG;
                unsigned char y=0;
                unsigned char Ry;
                Sum=Dsum*RGB;//灯数
                tempG=0XFF;    填充1测试

                for(y=Sum;y!=0;)
                {       P20=1;
                       if(tempG&0x80)       { nop14;y--;P20=0; nop1;   }
                             else{y--; P20=0;}       

               
                       if(tempG&0x40){ P20=1;nop15;Ry=Sum-y;P20=0; }
                             else { P20=1;    P20=0;}       
               
                       if(tempG&0x20){ P20=1;tempR=s;nop2;P20=0; }
                             else { P20=1; P20=0; }       
               
                       if(tempG&0x10){ P20=1;nop21;P20=0;}
                             else { P20=1;   P20=0;}       
               
                       if(tempG&0x08)    { P20=1;nop21; P20=0;}
                             else { P20=1;P20=0;}       
       
                       if(tempG&0x04){ P20=1;nop21; P20=0; }
                             else { P20=1;    P20=0; }       

                       if(tempG&0x02) { P20=1;nop21; P20=0;}
                             else{ P20=1;P20=0;}

                       if(tempG&0x01){ P20=1;nop21; P20=0;}
                             else{ P20=1;   P20=0; }                               
}
   P20=0;        delay_ms(100);
}

大侠们,为什么我数的波形也正确,宽度也对,数量也对,就是点灯的时候,

发1个 8位数据时,绿色亮
发2个 8位数据时,红色+绿色亮
发3个 8位数据时,红色+绿色+白色亮
发4个 8位数据时,红色+绿色+白色亮(好像跑丢了)
发5个 8位数据时,红色+绿色+白色亮 +第2个灯的绿色亮 (好像跑丢了)
发6个 8位数据时,红色+绿色+白色亮 +第2个灯的绿色+红色亮
-
-
每遇到4就跑丢,仿真的时候我一个个数,也没有少呀,波形宽度也完全正常呀?为啥呢搞不懂了
高 0.800
低 0.400
每8个跳转时,0.833

0码就不要看了,我还没有填;

weatt123456789 发表于 2018-10-14 23:20:12

void WS2812()
        {       
                unsigned chartempR;
                unsigned chartempG;
                unsigned char y=0;
                unsigned char Ry;
                Sum=Dsum*RGB;//灯数
                tempG=0XFF;    填充1测试

                for(y=Sum;y!=0;)
                {       P20=1;
                       if(tempG&0x80)       { nop14;y--;P20=0; nop1;   }
                             else{y--; P20=0;}       

               
                       if(tempG&0x40){ P20=1;nop15;Ry=Sum-y;P20=0; }
                             else { P20=1;    P20=0;}       
               
                       if(tempG&0x20){ P20=1;tempR=s;nop2;P20=0; }
                             else { P20=1; P20=0; }       
               
                       if(tempG&0x10){ P20=1;nop21;P20=0;}
                             else { P20=1;   P20=0;}       
               
                       if(tempG&0x08)    { P20=1;nop21; P20=0;}
                             else { P20=1;P20=0;}       
       
                       if(tempG&0x04){ P20=1;nop21; P20=0; }
                             else { P20=1;    P20=0; }       

                       if(tempG&0x02) { P20=1;nop21; P20=0;}
                             else{ P20=1;P20=0;}

                       if(tempG&0x01){ P20=1;nop21; P20=0;}
                             else{ P20=1;   P20=0; }                               
}
   P20=0;        delay_ms(100);
}

大侠们,为什么我数的波形也正确,宽度也对,数量也对,就是点灯的时候,

发1个 8位数据时,绿色亮
发2个 8位数据时,红色+绿色亮
发3个 8位数据时,红色+绿色+白色亮
发4个 8位数据时,红色+绿色+白色亮(好像跑丢了1个)
发5个 8位数据时,红色+绿色+白色亮 +第2个灯的绿色亮
发6个 8位数据时,红色+绿色+白色亮 +第2个灯的绿色+红色亮
-
-
每遇到4就跑丢,仿真的时候我一个个数,也没有少呀,波形宽度也完全正常呀?为啥呢搞不懂了
高 0.800
低 0.400
每8个跳转时,0.833

0码就不要看了,我还没有填;void WS2812()
       

cdust 发表于 2018-10-15 08:02:18

weatt123456789 发表于 2018-10-14 23:20
void WS2812()
        {       
                unsigned chartempR;


我给你个我下的代码你看看,是否有帮助.



lb0857 发表于 2018-10-15 08:24:12

STC8A8K 用ISP软件 好像还有几个下拉菜单选择的是不是忽略了

weatt123456789 发表于 2018-10-15 09:18:42

lb0857 发表于 2018-10-15 08:24
STC8A8K 用ISP软件 好像还有几个下拉菜单选择的是不是忽略了

这个不管它了,我怀疑可能是仿真软件没能识别

weatt123456789 发表于 2018-10-15 09:20:51

cdust 发表于 2018-10-15 08:02
我给你个我下的代码你看看,是否有帮助.

这代码我也有,仿真出来的每8位间隔时的波形宽度都超过2.2US了,却可以受控,我的仿真出来的波形误差在0.05US以内,却总是漏点,搞不懂为啥,莫非仿真出错了

jyrpxj 发表于 2018-10-15 10:38:33

keil只能够仿标准51。以示波器实测为准

weatt123456789 发表于 2018-10-15 11:47:41

仿真PWM为什么看不到波形?

weatt123456789 发表于 2018-10-15 12:41:13

我用仿真驱动LED一点都没问题,下载下去就不行了,会漏掉一些点

cdust 发表于 2018-10-15 19:25:24

搞个逻辑分析仪分析下

cdust 发表于 2018-10-16 08:29:19

楼主把你的文件包共享下,我正好也开始搞,看看行不行。

小李非刀 发表于 2018-10-16 22:37:41

KEIL并不支持STC的指令周期,所以要下载到MCU运行,或者仿真时全速运行,用一个IO来指示这个延时。
比如,主循环执行如下程序:
while(1)
{
    P10 = 1;
    delay;
    P10 = 0;
    delay;
}
然后用示波器看P1.0的电平时间。

weatt123456789 发表于 2018-10-17 01:32:46

cdust 发表于 2018-10-16 08:29
楼主把你的文件包共享下,我正好也开始搞,看看行不行。

我按30M晶体设计的因为下载错了,结果变得正常了,我知道可能我的仿真出了问题,于是我把仿真=0.8US的改成1US,仿真0.4US的改成0.5US,结果就完全正常了,就是不知道实际波形是什么样的。估计没有仿真出来的好看,我单刷0-255,255-0,用修改数组的方式,刷1000个灯(我没有那么多灯可以测试),达到30帧,如果要读SD卡的话,可能还会降低很多,但我最近没空去玩了

weatt123456789 发表于 2018-10-17 01:52:00

根据灯亮灭周期,计算应该在30帧左右,根据仿真测量,在23帧左右,所以仿真中的误差还是满大的

weatt123456789 发表于 2018-10-17 01:55:43

按这个比例,1/23*30=1.3倍误差,因些0.4我设在0.52,0.85我设在1.1,结果就果真能正常了

weatt123456789 发表于 2018-10-17 01:56:34

虽然这样不科学,可我也没有示波器

cdust 发表于 2018-10-17 07:47:47

weatt123456789 发表于 2018-10-17 01:56
虽然这样不科学,可我也没有示波器

我有示波器啊。

weatt123456789 发表于 2018-10-17 09:01:52

好的,我传上去,你测了告诉我下

weatt123456789 发表于 2018-10-17 12:15:32

cdust 发表于 2018-10-17 07:47
我有示波器啊。

纯刷新数据,邦我测一下纯1和纯0的波形宽度呀

cdust 发表于 2018-10-18 20:39:55

本帖最后由 cdust 于 2018-10-18 20:42 编辑

weatt123456789 发表于 2018-10-17 12:15
纯刷新数据,邦我测一下纯1和纯0的波形宽度呀
好的,我测试下

cdust 发表于 2018-10-19 08:49:37

波形看看没有啥大问题啊,我觉得误差不大啊

cdust 发表于 2018-10-19 21:19:55

我做了下实验,这个时序要求误差很大的,所以实际很好控制。我直接用上面我上传的例子稍微修改下就在STC8上面用了,一切正常,他要求33M,实际我30M都没有问题

weatt123456789 发表于 2018-10-20 16:35:01

cdust 发表于 2018-10-19 21:19
我做了下实验,这个时序要求误差很大的,所以实际很好控制。我直接用上面我上传的例子稍微修改下就在STC8上 ...

我每次上电的时候会有点闪一下,大概送电的前一两个循环会有干扰的感觉,然后就好了,不知为什么

cdust 发表于 2018-10-20 16:42:52

我现在没有用你的程序,我吧那个我给出的例子程序修改了下,还挺好用的

weatt123456789 发表于 2018-10-20 16:47:36

cdust 发表于 2018-10-20 16:42
我现在没有用你的程序,我吧那个我给出的例子程序修改了下,还挺好用的

我知道满好用的,我也测试过

weatt123456789 发表于 2018-10-21 14:47:51

cdust 发表于 2018-10-20 16:42
我现在没有用你的程序,我吧那个我给出的例子程序修改了下,还挺好用的

无论怎么写,写8个1时,第8个低电平跳转时总是超出0.4us甚至到0.8us,一个for循环就超出去了,不知怎样才可以减少间隔

只追求能亮那早就做到了的
页: [1]
查看完整版本: STC8A8K 用ISP软件计算的软件延时为什么不准