设为首页收藏本站

Discuz! Board

 找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
热搜: 活动 交友 discuz
查看: 5626|回复: 2
打印 上一主题 下一主题

STM8可以精确到us级延时吗?

[复制链接]

5

主题

22

帖子

128

积分

注册会员

Rank: 2

积分
128
跳转到指定楼层
楼主
chenfei48 发表于 2015-3-8 21:27:34 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
我想做个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本身就不行这么精确延时!




分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖
回复

使用道具 举报

4

主题

12

帖子

526

积分

高级会员

Rank: 4

积分
526
板凳
qianbi 发表于 2015-5-13 21:09:05 | 只看该作者
你可以算算 16M时钟不分频,用定时器精确延时,最小值比0.5us小的话就可以实现,反之就不行。
nop();延时的方法实际操作没用过,如果稳定在1US的话那以后用得到的
学习了~
回复 支持 反对

使用道具 举报

Archiver|手机版|小黑屋|Comsenz Inc.   

GMT+8, 2024-11-23 07:13 , Processed in 0.112418 second(s), 28 queries .

Powered by Discuz! X3

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表