Important changes to repositories hosted on mbed.com
Mbed hosted mercurial repositories are deprecated and are due to be permanently deleted in July 2026.
To keep a copy of this software download the repository Zip archive or clone locally using Mercurial.
It is also possible to export all your personal repositories from the account settings page.
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();