Relay counter

Dependencies:   TM1638 mbed mbed-rtos AT45

Files at this revision

API Documentation at this revision

Comitter:
Oleg_B
Date:
Thu Jan 28 14:18:16 2021 +0000
Child:
1:36d6279f43d5
Commit message:
Relay - counter

Changed in this revision

AT45.lib Show annotated file Show diff for this revision Revisions of this file
TM1638.lib Show annotated file Show diff for this revision Revisions of this file
Watchdog.lib Show annotated file Show diff for this revision Revisions of this file
main_count_v1.cmm Show annotated file Show diff for this revision Revisions of this file
main_count_v1.txt Show annotated file Show diff for this revision Revisions of this file
main_count_v2.cpp Show annotated file Show diff for this revision Revisions of this file
mbed-rtos.lib Show annotated file Show diff for this revision Revisions of this file
mbed.bld Show annotated file Show diff for this revision Revisions of this file
mbed_app.json Show annotated file Show diff for this revision Revisions of this file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/AT45.lib	Thu Jan 28 14:18:16 2021 +0000
@@ -0,0 +1,1 @@
+https://os.mbed.com/users/maclobdell/code/AT45/#f8e562ae5cc3
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/TM1638.lib	Thu Jan 28 14:18:16 2021 +0000
@@ -0,0 +1,1 @@
+https://os.mbed.com/users/wim/code/TM1638/#b2bbdc58967e
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Watchdog.lib	Thu Jan 28 14:18:16 2021 +0000
@@ -0,0 +1,1 @@
+https://os.mbed.com/users/Oleg_B/code/Watchdog/#1ec3e04054b6
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/main_count_v1.cmm	Thu Jan 28 14:18:16 2021 +0000
@@ -0,0 +1,267 @@
+
+/**************rele-counter v1  **********************************/
+//  при включении восстанавливаются значения текущие и уставка  
+//  при подаче импульсов +24В на счетный вход значение  увеличиваются +1
+//  при подаче +24В на вхд сброса, значения сбрасываются  
+//  реле включается если  значение равно или больше  установленного
+//
+
+
+
+#include "mbed.h"
+#include "rtos.h"
+#include "TM1638.h"
+#include "AT45.h"
+
+
+// -------  input/output  ----------------
+DigitalOut  led(PC_13);
+DigitalOut  rel(PA_15);
+DigitalIn   in1(PA_8);
+DigitalIn   in2(PA_9);
+DigitalIn   in3(PA_10);
+
+//  -------  displey --------------------
+TM1638_LEDKEY8 LEDKEY8(PB_15,PB_14,PB_13, PB_12);
+TM1638::KeyData_t keydata; 
+
+
+//----------- SPI FLASH  ------------------------
+SPI 	spi(PA_7, PA_6, PA_5); 	// mosi, miso, sclk
+AT45 	spif(&spi, PA_4);		// NSS
+
+char *spi_buffer = (char*) malloc(64);
+char str[10]; 
+
+
+// --------  глоб.переменные ---------------
+int present_val = 0;				// текущее заначение 
+int present_val_last = 0;			// текущее значение (старое)
+int max_value = 0;					// значение  вкл. реле
+
+int  led1=0;						//  индикация LED1
+int  led2=0;						//  индикация LED2
+int  led3=0;						//  индикация LED3
+
+// --------  Прототипы функций:  ----------
+void count_value();
+
+
+/********************************************************************/
+int main() {
+	
+    //  предустановка  значений 
+    int update = 0;
+    int update2 = 0;
+    int delay_update_x10 = 2000;			//  задержка  перед  +/-  x_inreasing_decreasing
+    int time_update_increase = 0;			//  отсчет времени до  +10
+    int time_update_decrease = 0;			//  отсчет времени до -10
+    int delay_cycle = 25;					//  период вывода инф. на дисплей
+    int once_increase = 0;
+    int once_decrease = 0;
+    int x_inreasing_decreasing = 10;		//	+/-  после удержания кнопки
+   
+    
+    int write_page_time = 5000;				//  время до  записи  max_value
+    int timer_to_write_page = 0;			//  отсчет времени до  записи  max_value
+    int write_page_start = 0;				//  старт процедуры записи 
+    
+    
+    // Вычитываем сохраненное максимальное значение (11 стр для записи)
+    spif.read_page(spi_buffer, 11);
+    max_value = atoi(spi_buffer);
+    
+    // Вычитываем сохраненное текущее значение (12 стр для записи)
+    spif.read_page(spi_buffer, 12);
+    present_val = atoi(spi_buffer);
+    
+    // Делаем текущее значение != текущему прошлому значение
+    present_val_last = present_val + 10;
+    
+    // Поток для работы с текущим значением
+    Thread count_thread;
+    count_thread.start(count_value);
+    
+	
+	while(1) {
+		
+		/***  обработка нажатия кнопок   ***/
+		
+		LEDKEY8.getKeys(&keydata);
+		
+		// Нажимаем кнопку X, текущее значение = 0
+		if(keydata[LEDKEY8_SW3_IDX] == LEDKEY8_SW3_BIT) {
+			present_val = 0;
+		}
+		
+		
+		// Нажимаем кнопку увеличить 
+		if(keydata[LEDKEY8_SW1_IDX] == LEDKEY8_SW1_BIT) {
+			if(keydata[LEDKEY8_SW2_IDX] != LEDKEY8_SW2_BIT) {
+				time_update_increase = time_update_increase + delay_cycle;
+				
+				// Один раз делаем +1
+				if(once_increase == 0) {
+					once_increase = 1;
+					if(max_value<999){max_value = max_value + 1;}
+					update = 0;
+				}
+				
+				write_page_start = 1;
+				timer_to_write_page = 0;
+			}
+		}
+		else {
+			time_update_increase = 0;
+			once_increase = 0;
+		}
+		
+		
+		
+		// Нажимаем кнопку уменьшить
+		if(keydata[LEDKEY8_SW2_IDX] == LEDKEY8_SW2_BIT) {
+			if(keydata[LEDKEY8_SW1_IDX] != LEDKEY8_SW1_BIT) {
+				time_update_decrease = time_update_decrease + delay_cycle;
+				
+				// Один раз делаем -1
+				if(once_decrease == 0) {
+					once_decrease = 1;
+					if(max_value>0){max_value = max_value - 1;}
+					update = 0;
+				}
+				
+				write_page_start = 1;
+				timer_to_write_page = 0;
+			}
+		}
+		else {
+			once_decrease = 0;
+			time_update_decrease = 0;
+		}
+		
+		
+		
+		
+		// При удержании кнопки увеличить  на +10
+		if(keydata[LEDKEY8_SW1_IDX] == LEDKEY8_SW1_BIT) {
+			if(time_update_increase >= delay_update_x10) {
+				time_update_increase = delay_update_x10 - delay_cycle*10;
+				if(max_value<=990){max_value = max_value + x_inreasing_decreasing;}
+				update = 0;
+			}
+		}
+		
+		
+		
+		
+		// При удержании  кнопки уменьшить на -10
+		if(keydata[LEDKEY8_SW2_IDX] == LEDKEY8_SW2_BIT) {
+			if(time_update_decrease >= delay_update_x10) {
+				time_update_decrease = delay_update_x10 - delay_cycle*10;
+				if(max_value>10){max_value = max_value - x_inreasing_decreasing;}
+				update = 0;
+			}
+		}
+		
+		
+		
+		// Записываем в память максимальное значение 
+		// через время write_page_time после нажатий кнопок
+		if(write_page_start == 1) {
+			timer_to_write_page = timer_to_write_page + delay_cycle;
+			
+			if(timer_to_write_page >= write_page_time) {
+				write_page_start = 0;
+				timer_to_write_page = 0;
+				sprintf(spi_buffer, "%d", max_value);
+				spif.page_erase(11);  
+				spif.write_page(spi_buffer, 11);
+				
+				LEDKEY8.locate(0);
+				LEDKEY8.printf("   ");
+				Thread::wait(500);
+				LEDKEY8.locate(0);
+				LEDKEY8.printf("%d", max_value);
+			}
+		}
+		
+		
+		
+		/***  вывод на дисплей  ***/
+		
+		led = !led ;
+		
+		LEDKEY8.cls();
+		LEDKEY8.setBrightness(TM1638_BRT1);
+		LEDKEY8.locate(0);
+		LEDKEY8.printf("%d", max_value);
+		LEDKEY8.locate(3);
+		LEDKEY8.printf("%d", present_val);
+		if(led1==1){LEDKEY8.setIcon(TM1638_LEDKEY8::LD1);}else{LEDKEY8.clrIcon(TM1638_LEDKEY8::LD1);}
+		if(led2==1){LEDKEY8.setIcon(TM1638_LEDKEY8::LD2);}else{LEDKEY8.clrIcon(TM1638_LEDKEY8::LD2);}
+		if(led3==1){LEDKEY8.setIcon(TM1638_LEDKEY8::LD3);}else{LEDKEY8.clrIcon(TM1638_LEDKEY8::LD3);}
+				
+		
+		Thread::wait(delay_cycle);
+	}
+}
+
+/****************************************************************/
+
+// Поток работы с текущим значением 10msec
+void count_value() {
+	
+	int  c_inp1=0;
+	int  c_inp2=0;
+	int  c_inp3=0;
+	int  m_inp1=0;
+	int  m_inp2=0;
+	int  m_inp3=0;
+	
+	while(1) {
+		
+		//  фиксируем значения
+		if(in1==0){c_inp1=1;}else{c_inp1=0;}
+		if(in2==0){c_inp2=1;}else{c_inp2=0;}
+		if(in3==0){c_inp3=1;}else{c_inp3=0;}
+		
+		
+		// сохраняем тек.значение  в 12 стр. при выкл. питания
+		if(c_inp1==0 && m_inp1==1){
+			sprintf(spi_buffer, "%d", present_val);
+			spif.page_erase(12);  
+			spif.write_page(spi_buffer, 12);
+		}
+		
+		// подсчет импульсов по входу 1
+		if(c_inp2==1 && m_inp2==0){
+			present_val++;
+		}
+		
+		// сбрасываем текущее значение по входу 2
+		if(c_inp3==1 && m_inp3==0){
+			present_val=0;
+		}
+		
+		
+		// управление реле
+		if(present_val>=max_value){	rel=1; }else{rel=0;	}
+		
+		
+		// управляем светодиодами
+		if(rel==1)   {led1=1;}else{led1=0;}
+		if(c_inp2==1){led2=1;}else{led2=0;}
+		if(c_inp3==1){led3=1;}else{led3=0;}
+		
+
+		// сохраняем значени 
+		m_inp1=c_inp1;
+		m_inp2=c_inp2;
+		m_inp3=c_inp3;
+		
+		
+		Thread::wait(5);
+	}
+}
+
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/main_count_v1.txt	Thu Jan 28 14:18:16 2021 +0000
@@ -0,0 +1,267 @@
+
+/**************rele-counter v1  **********************************/
+//  при включении восстанавливаются значения текущие и уставка  
+//  при подаче импульсов +24В на счетный вход значение  увеличиваются +1
+//  при подаче +24В на вхд сброса, значения сбрасываются  
+//  реле включается если  значение равно или больше  установленного
+//
+
+
+
+#include "mbed.h"
+#include "rtos.h"
+#include "TM1638.h"
+#include "AT45.h"
+
+
+// -------  input/output  ----------------
+DigitalOut  led(PC_13);
+DigitalOut  rel(PA_15);
+DigitalIn   in1(PA_8);
+DigitalIn   in2(PA_9);
+DigitalIn   in3(PA_10);
+
+//  -------  displey --------------------
+TM1638_LEDKEY8 LEDKEY8(PB_15,PB_14,PB_13, PB_12);
+TM1638::KeyData_t keydata; 
+
+
+//----------- SPI FLASH  ------------------------
+SPI 	spi(PA_7, PA_6, PA_5); 	// mosi, miso, sclk
+AT45 	spif(&spi, PA_4);		// NSS
+
+char *spi_buffer = (char*) malloc(64);
+char str[10]; 
+
+
+// --------  глоб.переменные ---------------
+int present_val = 0;				// текущее заначение 
+int present_val_last = 0;			// текущее значение (старое)
+int max_value = 0;					// значение  вкл. реле
+
+int  led1=0;						//  индикация LED1
+int  led2=0;						//  индикация LED2
+int  led3=0;						//  индикация LED3
+
+// --------  Прототипы функций:  ----------
+void count_value();
+
+
+/********************************************************************/
+int main() {
+	
+    //  предустановка  значений 
+    int update = 0;
+    int update2 = 0;
+    int delay_update_x10 = 2000;			//  задержка  перед  +/-  x_inreasing_decreasing
+    int time_update_increase = 0;			//  отсчет времени до  +10
+    int time_update_decrease = 0;			//  отсчет времени до -10
+    int delay_cycle = 25;					//  период вывода инф. на дисплей
+    int once_increase = 0;
+    int once_decrease = 0;
+    int x_inreasing_decreasing = 10;		//	+/-  после удержания кнопки
+   
+    
+    int write_page_time = 5000;				//  время до  записи  max_value
+    int timer_to_write_page = 0;			//  отсчет времени до  записи  max_value
+    int write_page_start = 0;				//  старт процедуры записи 
+    
+    
+    // Вычитываем сохраненное максимальное значение (11 стр для записи)
+    spif.read_page(spi_buffer, 11);
+    max_value = atoi(spi_buffer);
+    
+    // Вычитываем сохраненное текущее значение (12 стр для записи)
+    spif.read_page(spi_buffer, 12);
+    present_val = atoi(spi_buffer);
+    
+    // Делаем текущее значение != текущему прошлому значение
+    present_val_last = present_val + 10;
+    
+    // Поток для работы с текущим значением
+    Thread count_thread;
+    count_thread.start(count_value);
+    
+	
+	while(1) {
+		
+		/***  обработка нажатия кнопок   ***/
+		
+		LEDKEY8.getKeys(&keydata);
+		
+		// Нажимаем кнопку X, текущее значение = 0
+		if(keydata[LEDKEY8_SW3_IDX] == LEDKEY8_SW3_BIT) {
+			present_val = 0;
+		}
+		
+		
+		// Нажимаем кнопку увеличить 
+		if(keydata[LEDKEY8_SW1_IDX] == LEDKEY8_SW1_BIT) {
+			if(keydata[LEDKEY8_SW2_IDX] != LEDKEY8_SW2_BIT) {
+				time_update_increase = time_update_increase + delay_cycle;
+				
+				// Один раз делаем +1
+				if(once_increase == 0) {
+					once_increase = 1;
+					if(max_value<999){max_value = max_value + 1;}
+					update = 0;
+				}
+				
+				write_page_start = 1;
+				timer_to_write_page = 0;
+			}
+		}
+		else {
+			time_update_increase = 0;
+			once_increase = 0;
+		}
+		
+		
+		
+		// Нажимаем кнопку уменьшить
+		if(keydata[LEDKEY8_SW2_IDX] == LEDKEY8_SW2_BIT) {
+			if(keydata[LEDKEY8_SW1_IDX] != LEDKEY8_SW1_BIT) {
+				time_update_decrease = time_update_decrease + delay_cycle;
+				
+				// Один раз делаем -1
+				if(once_decrease == 0) {
+					once_decrease = 1;
+					if(max_value>0){max_value = max_value - 1;}
+					update = 0;
+				}
+				
+				write_page_start = 1;
+				timer_to_write_page = 0;
+			}
+		}
+		else {
+			once_decrease = 0;
+			time_update_decrease = 0;
+		}
+		
+		
+		
+		
+		// При удержании кнопки увеличить  на +10
+		if(keydata[LEDKEY8_SW1_IDX] == LEDKEY8_SW1_BIT) {
+			if(time_update_increase >= delay_update_x10) {
+				time_update_increase = delay_update_x10 - delay_cycle*10;
+				if(max_value<=990){max_value = max_value + x_inreasing_decreasing;}
+				update = 0;
+			}
+		}
+		
+		
+		
+		
+		// При удержании  кнопки уменьшить на -10
+		if(keydata[LEDKEY8_SW2_IDX] == LEDKEY8_SW2_BIT) {
+			if(time_update_decrease >= delay_update_x10) {
+				time_update_decrease = delay_update_x10 - delay_cycle*10;
+				if(max_value>10){max_value = max_value - x_inreasing_decreasing;}
+				update = 0;
+			}
+		}
+		
+		
+		
+		// Записываем в память максимальное значение 
+		// через время write_page_time после нажатий кнопок
+		if(write_page_start == 1) {
+			timer_to_write_page = timer_to_write_page + delay_cycle;
+			
+			if(timer_to_write_page >= write_page_time) {
+				write_page_start = 0;
+				timer_to_write_page = 0;
+				sprintf(spi_buffer, "%d", max_value);
+				spif.page_erase(11);  
+				spif.write_page(spi_buffer, 11);
+				
+				LEDKEY8.locate(0);
+				LEDKEY8.printf("   ");
+				Thread::wait(500);
+				LEDKEY8.locate(0);
+				LEDKEY8.printf("%d", max_value);
+			}
+		}
+		
+		
+		
+		/***  вывод на дисплей  ***/
+		
+		led = !led ;
+		
+		LEDKEY8.cls();
+		LEDKEY8.setBrightness(TM1638_BRT1);
+		LEDKEY8.locate(0);
+		LEDKEY8.printf("%d", max_value);
+		LEDKEY8.locate(3);
+		LEDKEY8.printf("%d", present_val);
+		if(led1==1){LEDKEY8.setIcon(TM1638_LEDKEY8::LD1);}else{LEDKEY8.clrIcon(TM1638_LEDKEY8::LD1);}
+		if(led2==1){LEDKEY8.setIcon(TM1638_LEDKEY8::LD2);}else{LEDKEY8.clrIcon(TM1638_LEDKEY8::LD2);}
+		if(led3==1){LEDKEY8.setIcon(TM1638_LEDKEY8::LD3);}else{LEDKEY8.clrIcon(TM1638_LEDKEY8::LD3);}
+				
+		
+		Thread::wait(delay_cycle);
+	}
+}
+
+/****************************************************************/
+
+// Поток работы с текущим значением 10msec
+void count_value() {
+	
+	int  c_inp1=0;
+	int  c_inp2=0;
+	int  c_inp3=0;
+	int  m_inp1=0;
+	int  m_inp2=0;
+	int  m_inp3=0;
+	
+	while(1) {
+		
+		//  фиксируем значения
+		if(in1==0){c_inp1=1;}else{c_inp1=0;}
+		if(in2==0){c_inp2=1;}else{c_inp2=0;}
+		if(in3==0){c_inp3=1;}else{c_inp3=0;}
+		
+		
+		// сохраняем тек.значение  в 12 стр. при выкл. питания
+		if(c_inp1==0 && m_inp1==1){
+			sprintf(spi_buffer, "%d", present_val);
+			spif.page_erase(12);  
+			spif.write_page(spi_buffer, 12);
+		}
+		
+		// подсчет импульсов по входу 1
+		if(c_inp2==1 && m_inp2==0){
+			present_val++;
+		}
+		
+		// сбрасываем текущее значение по входу 2
+		if(c_inp3==1 && m_inp3==0){
+			present_val=0;
+		}
+		
+		
+		// управление реле
+		if(present_val>=max_value){	rel=1; }else{rel=0;	}
+		
+		
+		// управляем светодиодами
+		if(rel==1)   {led1=1;}else{led1=0;}
+		if(c_inp2==1){led2=1;}else{led2=0;}
+		if(c_inp3==1){led3=1;}else{led3=0;}
+		
+
+		// сохраняем значени 
+		m_inp1=c_inp1;
+		m_inp2=c_inp2;
+		m_inp3=c_inp3;
+		
+		
+		Thread::wait(5);
+	}
+}
+
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/main_count_v2.cpp	Thu Jan 28 14:18:16 2021 +0000
@@ -0,0 +1,282 @@
+
+/**************rele-counter v2  **********************************/
+//	при включении  реле выключено, тек.показания и уставка как до выключения, 
+//	но подсчет импульсов не работает до подачи 1го импульса на сброс.
+//	после подачи  1го имп.сброс - показания сбрасываются реле включается
+//	при достижении  подсчитанных импульсов уставки - реле отключается
+//	при повторной подаче  сигнала сброс, показания сбрасываются и реле включается
+//
+//
+
+
+#include "mbed.h"
+#include "rtos.h"
+#include "TM1638.h"
+#include "AT45.h"
+
+
+// -------  input/output  ----------------
+DigitalOut  led(PC_13);
+DigitalOut  rel(PA_15);
+DigitalIn   in1(PA_8);
+DigitalIn   in2(PA_9);
+DigitalIn   in3(PA_10);
+
+//  -------  displey --------------------
+TM1638_LEDKEY8 LEDKEY8(PB_15,PB_14,PB_13, PB_12);
+TM1638::KeyData_t keydata; 
+
+
+//----------- SPI FLASH  ------------------------
+SPI 	spi(PA_7, PA_6, PA_5); 	// mosi, miso, sclk
+AT45 	spif(&spi, PA_4);		// NSS
+
+char *spi_buffer = (char*) malloc(64);
+char str[10]; 
+
+
+// --------  глоб.переменные ---------------
+int present_val = 0;				// текущее заначение 
+int present_val_last = 0;			// текущее значение (старое)
+int max_value = 0;					// значение  вкл. реле
+
+int  led1=0;						//  индикация LED1
+int  led2=0;						//  индикация LED2
+int  led3=0;						//  индикация LED3
+
+int  enbl=0;						//  разрешение на работу 
+
+// --------  Прототипы функций:  ----------
+void count_value();
+
+
+/********************************************************************/
+int main() {
+	
+    //  предустановка  значений 
+    int update = 0;
+    int update2 = 0;
+    int delay_update_x10 = 2000;			//  задержка  перед  +/-  x_inreasing_decreasing
+    int time_update_increase = 0;			//  отсчет времени до  +10
+    int time_update_decrease = 0;			//  отсчет времени до -10
+    int delay_cycle = 25;					//  период вывода инф. на дисплей
+    int once_increase = 0;
+    int once_decrease = 0;
+    int x_inreasing_decreasing = 10;		//	+/-  после удержания кнопки
+   
+    
+    int write_page_time = 5000;				//  время до  записи  max_value
+    int timer_to_write_page = 0;			//  отсчет времени до  записи  max_value
+    int write_page_start = 0;				//  старт процедуры записи 
+    
+    
+    // Вычитываем сохраненное максимальное значение (11 стр для записи)
+    spif.read_page(spi_buffer, 11);
+    max_value = atoi(spi_buffer);
+    
+    // Вычитываем сохраненное текущее значение (12 стр для записи)
+    spif.read_page(spi_buffer, 12);
+    present_val = atoi(spi_buffer);
+    
+    // Делаем текущее значение != текущему прошлому значение
+    present_val_last = present_val + 10;
+    
+    // Поток для работы с текущим значением
+    Thread count_thread;
+    count_thread.start(count_value);
+    
+	
+	while(1) {
+		
+		/***  обработка нажатия кнопок   ***/
+		
+		LEDKEY8.getKeys(&keydata);
+		
+		// Нажимаем кнопку X, текущее значение = 0
+		if(keydata[LEDKEY8_SW3_IDX] == LEDKEY8_SW3_BIT) {
+			present_val = 0;
+			enbl=1;
+		}
+		
+		
+		// Нажимаем кнопку увеличить 
+		if(keydata[LEDKEY8_SW1_IDX] == LEDKEY8_SW1_BIT) {
+			if(keydata[LEDKEY8_SW2_IDX] != LEDKEY8_SW2_BIT) {
+				time_update_increase = time_update_increase + delay_cycle;
+				
+				// Один раз делаем +1
+				if(once_increase == 0) {
+					once_increase = 1;
+					if(max_value<999){max_value = max_value + 1;}
+					update = 0;
+				}
+				
+				write_page_start = 1;
+				timer_to_write_page = 0;
+			}
+		}
+		else {
+			time_update_increase = 0;
+			once_increase = 0;
+		}
+		
+		
+		
+		// Нажимаем кнопку уменьшить
+		if(keydata[LEDKEY8_SW2_IDX] == LEDKEY8_SW2_BIT) {
+			if(keydata[LEDKEY8_SW1_IDX] != LEDKEY8_SW1_BIT) {
+				time_update_decrease = time_update_decrease + delay_cycle;
+				
+				// Один раз делаем -1
+				if(once_decrease == 0) {
+					once_decrease = 1;
+					if(max_value>0){max_value = max_value - 1;}
+					update = 0;
+				}
+				
+				write_page_start = 1;
+				timer_to_write_page = 0;
+			}
+		}
+		else {
+			once_decrease = 0;
+			time_update_decrease = 0;
+		}
+		
+		
+		
+		
+		// При удержании кнопки увеличить  на +10
+		if(keydata[LEDKEY8_SW1_IDX] == LEDKEY8_SW1_BIT) {
+			if(time_update_increase >= delay_update_x10) {
+				time_update_increase = delay_update_x10 - delay_cycle*10;
+				if(max_value<=990){max_value = max_value + x_inreasing_decreasing;}
+				update = 0;
+			}
+		}
+		
+		
+		
+		
+		// При удержании  кнопки уменьшить на -10
+		if(keydata[LEDKEY8_SW2_IDX] == LEDKEY8_SW2_BIT) {
+			if(time_update_decrease >= delay_update_x10) {
+				time_update_decrease = delay_update_x10 - delay_cycle*10;
+				if(max_value>10){max_value = max_value - x_inreasing_decreasing;}
+				update = 0;
+			}
+		}
+		
+		
+		
+		// Записываем в память максимальное значение 
+		// через время write_page_time после нажатий кнопок
+		if(write_page_start == 1) {
+			timer_to_write_page = timer_to_write_page + delay_cycle;
+			
+			if(timer_to_write_page >= write_page_time) {
+				write_page_start = 0;
+				timer_to_write_page = 0;
+				sprintf(spi_buffer, "%d", max_value);
+				spif.page_erase(11);  
+				spif.write_page(spi_buffer, 11);
+				
+				LEDKEY8.locate(0);
+				LEDKEY8.printf("   ");
+				Thread::wait(500);
+				LEDKEY8.locate(0);
+				LEDKEY8.printf("%d", max_value);
+			}
+		}
+		
+		
+		
+		/***  вывод на дисплей  ***/
+		
+		led = !led ;
+		
+		LEDKEY8.cls();
+		LEDKEY8.setBrightness(TM1638_BRT1);
+		LEDKEY8.locate(0);
+		LEDKEY8.printf("%d", max_value);
+		LEDKEY8.locate(3);
+		LEDKEY8.printf("%d", present_val);
+		if(led1==1){LEDKEY8.setIcon(TM1638_LEDKEY8::LD1);}else{LEDKEY8.clrIcon(TM1638_LEDKEY8::LD1);}
+		if(led2==1){LEDKEY8.setIcon(TM1638_LEDKEY8::LD2);}else{LEDKEY8.clrIcon(TM1638_LEDKEY8::LD2);}
+		if(led3==1){LEDKEY8.setIcon(TM1638_LEDKEY8::LD3);}else{LEDKEY8.clrIcon(TM1638_LEDKEY8::LD3);}
+				
+		
+		Thread::wait(delay_cycle);
+	}
+}
+
+/****************************************************************/
+
+// Поток работы с текущим значением 10msec
+void count_value() {
+	
+	int  c_inp1=0;
+	int  c_inp2=0;
+	int  c_inp3=0;
+	int  m_inp1=0;
+	int  m_inp2=0;
+	int  m_inp3=0;
+	
+	int  blnk=0;
+	
+	while(1) {
+		
+		if(blnk<100){blnk++;}else{blnk=0;}
+		
+		//  фиксируем значения
+		if(in1==0){c_inp1=1;}else{c_inp1=0;}
+		if(in2==0){c_inp2=1;}else{c_inp2=0;}
+		if(in3==0){c_inp3=1;}else{c_inp3=0;}
+		
+		
+		// сохраняем тек.значение  в 12 стр. при выкл. питания
+		if(c_inp1==0 && m_inp1==1){
+			sprintf(spi_buffer, "%d", present_val);
+			spif.page_erase(12);  
+			spif.write_page(spi_buffer, 12);
+		}
+		
+		// подсчет импульсов по входу 1
+		if(c_inp2==1 && m_inp2==0 && enbl==1){
+			present_val++;
+		}
+		
+		// сбрасываем текущее значение по входу 2
+		if(c_inp3==1 && m_inp3==0){
+			enbl=1;
+			present_val=0;
+		}
+		
+		
+		// управление реле
+		if(present_val<max_value && enbl==1){rel=1; }else{rel=0;}
+		
+		
+		// управляем светодиодами
+		if(enbl==1){
+			if(rel==1){led1=1;}else{led1=0;}
+		}else{
+			if(blnk<50){led1=1;}else{led1=0;}
+		}
+		
+		
+		if(c_inp2==1){led2=1;}else{led2=0;}
+		if(c_inp3==1){led3=1;}else{led3=0;}
+		
+
+		// сохраняем значени 
+		m_inp1=c_inp1;
+		m_inp2=c_inp2;
+		m_inp3=c_inp3;
+		
+		
+		Thread::wait(5);
+	}
+}
+
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/mbed-rtos.lib	Thu Jan 28 14:18:16 2021 +0000
@@ -0,0 +1,1 @@
+https://os.mbed.com/users/mbed_official/code/mbed-rtos/#5713cbbdb706
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/mbed.bld	Thu Jan 28 14:18:16 2021 +0000
@@ -0,0 +1,1 @@
+https://os.mbed.com/users/mbed_official/code/mbed/builds/7130f322cb7e
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/mbed_app.json	Thu Jan 28 14:18:16 2021 +0000
@@ -0,0 +1,9 @@
+{
+    "target_overrides": {
+        "NUCLEO_F103RB": {
+            "target.clock_source": "USE_PLL_HSE_XTAL",
+            "target.default_lib": "small"
+        }
+    }
+}
+