|
技术交流 | 电路欣赏 | 工控天地 | 数字广电 | 通信技术 | 电源技术 | 测控之家 | EMC技术 | ARM技术 | EDA技术 | PCB技术 | 嵌入式系统 驱动编程 | 集成电路 | 器件替换 | 模拟技术 | 新手园地 | 单 片 机 | DSP技术 | MCU技术 | IC 设计 | IC 产业 | CAN-bus/DeviceNe |
省电模式被定时器中断唤醒,中断结束后返回何处? |
作者:sambie 栏目:单片机 |
keil的仿真结果是返回到断点的下一句,但万利的仿真器返回到别的地方。到底应该到哪里?请高手发表看法 |
2楼: | >>参与讨论 |
作者: xwj 于 2006/1/2 19:00:00 发布:
返回到被中断的主程序,就是设置省电模式语句的下一句 因此中断唤醒的系统应该把“设置省电模式语句”设为无限循环,退出中断后就又会进入省电模式 |
3楼: | >>参与讨论 |
作者: computer00 于 2006/1/2 19:00:00 发布:
当然要返回到该回的地方了,不然程序不是出错了。。。 从哪进的中断,就应该要回到哪(上了操作系统的除外)。 |
4楼: | >>参与讨论 |
作者: sambie 于 2006/1/2 19:52:00 发布:
好像不对。。。 请看下面的程序: org 0000h sjmp main org 000bh sjmp t0int main: mov sp,#3fh MOV TMOD,#11H setb ea loop: clr tf0 CLR TR0 SETB ET0 MOV TH0,#0H MOV TL0,#0H SETB TR0 psaving: orl pcon,#1b clr p1.3 setb p1.3 sjmp loop t0int: PUSH psw PUSH acc pop acc pop psw reti end 我用软件仿真时,定时器中断返回到 clr p1.3 这句(即使不发生中断,当单步执行下一步即clr p1.3时,仍然能执行,不知道为什么--因为已经进入省电模式,按理CPU不应该执行这一步。),可是如果接上目标板,当执行到psaving 时就跳到t0int(即使中断并未发生),并且pcon.0也不为1。根本不会执行到下一句。我猜想定时器中断不能用于唤醒CPU,只能在中断服务程序里打转。请高手们指正。 |
5楼: | >>参与讨论 |
作者: computer00 于 2006/1/2 19:55:00 发布:
re:好好读读8951的datasheet吧。 在设置进入掉电模式的语句后面,不能用访问端口的指令。 |
6楼: | >>参与讨论 |
作者: sambie 于 2006/1/2 20:13:00 发布:
即使换成mov a, #1h,也还是一样啊 感谢圈圈的提醒。 |
7楼: | >>参与讨论 |
作者: sambie 于 2006/1/2 21:33:00 发布:
有没有哪位高手解释一下为什么省电模式被定时器中断唤醒 后,不能返回到设置省电模式语句的下一句的原因?谢谢 |
8楼: | >>参与讨论 |
作者: xwj 于 2006/1/2 22:39:00 发布:
不要全信仿真器,很多仿真器都不是(或不能)完全仿真单片机的 |
9楼: | >>参与讨论 |
作者: descriptor 于 2006/1/2 22:53:00 发布:
re楼主 用软件仿真时,执行orl pcon,#1b后,仍然能执行下一句clr p1.3,不知道为什么?已经进入省电模式,按理CPU不应该执行这一步。 --因为仿真软件没有这么聪明。 如果接上目标板,当执行到psaving 时就跳到t0int(即使中断并未发生),并且pcon.0也不为1。根本不会执行到下一句。 --执行SETB TR0后,T0是硬件,T0立即运行,并不理会你单步与否,并且瞬间溢出引起中断。退出中断时,T0仍然会溢出,所以表现为在中断里打转,根本不会执行到下一句。这是完全正确的结果。所以说不是在所有的地方都能设置断点。 |
10楼: | >>参与讨论 |
作者: sambie 于 2006/1/2 23:18:00 发布:
楼上言之有理。就是说,用定时器无法唤醒省电模式? |
11楼: | >>参与讨论 |
作者: computer00 于 2006/1/2 23:59:00 发布:
省电模式?是不是idle模式?还是POWER down模式啊? idle模式是可以通过中断来唤醒的;而POWER down模式则只有reset才能唤醒。 这个在51的datasheet上应该写得很清楚。 |
12楼: | >>参与讨论 |
作者: descriptor 于 2006/1/3 0:30:00 发布:
sambie,我都快被你气死了 我觉得讲得够明白了。 不是用定时器无法唤醒idle模式,而是你不能在此设断点。 |
13楼: | >>参与讨论 |
作者: sambie 于 2006/1/3 10:22:00 发布:
楼上息怒。恕我愚顽不化。我还是不能从您的回复中 找到我需要的答案。我想用定时器中断来唤醒idle,希望中断返回到设置idle语句的下一句,可是如您所说,程序总在中断服务程序中打转,无法跳出。这样idle不是永远都唤不醒吗?我在中断程序中把pcon.0置0也不管用。还有,我把程序烧进89C2051试也没有见到被唤醒。 各位高手都说可以唤醒,那一定是我那儿搞错了,可问题出在哪里呢?谢谢 |
14楼: | >>参与讨论 |
作者: noahwj 于 2006/1/3 11:15:00 发布:
肯定可以,我用过,orl pcon,#1b改为MOV PCON,#01H |
15楼: | >>参与讨论 |
作者: fushaobing 于 2006/1/3 13:01:00 发布:
sambie 有关“中断”和“定时器”的问题是很难用仿真器仿真的,因为仿真器永远代替不了MCU。比如,你走单步时,即使你看到了定时器的计数器在变化,那也是不真实的。 descriptor说的已经很清楚了,你仔细体会一下。 如果你想得到你想要的结果,必须烧到MCU里面去。至于你说的烧了以后也看不到你要的结果,我想应该想想其他的办法。因为“computer00”说了“在设置进入掉电模式的语句后面,不能用访问端口的指令”。 |
16楼: | >>参与讨论 |
作者: computer00 于 2006/1/3 13:18:00 发布:
我用keil软仿真过了,可以进入中断的。我用的是外部中断0 设置进入idle模式后,就停在了下面的一条语句。然后中断到来时,就进入中断服务程序。 返回就返回到了idle下面的那条语句,继续执行。 |
17楼: | >>参与讨论 |
作者: sambie 于 2006/1/3 14:33:00 发布:
看到这么多高手都回了帖子,真是感激。 computer00, 用外部中断肯定没问题。可我是想用定时器。我的本意是想让MCU 执行一些操作后 IDLE 一段时间如1小时后被定时器唤醒,再循环。可程序老是不行。大侠论坛上有人说这很难实现,需要用RTC。而这里的众高手说可行,我用仿真器得不到结果,MCU也不行,还惹烦了几位,真是罪过。要不你用定时器试试?谢谢了 |
18楼: | >>参与讨论 |
作者: computer00 于 2006/1/3 14:57:00 发布:
用定时器也可以,我用了定时器2,10mS中断一次,可以从idle唤醒 你的系统时钟是多少?idle一小时?定时器可能弄不了那长时间啊,加软件计数还差不多。 另外,我用你的程序仿真,运行结果也正确啊。 orl pcon,#1b clr p1.3 ;程序运行到这里暂停。一定时间后,进入中断服务程序,运行完ISR后,继续从这里往下运行。 |
19楼: | >>参与讨论 |
作者: sambie 于 2006/1/3 15:04:00 发布:
我猜想你是用keil软件仿真,对吧?软件仿真是可以 硬件仿真和烧到mcu中去就不行了。 |
20楼: | >>参与讨论 |
作者: computer00 于 2006/1/3 15:38:00 发布:
我硬件上也行啊, while(i) { LCD_printc(0xFF); PCON|=0x01;PCON|=0x01;PCON|=0x01;PCON|=0x01;PCON|=0x01; //我用LCD显示的,加了几个进来,显示速度明显变慢了。定时器2每隔10mS中断一次 i--; } LCD_printc(1+TEMP%5); |
21楼: | >>参与讨论 |
作者: javie 于 2006/1/3 15:42:00 发布:
问题的关键就在于你们太相信万历的仿真器了 尤其在中断和定时的时候 我们只能相信MCU本身 而不能把希望寄托在万历身上 |
22楼: | >>参与讨论 |
作者: descriptor 于 2006/1/3 17:49:00 发布:
sambie,我服了你了 不能在硬件仿真时在SETB TR0后加入断点(或单步等)。 你加了断点,程序暂时停止,可是T0并不会停止,所以在你盯着屏幕发呆的时候,T0已经溢出申请中断。再执行下一步时,就进了中断。中断返回时情况相同,所以表现为在中断里打转,永远执行不了psaving: orl pcon,#1b。 如果全速运行,或者烧成片子,执行完SETB TR0后自然会执行psaving: orl pcon,#1b,结果将完全正确。 还是那句话:不是用定时器无法唤醒idle模式,而是你不能在此设断点。 |
23楼: | >>参与讨论 |
作者: descriptor 于 2006/1/3 18:03:00 发布:
建议你把程序改成 中断 点亮LED 中断返回 主循环 延时约1S 关闭LED idle 这样你烧成片子或者全速就能看到唤醒的效果了。T0决定LED熄灭的时间,如果太短,人眼将看不出来。 * - 本贴最后修改时间:2006-1-3 18:09:59 修改者:descriptor |
24楼: | >>参与讨论 |
作者: jackf125 于 2006/1/4 21:25:00 发布:
看MCU的资料,多有交代 看MCU的资料,多有交代 |
25楼: | >>参与讨论 |
作者: martial 于 2006/1/9 8:39:00 发布:
学习!ing |
26楼: | >>参与讨论 |
作者: wolfererer 于 2006/1/9 10:21:00 发布:
楼上几位真是热心人啊,佩服,佩服 |
27楼: | >>参与讨论 |
作者: sambie 于 2006/1/9 18:06:00 发布:
感谢各位指点,特别是descriptor, 出了趟差,没有及时回复大家,sorry。我发现了原来程序中一个很可笑的错误:我在中断程序中将中断次数保存为某个变量,在主程序中用R0与它进行比较,如果相等,则引发IDLE。可是当主程序执行到这里的时候,变量的值已经超过了R0,这就是为什么老不进入idle的原因。仿真时看到的却是程序总在中断程序中打转。后来我改了程序,也看到了正确的结果。。。说实话,在此之前我还不知道怎么设置断点呢,当然理解不了Descriptor的意思啦。不过也从几位高人这里学到了东西,特别加深了对仿真的理解,谢谢。 |
|
|
免费注册为维库电子开发网会员,参与电子工程师社区讨论,点此进入 |
Copyright © 1998-2006 www.dzsc.com 浙ICP证030469号 |