Discuz! Board
标题:
STM8可以精确到us级延时吗?
[打印本页]
作者:
chenfei48
时间:
2015-3-8 21:27
标题:
STM8可以精确到us级延时吗?
我想做个RGB灯控制器,用的是2811的芯片,发送数据是靠延时来实现:
file:///C:\Users\Canny\AppData\Roaming\Tencent\Users\394030585\QQ\WinTemp\RichOle\8`$TKV}~2{DIJUO_DCPBULA.pngT0H 0码, 高电平时间 0.5 μs ±150ns
T1H 1码, 高电平时间 2.0μs ±150ns
T0L 0码, 低电平时间 2.0 μs ±150ns
T1L 1码, 低电平时间 0.5μs ±150ns
RES 帧单位,低电平时间 50μs以上
我的程序是这样写的:
/***********************
函数功能:向2811发送1个字节的数据
输入参数:要发送的数据
输出参数:无
备 注:无
***********************/
void WS2811_SendByte(u8 dat)
{
u8 i;
for(i=0;i<8;i++)
{
if(dat & 0x80)
{
LED_DO_Port->ODR |= LED_DO_Pin;//LED置高
nop();nop();nop();nop();nop();nop();nop();nop();nop();nop();
nop();nop();nop();nop();nop();nop();nop();nop();nop();nop();
LED_DO_Port->ODR &=~LED_DO_Pin;//LED置低
nop();nop();nop();nop();nop();
}
else
{
LED_DO_Port->ODR |= LED_DO_Pin;//LED置高
nop();nop();nop();nop();nop();
LED_DO_Port->ODR &=~LED_DO_Pin;//LED置低
nop();nop();nop();nop();nop();nop();nop();nop();nop();nop();
nop();nop();nop();nop();nop();nop();nop();nop();nop();nop();
}
dat <<= 1;
}
}
问题来了:
输出高电位是正常的,可以精确到0.5us, 但是低电位不认,删除(LED_DO_Port->ODR &=~LED_DO_Pin;//LED置低)后面所有的nop(); 用示波器测试观察最小都在1us,
想了许多办法,如更换编译器:1、从1.4更换成1.3,没有解决
2、 更改操作系统
3、把无关的程序删除,只留下发送程序
请问各位高手有没有解决方法,还是STM8本身就不行这么精确延时!
作者:
admin
时间:
2015-3-10 19:21
应该可以
作者:
qianbi
时间:
2015-5-13 21:09
你可以算算 16M时钟不分频,用定时器精确延时,最小值比0.5us小的话就可以实现,反之就不行。
nop();延时的方法实际操作没用过,如果稳定在1US的话那以后用得到的
学习了~
欢迎光临 Discuz! Board (http://qfv8.com/)
Powered by Discuz! X3