[应用方案] N79E715的BOD中断演示

[复制链接]
1445|10
 楼主| dongnanxibei 发表于 2017-1-14 19:41 | 显示全部楼层 |阅读模式
  1. /*---------------------------------------------------------------------------------------------------------*/
  2. /*                                                                                                         */
  3. /* Copyright(c) 2015 Nuvoton Technology Corp. All rights reserved.                                         */
  4. /*                                                                                                         */
  5. /*---------------------------------------------------------------------------------------------------------*/

  6. //***********************************************************************************************************
  7. //  Nuvoton Technology Corp.
  8. //  E-mail: MicroC-8bit@nuvoton.com
  9. //***********************************************************************************************************

  10. bit EA_Save_bit;
  11. #include <stdio.h>
  12. #include "N79E715.h"
  13. #include "Typedef.h"
  14. #include "Define.h"
  15. #include "Common.h"
  16. #include "Delay.h"
  17. #include "ISR.h"
  18. #include "wdt.h"
  19. #include "Version.h"

  20. #define set_BODEN\
  21.         EA_Save_bit=EA;\
  22.         EA=0;\
  23.         TA=0xAA;\
  24.         TA=0x55;\
  25.         PMCR |= SET_BIT7;\
  26.         EA=EA_Save_bit;
  27. #define clr_BODEN\
  28.         EA_Save_bit=EA;\
  29.         EA=0;\
  30.         TA=0xAA;\
  31.         TA=0x55;\
  32.         PMCR &= CLR_BIT7;\
  33.         EA=EA_Save_bit;
  34. #define set_BOV\
  35.         EA_Save_bit=EA;\
  36.         EA=0;\
  37.         TA=0xAA;\
  38.         TA=0x55;\
  39.         PMCR |= SET_BIT6;\
  40.         EA=EA_Save_bit;
  41. #define clr_BOV\
  42.         EA_Save_bit=EA;\
  43.         EA=0;\
  44.         TA=0xAA;\
  45.         TA=0x55;\
  46.         PMCR &= CLR_BIT6;\
  47.         EA=EA_Save_bit;
  48. #define set_BORST\
  49.         EA_Save_bit=EA;\
  50.         EA=0;\
  51.         TA=0xAA;\
  52.         TA=0x55;\
  53.         PMCR |= SET_BIT4;\
  54.         EA=EA_Save_bit;
  55. #define clr_BORST\
  56.         EA_Save_bit=EA;\
  57.         EA=0;\
  58.         TA=0xAA;\
  59.         TA=0x55;\
  60.         PMCR &= CLR_BIT4;\
  61.         EA=EA_Save_bit;
  62. //-----------------------------------------------------------------------------------------------------------
  63. UINT8 CounterBOF = 0;
  64. void main()
  65. {
  66.     InitialUART0_Timer1(9600);      // 9600 Baud Rate [url=home.php?mod=space&uid=72445]@[/url] 11.0592MHz
  67.     printf ("\n*===================================================================");
  68.     printf ("\n*  Name: N79E715 BOD Sample Code.");
  69.     printf ("\n*===================================================================");
  70.     set_BODEN        //Enable BOD
  71.     set_BOV          //Select BOD38
  72.     clr_BORST        //Disable BOD reset when VDD drops below VBOD
  73.     EBO = 1;         //Enable BOD Interrupt
  74.     EA = 1;

  75.     while(1)
  76.     {
  77.         if(PMCR & 0x01)       //BOS = 1: VDD is higher than VBOD
  78.         {
  79.             P0 = PMCR;
  80.             printf ("\nVDD is higher than VBOD");
  81.         }
  82.         else                  //BOS = 0: VDD is lower than VBOD
  83.         {
  84.             P0 = PMCR;
  85.             printf ("\nVDD is lower than VBOD");
  86.         }
  87.         Delay1ms(2000);
  88.     }
  89. }
  90. //-----------------------------------------------------------------------------------------------------------
  91. void BOD_ISR(void)  interrupt 8             // Vector @  0x43
  92. {
  93.     clr_BOF;//Two conditions will assert BOF,
  94.             //One is "VDD rise above VBOD";
  95.             //Another is "VDD fall below VBOD"
  96.     CounterBOF++;
  97.     P2 = CounterBOF;
  98. }
  99. //-----------------------------------------------------------------------------------------------------------


 楼主| dongnanxibei 发表于 2017-1-14 20:07 | 显示全部楼层
电源检测(BOD):
  对于单片机5V系统,设置BOD电平为4.0V;对于3V系统,设置BOD电平为2.7V。然后允许BOD检测。
  这样,一旦单片机的供电电压低于BOD电平,单片机进入RESET(不执行程序了)。而当电源恢复到BOD电平以上,单片机才正式开始从头执行程序。保证了系统的可靠性!
  当电压跌至2.5V,系统程序还能工作。这是有2个可怕的现象可能出现,
  1。外围芯片工作已经混乱,单片机读到的东西不正确,造成程序的执行发生逻辑错误(不是单片机本身的原因)。
  2。当电源低到临界点,如2.4V时,并且在此互上互下的,单片机本身的程序执行也不正常,取指令、读数据都可能发生错误,或程序乱飞、不稳定,非常容易造成EEPROM、FALSH的破坏。有人问51怎么不会?实际上51也是这样,只是51内部没有直接写EEPROM、FLASH的指令,它的程序乱飞留不下痕迹。还有人有疑问:外挂EEPROM,掉电时怎么不会改写?实际是外挂EEPROM,当电压低于4V(2.7V)时,它已经不工作了,程序去改内容也改不了。
heisexingqisi 发表于 2017-1-15 16:34 | 显示全部楼层
实用那个宏没想到可以让程序看起来这么美观。
734774645 发表于 2017-1-15 22:44 | 显示全部楼层
如果能弄个可以传递函数进去设置这个BOV值的就给力了。
yiyigirl2014 发表于 2017-1-16 13:51 | 显示全部楼层
中断后是不是就关机了。
玛尼玛尼哄 发表于 2017-1-16 21:55 | 显示全部楼层
玛尼玛尼哄 发表于 2017-1-16 21:57 | 显示全部楼层
看了用户手册,发现还是51单片机简单啊。
 楼主| dongnanxibei 发表于 2017-1-23 20:03 | 显示全部楼层
51确实用起来简单,但是硬件实现起来复杂,用的是复杂指令集。
zhuomuniao110 发表于 2017-1-26 18:04 | 显示全部楼层
当电压低于4V(2.7V)时,它已经不工作了,程序去改内容也改不了
734774645 发表于 2017-1-26 19:02 | 显示全部楼层
对于单片机5V系统,设置BOD电平为4.0V;对于3V系统,设置BOD电平为2.7V。然后允许BOD检测。
 楼主| dongnanxibei 发表于 2017-1-26 19:42 | 显示全部楼层
实际上51也是这样,只是51内部没有直接写EEPROM、FLASH的指令,它的程序乱飞留不下痕迹。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

225

主题

3870

帖子

18

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