|
@@ -17,6 +17,16 @@ static uint16_t PDMset[2][ARRAY_SIZE] = {}; // Массив уставок мо
|
|
|
//static uint16_t (&Pnom_arr)[ARRAY_SIZE] = PDMset[0]; // Массив мощностей ТЭНа как ссылка на нулевую строку массива уставок
|
|
|
// (&Pnom_arr) - посилання на PDMset[0], в С не працює, замінив по тексту.
|
|
|
|
|
|
+// В EEPROM хранятся значения номинальных мощностей ТЭНа (каждая занимает 2 байта, количество определяется величиной Pnom_ARR_SIZE)
|
|
|
+// и уставки мощности для каждой номинальной в формате pdm (каждая занимает 2 байта),
|
|
|
+// уставки пишутся не в конкретные ячейки, а по кругу до заполнения выделенного участка EEPROM.
|
|
|
+// Так сделано для экономии ресурса EEPROM
|
|
|
+static volatile uint16_t old_addr = 0; // Адрес в EEPROM, где записана самая старая уставка
|
|
|
+static volatile uint16_t new_addr; // Адрес в EEPROM, куда писать новую уставку
|
|
|
+static uint16_t start_addr; // Начальный адрес области записи уставок в EEPROM
|
|
|
+static uint16_t end_addr; // Конечный адрес области записи уставок в EEPROM
|
|
|
+static volatile uint16_t clear_old_addr; // Дубль адреса в EEPROM, где записана самая старая уставка, предназначенная для стирания
|
|
|
+
|
|
|
static volatile uint32_t sum; // Сумматор квадратов отсчетов АЦП
|
|
|
static volatile uint16_t sc = 0; // Счетчик просуммированных квадратов
|
|
|
static volatile uint16_t sc_sum = 0; // Счетчик просуммированных квадратов, готовый к обработке
|
|
@@ -55,9 +65,7 @@ static volatile struct flags { // Флаги
|
|
|
unsigned stab_off : 1; // Флаг аварийного останова стабилизатора
|
|
|
unsigned butt : 1; // Флаг опроса кнопок
|
|
|
unsigned test : 1;
|
|
|
-#ifdef USE_EEPROM
|
|
|
unsigned writable : 1; // Флаг записи уставок в EEPROM
|
|
|
-#endif
|
|
|
#ifdef USE_USART
|
|
|
unsigned uartUnhold : 1; // Флаг разрешения передачи данных по USART
|
|
|
unsigned uartReport : 1; // Флаг разрешения отправки данных внешнему контроллеру
|
|
@@ -147,7 +155,6 @@ static uint8_t X_centred(const uint8_t len) {
|
|
|
}
|
|
|
}
|
|
|
|
|
|
-#ifdef USE_EEPROM
|
|
|
/**
|
|
|
* @brief Функция переводит символ ASCII в шестнадцатиричную цифру,
|
|
|
* @return при ошибке возвращает 255
|
|
@@ -179,7 +186,6 @@ static char HEX_to_A (const uint8_t x) {
|
|
|
return 'X';
|
|
|
}
|
|
|
}
|
|
|
-#endif
|
|
|
|
|
|
/**
|
|
|
* @brief Подпрограммка остановки режима "Разгон"
|
|
@@ -253,7 +259,6 @@ static void remember_last_power_setting(void) { // Запомним послед
|
|
|
}
|
|
|
}
|
|
|
|
|
|
-#ifdef USE_EEPROM
|
|
|
/**
|
|
|
* @brief Подпрограмма обмена двух ячеек массива
|
|
|
* @param arr массив,
|
|
@@ -266,7 +271,6 @@ static void change_arr_cell(uint16_t arr[2][ARRAY_SIZE], const uint8_t index, co
|
|
|
arr[index][index1] = arr[index][index2];// Обмениваемся
|
|
|
arr[index][index2] = k;
|
|
|
}
|
|
|
-#endif
|
|
|
|
|
|
/**
|
|
|
* @brief Подпрограмма обработки режима разгона
|
|
@@ -332,20 +336,16 @@ static void Buttons_(void) {
|
|
|
unsigned butt_3 : 1; // текущее состояние кнопки
|
|
|
unsigned butt_4 : 1; // текущее состояние кнопки
|
|
|
unsigned no_select : 1; // вспомогательный флажок для начального меню
|
|
|
-#ifdef USE_EEPROM
|
|
|
unsigned writePnom : 1; // вспомогательный флажок записи нового Pnom в EEPROM
|
|
|
unsigned clear_old : 1; // вспомогательный флажок стирания старой уставки из EEPROM
|
|
|
-#endif
|
|
|
} bt = {}; // Инициализируем структуру с нулевыми членами
|
|
|
static uint8_t butt_count = 0; // счетчик для устранения дребезга
|
|
|
static uint8_t butt_force_count = 0; // счетчик для форсирования инкремента/декремента
|
|
|
|
|
|
-#ifdef USE_EEPROM
|
|
|
if (bt.clear_old) { // Стираем старую уставку, если нужно
|
|
|
- eeprom_update_word((uint16_t*)clear_old_addr,EMPTY_CELL_VALUE); // Стираем самую старую уставку
|
|
|
+ ///eeprom_update_word((uint16_t*)clear_old_addr,EMPTY_CELL_VALUE); // Стираем самую старую уставку
|
|
|
bt.clear_old = 0; // Снимаем флажок стирания
|
|
|
}
|
|
|
-#endif
|
|
|
|
|
|
bt.butt_1 = pin_butt_1_STATE;
|
|
|
bt.butt_2 = pin_butt_2_STATE;
|
|
@@ -376,10 +376,8 @@ static void Buttons_(void) {
|
|
|
if (PDMset[0][0] != 0xffff) { // и есть записанное значение, уходим
|
|
|
cnt_Pnom_number = 0;
|
|
|
Pnom = PDMset[0][0]; // По умолчанию установим номинальную мощность из нулевой ячейки
|
|
|
-#ifdef USE_EEPROM
|
|
|
fl.writable = 1; // Уставки пишутся в EERPOM
|
|
|
- EEPROM_read_PDMs(); // Читаем уставки
|
|
|
-#endif
|
|
|
+ //EEPROM_read_PDMs(); // Читаем уставки
|
|
|
#ifdef USE_USART
|
|
|
fl.uartUnhold = 1; // Разрешим обращение к USART
|
|
|
#endif
|
|
@@ -437,10 +435,8 @@ static void Buttons_(void) {
|
|
|
break; //Закончили
|
|
|
}
|
|
|
case 4: { //Кнопкой "Стоп" пишем значение в память и выходим из менюшки
|
|
|
-#ifdef USE_EEPROM
|
|
|
bt.writePnom = 1; // Ставим флаг записи нового значения Pnom в EEPROM
|
|
|
fl.writable = 1; // Ставим флаг записи уставок в EEPROM
|
|
|
-#endif
|
|
|
}
|
|
|
case 8: { //Кнопкой "Разгон" выходим из менюшки
|
|
|
if (Pnom < 10000) { // Если значение реальное...
|
|
@@ -449,32 +445,25 @@ static void Buttons_(void) {
|
|
|
for (int8_t x = cnt_Pnom_count; x >= 0; x--) { // Проверим новое значение на совпадение с уже записанными
|
|
|
if (Pnom == PDMset[0][x]) { // Если такое значение уже есть в EEPROM...
|
|
|
cnt_Pnom_number = x; // Запомним порядковый номер совпавшего Pnom
|
|
|
-#ifdef USE_EEPROM
|
|
|
bt.writePnom = 0; // Снимем флаг записи нового значения Pnom в EEPROM
|
|
|
fl.writable = 1; // Ставим флаг записи уставок в EEPROM
|
|
|
-#endif
|
|
|
break;
|
|
|
}
|
|
|
}
|
|
|
} else { // Если значение выбрано из записанных в EEPROM...
|
|
|
-#ifdef USE_EEPROM
|
|
|
bt.writePnom = 0; // Снимем флаг записи нового значения Pnom в EEPROM
|
|
|
fl.writable = 1; // Ставим флаг записи уставок в EEPROM
|
|
|
-#endif
|
|
|
}
|
|
|
|
|
|
cnt_PDMcount=0; //Сбрасываем счетчик
|
|
|
-#ifdef USE_EEPROM
|
|
|
if (fl.writable) { // Если уставки пишутся в EERPOM, то
|
|
|
- EEPROM_read_PDMs(); // читаем ранее записанное
|
|
|
+ //EEPROM_read_PDMs(); // читаем ранее записанное
|
|
|
}
|
|
|
if (bt.writePnom) { // Запишем новое значение Pnom, если необходимо
|
|
|
- eeprom_update_word((uint16_t*)(cnt_Pnom_number * 2),Pnom);
|
|
|
+ //eeprom_update_word((uint16_t*)(cnt_Pnom_number * 2),Pnom);
|
|
|
bt.writePnom = 0; // и сбросим флаг записи нового значения Pnom
|
|
|
}
|
|
|
-#endif
|
|
|
cnt_dspMenu = 0; // Снимаем флаг перехода в меню
|
|
|
- //
|
|
|
#ifdef USE_USART
|
|
|
fl.uartUnhold = 1; // Разрешим обращение к USART
|
|
|
#endif /* USE_USART */
|
|
@@ -512,7 +501,6 @@ static void Buttons_(void) {
|
|
|
}
|
|
|
case 4: { //По кнопке "стоп" записываем уставку, если нужно, принимаем и выходим
|
|
|
PDMust = PDMset[0][cnt_PDMcount]; //Устанавливаем выбранную мощность ТЭНа
|
|
|
-#ifdef USE_EEPROM
|
|
|
if (fl.writable) { // Если уставки запоминаются...
|
|
|
if (!PDMset[1][cnt_PDMcount]) { // Если просят записать НЕ уже записанное...
|
|
|
//eeprom_update_word((uint16_t*)new_addr,PDMset[0][cnt_PDMcount]); // Пишем новую уставку
|
|
@@ -557,7 +545,6 @@ static void Buttons_(void) {
|
|
|
}
|
|
|
}
|
|
|
}
|
|
|
-#endif /* USE_EEPROM */
|
|
|
cnt_dspMenu = 0; //Снимаем флаг перехода в меню
|
|
|
fl.dspRefresh = 1; //Ставим флаг обновления экрана
|
|
|
fl.butt = 0; //После нажатия должна быть пауза
|
|
@@ -781,11 +768,9 @@ static void RefreshMenu (void) {
|
|
|
#endif
|
|
|
ST7735_WriteString(0, 20, "=======Уставка=======", LiberM_7x10, Silver, Black);
|
|
|
ST7735_WriteString(0, 60, "P+ Вибір", LiberM_7x10, Silver, Black);
|
|
|
-#ifdef USE_EEPROM
|
|
|
if (!fl.writable) { // Если уставки не пишутся в EEPROM, то...
|
|
|
ST7735_WriteString(0, 70, "Ст Прийняти без запису", LiberM_7x10, Silver, Black);
|
|
|
}
|
|
|
-#endif
|
|
|
break;
|
|
|
}
|
|
|
|
|
@@ -841,14 +826,12 @@ void Stab_Init(void) {
|
|
|
#ifdef INTERFACE_ALT
|
|
|
ST7735_WriteString(X_centred(16), 50, "STAB-STM32", Font_11x18, Green, Black);
|
|
|
#else
|
|
|
- ST7735_WriteString(X_centred(8), 50, "STAB-AVR", LiberM_7x10, Green, Black);
|
|
|
+ ST7735_WriteString(X_centred(16), 50, "STAB-STM32", LiberM_7x10, Green, Black);
|
|
|
#endif
|
|
|
ST7735_WriteString(X_centred(VERSION_LEN), 70, VERSION, LiberM_7x10, Red, Black);
|
|
|
ST7735_WriteString(X_centred(10), 100, "JohnJohnov", LiberM_7x10, Silver, Black);
|
|
|
ST7735_WriteString(X_centred(17), 110, "alcodistillers.ru", LiberM_7x10, Silver, Black);
|
|
|
-#ifdef USE_EEPROM
|
|
|
- EEPROM_read_Pnoms(); // Прочитаем из EEPROM записанные номиналы ТЭНов
|
|
|
-#endif
|
|
|
+ //EEPROM_read_Pnoms(); // Прочитаем из EEPROM записанные номиналы ТЭНов
|
|
|
pp_Delay(400); // Подождем x полупериодов, пережидаем переходные процессы и любуемся заставкой
|
|
|
|
|
|
fl.dspRefresh = 1;
|
|
@@ -961,13 +944,11 @@ void Stab_WorkCycle(void) {
|
|
|
#else
|
|
|
ST7735_WriteString(X_position(9, p, 7), 10, buf, LiberM_7x10, Silver, Black);
|
|
|
#endif
|
|
|
-#ifdef USE_EEPROM
|
|
|
if (PDMset[1][cnt_PDMcount]) { // Если значение записано в EEPROM
|
|
|
ST7735_WriteString(X_position(20, 0, 7), 1, "R", LiberM_7x10, Silver, Black); // поставим значок
|
|
|
} else {
|
|
|
ST7735_WriteString(X_position(20, 0, 7), 10, " ", LiberM_7x10, Silver, Black); // а если не записано - уберем
|
|
|
}
|
|
|
-#endif
|
|
|
}
|
|
|
fl.dspRefresh = 0;
|
|
|
break;
|