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仿真测量的结果 主频相同吗? 本帖最后由 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才行呀
我下载了两个版本的规格书,时序说明各不相同,也不知为何? weatt123456789 发表于 2018-10-12 13:51
主频相同,我驱动WS2812,如果不对的话,灯应该不会亮,另外,发送0和1的时序是正确的,就是不明白为啥置 ...
{:titter:} 一般不干这种事,用示波器爪一下时间间隔,差不多了就行,不纠结 STC8A8K芯片,在ISP软件中最高只能设置到27MHZ.
问一下楼主,怎样才能设置到30MHZ?{:lol:} keil能仿真STC8? keil仿真不了STC的指令时间。ISP软件计算的时间没有问题,我用逻辑分析仪测过的! su33691 发表于 2018-10-12 14:28
STC8A8K芯片,在ISP软件中最高只能设置到27MHZ.
问一下楼主,怎样才能设置到30MHZ? ...
可以手工输入吧 keil软仿真只能是标准51 选择嵌入汇编吧 su33691 发表于 2018-10-12 14:28
STC8A8K芯片,在ISP软件中最高只能设置到27MHZ.
问一下楼主,怎样才能设置到30MHZ? ...
手动输入就30就可以了,最多达到了30.049,可能有的芯片达不到吧 weatt123456789 发表于 2018-10-12 21:29
手动输入就30就可以了,最多达到了30.049,可能有的芯片达不到吧
谢谢,这样的话,修改频率就太方便了。 while几个周期?for几个周期? 楼主如果做完能不能共享下STC8A8K芯片驱动WS2812的程序,我正好买了东西要做,能不能让我站在楼主的肩膀上一步登月?{:lol:} cdust 发表于 2018-10-13 08:59
楼主如果做完能不能共享下STC8A8K芯片驱动WS2812的程序,我正好买了东西要做,能不能让我站在楼主的肩膀上 ...
我还在弄,主要是一不小心多个if戓FOR就超过0.4us了,每8个位切换时就超出,我现在写的是高电平0.866US,低电平0.433,我有强迫症,循环时,一个IF就起出0.433了,非得整好它才睡得着 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个时钟周期。 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码就不要看了,我还没有填; 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()
weatt123456789 发表于 2018-10-14 23:20
void WS2812()
{
unsigned chartempR;
我给你个我下的代码你看看,是否有帮助.
STC8A8K 用ISP软件 好像还有几个下拉菜单选择的是不是忽略了 lb0857 发表于 2018-10-15 08:24
STC8A8K 用ISP软件 好像还有几个下拉菜单选择的是不是忽略了
这个不管它了,我怀疑可能是仿真软件没能识别 cdust 发表于 2018-10-15 08:02
我给你个我下的代码你看看,是否有帮助.
这代码我也有,仿真出来的每8位间隔时的波形宽度都超过2.2US了,却可以受控,我的仿真出来的波形误差在0.05US以内,却总是漏点,搞不懂为啥,莫非仿真出错了 keil只能够仿标准51。以示波器实测为准 仿真PWM为什么看不到波形? 我用仿真驱动LED一点都没问题,下载下去就不行了,会漏掉一些点 搞个逻辑分析仪分析下 楼主把你的文件包共享下,我正好也开始搞,看看行不行。 KEIL并不支持STC的指令周期,所以要下载到MCU运行,或者仿真时全速运行,用一个IO来指示这个延时。
比如,主循环执行如下程序:
while(1)
{
P10 = 1;
delay;
P10 = 0;
delay;
}
然后用示波器看P1.0的电平时间。 cdust 发表于 2018-10-16 08:29
楼主把你的文件包共享下,我正好也开始搞,看看行不行。
我按30M晶体设计的因为下载错了,结果变得正常了,我知道可能我的仿真出了问题,于是我把仿真=0.8US的改成1US,仿真0.4US的改成0.5US,结果就完全正常了,就是不知道实际波形是什么样的。估计没有仿真出来的好看,我单刷0-255,255-0,用修改数组的方式,刷1000个灯(我没有那么多灯可以测试),达到30帧,如果要读SD卡的话,可能还会降低很多,但我最近没空去玩了 根据灯亮灭周期,计算应该在30帧左右,根据仿真测量,在23帧左右,所以仿真中的误差还是满大的 按这个比例,1/23*30=1.3倍误差,因些0.4我设在0.52,0.85我设在1.1,结果就果真能正常了 虽然这样不科学,可我也没有示波器 weatt123456789 发表于 2018-10-17 01:56
虽然这样不科学,可我也没有示波器
我有示波器啊。 好的,我传上去,你测了告诉我下 cdust 发表于 2018-10-17 07:47
我有示波器啊。
纯刷新数据,邦我测一下纯1和纯0的波形宽度呀 本帖最后由 cdust 于 2018-10-18 20:42 编辑
weatt123456789 发表于 2018-10-17 12:15
纯刷新数据,邦我测一下纯1和纯0的波形宽度呀
好的,我测试下 波形看看没有啥大问题啊,我觉得误差不大啊 我做了下实验,这个时序要求误差很大的,所以实际很好控制。我直接用上面我上传的例子稍微修改下就在STC8上面用了,一切正常,他要求33M,实际我30M都没有问题 cdust 发表于 2018-10-19 21:19
我做了下实验,这个时序要求误差很大的,所以实际很好控制。我直接用上面我上传的例子稍微修改下就在STC8上 ...
我每次上电的时候会有点闪一下,大概送电的前一两个循环会有干扰的感觉,然后就好了,不知为什么 我现在没有用你的程序,我吧那个我给出的例子程序修改了下,还挺好用的 cdust 发表于 2018-10-20 16:42
我现在没有用你的程序,我吧那个我给出的例子程序修改了下,还挺好用的
我知道满好用的,我也测试过 cdust 发表于 2018-10-20 16:42
我现在没有用你的程序,我吧那个我给出的例子程序修改了下,还挺好用的
无论怎么写,写8个1时,第8个低电平跳转时总是超出0.4us甚至到0.8us,一个for循环就超出去了,不知怎样才可以减少间隔
只追求能亮那早就做到了的
页:
[1]