The values of the EEPROM2 settings are displayed in pc.print in a special line with the current diagnostic data. An additional block has been made in the parser for decoding incoming alarm settings; they are written in EEPROM2.
Diff: main.cpp
- Revision:
- 2:8230a5a4cc13
- Parent:
- 1:1d4ec28f17c4
- Child:
- 3:712f751b4974
--- a/main.cpp Fri May 08 12:05:29 2020 +0000 +++ b/main.cpp Fri May 15 07:56:26 2020 +0000 @@ -1,4 +1,9 @@ +// Создан сторожевой таймер, который истекает через 100мс #include "mbed.h" +#include "_24LCXXX.h" + +I2C i2c(PB_9,PB_8); // sda, scl +_24LCXXX eeprom(&i2c, 0x50); AnalogIn analog_value(A0); //подключение аналогового входа A0 DigitalOut led(LED1); @@ -8,15 +13,16 @@ RawSerial plotter(PA_9, PA_10, 115200); // tx, rx for F411RE out port for serial_plotter EventQueue *queue = mbed_event_queue(); //инициализация очереди событий RTOS mbed5 Timer timer; //инициализация таймера - -int flag_autoset = 0; //отладочный флаг. При 0 - запрет автоуставки давления, при 1 - разрешение -int flag_plotter = 0; //отладочный флаг. При 0 - запрет печати в плоттер, при 1 - разрешение -int value = 0; //set begin value "pressure" -int delta_value = 0; //set delta pressure +//========УСТАВКИ======== +uint8_t flag_autoset = 0; //отладочный флаг. При 0 - запрет автоуставки давления, при 1 - разрешение +uint8_t flag_plotter = 0; //отладочный флаг. При 0 - запрет печати в плоттер, при 1 - разрешение +int value = 0; //set begin value "pressure" 1...3300 +uint8_t delta_value = 0; //set delta pressure 1...99 +//======================= int value_auto=250 ; //set begin value auto "pressure" int sensor_value =0; //напряжение с аналогового входа А0 (текущее давление) -int counter_cycle1 = 0; -int counter_cycle2 = 0; +int counter_cycle1 = 0; //счётчик цикла while(true) +int counter_cycle2 = 0; //счётчик внутри функции auto_set int sig = 1; //знак инкримента для автоустаки // FIFO_buffer must be full (only char and '\0') //#define maxnsym 24 // maximum nbr of symbols FIFO_buffer (вариант без символов окончания) @@ -24,10 +30,39 @@ char Source[maxnsym]="$press,1000,25,0,0,2050**"; //23 char- string ,весь массив со строкой для поиска 23+1(null terminal)=24 //уставки и контрольная сумма умноженная на два, должны быть больше нуля char trueSource[maxnsym]; //верифицированная строка для callback +char trueSourceOld[maxnsym]; //предыдущая верифицированная строка для callback volatile char chr_a; //в прерываниях переменные должны быть защищены при помощи volatile от оптимизации компилятором volatile bool flag_comand_detected = false; //если строка декодирована правильно то true -volatile bool flag_reset = true; //флаг индикатора перезагрузки +volatile bool flag_stopRegulator = true; //флаг остановки , закрыть все клапана +//_____________________________________________________________________________ +void save_EEPROM () { + int data2; + pc.printf("EEPROM write------\r\n"); + eeprom.byte_write(0, delta_value); + eeprom.byte_write(1, flag_autoset); + eeprom.byte_write(2, flag_plotter); + data2 = value; + eeprom.nbyte_write( 10, &data2, sizeof(int)); +} +//_____________________________________________________________________________ +void load_EEPROM () { + uint8_t data1; + int data2; + pc.printf("EEPROM read------\r\n"); + eeprom.nbyte_read( 0, &data1, 1 ); + pc.printf("adress 0 =%d \r\n",data1); + delta_value=data1; + eeprom.nbyte_read( 1, &data1, 1 ); + pc.printf("adress 1 =%d \r\n",data1); + flag_autoset=data1; + eeprom.nbyte_read( 2, &data1, 1 ); + pc.printf("adress 2 =%d \r\n",data1); + flag_plotter=data1; + eeprom.nbyte_read( 10, &data2, sizeof(int) ); + pc.printf("adress 10 = %d \r\n",data2); + value=data2; + } //______________________________________________________________________________ void substring(char *s,char *d,int pos,int len) { //usage: substring(Source,Destination,pos,len); @@ -164,23 +199,38 @@ int time, valve1, valve2, countValve1=0, countValve2=0; int frequencyValve1, frequencyValve2; float raw_value_sum = 0 ; - //после перезагрузки немедленно закрыть оба клапана - digital_4.write(0); //valve1 off; - digital_7.write(0); //valve2 off; - + digital_4.write(0); //valve1 off; + digital_7.write(0); //valve2 off; + load_EEPROM (); //загрузка уставок из EEPROM + if (value >= 1 && delta_value >= 1 && flag_autoset < 2 && flag_plotter < 2) { + flag_stopRegulator=false; //уставки из EEPROM похожи на правду, разрешаем работу регулятора + } else { + flag_stopRegulator = true; //флаг остановки установлен + pc.printf("Regulator stopped, error in EEPROM \r\n"); + } + pc.printf("Program started \r\n"); + Watchdog &watchdog = Watchdog::get_instance(); + watchdog.start(100); //WDlimit = 100 ms timer.start(); while (true){ //бесконечный цикл - + // kick watchdog regularly within provided timeout (сброс собаки в начало счёта) + watchdog.kick(); if (flag_comand_detected) { //пришла правильная командная строка pc.printf("$press,%d,%d,%d,%d,%d,%d,%d,*\r\n", value,delta_value,flag_autoset,flag_plotter,sensor_value,frequencyValve1,frequencyValve2); //текущие данные //pc.printf("%s\r\n",trueSource); //эхо для отладки канала связи - flag_comand_detected=false; //в последующих обращениях не печатать пока нет новых уставок из СОМ-порта - flag_reset=false; //сброс флага перезагрузки (после перезагрузки клапана закрыты, регулятор ждет пока не будет сброшен этот флаг) + flag_comand_detected=false; //в последующих обращениях не печатать пока нет новых уставок из СОМ-порта + flag_stopRegulator=false; //сброс флага, регулятор ждет пока не будет сброшен этот флаг //plotter.printf("$%d %d %d %d %d;\r\n", digital_4.read()*100-110, // digital_7.read()*100-220, value, sensor_value, time ); //печать в плоттер в другой СОМ-порт + if (strcmp(trueSourceOld,trueSource) != 0) { //функция возвращает ноль если командные строки совпадают + save_EEPROM (); //пишем в память уставки отличные от старых + load_EEPROM (); + } + + strcpy(trueSourceOld,trueSource); //копировать из trueSource в trueSourceOld } float raw_value = analog_value.read(); // Чтение аналогового входа (0.0 to 1.0 = full ADC диапазон) raw_value_sum = raw_value_sum + raw_value; @@ -189,7 +239,7 @@ counter_cycle1=0; sensor_value = raw_value_sum/20 * 3300; // преобразование в напряжение 0-3300 mV с усреднением raw_value_sum = 0 ; - if (flag_reset == false) { //после перезагрузки уставки получены, можно запускать регулятор + if (flag_stopRegulator == false) { // можно запускать регулятор //--------------regulator begin----------------------- if (sensor_value > value + delta_value) { valve2 = digital_7.read();