Announcements
-
Сообщения
-
Ответная часть не в одном экземпляре. Проблема вряд ли с той стороны. Что-то с пультом, думаю.
-
Всем доброго времени суток. На работе случилась беда, навернулся котел, точнее программно-таймерное устройство, дергающее за "веревочки" цепей данного котла. Как у нас в стране обычно бывает, нет ни документации на это устройство, ни описания логики данного механизма. Ну и соответственно вся возня, касаемая ремонта, легла на плечи коллектива. Недолго думая, обложился всем схемами, которые мог найти, частично методом частичного разбора и замеров расчертил полную схему данного котла. Постепенно логика работы сломанного программно-таймерного устройства стала понятна. Было принято решение воссоздать данный модуль на базе AVR контроллера со всеми вытекающими. В спринт лайот накидал печатку, заказал, и пока она доставляется занялся набором программы в среде Arduino IDE. И буквально с первых же попыток написать скетч понял, что с печатками я поторопился, как я уже потом понял, программно-таймерное устройство c момента запуска должно единожды прогнать перечень команд в void setup и начать следить да датчиками уже в void loop. Следовательно для такого исполнения программы понадобилось дополнять схему парой транзисторов и реле, для коммутации питания ардуино самой на себя. Ну что-то я в дебри полез. Нужен совет по скетчу. Дабы оставить печатные платы без изменений в первоначальном заказанном виде, хочу избавиться от удерживающего питание реле. Но это получится сделать только если есть возможность в void setup скинуть скетч на начало работы при определенных условиях, но только не средствами reset, а именно программно? Чтото вроде того, что при начале скетча, при несоблюдении условий продолжения работы void setup начинал выполняться с первой строки. Ниже часть пока еще сырого пробного скетча. #include <OLED_I2C.h> OLED myOLED(4, 3, 4); extern uint8_t RusFont[]; extern uint8_t SmallFont[]; const int buttonPinSTART = A0; // вход для контроля пуск/стоп программы (так же через диод запитывается пин +5v, на который приходит питание через реле, управляемого 13 пином) const int buttonPinFIRE = A1; // вход для контроля пламени const int ledPin2 = 2; // пин питания дисплея const int ledPin5 = 5; // вывод для реле вентилятора const int ledPin6 = 6; // вывод для реле аварии const int ledPin7 = 7; // вывод для реле воздушной заслонки const int ledPin8 = 8; // вывод для реле соленоид2 const int ledPin9 = 9; // вывод для реле розжига const int ledPin10 = 10; // вывод для реле соленоид1 const int ledPin13 = 13; // вывод подтяжки питания int buttonStateSTART = LOW; int buttonStateFIRE = HIGH; void setup() { pinMode(buttonPinSTART, INPUT); pinMode(buttonPinFIRE, INPUT_PULLUP); pinMode(ledPin2, OUTPUT); // Пин питания дисплея pinMode(ledPin5, OUTPUT); // Пин управления pinMode(ledPin6, OUTPUT); // Пин управления pinMode(ledPin7, OUTPUT); // Пин управления pinMode(ledPin8, OUTPUT); // Пин управления pinMode(ledPin9, OUTPUT); // Пин управления pinMode(ledPin10, OUTPUT); // Пин управления pinMode(ledPin13, OUTPUT); // Пин удержания питания микроконтроллера digitalWrite(ledPin2, HIGH); // Подклюаем дисплей delay(1500); myOLED.begin(); myOLED.clrScr(); // Стираем все с экрана myOLED.setFont(RusFont); // Инициализируем русский шрифт myOLED.print( "------" , CENTER, 12); // Выводим текст ------ myOLED.print( "------" , CENTER, 30); // Выводим текст ------ myOLED.print( "------" , RIGHT, 48); // Выводим текст ------ myOLED.update(); digitalWrite(ledPin13, HIGH); // Подтягиваем питание ардуино через реле delay (2000); buttonStateSTART = digitalRead(buttonPinSTART); if (buttonStateSTART == LOW) { myOLED.clrScr(); myOLED.print( "JNVTYF PFGECRF" , CENTER, 24); // Выводим текст ОТМЕНА ЗАПУСКА myOLED.update(); delay(1000); myOLED.print( "DSRK>XTYBT" , CENTER, 36); // Выводим текст ВЫКЛЮЧЕНИЕ myOLED.update(); delay(1000); digitalWrite(ledPin13, LOW); delay(300); } myOLED.clrScr(); myOLED.print( "GJLUJNJDRF R GECRE" , CENTER, 24); // Выводим текст ПОДГОТОВКА К ПУСКУ myOLED.update(); delay(2000); buttonStateSTART = digitalRead(buttonPinSTART); if (buttonStateSTART == LOW) { myOLED.clrScr(); myOLED.print( "JNVTYF PFGECRF" , CENTER, 24); // Выводим текст ОТМЕНА ЗАПУСКА myOLED.update(); delay(1000); myOLED.print( "DSRK>XTYBT" , CENTER, 36); // Выводим текст ВЫКЛЮЧЕНИЕ myOLED.update(); delay(1000); digitalWrite(ledPin13, LOW); delay(300); } myOLED.clrScr(); myOLED.print( "------" , CENTER, 24); // Выводим текст myOLED.print( "------" , CENTER, 36); // Выводим текст myOLED.update(); delay(1000); buttonStateSTART = digitalRead(buttonPinSTART); if (buttonStateSTART == LOW) { myOLED.clrScr(); myOLED.print( "JNVTYF PFGECRF" , CENTER, 24); // Выводим текст ОТМЕНА ЗАПУСКА myOLED.update(); delay(1000); myOLED.print( "DSRK>XTYBT" , CENTER, 36); // Выводим текст ВЫКЛЮЧЕНИЕ myOLED.update(); delay(1000); digitalWrite(ledPin13, LOW); delay(300); } digitalWrite(ledPin7, HIGH); myOLED.clrScr(); myOLED.print( "------" , CENTER, 24); // Выводим текст myOLED.update(); delay(1000); buttonStateSTART = digitalRead(buttonPinSTART); if (buttonStateSTART == LOW) { myOLED.clrScr(); myOLED.print( "JNVTYF PFGECRF" , CENTER, 24); // Выводим текст ОТМЕНА ЗАПУСКА myOLED.update(); delay(1000); myOLED.print( "DSRK>XTYBT" , CENTER, 36); // Выводим текст ВЫКЛЮЧЕНИЕ myOLED.update(); digitalWrite(ledPin7, LOW); delay(1000); digitalWrite(ledPin13, LOW); delay(300); } digitalWrite(ledPin5, HIGH); delay(300); ..... ..... ..... ..... ..... } } void loop() { ..... ..... ..... ..... ..... } В данном варианте, при отмене запуска ардуинка проделывает кое какие манипуляции, в зависимости от части кода и снимает питание с пина13 (реле поддержки питания), которое тем временем обестачивает контроллер. Вроде бы задача выполнена, но есть баг. К примеру механик решил выключить котел, повернул тумблер в *0* на стадии предпускового продува камеры, пошел цикл завершения работы. А механик передумал останавливать котел, не дождался пока завершится процесс выключения, врубает тумблер в "работу", при этом в void setup программа отключает подтяжку питания, но продолжает выполнять последовательность действий запуска. В конечном итоге сработает авария, условия которой прописано в void loop. Но момент все равно неприятный. Есть ли возможность в данной строке delay(1000); digitalWrite(ledPin13, LOW); delay(300); вписать команду, которая заставит void setup прервать выполнение программы и вернуться к началу (повторюсь, без reset), ну и соответственно избавиться от использования 13 пина и соответственно танцев с подтягиванием питания Написал много, так как тяжело выразить словами всю кашу, которая на данный момент у меня в голове, возможно и сам за выходные немного отдохну и решение придет само собой) Возможно я изначально неправильно выбрал подход к данному скетчу. Не представляю как в void loop это все заставить работать, так как основному телу программы не нужна цикличность.
-
Ещё парочку реле надо добавить, а то несерьёзно как-то.
-
By demiurg1978 · Posted
Вариант первый. ldi r16, 1 Cycle: dec r16 Проверка на переполнение или отрицательное число, не помню команду. Если да, выход, если нет lsl r16 rjmp Cycle Получили бит в соответствии с переменной от 0 до 7. Второй вариант. Создаем таблицу. Table_bits: .db 0b00000001, 0b00000010 .db 0b00000100, 0b00001000 .db 0b00010000, 0b00100000 .db 0b01000000, 0b10000000 Установка адреса указателя на flash таблицу. Прибавляем переменную. Считывает значение. Получаем бит в соответствии с переменной от 0 до7. Народ. В данном случае вопрос касается алгоритмов. Вы не правы, отправляя тс читать книги. В книгах зачастую нет ответа на такие вопросы. -
Ну не скажите!! фен скорее всего есть. Нужен фен не для пайки, а для разогрева, чтоб пластик стал более податливым (60-80грС) Есть ребёнок сломавший фотоаппарат - значит есть жена - у жены есть волосы и их надо сушить - значит есть фен. Он не мастер в ремонте, но у него есть фен годный к применению для разбора фотика. А вот "медиаторов" и прочих приспособ для расщепления, что МАВР выше указал, у него нет. С уважением, Сергей