|
发表于 2012-11-12 22:49:33
|
显示全部楼层
本帖最后由 gaoshine 于 2012-11-12 22:59 编辑
gaoshine 发表于 2012-11-7 17:28
bootload很重要,在Arduino Duemilanove下失败,在 Arduino UNO下就可以实现。另外即便使用新bootload或者 ... - //*******************************************/
- //神经元2号控制器
- //Neuron Ver 2.02D
- //高胜 2012-4-1
- //修改 2012-8-12
- //电信基站机房监控
- //D0-D1为串口和网络模块接口
- //OUT1 2号口(开关量输出)烟感报警器1按钮接口
- //OUT2 3号口(开关量输出)烟感报警器2按钮接口
- //SG 4号口(开关量输出)室外声光警报器输出口
- //VD4 5号口(开关量输出)通讯状态灯
- //VD3 6号口(开关量输出)设备故障灯
- //VD2 7号口(开关量输入)报警灯
- //IN5 8号口(开关量输入)测试按钮
- //IN6 9号口(开关量输入)烟感报警器1接口
- //GZ1 10号口(开关量输入)烟感报警器2接口
- //A0 模拟0 (模拟量输入)采集室外声光报警器电压
- //********************************************/
- //修改输出字串 变DD[20] 为 DD[0-19]+DH[4-10] (DH[4-10]为参数)
- /*
- 写入基本信息指令: {*009,255;010,255;014,060;}
- 写入标识信息指令: {*041,001;}
- 保存指令: {#}
- */
-
- //Lib函数库库
- #include <EEPROM.h>
- #include <avr/wdt.h> //使用WDT看门狗
- //数字传感器端口
- #define smoke1_pin 9 //烟感报警器1接口
- #define smoke2_pin 10 //烟感报警器2接口
- #define alarm1_test_pin 2 //烟感报警器1按钮接口
- #define alarm2_test_pin 3 //烟感报警器2按钮接口
-
- #define alarm_pin 4 //室外声光警报器输出口
- #define reset_pin 4 //电源复位 (常开接点,需要上电是输出高电平)
- #define commled_pin 5 //通讯状态灯
- #define led_pin 6 //设备故障灯
- #define alarmled_pin 7 //报警灯
- #define testbutton_pin 8 //测试按钮
- //模拟传感器端口
- #define ac_pin 0 //电源电压传感器
- #define bj_pin 0 //声光报警器电压传感器
- int count; //程序控制器计数器
- int connect_count; // 通讯计数器
- byte alarmcount[20]; //为每个参数分配一个报警计数器
- byte unalarmcount[20]; //为每个参数分配一个un报警计数器
- byte alarmstatus[20];
- //int resetcount;
- int status; //系统进入空闲状态
- int address; //程序控制器变量
- int values; //程序控制器变量
- static uint32_t timer; //计时器
- boolean testflag = false; //自检测时标示
- boolean alarmflag = false; //报警标示
- int checkcount; //烟感报警器和声光报警器状态检测周期计数器 每1小时检测一次
- long jiange;
- int DD[20]; //动态数据 |ADD|NULL|D2|D3|....|D11|D12|D13|A0|..|A5| 一共20个
- byte DH[42]; //[0]:标示为"N" 否则认定没有设置参数
- //[1]-[20]为控制位 1-8字节 1(1 启用本通道 0 禁用本通道 ) 2、3(00数字输入 01数字输出 10
- //模拟输入 11模拟输出)4(1高位报警 0低位报警) 5、6(00不报、01只监控、10上限报警 11下限报警)
- //7、8(00网络报警 01 声音 10 短信 11声音+短信)
- //[21]-[40]对应[1]-[20]的报警数值
- //[41]设备地址码
- //DH[9] DH[10] fire DH[14] timer
- void setup()
- {
- //初始化串口
- Serial.begin(9600);
-
- //烟感报警器接口(输入)
- pinMode(smoke1_pin,INPUT);
- pinMode(smoke2_pin,INPUT);
- pinMode(testbutton_pin ,INPUT);
-
- //烟感报警器测试按钮接口(输出)
- pinMode(alarm1_test_pin,OUTPUT);
- pinMode(alarm2_test_pin,OUTPUT);
-
- //输出 LED灯 报警器 电源复位
- pinMode(led_pin,OUTPUT);
- pinMode(commled_pin,OUTPUT);
- pinMode(alarmled_pin,OUTPUT);
- pinMode(reset_pin,OUTPUT);
- pinMode(alarm_pin,OUTPUT);
-
- //拉高电平给设备供电
- digitalWrite(reset_pin, LOW);
- digitalWrite(alarm1_test_pin, LOW);
- digitalWrite(alarm2_test_pin, LOW);
- digitalWrite(alarm_pin, LOW);
- int i;
- for (i=0;i<20;i++){
- alarmcount[i]=0;
- }
- for (i=0;i<20;i++){
- DD[i]=1;
- }
- //设备初始化
- deviceinit();
-
- //变量初始化
- delay(1000);
- jiange=millis();
- status = 0;
- count = 100;
- connect_count=0;
- //初始化看门狗
- wdt_enable(WDTO_8S);
- }
-
- //主循环程序
- void loop()
- {
- byte inbyte;
- wdt_reset(); //喂狗
- if (Serial.available() > 0){ //从串口接收指令
- inbyte = Serial.read(); //
- action(inbyte); //调用控制函数进入指令状态
- }
-
- if (status==0) //status==0 那么系统进入空闲状态,继续采集数据、监控报警,否则进入忙状态暂停采集报警任务
- {
- data_capture(); //数据采集
- if (testflag==true) {
- alarmcheck(); //报警检测
- }
- if (!digitalRead(testbutton_pin)) //按下自检测试按钮
- {
- testflag=false;
- checkcount=0;
- checkfire(); //进行火灾探测器的自检测试
- delay(1000);
- checkalarm(); //进行声光报警器的自检测试
- }
- }
- //设备自检自启动
- void selftest(){
- Serial.print("<i|SELF_TEST|");
- Serial.print(DH[41],DEC);
- Serial.println("|>");
- for(int i=1;i<=3;i++){
- digitalWrite(led_pin, HIGH);
- digitalWrite(alarmled_pin, HIGH);
- wdt_reset(); //喂狗
- delay(3000);
- digitalWrite(led_pin, LOW);
- digitalWrite(alarmled_pin, LOW);
- }
-
- Serial.print("<i|SYSTEM_RESET|");
- Serial.print(DH[41],DEC);
- Serial.println("|>");
- delay(10000); //8S后系统复位
- }
复制代码
顺便说一下 看门狗的用法很简单 看看是不是片子和bootload的问题
只需要三句话就可以
#include <avr/wdt.h> //使用WDT看门狗
wdt_enable(WDTO_8S); //初始化看门狗
wdt_reset(); //喂狗
然后给个长于8S的延时,系统就可以重新启动
另外 我还常用软启动来解决系统启动问题,效率比看门狗要高,只是启动后,寄存器和内存变量的值不变,供各位参考:
void software_Reset() // 软启动系统,但不 复位寄存器和变量
{
asm volatile (" jmp 0");
}
这个原理很简单,直接跳转到程序起始位:0000开始运行,学过汇编的应该明白,这个效率真他妈的高啊 呵呵
|
|