准确的方式延迟了100us

9个帖子/ 0个新
最后发表
kr105
离线
最后看到:4年8个月前
加入:2015-06-16 18:20
准确的方式延迟了100us

我正在与一个外部设备接口,我在一个GPIO中发送信号。这个协议是私有的,所以我不能使用任何提供的硬件外围设备。现在我使用这样一个函数来延迟执行:


无效usDelay(uint32_t nof_us)

而(nof_us——){
__nop ();
__nop ();
__nop ();
__nop ();
__nop ();
__nop ();
__nop ();
__nop ();
__nop ();
__nop ();
__nop ();


我从adc.c函数adc_usDelay中获得了这段代码。

问题是,这是不准确的,有时它延迟100us准确和下一个(测量示波器)它延迟110us代替,协议混乱,我不能传输数据。我过去做这个与AVR核心和延时函数与nops工作得很好,这里它不出于某些原因。

我知道定时器外围设备,但我不知道如何在如此短的时间间隔内使用它们,并且不添加可能改变代码计时的开销。

有人知道吗?

设备:
mohit3112
离线
最后看到:11个月2周之前
专家
加入:2014-08-04一点
如果不是在睡眠模式:-

如果不是在睡眠模式:-

空白delay_us (uint16_t time_us)

Uint32_t time_gone = 0;
SysTick -> CTRL = 0;
SysTick ->LOAD = 0xFFFFFF;
SysTick - > VAL = 0;
SysTick-> CTRL = 0x5;
而(time_limit < = time_us)

time_gone = (0xFFFFFF - SysTick->VAL)/16;

SysTick - > CTRL = 0;

MT_dialog
离线
最后看到:4个月,1个星期前
工作人员
加入:2015-06-08 34
嗨kr105,

嗨kr105,

该函数应该足够准确,您确定没有任何中断发出,而该函数正在执行?

由于MT_dialog

kr105
离线
最后看到:4年8个月前
加入:2015-06-16 18:20
我这样做是为了避免那样:

我这样做是为了避免那样:


GLOBAL_INT_STOP ();
...代码…
GLOBAL_INT_START ();

据我所知,这样可以避免这个问题,对吧?

MT_dialog
离线
最后看到:4个月,1个星期前
工作人员
加入:2015-06-08 34
嗨kr105,

嗨kr105,

是的,通过禁用中断,延迟功能应该是好的,应该工作足够准确,请检查你正在使用的时钟,也许这是造成你看到的偏移。

由于MT_dialog

kr105
离线
最后看到:4年8个月前
加入:2015-06-16 18:20
如果蓝牙工作正常,那

如果蓝牙工作正常,那就意味着时钟没问题,对吗?我使用一个16mhz晶体和一个32khz晶体(我不使用任何睡眠模式,所以可能是多余的)。我不认为这是开销的if/for/调用,正在进行的算法上,因为Attiny能够处理他们在11mhz没有问题,代码主要是从那里复制粘贴。我也在循环上做GPIO高/低操作,并建立一个活动的ble链路(没有数据流量)。
为了澄清,信号似乎在比特砰砰过程中缓慢偏移,它总是这样做信号:HIGH - 100us - LOW - 105us - HIGH - 110us -等等,在代码中它被指定为(简化):
为…
GPIO高
delay100us
GPIO低
delay100us
结束了

还有更多的想法吗?我在写这篇文章的时候得到了一些,我明天会测试它们,但任何帮助都会很好。

MT_dialog
离线
最后看到:4个月,1个星期前
工作人员
加入:2015-06-08 34
嗨kr105,

嗨kr105,

我刚刚在分析仪上测试了这个.....在app_async_trm中放置了以下代码:

(我= 0;我< 15;我+ +)

GPIO_SetActive (GPIO_PORT_1 GPIO_PIN_0);
adc_usDelay (100);
GPIO_SetInactive (GPIO_PORT_1 GPIO_PIN_0);
adc_usDelay (100);

脉搏足够准确,而且始终稳定。

由于MT_dialog

kr105
离线
最后看到:4年8个月前
加入:2015-06-16 18:20
我解决了这个问题。我还

我解决了这个问题。我还没有深入的原因,但有一个像下面这样的循环产生了我正在寻找的时机。也许我的嵌套函数,如果/else等造成了额外的延迟,但到目前为止,这是我的工作。


(我= 0;我< 15;我+ +)

GPIO_SetActive (GPIO_PORT_1 GPIO_PIN_0);
adc_usDelay (100);
GPIO_SetInactive (GPIO_PORT_1 GPIO_PIN_0);
adc_usDelay (96);

MT_dialog
离线
最后看到:4个月,1个星期前
工作人员
加入:2015-06-08 34
嗨kr105,

嗨kr105,

很高兴你成功了。

由于MT_dialog

主题锁定