打开APP
userphoto
未登录

开通VIP,畅享免费电子书等14项超值服

开通VIP
Arduino看门狗问题,求助(已解决)
ARDUINO 代码
  1. //*******************************************/
  2. //神经元2号控制器
  3. //Neuron Ver 2.02D
  4. //高胜  2012-4-1
  5. //修改  2012-8-12
  6. //电信基站机房监控
  7. //D0-D1为串口和网络模块接口
  8. //OUT1  2号口(开关量输出)烟感报警器1按钮接口
  9. //OUT2  3号口(开关量输出)烟感报警器2按钮接口
  10. //SG    4号口(开关量输出)室外声光警报器输出口
  11. //VD4   5号口(开关量输出)通讯状态灯
  12. //VD3   6号口(开关量输出)设备故障灯
  13. //VD2   7号口(开关量输入)报警灯
  14. //IN5   8号口(开关量输入)测试按钮
  15. //IN6   9号口(开关量输入)烟感报警器1接口
  16. //GZ1   10号口(开关量输入)烟感报警器2接口
  17. //A0    模拟0 (模拟量输入)采集室外声光报警器电压
  18. //********************************************/
  19. //修改输出字串 变DD[20] 为 DD[0-19]+DH[4-10] (DH[4-10]为参数)
  20. /*
  21. 写入基本信息指令: {*009,255;010,255;014,060;}
  22. 写入标识信息指令: {*041,001;}
  23. 保存指令:         {#}
  24. */


  25. //Lib函数库库
  26. #include <EEPROM.h>
  27. #include <avr/wdt.h>                                                                //使用WDT看门狗


  28. //数字传感器端口

  29. #define smoke1_pin                            9                 //烟感报警器1接口
  30. #define smoke2_pin                            10                //烟感报警器2接口
  31. #define alarm1_test_pin          2                 //烟感报警器1按钮接口
  32. #define alarm2_test_pin                         3                 //烟感报警器2按钮接口

  33. #define alarm_pin                         4                 //室外声光警报器输出口
  34. #define reset_pin                            4                 //电源复位 (常开接点,需要上电是输出高电平)

  35. #define commled_pin                                 5                                   //通讯状态灯         
  36. #define led_pin                          6                 //设备故障灯
  37. #define alarmled_pin                        7                 //报警灯
  38. #define testbutton_pin                    8                 //测试按钮


  39. //模拟传感器端口
  40. #define ac_pin                            0                   //电源电压传感器
  41. #define bj_pin                            0                   //声光报警器电压传感器


  42. int count;                                           //程序控制器计数器
  43. int connect_count;                                                                        // 通讯计数器
  44. byte alarmcount[20];                                 //为每个参数分配一个报警计数器
  45. byte unalarmcount[20];                               //为每个参数分配一个un报警计数器
  46. byte alarmstatus[20];
  47. //int resetcount;
  48. int status;                                                                                 //系统进入空闲状态
  49. int address;                                                                                 //程序控制器变量
  50. int values;                                                                                 //程序控制器变量
  51. static uint32_t timer;                                                                 //计时器
  52. boolean testflag = false;                           //自检测时标示
  53. boolean alarmflag = false;                                                        //报警标示                                               
  54. int        checkcount;                                                                       //烟感报警器和声光报警器状态检测周期计数器 每1小时检测一次
  55. long jiange;

  56. int DD[20];                                          //动态数据 |ADD|NULL|D2|D3|....|D11|D12|D13|A0|..|A5| 一共20个

  57. byte DH[42];                                                      //[0]:标示为"N" 否则认定没有设置参数
  58.                                                                                                  //[1]-[20]为控制位 1-8字节 1(1 启用本通道 0 禁用本通道 ) 2、3(00数字输入 01数字输出 10
  59.                                                                                                  //模拟输入 11模拟输出)4(1高位报警 0低位报警) 5、6(00不报、01只监控、10上限报警 11下限报警)
  60.                                                                                                  //7、8(00网络报警 01 声音 10 短信 11声音+短信)
  61.                                                                                                  //[21]-[40]对应[1]-[20]的报警数值
  62.                                                                                                  //[41]设备地址码  
  63.                                                                                                  //DH[9] DH[10] fire        DH[14] timer      
  64. void setup()
  65. {
  66.         //初始化串口
  67.         Serial.begin(9600);         

  68.         //烟感报警器接口(输入)
  69.         pinMode(smoke1_pin,INPUT);
  70.         pinMode(smoke2_pin,INPUT);
  71.         pinMode(testbutton_pin ,INPUT);

  72.         //烟感报警器测试按钮接口(输出)
  73.         pinMode(alarm1_test_pin,OUTPUT);
  74.         pinMode(alarm2_test_pin,OUTPUT);

  75.         //输出 LED灯 报警器 电源复位
  76.         pinMode(led_pin,OUTPUT);
  77.         pinMode(commled_pin,OUTPUT);
  78.         pinMode(alarmled_pin,OUTPUT);

  79.         pinMode(reset_pin,OUTPUT);
  80.         pinMode(alarm_pin,OUTPUT);



  81.         //拉高电平给设备供电
  82.         digitalWrite(reset_pin, LOW);  
  83.         digitalWrite(alarm1_test_pin, LOW);  
  84.         digitalWrite(alarm2_test_pin, LOW);  
  85.         digitalWrite(alarm_pin, LOW);         
  86.     int i;
  87.     for (i=0;i<20;i++){
  88.                 alarmcount[i]=0;
  89.                 }
  90.     for (i=0;i<20;i++){
  91.                 DD[i]=1;
  92.                 }
  93.     //设备初始化
  94.         deviceinit();

  95.         //变量初始化
  96.         delay(1000);
  97.     jiange=millis();
  98.         status = 0;
  99.     count = 100;
  100.         connect_count=0;
  101.         //初始化看门狗
  102.         wdt_enable(WDTO_8S);      

  103. }


  104. //主循环程序   
  105. void loop()  
  106. {  
  107.         byte inbyte;
  108.         wdt_reset();                                                                          //喂狗         
  109.    if (Serial.available() > 0){                          //从串口接收指令
  110.     inbyte = Serial.read();                              //
  111.     action(inbyte);                                      //调用控制函数进入指令状态
  112.    }

  113. if (status==0)                         //status==0 那么系统进入空闲状态,继续采集数据、监控报警,否则进入忙状态暂停采集报警任务
  114. {
  115.     data_capture();                //数据采集
  116.     if   (testflag==true)        {
  117.         alarmcheck();                 //报警检测
  118.         }
  119.         if (!digitalRead(testbutton_pin))        //按下自检测试按钮
  120.         {
  121.     testflag=false;
  122.         checkcount=0;
  123.         checkfire();         //进行火灾探测器的自检测试
  124.         delay(1000);
  125.         checkalarm();    //进行声光报警器的自检测试

  126.         }
  127. }





  128. //设备自检自启动
  129. void selftest(){

  130.         Serial.print("<i|SELF_TEST|");
  131.         Serial.print(DH[41],DEC);
  132.         Serial.println("|>");

  133. for(int i=1;i<=3;i++){
  134.         digitalWrite(led_pin, HIGH);  
  135.         digitalWrite(alarmled_pin, HIGH);  
  136.     wdt_reset();                                                                                          //喂狗               
  137.         delay(3000);
  138.         digitalWrite(led_pin, LOW);
  139.         digitalWrite(alarmled_pin, LOW);
  140.         }

  141.         Serial.print("<i|SYSTEM_RESET|");
  142.         Serial.print(DH[41],DEC);
  143.         Serial.println("|>");
  144.         delay(10000);                                                                                                //8S后系统复位
  145.         }




顺便说一下 看门狗的用法很简单 看看是不是片子和bootload的问题
只需要三句话就可以

#include <avr/wdt.h>                                                                //使用WDT看门狗

wdt_enable(WDTO_8S);                                                                  //初始化看门狗

wdt_reset();                                                                                          //喂狗

然后给个长于8S的延时,系统就可以重新启动


另外 我还常用软启动来解决系统启动问题,效率比看门狗要高,只是启动后,寄存器和内存变量的值不变,供各位参考:


void software_Reset() // 软启动系统,但不 复位寄存器和变量
{
        asm volatile ("  jmp 0");
}  

这个原理很简单,直接跳转到程序起始位:0000开始运行,学过汇编的应该明白,这个效率真他妈的高啊 呵呵
本站仅提供存储服务,所有内容均由用户发布,如发现有害或侵权内容,请点击举报
打开APP,阅读全文并永久保存 查看更多类似文章
猜你喜欢
类似文章
【热】打开小程序,算一算2024你的财运
MSP430看门狗定时器的寄存器定义
MSP430学习小结1
【Arduino学习笔记】蓝牙控制手自两用避障车
学做8位计算机
如何使局域网/以太网使用Arduino Uno继电器开关
【RISC-V MCU应用开发】详解EC11编码器高效驱动方法
更多类似文章 >>
生活服务
热点新闻
分享 收藏 导长图 关注 下载文章
绑定账号成功
后续可登录账号畅享VIP特权!
如果VIP功能使用有故障,
可点击这里联系客服!

联系客服