我正在8051家庭的ATMEL AT89C51上开发一个应用程序。
有人建议如何确定编码是否由于电源循环或通过软件完成了重置?
答案 0 :(得分:3)
根据Atmel 8051 Microcontrollers Hardware Manual (PDF link),当VCC从0上升到其标称电压时,功率控制寄存器(PCON / 87h)中的断电标志(POF / bit 4)由硬件置1。仅在上电(冷复位)后,断电标志复位值才为1。热复位(例如软件复位)不会影响该位的值。
我经常发现不同的供应商在SFR空间中实现自己的寄存器,可以利用这种情况来解决这种情况。例如,Silicon Labs在其复位源寄存器(RSTSRC)中使用上电复位标志(PORSF)。
答案 1 :(得分:1)
这取决于您是否希望依赖某些特定的8051变体供应商。最好使用供应商提供的寄存器,但是如果你更换了供应商,你的代码就会制动,甚至更糟糕的是,它会出现行为异常。
如果您的系统中有外部RAM(并且它没有电池供电),那么您可以在内存的保留部分的某处写入一个字节序列(如0xAA,0x55 ......),并检查它是否存在启动后仍然存在。如果没有,你就开始了。当然,您应该修改汇编程序启动代码以确保它不初始化此部分内存(或者在每次启动时它将为零),并且您应该指示您的链接器将此内存从链接中排除,以便它不会获得被其他任何东西使用。
最后,在你的代码中包含条件编译,这样如果你有一个带有特殊寄存器的8051变体,那么它将被使用,如果没有,试试计划B.
我用几个字节的内部8051内存完成了这一点/我所有的外部RAM都是电池供电的/然后我学到了不是每个8051变体在启动时都有一致的策略 - 有些已经初始化了所有内部存储器,有些已经初始化了SFR和其他一些特定区域,只留下几个字节来完成所描述的过程。
答案 2 :(得分:0)
我认为没有一种方法可以确定重置是如何发生的,因为一旦重置,一切都从8051年开始。
我认为可行的一种方法是,
假设在每个软件复位代码之前取一个变量X,只需设置X = 1(表示软件复位),并在外部接口时将此变量存储在任何ROM中。
在每次重置时,在开始时包括一个实例,它检查此变量X以查看发生了哪次重置并将X更改为0,以便下次检测。
如果您没有外部ROM,请至少连接D锁存器。
我希望这有效。请告诉我这是否有效。