登录 免费注册 首页 | 行业黑名单 | 帮助
维库电子市场网
技术交流 | 电路欣赏 | 工控天地 | 数字广电 | 通信技术 | 电源技术 | 测控之家 | EMC技术 | ARM技术 | EDA技术 | PCB技术 | 嵌入式系统
驱动编程 | 集成电路 | 器件替换 | 模拟技术 | 新手园地 | 单 片 机 | DSP技术 | MCU技术 | IC 设计 | IC 产业 | CAN-bus/DeviceNe

省电模式被定时器中断唤醒,中断结束后返回何处?

作者:sambie 栏目:单片机
省电模式被定时器中断唤醒,中断结束后返回何处?
keil的仿真结果是返回到断点的下一句,但万利的仿真器返回到别的地方。到底应该到哪里?请高手发表看法

2楼: >>参与讨论
xwj
返回到被中断的主程序,就是设置省电模式语句的下一句
因此中断唤醒的系统应该把“设置省电模式语句”设为无限循环,退出中断后就又会进入省电模式

3楼: >>参与讨论
computer00
当然要返回到该回的地方了,不然程序不是出错了。。。
从哪进的中断,就应该要回到哪(上了操作系统的除外)。

4楼: >>参与讨论
sambie
好像不对。。。
请看下面的程序:
    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
re:好好读读8951的datasheet吧。
在设置进入掉电模式的语句后面,不能用访问端口的指令。

6楼: >>参与讨论
sambie
即使换成mov a, #1h,也还是一样啊
感谢圈圈的提醒。

7楼: >>参与讨论
sambie
有没有哪位高手解释一下为什么省电模式被定时器中断唤醒
后,不能返回到设置省电模式语句的下一句的原因?谢谢

8楼: >>参与讨论
xwj
不要全信仿真器,很多仿真器都不是(或不能)完全仿真单片机的
 
9楼: >>参与讨论
descriptor
re楼主
用软件仿真时,执行orl pcon,#1b后,仍然能执行下一句clr p1.3,不知道为什么?已经进入省电模式,按理CPU不应该执行这一步。
--因为仿真软件没有这么聪明。

如果接上目标板,当执行到psaving 时就跳到t0int(即使中断并未发生),并且pcon.0也不为1。根本不会执行到下一句。
--执行SETB TR0后,T0是硬件,T0立即运行,并不理会你单步与否,并且瞬间溢出引起中断。退出中断时,T0仍然会溢出,所以表现为在中断里打转,根本不会执行到下一句。这是完全正确的结果。所以说不是在所有的地方都能设置断点。

10楼: >>参与讨论
sambie
楼上言之有理。就是说,用定时器无法唤醒省电模式?
 
11楼: >>参与讨论
computer00
省电模式?是不是idle模式?还是POWER down模式啊?
idle模式是可以通过中断来唤醒的;而POWER down模式则只有reset才能唤醒。
这个在51的datasheet上应该写得很清楚。

12楼: >>参与讨论
descriptor
sambie,我都快被你气死了
我觉得讲得够明白了。
不是用定时器无法唤醒idle模式,而是你不能在此设断点。

13楼: >>参与讨论
sambie
楼上息怒。恕我愚顽不化。我还是不能从您的回复中
找到我需要的答案。我想用定时器中断来唤醒idle,希望中断返回到设置idle语句的下一句,可是如您所说,程序总在中断服务程序中打转,无法跳出。这样idle不是永远都唤不醒吗?我在中断程序中把pcon.0置0也不管用。还有,我把程序烧进89C2051试也没有见到被唤醒。
各位高手都说可以唤醒,那一定是我那儿搞错了,可问题出在哪里呢?谢谢

14楼: >>参与讨论
noahwj
肯定可以,我用过,orl pcon,#1b改为MOV PCON,#01H
 
15楼: >>参与讨论
fushaobing
sambie
有关“中断”和“定时器”的问题是很难用仿真器仿真的,因为仿真器永远代替不了MCU。比如,你走单步时,即使你看到了定时器的计数器在变化,那也是不真实的。
descriptor说的已经很清楚了,你仔细体会一下。
如果你想得到你想要的结果,必须烧到MCU里面去。至于你说的烧了以后也看不到你要的结果,我想应该想想其他的办法。因为“computer00”说了“在设置进入掉电模式的语句后面,不能用访问端口的指令”。



