//#include "main.h"
uint8_t INIT_ADDR EEMEM ;// номер резервной ячейки
#define INIT_KEY 50 // ключ первого запуска. 0-254, на выбор
volatile uint8_t first_start = 0 ; // если 0 то признак 1 старта откуда читать данные из EEPROM или инициализация
// при сработке прерывания от датчика запоминаем значение счетчика в переменных
// прижимы лимиты
#define max_Boktime 2000 // максимальная задержка сработки
#define min_Boktime 20 //минимальная задержка сработки боковой фиксатор
#define max_Verttime 2000 // лимиты время закрутки
#define min_Verttime 20
#define max_Bokdelay 120 //максимальное время задержки сработки фиксатора крышки
#define min_Bokdelay 20 // минимальное время задержки сработки фиксатора крышки
#define max_Vertdelay 90 // лимиты задержки отпускания продукта
#define min_Vertdelay 20
#define max_Spindelay 90 // лимиты задержки закрутки после фиксатора крышки
#define min_Spindelay 20
#define max_length 990 // лимиты задержки длины продукта
#define min_length 110
// двигатель лимиты
#define strong_max 90
#define strong_min 20
#define osr_max 130 // пересчет на регистр OCR2
#define osr_min 30
// датчик
#define debonce_max 1000 //лимиты времени блокировки от сработки датчика
#define debonce_min 10
// лимиты обнаружения строб сигнала от сети
#define T_det_max 98
#define T_det_min 70
uint8_t flag = 0; // переменная для определения обьекта изменения (что меняем pointer или сам параметр)
uint8_t is_redakt = 0 ; // переменная для включение возможности редактирования параметра
volatile uint8_t save_redakt = 0; // сохранение переменных в памяти устройства
volatile uint8_t key_value = 0;// код нажатой клавиши
//клапана горизонтальных и вертикальных зажимов
// регистр статуса прижимов
uint8_t prigim_status; //неисп|неисп|общее разр. вкл клапанов|motor_status|prigimO_status|prigimZ_status|prigimV_status|prigimG_status
//Определяем биты флага
#define prigimG_status 0 //переменная включения клапана прижима горизонтального prigimG_on=1 если боковые прижимы держат продукт
#define prigimV_status 1 // переменная включения клапана вертикального prigimV_on=1 если продукт зажат сверху
#define prigimZ_status 2 // переменная включения клапана закрутки
#define prigimO_status 3 // переменная включения отсекателя
#define motor_status 4 // переменная включения двигателя
#define ready_klap 5 // общее разрешение включения клапанов
//#include "timer.h"
volatile uint16_t time_bok = 700; // задержка сработки бокового прижима пневмоцилиндра
volatile uint16_t time_vert = 200; // время закрутки
volatile uint8_t delay_bok = 50; // задержка сработки фиксатора крышки
volatile uint8_t delay_vert = 10; // задержка отпускания продукта
volatile uint8_t delay_spin = 10;// задержка сработки закрутки после фиксатора крышки
volatile uint16_t length_product = 150; // задержка длительности продукта
//резервируем место в eeprom
uint16_t e_time_bok EEMEM; // задержка сработки бокового прижима пневмоцилиндра
uint16_t e_time_vert EEMEM; // время закрутки
uint8_t e_delay_bok EEMEM; // задержка сработки фиксатора крышки
uint8_t e_delay_vert EEMEM; // задержка отпускания продукта
uint8_t e_delay_spin EEMEM;// задержка сработки закрутки после фиксатора крышки
uint16_t e_length_product EEMEM;// задержка длительности продукта
// двигатель закрутки
//volatile bool dvig_on = 1; // переменная включения двигателя dvig_on=1 если двигатель включен
uint8_t strong_zakr = 60; // усилие закрутки
uint8_t e_strong_zakr EEMEM; // усилие закрутки
// детектирование сигнала строб от сети
volatile uint8_t t_detect = 0; // время между импульсами детектирования
volatile uint8_t N_strob = 0;
volatile uint8_t mass[5] = {0, 0, 0, 0, 0};
// датчик
volatile uint8_t datchik_status = 0; // переменная сработки датчика datchik_on=1 если датчик сработал
volatile uint8_t process_status = 0; // статус процесса 0-готов 1 - блокировка 2- блокировка снята 3- сработка бок. прижим 3 сработка верт. прижим
//volatile uint32_t debounce; // переменная для замера времени дребезга
//volatile uint32_t time_start; // переменная для сохранения метки начала отсчета времени
uint8_t akt_level = 0; // активный уровень сигнала фронт-0 или спад-1
uint8_t set_pedal = 0; // подключение сработки от педали 0-выкл 1 -вкл
volatile uint16_t delay_block = 100; // блокировка следующей сработки после сработки датчика
uint16_t e_delay_block EEMEM;
uint8_t pointer = 0; // Переменная указатель для движения по пунктам меню
uint8_t ukasatel = 0 ; // указывант курсору куда встать 0- 1строка 1-2 строка дисплея
uint16_t convert(uint16_t value, uint16_t From1, uint16_t From2, uint16_t To1, uint16_t To2)
{
return (value - From1) / (From2 - From1) * (To2 - To1) + To1;
}
// при сработке прерывания от датчика запоминаем значение счетчика в переменных
ISR (INT0_vect)
{
// if ((millis() - debounce >= value_deb) && digitalRead(pin_isr))
// {
// debounce = millis();
datchik_status = 1;
EIMSK &= ~(1 << INT0); // блокировка сработки прерывания на время delay_block
TCNT1 = 65535 - delay_block;
TCCR1B = (1 << CS12) | (1 << CS10); // старт Т1
process_status = 1;
// digitalWrite(pin_bok2, 1);// открываем тиристор
// }
}
ISR (TIMER1_OVF_vect)//блокировка повторной сработки
// уходим из зоны видимости датчика
{
//datchik_status = 0;
process_status = 2;
EIMSK |= (1 << INT0); // снимаем блокировку от повторной сработки
TCCR1B = 0; // тормозим счетчик
TCNT1 = 0;
OCR1A = (time_bok << 4); // все значения умножены на 16
OCR1B = (time_bok << 4) + (delay_bok << 5);
TCCR1B = (1 << CS12) | (1 << CS10); // один тик (1/16)*1024=64 мкс
datchik_status = 0;
}
ISR (TIMER1_COMPA_vect)//прерывание по совпадению TCNT1 c OCR1А
{
// отпускаем продукт
if (ready_klap && (process_status == 4)) {
iocfg_bok_off();// закрываем тиристор
prigim_status &= ~(1 << prigimG_status);
iocfg_ots_on();// открываем отсекатель
prigim_status |= (1 << prigimO_status);
}
// включаем закрутку
if (ready_klap && (process_status == 3)) {
// process_status = 4;
iocfg_zakr_on();// открываем тиристор закрутки
prigim_status |= (1 << prigimZ_status);
}
// захват продукта
if (ready_klap && (process_status == 2)) {
iocfg_bok_on();// фиксация бутылки
prigim_status |= (1 << prigimG_status);
}
}
ISR (TIMER1_COMPB_vect)//прерывание по совпадению TCNT1 c OCR1А
{
// отпускаем продукт
if (ready_klap && (process_status == 4)) {
iocfg_ots_on();// закрываем тиристор
prigim_status &= ~(1 << prigimO_status);
TCCR1B = 0;
TCNT1 = 0;
process_status = 0 ;
}
// выключаем закрутку
if (ready_klap && (process_status == 3)) {
iocfg_vert_off();// выключаем прижим крышки
// digitalWrite(pin_ots, 0);// открываем отсекатель
iocfg_zakr_off();
prigim_status &= ~(1 << prigimV_status);
prigim_status &= ~(1 << prigimZ_status);
process_status = 0 ;
TCCR1B = 0;
TCNT1 = 0;
process_status = 4;
OCR1A = delay_vert << 5;
//OCR1A =length_product<<5;
OCR1B = OCR1A + (length_product << 4);
TCCR1B = (1 << CS12) | (1 << CS10);
}
// сработка фиксатора крышки
if (ready_klap && (process_status == 2)) {
iocfg_vert_on();// открываем тиристор верт. прижима
prigim_status |= (1 << prigimV_status);
process_status = 3;
TCCR1B = 0;
TCNT1 = 0;
OCR1A = (delay_spin << 5);
OCR1B = OCR1A + (time_vert << 4);
TCCR1B = (1 << CS12) | (1 << CS10);
}
}
ISR (INT1_vect)// прошли через 0 стартуем счетчиком
{ // еще раз проверяем точно через 0 прошли
if (PIND & (1 << pin_zero))
{ if (first_start ) {
TCCR2B = 0;// останавливаем счетчик
t_detect = TCNT2;
mass[N_strob] = t_detect;
N_strob++;
if (N_strob >= 5) N_strob = 0;
TCNT2 = 0;
OCR2A = convert(strong_zakr, strong_min, strong_max, osr_max, osr_min);
TCCR2B = (1 << CS22) | (1 << CS21) | (1 << CS20); //коэфициент деления 1024 1/16*1024=64 мкс
//if (dvig_on) digitalWrite(pin_shim, 1); //закрываем тиристор
iocfg_shim_off();
//OCR2A = map(strong_zakr, strong_min, strong_max, osr_max, osr_min);
}
else {
TCCR2B = 0; // первый замер ничего не делаем
TCNT2 = 0;
TCCR2B = (1 << CS22) | (1 << CS21) | (1 << CS20); //коэфициент деления 1024 1/16*1024=64 мк
first_start = 1;
}
}
}
ISR (TIMER2_COMPA_vect)//прерывание по совпадению TCNT2 c OCR2
{
if (~prigim_status & (1 << motor_status)) iocfg_shim_on(); // открываем тиристор
}
ISR (TIMER2_COMPB_vect)//прерывание по совпадению TCNT2 c OCR2B
{ TCCR2B = 0;
t_detect = 0;
mass[N_strob] = t_detect;
N_strob++;
if (N_strob >= 5) N_strob = 0;
if (prigim_status & (1 << motor_status)) iocfg_shim_off(); //закрываем тиристор
TCNT2 = 0;
//TCCR2B = (1 << CS22) | (1 << CS21) | (1 << CS20); //коэфициент деления 1024
}
int main(void)
{
/* Replace with your application code */
iocfg_init(); // конфигурирование входов выходов
//digitalWrite(pin_shim, 1);// шим отключен
LCD_ini();// инициализация дисплея
clearlcd();//очистка
// attachInterrupt(0, isr, FALLING); // прерывание на D 2 (int0)
// настройка Т0 для оценки времени нажатия на кнопку
TCCR0B = 0;
TCCR0B = TCCR0B | (1 << CS02) | (1 << CS02); // старт 1 тик 0,064 мс
// Serial.begin(9600);
EICRA = (1 << ISC11); //детектор нуля спадающий фронт
EIMSK = (1 << INT1) | (1 << INT0); //разрешаем прерывания int0- int1
TIMSK2 = (1 << OCIE2A) | (1 << OCIE2B); //разрешаем прерывание по сравнению OCR2
TCCR2A = 0;
TCCR2B = 0;
TCNT2 = 0; //обнуляем счетчик 2
// настройка Т1 задержка старта фиксации продукта
TCCR1A = 0;
TCCR1B = 0;
TCNT1 = 0;
OCR1A = 0;
OCR1B = 0;
TIMSK1 = (1 << OCIE1A) | (1 << OCIE1B) | (1 << TOIE1);
process_status = 0;
OCR2A = convert(strong_zakr, strong_min, strong_max, osr_max, osr_min);
OCR2B = T_det_max;// лимит выхода за пределы измерения строба
sei();
if (eeprom_read_byte(&INIT_ADDR) != INIT_KEY) { // первый запуск
eeprom_write_byte(&INIT_ADDR, INIT_KEY); // записали ключ
// в данном случае это значение переменной, объявленное выше
eeprom_write_word(&e_time_bok, time_bok); // инициализация значений
eeprom_write_byte(&e_delay_bok, delay_bok);
eeprom_write_word(&e_time_vert, time_vert);
eeprom_write_byte(&e_delay_spin, delay_spin);
eeprom_write_byte(&e_delay_vert, delay_vert);
eeprom_write_byte(&e_strong_zakr, strong_zakr);
eeprom_write_word(&e_delay_block, delay_block);
//EEPROM.put(10, first_start);
//EEPROM.put(11, akt_level);
eeprom_write_word(&e_length_product, length_product);
}
time_bok = eeprom_read_word(&e_time_bok); // читаем из памяти
delay_bok = eeprom_read_byte(&e_delay_bok);
time_vert = eeprom_read_word(&e_time_vert);
delay_spin = eeprom_read_byte(&e_delay_spin);
delay_vert = eeprom_read_byte(&e_delay_vert);
strong_zakr = eeprom_read_byte(&e_strong_zakr);
delay_block = eeprom_read_word(&e_delay_block);
//EEPROM.get(10, first_start);
//EEPROM.get(11, akt_level);
length_product = eeprom_read_word(&e_length_product);
first_start = 1; // переводим в статус не первого старта
//R_eprom(); //считываем настройки задержек
if (akt_level) EICRA |= (1 << ISC01) | (1 << ISC00); else EICRA |= (1 << ISC01); // если akt_level =1 активный уровень фронт иначе спад
while (1)
{
key_value = key_cod (); // опрашиваем клавиатуру
if (key_value == 1) // нажата кнопка влево
{
if (flag == 0) switch (pointer) { // описаны алгоритмы движения по меню при нажатии кнопки влево
case 10: pointer = pointer - 10; ukasatel = 0; break;
case 11: pointer = pointer - 11; ukasatel = 0; break;
case 12: pointer = pointer - 12; ukasatel = 0; break;
case 13: pointer = pointer - 13; ukasatel = 0; break;
case 21: pointer = pointer - 20; ukasatel = 1; break;
case 22: pointer = pointer - 21; ukasatel = 1; break;
case 23: pointer = pointer - 22; ukasatel = 1; break;
case 24: pointer = pointer - 23; ukasatel = 1; break;
case 25: pointer = pointer - 24; ukasatel = 1; break;
case 26: pointer = pointer - 25; ukasatel = 1; break;
case 32: pointer = pointer - 30; ukasatel = 0; break;
case 33: pointer = pointer - 31; ukasatel = 0; break;
case 34: pointer = pointer - 32; ukasatel = 0; break;
case 35: pointer = pointer - 33; ukasatel = 0; break;
case 36: pointer = pointer - 34; ukasatel = 0; break;
case 43: pointer = 3; ukasatel = 1; break;
case 44: pointer = 3; ukasatel = 1; break;
case 121: pointer = pointer - 100; ukasatel = 0; break;
case 122: pointer = pointer - 101; ukasatel = 0; break;
case 123: pointer = pointer - 102; ukasatel = 0; break;
case 132: pointer = pointer - 100; ukasatel = 0; break;
case 133: pointer = pointer - 100; ukasatel = 1; break;
case 134: pointer = pointer - 100; ukasatel = 1; break;
case 135: pointer = pointer - 100; ukasatel = 1; break;
case 136: pointer = pointer - 101; ukasatel = 1; break;
case 137: pointer = pointer - 101; ukasatel = 0; break;
case 221: pointer = pointer - 199; ukasatel = 1; break;
case 222: pointer = pointer - 200; ukasatel = 1; break;
case 225: pointer = pointer - 202; ukasatel = 0; break;
case 230: pointer = pointer - 206; ukasatel = 1; break;
case 231: pointer = pointer - 207; ukasatel = 1; break;
case 232: pointer = pointer - 208; ukasatel = 1; break;
case 235: pointer = pointer - 210; ukasatel = 1; break;
case 241: pointer = pointer - 215; ukasatel = 0; break;
default: break;
}
clearlcd();
flag = 0;
is_redakt = 0;
}
if (key_value == 2) // нажата кнопка вправо
{
if (flag == 0) switch (pointer) { // описаны алгоритмы движения по меню при нажатии кнопки вправо
case 0: pointer = pointer + 10; ukasatel = 0; break;
case 1: pointer = pointer + 20; ukasatel = 0; break;
case 2: pointer = pointer + 30; ukasatel = 0; break;
case 3: pointer = pointer + 40; ukasatel = 1; break;
case 21: pointer = pointer + 100; ukasatel = 0; break;
case 22: pointer = pointer + 199; ukasatel = 0; break;
case 23: pointer = pointer + 202; ukasatel = 0; break;
case 24: pointer = pointer + 206; ukasatel = 0; break;
case 25: pointer = pointer + 210; ukasatel = 0; break;
case 26: pointer = pointer + 215; ukasatel = 0; break;
case 32: pointer = pointer + 100; ukasatel = 1; break;
case 33: pointer = pointer + 100; ukasatel = 1; break;
case 34: pointer = pointer + 100; ukasatel = 1; break;
case 35: pointer = pointer + 100; ukasatel = 0; break;
case 36: pointer = pointer + 101; ukasatel = 0; break;
default: break;
flag = 0;
is_redakt = 0;
}
clearlcd();
}
if (key_value == 12 || key_value == 112) // нажата кнопка вверх
{ // Двигаем указатель в пределах дисплея;
if (flag == 0) switch (pointer) {
// описаны алгоритмы движения по меню при нажатии кнопки вверх
case 0: pointer = 0; ukasatel = 0; break;
case 1: pointer = pointer - 1; ukasatel = 0; break;
case 2: pointer = pointer - 1; ukasatel = 1; break;
case 3: pointer = pointer - 1; ukasatel = 0; break;
case 10: pointer = 10; ukasatel = 0; break;
case 11: pointer = pointer - 1; ukasatel = 0; break;
case 12: pointer = pointer - 1; ukasatel = 0; break;
// case 13: pointer = pointer - 1; ukasatel = 0; break;
case 21: pointer = 21; ukasatel = 0; break;
case 22: pointer = pointer - 1; ukasatel = 0; break;
case 23: pointer = pointer - 1; ukasatel = 1; break;
case 24: pointer = pointer - 1; ukasatel = 0; break;
case 25: pointer = pointer - 1; ukasatel = 1; break;
case 26: pointer = pointer - 1; ukasatel = 0; break;
case 32: pointer = 32; ukasatel = 0; break;
case 33: pointer = pointer - 1; ukasatel = 0; break;
case 34: pointer = pointer - 1; ukasatel = 1; break;
case 35: pointer = pointer - 1; ukasatel = 0; break;
case 36: pointer = pointer - 1; ukasatel = 1; break;
case 43: pointer = 3; ukasatel = 1; break;
case 121: pointer = 121; ukasatel = 0; break;
case 122: pointer = pointer - 1; ukasatel = 0; break;
case 123: pointer = pointer - 1; ukasatel = 1; break;
case 135: pointer = 135; ukasatel = 0; break;
case 136: pointer = pointer - 1; ukasatel = 0; break;
case 221: pointer = 221; ukasatel = 0; break;
case 222: pointer = pointer - 1; ukasatel = 0; break;
case 225: pointer = 225; ukasatel = 0; break;
case 230: pointer = 230; ukasatel = 0; break;
case 231: pointer = pointer - 1; ukasatel = 0; break;
case 232: pointer = pointer - 1; ukasatel = 1; break;
default: break;
}
if (flag == 1) switch (pointer) {
// описаны алгоритмы движения по меню при нажатии кнопки вверх
case 43: if ( save_redakt == 0) save_redakt = 1; else save_redakt = 1; break;
case 121: if ( set_pedal == 0) set_pedal = 1; else set_pedal = 0; break;
case 122: if ( akt_level == 0) {
akt_level = 1;
EICRA = (1 << ISC11) | (1 << ISC01) | (1 << ISC00);
}
else {
akt_level = 0;
EICRA = (1 << ISC11) | (1 << ISC01);
}
break;
case 123: if (delay_block < debonce_max) delay_block ++; break;
case 132: {
TIMSK1 = 0; // запрещаем все прерывания от таймера Т1
TCCR1B = 0; // останавливаем счетчик
TCNT1 = 0; // обнуляем значение
if ( prigimG_status == 0) {
prigim_status |= (1 << prigimG_status);
iocfg_bok_on(); // выход в статус
// digitalWrite(pin_bok2, !prigimG_status);
}
else {
prigim_status &= ~(1 << prigimG_status);
iocfg_bok_off(); // выход в статус
// digitalWrite(pin_bok2, !prigimG_status);
}
break;
}
case 133: {
TIMSK1 = 0; // запрещаем все прерывания от таймера Т1
TCCR1B = 0; // останавливаем счетчик
TCNT1 = 0; // обнуляем значение
//digitalWrite(pin_vert, prigimV_status); // выход в статус
if ( prigimV_status == 0) {
prigim_status |= (1 << prigimV_status);
iocfg_vert_on(); // выход в статус
}
else {
prigim_status &= ~(1 << prigimV_status);
iocfg_vert_off();// выход в статус
}
break;
}
case 134: {
TIMSK1 = 0; // запрещаем все прерывания от таймера Т1
TCCR1B = 0; // останавливаем счетчик
TCNT1 = 0; // обнуляем значение
//digitalWrite(pin_vert, prigimV_status); // выход в статус
if ( prigimZ_status == 0) {
prigim_status |= (1 << prigimZ_status);
iocfg_zakr_on(); // выход в статус
}
else {
prigim_status &= ~(1 << prigimZ_status);
iocfg_zakr_off(); // выход в статус
}
break;
}
case 135: if ( ~prigim_status & (1 << motor_status)) {
TIMSK2 |= (1 << OCIE2A);
prigim_status |= (1 << motor_status);
}
else {
TIMSK2 &= ~(1 << OCIE2A);
prigim_status &= ~(1 << motor_status);
iocfg_shim_off();
}
break;
case 136: if (strong_zakr < strong_max) {
if (key_value == 112) strong_zakr = strong_zakr + 5;
else strong_zakr++;
}
break;
case 137: {
TIMSK1 = 0; // запрещаем все прерывания от таймера Т1
TCCR1B = 0; // останавливаем счетчик
TCNT1 = 0; // обнуляем значение
if ( prigimO_status == 0) {
prigim_status |= (1 << prigimO_status);
iocfg_ots_on(); // выход в статус
// digitalWrite(pin_bok2, !prigimG_status);
}
else {
prigim_status &= ~(1 << prigimO_status);
iocfg_ots_off(); // выход в статус
// digitalWrite(pin_bok2, !prigimG_status);
}
break;
}
case 221: if (time_bok < max_Boktime) {
if (key_value == 112) time_bok = time_bok + 10;
else time_bok++;
}
break;
case 222: if (delay_bok < max_Bokdelay) {
if (key_value == 112) delay_bok = delay_bok + 10;
else delay_bok++;
}
break;
case 225: if (delay_vert < max_Vertdelay) {
if (key_value == 112) delay_vert = delay_vert + 10;
else delay_vert++;
}
break;
case 230: if (delay_spin < max_Spindelay) {
if (key_value == 112) delay_spin = delay_spin + 10;
else
delay_spin ++;
}
break;
case 231: if (time_vert < max_Verttime) {
if (key_value == 112) time_vert = time_vert + 10;
else
time_vert++;
}
break;
case 235: if (length_product < max_length) {
if (key_value == 112) length_product = length_product + 10;
else
length_product++;
}
break;
//length_product
case 241: if (strong_zakr < strong_max) {
if (key_value == 112) strong_zakr = strong_zakr + 5;
else strong_zakr++;
// OCR2A = map(strong_zakr, strong_min, strong_max, osr_max, osr_min);
}
break;
default: break;
}
// flag = 0;
// is_redakt = false;
if (flag == 0) clearlcd();
}
if (key_value == 22 || key_value == 122) // нажата кнопка вниз
{
if (flag == 0) switch (pointer) {
// описаны алгоритмы движения по меню при нажатии кнопки вниз
case 0: {
pointer = pointer + 1;
ukasatel = 1;
break;
}
case 1: {
pointer = pointer + 1;
ukasatel = 0;
break;
}
case 2: {
pointer = pointer + 1;
ukasatel = 0;
break;
}
case 3: {
pointer = 3;
ukasatel = 1;
break;
}
case 10: {
pointer = pointer + 1;
ukasatel = 0;
break;
}
case 11: {
pointer = pointer + 1;
ukasatel = 0;
break;
}
case 12: {
pointer = 12;
ukasatel = 0;
break;
}
case 21: {
pointer = pointer + 1;
ukasatel = 1;
break;
}
case 22: {
pointer = pointer + 1;
ukasatel = 0;
break;
}
case 23: {
pointer = pointer + 1;
ukasatel = 1;
break;
}
case 24: {
pointer = pointer + 1;
ukasatel = 1;
break;
}
case 25: {
pointer = pointer + 1;
ukasatel = 1;
break;
}
case 26: {
pointer = 26;
ukasatel = 0;
break;
}
case 32: {
pointer = pointer + 1;
ukasatel = 1;
break;
}
case 33: {
pointer = pointer + 1;
ukasatel = 0;
break;
}
case 34: {
pointer = pointer + 1;
ukasatel = 1;
break;
}
case 35: {
pointer = pointer + 1;;
ukasatel = 1;
break;
}
case 36: {
pointer = 36;
ukasatel = 0;
break;
}
case 121: {
pointer = pointer + 1;
ukasatel = 1;
break;
}
case 122: {
pointer = pointer + 1;
ukasatel = 0;
break;
}
case 123: {
pointer = 123;
ukasatel = 0;
break;
}
case 135: {
pointer = pointer + 1;
ukasatel = 1;
break;
}
case 136: {
pointer = 136;
ukasatel = 1;
break;
}
case 221: {
pointer = pointer + 1;
ukasatel = 1;
break;
}
case 222: {
pointer = 222;
ukasatel = 1;
break;
}
case 225: {
pointer = 225;
ukasatel = 0;
break;
}
case 230: {
pointer = pointer + 1;
ukasatel = 1;
break;
}
case 231: {
pointer = 231;
ukasatel = 0;
break;
}
default: break;
}
if (flag == 1) switch (pointer) {
// описаны алгоритмы движения по меню при нажатии кнопки вверх
case 43: if ( save_redakt == 0) save_redakt = 1; else save_redakt = 0; break;
case 121: if ( set_pedal == 0) set_pedal = 1; else set_pedal = 0; break;
case 122: if ( akt_level == 0) {
akt_level = 1;
EICRA = (1 << ISC11) | (1 << ISC01) | (1 << ISC00);
}
else {
akt_level = 0;
EICRA = (1 << ISC11) | (1 << ISC01);
}
break;
case 123: if (delay_block > debonce_min) delay_block --; break;
case 132: {
TIMSK1 = 0; // запрещаем все прерывания от таймера Т1
TCCR1B = 0; // останавливаем счетчик
TCNT1 = 0; // обнуляем значение
if ( prigimG_status == 0) {
prigim_status |= (1 << prigimG_status);
iocfg_bok_on(); // выход в статус
// digitalWrite(pin_bok2, !prigimG_status);
}
else
{ prigim_status &= ~(1 << prigimG_status);
iocfg_bok_off(); // выход в статус
// digitalWrite(pin_bok2, !prigimG_status);
}
break;
}
case 133: {
TIMSK1 = 0; // запрещаем все прерывания от таймера Т1
TCCR1B = 0; // останавливаем счетчик
TCNT1 = 0; // обнуляем значение
if ( prigimV_status == 0) {
prigim_status |= (1 << prigimV_status);
iocfg_vert_on(); // выход в статус
}
else {
prigim_status &= ~(1 << prigimV_status);
iocfg_vert_off(); // выход в статус
}
break;
}
case 134: {
TIMSK1 = 0; // запрещаем все прерывания от таймера Т1
TCCR1B = 0; // останавливаем счетчик
TCNT1 = 0; // обнуляем значение
if ( prigimZ_status == 0) {
prigim_status |= (1 << prigimZ_status);
iocfg_zakr_on(); // выход в статус
}
else {
prigim_status &= ~(1 << prigimZ_status);
iocfg_zakr_off(); // выход в статус
}
break;
}
case 135: if (~prigim_status & (1 << motor_status)) {
TIMSK2 |= (1 << OCIE2A);
prigim_status |= (1 << motor_status);
}
else {
TIMSK2 &= ~(1 << OCIE2A);
prigim_status &= ~(1 << motor_status);
iocfg_shim_off();
}
break;
case 136: if (strong_zakr > strong_min) {
if (key_value == 122) strong_zakr = strong_zakr - 5;
else strong_zakr--;
}
break;
case 137: {
TIMSK1 = 0; // запрещаем все прерывания от таймера Т1
TCCR1B = 0; // останавливаем счетчик
TCNT1 = 0; // обнуляем значение
if ( prigimO_status == 0) {
prigim_status |= (1 << prigimO_status);
iocfg_ots_on(); // выход в статус
// digitalWrite(pin_bok2, !prigimG_status);
}
else {
prigim_status &= ~(1 << prigimO_status);
iocfg_ots_off(); // выход в статус
// digitalWrite(pin_bok2, !prigimG_status);
}
break;
}
case 221: if (time_bok > min_Boktime) {
if (key_value == 122) time_bok = time_bok - 10;
else time_bok--;
}
break;
case 222: if (delay_bok > min_Bokdelay) {
if (key_value == 122) delay_bok = delay_bok - 10;
else delay_bok--;
}
break;
case 225: if (delay_vert > min_Vertdelay) {
if (key_value == 122) delay_vert = delay_vert - 10;
else delay_vert--;
}
break;
case 230: if (delay_spin > min_Spindelay) {
if (key_value == 122) delay_spin = delay_spin - 10;
else delay_spin--;
}
break;
case 231: if (time_vert > min_Verttime) {
if (key_value == 122) time_vert = time_vert - 10;
else time_vert--;
}
break;
case 235: if (length_product > min_length) {
if (key_value == 122) length_product = length_product - 10;
else length_product--;
}
break;
case 241: if (strong_zakr > strong_min) {
if (key_value == 122) strong_zakr = strong_zakr - 5;
else strong_zakr--;
// OCR2A = map(strong_zakr, strong_min, strong_max, osr_max, osr_min);
}
break;
default: break;
}
//flag = 0;
//is_redakt = false;
if (flag == 0) clearlcd();
}
if (key_value == 42) // открываем пункт
{
if (ukasatel == 0 && is_redakt) {
setpos(15, 0);
str_lcd("<");
flag = 0;
}
if (ukasatel == 1 && is_redakt) {
setpos(15, 1);
str_lcd("<");
flag = 1;
}
// if ((is_redakt== true)&&(flag == 0)) {flag =false;
//
// is_redakt = false;
// lcd.setCursor(15, 0);
// lcd.print(" ");
// }
// if ((flag ==true)&&(ukasatel == 1)) {flag =false;
// lcd.setCursor(15, 1);
// lcd.print(" ");
// }
// flag =false;
}// открываем пункт
switch (pointer) { // По номеру указателей располагаем вложенные функции (можно вложенные меню)
case 0: {
setpos(0, 0);
str_lcd(">Status ->");
setpos(0, 1);
str_lcd(" Settings ");
break;
}
case 1: {
setpos(0, 0);
str_lcd(" Status ");
setpos(0, 1);
str_lcd(">Settings->");
break;
}
case 2: {
setpos(0, 0);
str_lcd(">Diagnostics ->"); // Вывод всех пунктов
setpos(0, 1);
str_lcd(" Save changes ");
break;
}
case 3: {
setpos(0, 0);
str_lcd(" Diagnostics "); // Вывод всех пунктов
setpos(0, 1);
str_lcd(">Save changes ->");
break;
}
case 10: {
setpos(0, 0);
str_lcd("Sensor:") ; // Вывод всех пунктов
print_bool(datchik_status);
str_lcd(" ");
setpos(0, 0);
str_lcd("Bottle clamp:");
print_bool(prigim_status & (1 << prigimG_status));
str_lcd(" ");
break;
}
case 11: {
setpos(0, 0);
str_lcd("Lid clamp:") ; // Вывод всех пунктов
print_bool(prigim_status & (1 << prigimV_status));
str_lcd(" ");
setpos(0, 1);
str_lcd("Curling:");
print_bool(prigim_status & (1 << prigimZ_status));
str_lcd(" ");
break;
}
case 12: {
setpos(0, 0);
str_lcd("Cutter:") ;
print_bool(prigim_status & (1 << prigimO_status));
str_lcd(" ");
setpos(0, 1);
str_lcd("T_d:");
uint16_t summ = 0;
for (int i = 0; i < 5; i++)
{
summ = summ + mass[i];
}
print_int(summ / 5);
str_lcd(" OCR:");
print_int(OCR2A);
break;
}
case 21: {
setpos(0, 0);
str_lcd(">Sensor ->") ; // Вывод всех пунктов
setpos(0, 1);
str_lcd(" Fix product ");
is_redakt = 0;
break;
}
case 22: {
setpos(0, 0);
str_lcd(" Sensor "); // Вывод всех пунктов
setpos(0, 1);
str_lcd(">Fix product ->");
is_redakt = 0;
break;
}
case 23: {
setpos(0, 0);
str_lcd(">Release ->") ; // Вывод всех пунктов
setpos(0, 1);
str_lcd(" Curling ");
is_redakt = 0;
break;
}
case 24: {
setpos(0, 0);
str_lcd(" Release "); // Вывод всех пунктов
setpos(0, 1);
str_lcd(">Curling -> ");
is_redakt = 0;
break;
}
case 25: {
setpos(0, 0);
str_lcd(">Cutter ->") ; // Вывод всех пунктов
setpos(0, 1);
str_lcd(" Motor ");
is_redakt = 0;
break;
}
case 26: {
setpos(0, 0);
str_lcd(" Cutter ") ; // Вывод всех пунктов
setpos(0, 1);
str_lcd(">Motor -> ");
is_redakt = 0;
break;
}
case 32: {
setpos(0, 0);
str_lcd(">Bottle clamp ->") ; // Вывод всех пунктов
setpos(0, 1);
str_lcd(" Lid clamp ") ;
TIMSK1 = (1 << OCIE1A) | (1 << OCIE1B) | (1 << TOIE1);
break;
}
case 33: {
setpos(0, 0);
str_lcd(" Bottle clamp ") ; // Вывод всех пунктов
setpos(0, 1);
str_lcd(">Lid clamp ->");
TIMSK1 = (1 << OCIE1A) | (1 << OCIE1B) | (1 << TOIE1);
break;
}
case 34: {
setpos(0, 0);
str_lcd(">Curling ->") ; // Вывод всех пунктов
// print_bool(dvig_on);
setpos(0, 1);
str_lcd(" Motor ") ;
// is_redakt = true;
break;
}
case 35: {
setpos(0, 0);
str_lcd(" Curling") ; // Вывод всех пунктов
//print_bool(dvig_on);
setpos(0, 1);
str_lcd(">Motor -> ") ;
// is_redakt = true;
break;
}
case 36: {
setpos(0, 0);
str_lcd(">Cutter ->") ; // Вывод всех пунктов
setpos(0, 1);
str_lcd(" ") ;
break;
}
case 43: {
setpos(0, 0);
str_lcd(" Are you sure:") ; // Вывод всех пунктов
setpos(0, 1);
str_lcd(">");
print_bool(save_redakt);
is_redakt = 1;
break;
}
case 44: {
setpos(0, 0);
str_lcd(" Are you sure:") ; // Вывод всех пунктов
setpos(0, 1);
str_lcd(">Syccessfully");
is_redakt = 0;
break;
}
case 121: {
setpos(0, 0);
str_lcd(">Type:") ; // Вывод всех пунктов
if (set_pedal == 0) str_lcd("foto ") ; else str_lcd("pedal") ;
setpos(0, 1);
str_lcd(" Level:") ;
if (akt_level == 0) str_lcd("rising ") ; else str_lcd("falling") ;
is_redakt = 1;
break;
}
case 122: {
setpos(0, 0);
str_lcd(" Type:") ; // Вывод всех пунктов
if (set_pedal == 0) str_lcd("foto ") ; else str_lcd("pedal") ;
setpos(0, 1);
str_lcd(">Level:") ;
if (akt_level == 0) str_lcd("rising ") ; else str_lcd("falling") ;
is_redakt = 1;
break;
}
case 123: {
setpos(0, 0);
str_lcd(">Debonce:") ; // Вывод всех пунктов
print_int(delay_block);
str_lcd(" ") ;
setpos(0, 1);
str_lcd(" ");
is_redakt = 1;
break;
}
case 132: {
setpos(1, 0);
str_lcd("Bottle clamp ") ; // Вывод всех пунктов
setpos(0, 1);
str_lcd(">");
print_bool(prigim_status & (1 << prigimG_status));
is_redakt = 1;
break;
}
case 133: {
setpos(1, 0);
str_lcd("Lid clamp ") ; // Вывод всех пунктов
setpos(0, 1);
str_lcd(">");
print_bool(prigim_status & (1 << prigimV_status));
is_redakt = 1;
break;
}
case 134: {
setpos(1, 0);
str_lcd("Curling clamp ") ; // Вывод всех пунктов
setpos(0, 1);
str_lcd(">");
print_bool(prigim_status & (1 << prigimZ_status));
is_redakt = 1;
break;
}
case 135: {
setpos(0, 0);
str_lcd(">");
str_lcd("Engine:") ; // Вывод всех пунктов
print_bool(prigim_status & (1 << motor_status));
setpos(0, 1);
str_lcd(" Strong:") ;
print_int(strong_zakr);
str_lcd(" ");
is_redakt = 1;
break;
}
case 136: {
setpos(0, 0);
//lcd.print(F(">"));
str_lcd(" Engine:") ; // Вывод всех пунктов
print_bool(prigim_status & (1 << motor_status));
setpos(0, 1);
str_lcd(">Strong:") ;
print_int(strong_zakr);
str_lcd(" ");
is_redakt = 1;
break;
}
case 137: {
setpos(0, 0);
str_lcd(">Cutter:") ; // Вывод всех пунктов
print_bool(prigimO_status);
setpos(0, 1);
// lcd.print(F(" "));
// lcd.print(F(">"));
str_lcd(" ") ;
is_redakt = 1;
break;
}
case 221: {
setpos(0, 0);
str_lcd(">Tri_del:") ; // Вывод всех пунктов
print_int(time_bok);
str_lcd(" ");
setpos(0, 1);
str_lcd(" Rel_del:");
print_int(delay_bok);
str_lcd(" ");
is_redakt = 1;
break;
}
case 222: {
setpos(0, 0);
str_lcd(" Tri_del:") ; // Вывод всех пунктов
print_int(time_bok);
str_lcd(" ");
setpos(0, 1);
str_lcd(">Rel_del:");
print_int(delay_bok);
str_lcd(" ");
is_redakt = 1;
break;
}
case 225: {
setpos(0, 0);
str_lcd(">Lid del:");
print_int(delay_vert);
str_lcd(" ");
is_redakt = 1;
break;
}
case 230: {
setpos(0, 0);
str_lcd(">Spi del:") ; // Вывод всех пунктов
print_int(delay_spin);
str_lcd(" ");
// lcd.print(pointer);
setpos(0, 1);
str_lcd(" Spi tim:");
print_int(time_vert);
str_lcd(" ");
is_redakt = 1;
break;
}
case 231: {
setpos(0, 0);
str_lcd(" Spi del:"); // Вывод всех пунктов
print_int(delay_spin);
str_lcd(" ");
// lcd.print(pointer);
setpos(0, 1);
str_lcd(">Spi tim:");
print_int(time_vert);
str_lcd(" ");
is_redakt = 1;
break;
}
case 235: {
setpos(0, 0);
str_lcd(">Length:"); // Вывод всех пунктов
print_int(length_product);
str_lcd(" ") ;
setpos(0, 1);
str_lcd(" ") ;
is_redakt = 1;
break;
}
case 241: {
setpos(0, 0);
str_lcd(">Strong:") ; // Вывод всех пунктов
print_int(strong_zakr);
str_lcd(" ");
is_redakt = 1;
break;
}
default: break;
}
if ((save_redakt == 1) && (flag == 0) && (pointer == 43)) //сохранение изменений настроек
{ pointer++;
eeprom_write_word(&e_time_bok, time_bok); // пишем в память
eeprom_write_byte(&e_delay_bok, delay_bok);
eeprom_write_word(&e_time_vert, time_vert);
eeprom_write_byte(&e_delay_spin, delay_spin);
eeprom_write_byte(&e_delay_vert, delay_vert);
eeprom_write_byte(&e_strong_zakr, strong_zakr);
eeprom_write_word(&e_delay_block, delay_block);
//EEPROM.put(10, first_start);
//EEPROM.put(11, akt_level);
eeprom_write_word(&e_length_product, length_product);
save_redakt = 0;
}
}
}