楼主想要的是掉电一秒内的**功能吧

[复制链接]
5222|15
 楼主| ch_ljun 发表于 2007-3-18 22:47 | 显示全部楼层 |阅读模式
我在做一个项目的时候,遇到一个问题请那位高手指点一下!非常感谢!<br />当单片机在中断返回以后,要求它不返回到原来的地方,而是返回到我指定的地方去?<br />具体的情况如下:有10种模式在循环运行,在这个过程之中突然断电,然后再次上电。如果时间在一秒内,则从断电处运行的那一种模式的下一种模式变化开始运行,如果断电时间超过一秒,则从本次模式再次循环。在整个程序的运行过程之中,我用中断探测到何时断电,当我中断返回以后就不能再返回到原处了,而是返回到我指定的地方去从新运行,不知这里如何处理,请高手指点。谢谢!
fzj 发表于 2007-3-19 13:41 | 显示全部楼层

应该讲你的程序设计思路不对

如果中断返回要返回到你指定的地方也可以,可以根据你中断事件判断建立几个标志位,然后根据标志位去执行不同的子程序.
 楼主| ch_ljun 发表于 2007-3-19 19:35 | 显示全部楼层

这位仁兄说的可能有点问题。

非常感谢2楼的兄弟指点。因为我是初搞pic单片机,对此也不是很熟,所以还要兄弟们多多指教才是,你说的这种方式我当初也想过了。因为在怎个程序运行的过程之中,我设定了一个TIME1定时器,是每隔20ms中断一次,我要以此来判定,硬件在运行的过程之中是否会断电。如果断电时间超过一秒,在下一次上电时从这个模式从新运行,如果断电时间在一秒以内,下一次上电就从这个模式的下一个模式再运行。如果在中断这里设定标志,当硬件断电之后再上电(时间在1秒以内,因为硬件上有一个大电容,所以系统不会复位,程序可以接着运行),如果将程序跳到开始再运行,则中断没有返回,下一次断电就检测不到,如果中断返回了又不能运行新的模式,所以,在这里不知如何处理,不知兄弟能否教我,谢谢了。
cloud2k 发表于 2007-3-19 22:32 | 显示全部楼层

做标志位

中断做标志位,然后在程序运行的过程中不断的检测,呵呵.<br />没有做过.
 楼主| ch_ljun 发表于 2007-3-20 00:57 | 显示全部楼层

这个方案试过

这个方案试过,在两个模式的循环之中有一个5秒的延时,其一不可能到延时里检测,其二在同一个模式下又有几种变化,如果在运行中断电,程序也会乱的,所以这个方案行不通,看那路高手有更好的主意。谢谢。
FZJ 发表于 2007-3-20 08:40 | 显示全部楼层

楼主想要的是掉电一秒内的**功能吧

那就别软件了,交给硬件,由硬件来完成...<br />搞个掉电检测端口,一掉电就SLEEP,这时测量一下MCU消耗电流,然后合理选择储能电容容量,就是说储能电容容量只能维持单片机在SLEEP下放电1S,如果放电时间过长MCU因得不到维持电压而复位.
yewuyi 发表于 2007-3-20 08:51 | 显示全部楼层

如果你非要按照你的想法做,只有换成可以操作堆栈的MCU

  
尘埃读电子 发表于 2007-3-20 20:22 | 显示全部楼层

中断可以不返回吗?>

PIC中断只有8级你不返回就会逸出的
soso 发表于 2007-3-20 20:29 | 显示全部楼层

你的设计原理没错

&nbsp;&nbsp;不过的软件设计思路错误。你可以在中断中设置一个全局标记,全身快速退出,安全的时间内保存到EEPROM,下次开机检测状态标记决定做啥。
 楼主| ch_ljun 发表于 2007-3-24 21:47 | 显示全部楼层

问题解决

这个项目我已经搞定了,因为这个有些功能不用了,所以没有简单多了,另外这个项目,大家可以讨论一下,看有没有办法做到我说的那个功能,另外,硬件部份是已经做好了的,没有办法改动的。只有在软件上想办法,请各路高手讨论一下。
 楼主| ch_ljun 发表于 2007-4-3 14:54 | 显示全部楼层

还有其它方案吗

怎么这段时间没有高手发言,看还有其它方案吗,望高手们在这里指点,看有什么更好的思路。
兰天白云 发表于 2007-4-3 17:12 | 显示全部楼层

断电1秒钟,电路还有电压吗?

如果没有,那又怎么知道是断电1秒呢?
alin_99 发表于 2007-4-4 08:53 | 显示全部楼层

从备用电源的角度来考虑或者超级电容来考虑

  
 楼主| ch_ljun 发表于 2007-4-4 10:48 | 显示全部楼层

硬件有电容

我在题里说过了,在硬件是有一个大电容,外部断电了,电容可以支持单片机跑1秒多,所以就存在这样的问题出现了。
xieyuanbin 发表于 2007-4-4 18:49 | 显示全部楼层

是不是超过一秒钟重新运行,而不超过一秒返回?

简单:<br />如果超过一秒钟,那么程序进入一个死循环,让单片机WDT复位,重新运行,前提当然是WDT要开启.<br />如果不超过一秒钟,从中断返回应该没问题吧?<br />如果对堆栈很清楚,让堆栈下溢也是没问题的.不过要把GIE给补上,但从中断中直接跳转到正常程序是很危险的行为,因为很多值被你改变了.比如W和STATUS
 楼主| ch_ljun 发表于 2007-4-27 13:09 | 显示全部楼层

可以试试

楼上的兄弟说的这个方案,我也想过,感觉可行,可是我们WDT的用法不是很熟,不知道经过WDT复位之后,程序是自动从最开始运行,还是说会复位到中断跳出来的这个地方,如果是复位到叫断跳出来的这个地方那就有问题了,你高手们指点。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

1

主题

12

帖子

0

粉丝
快速回复 在线客服 返回列表 返回顶部