16楼: >>参与讨论
computer00
我用keil软仿真过了,可以进入中断的。我用的是外部中断0
设置进入idle模式后,就停在了下面的一条语句。然后中断到来时,就进入中断服务程序。
返回就返回到了idle下面的那条语句,继续执行。

17楼: >>参与讨论
sambie
看到这么多高手都回了帖子,真是感激。
computer00, 用外部中断肯定没问题。可我是想用定时器。我的本意是想让MCU 执行一些操作后 IDLE 一段时间如1小时后被定时器唤醒,再循环。可程序老是不行。大侠论坛上有人说这很难实现,需要用RTC。而这里的众高手说可行,我用仿真器得不到结果,MCU也不行,还惹烦了几位,真是罪过。要不你用定时器试试?谢谢了

18楼: >>参与讨论
computer00
用定时器也可以,我用了定时器2,10mS中断一次,可以从idle唤醒
你的系统时钟是多少?idle一小时?定时器可能弄不了那长时间啊,加软件计数还差不多。


另外,我用你的程序仿真,运行结果也正确啊。

orl    pcon,#1b
clr    p1.3  ;程序运行到这里暂停。一定时间后,进入中断服务程序,运行完ISR后,继续从这里往下运行。

19楼: >>参与讨论
sambie
我猜想你是用keil软件仿真,对吧?软件仿真是可以
硬件仿真和烧到mcu中去就不行了。

20楼: >>参与讨论
computer00
我硬件上也行啊,
   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
问题的关键就在于你们太相信万历的仿真器了
尤其在中断和定时的时候

我们只能相信MCU本身

而不能把希望寄托在万历身上

22楼: >>参与讨论
descriptor
sambie,我服了你了
不能在硬件仿真时在SETB TR0后加入断点(或单步等)。
你加了断点,程序暂时停止,可是T0并不会停止,所以在你盯着屏幕发呆的时候,T0已经溢出申请中断。再执行下一步时,就进了中断。中断返回时情况相同,所以表现为在中断里打转,永远执行不了psaving: orl pcon,#1b。
如果全速运行,或者烧成片子,执行完SETB TR0后自然会执行psaving: orl pcon,#1b,结果将完全正确。
还是那句话:不是用定时器无法唤醒idle模式,而是你不能在此设断点。






23楼: >>参与讨论
descriptor
建议你把程序改成
中断
点亮LED
中断返回

主循环
延时约1S
关闭LED
idle

这样你烧成片子或者全速就能看到唤醒的效果了。T0决定LED熄灭的时间,如果太短,人眼将看不出来。


* - 本贴最后修改时间:2006-1-3 18:09:59 修改者:descriptor

24楼: >>参与讨论
jackf125
看MCU的资料,多有交代
看MCU的资料,多有交代

25楼: >>参与讨论
martial
学习!ing
 
26楼: >>参与讨论
wolfererer
楼上几位真是热心人啊,佩服,佩服
 
27楼: >>参与讨论
sambie
感谢各位指点,特别是descriptor,
出了趟差,没有及时回复大家,sorry。我发现了原来程序中一个很可笑的错误:我在中断程序中将中断次数保存为某个变量,在主程序中用R0与它进行比较,如果相等,则引发IDLE。可是当主程序执行到这里的时候,变量的值已经超过了R0,这就是为什么老不进入idle的原因。仿真时看到的却是程序总在中断程序中打转。后来我改了程序,也看到了正确的结果。。。说实话,在此之前我还不知道怎么设置断点呢,当然理解不了Descriptor的意思啦。不过也从几位高人这里学到了东西,特别加深了对仿真的理解,谢谢。


参与讨论
昵称:
讨论内容:
 
 
相关帖子
我想要用单片机的5V输出来控制12V的通断。
为什么51单片机IO口在输入时要先置高电平
[转帖]Keil和Proteus结合实例之一
77E58 pcon中smod与WDCON中SMOD_1的区别
大家介绍一款有usb的单片机啊!
免费注册为维库电子开发网会员,参与电子工程师社区讨论,点此进入


Copyright © 1998-2006 www.dzsc.com 浙ICP证030469号