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