请教:M88 1MHz T0中断为何做不到13us的响应时间?
本帖最后由 BS_good200xy 于 2019-10-15 08:11 编辑用ATmega88PA做红外发射程序时,发现1MHz主频时,T0中断响应时间完全做不到13us,只能到50us左右,不知什么原因?
我的红外发射思路是: 让T0每13us发出一次中断,进而产生38Khz方波驱动IR LED. 并且对13us中断次数进行计数,用于对其它所需的脉冲宽度进行定时,最终产生正确的红外发射时序.
将M88主频提高到8MHz后,就OK了.但还是想用1MHz主频来工作,不知如何才能让T0中断在1MHz下实现13us响应时间? 只要葫芦不要葫芦叶是不对的 中断不可能做到那么快。你应该用汇编+nop 1M主频的13uS就是13个机器周期,虽然AVR是大部分指令支持单周期,但是区区13个时钟,要完成进站出站,还有中断跳转和返回,你还要做那么多操作,时间上CPU来不及处理是根本原因,你也说了提高到8M就可以了。 1M主频要做到楼主得要求就算手工汇编优化也几乎不可能 ilikemcu 发表于 2019-10-15 08:21
1M主频的13uS就是13个机器周期,虽然AVR是大部分指令支持单周期,但是区区13个时钟,要完成进站出站,还有 ...
多谢指教,看来我对avr中断响应过程还理解不够. 加个与门, 一路定时器产生38K的载波信号, 一路是调制信号,这个不是更靠谱么 ETC 上下高速也要减速了,楼主难为人了哈哈。 polarbear 发表于 2019-10-15 08:52
加个与门, 一路定时器产生38K的载波信号, 一路是调制信号,这个不是更靠谱么 ...
这个一定行.但为了硬件尽量简洁,功耗更低才想全部用单片机内部资源来完成. BS_good200xy 发表于 2019-10-15 09:14
这个一定行.但为了硬件尽量简洁,功耗更低才想全部用单片机内部资源来完成. ...
外加与门调制的话这样做的话功耗更加低吧, 因为CPU 由定时器 硬件产生载波信号, 这样CPU的频率可以用更低因为不用占用CPU的资源去实现载波调制功能;
硬件与门电路其实也不复杂, 用2个三极管,一个NPN 控制GND, 一个PNP控制VCC, 实现载波与调制了;
polarbear 发表于 2019-10-15 09:55
外加与门调制的话这样做的话功耗更加低吧, 因为CPU 由定时器 硬件产生载波信号, 这样CPU的频率可以用更 ...
加一个74LVC1G08呗,更简单了。 本帖最后由 RAMILE 于 2019-10-15 10:20 编辑
这个NC设计,应该用两个定时器,一个生成载波,一个处理脉宽 RAMILE 发表于 2019-10-15 10:19
这个NC设计,应该用两个定时器,一个生成载波,一个处理脉宽
我感觉我的设计思路都会有些怪癖,就是想把软硬件资源及功耗都省到极致 中断响应时间,在 C 层面上大致受制于中断内的复杂程度:
1. 中断里有整数运算:需要使用寄存器,C进入中断前需要保存寄存器(进栈),会浪费一些时间;
2. 中断里有局部变量:一样需要进栈,会浪费时间;
3. 中断里有浮点运算:咋不上天...
你这个用定时中断的方法,基本上运行路径是确定的,建议改为查询 TOV 标志位的顺序 C 代码,放弃中断;
原因在于后者也是确切的执行路径,并且更加可控(不会后台入栈出栈寄存器)。 t3486784401 发表于 2019-10-15 20:27
中断响应时间,在 C 层面上大致受制于中断内的复杂程度:
1. 中断里有整数运算:需要使用寄存器,C进入中 ...
非常感谢你的指教,授益非浅! 打算用两种方式来改一下程序,争取在AVR 1MHz主频下能正确发送红外时序,并且不另加硬件.
1.不用中断,只用顺序程序实现.
2.用汇编写中断,让主程序调用. polarbear 发表于 2019-10-15 08:52
加个与门, 一路定时器产生38K的载波信号, 一路是调制信号,这个不是更靠谱么 ...
这是正常思路。。。 全用CPU来做而不借助外设,功耗不一定更低。让外设来做事情,CPU能休眠就休眠(或者周期性休眠)才是低功耗的正道。
页:
[1]