You can post now and register later.
If you have an account, sign in now to post with your account.
Note: Your post will require moderator approval before it will be visible.
Всем доброго времени суток. На работе случилась беда, навернулся котел, точнее программно-таймерное устройство, дергающее за "веревочки" цепей данного котла. Как у нас в стране обычно бывает, нет ни документации на это устройство, ни описания логики данного механизма. Ну и соответственно вся возня, касаемая ремонта, легла на плечи коллектива. Недолго думая, обложился всем схемами, которые мог найти, частично методом частичного разбора и замеров расчертил полную схему данного котла. Соответственно логика работы сломанного программно-таймерного устройства стала понятна. Было принято решение воссоздать данный модуль на базе AVR контроллера со всеми вытекающими. В спринт лайот накидал печатку, заказал, и пока она доставляется занялся набором программы в среде Arduino IDE. И буквально с первых же попыток написать скетч понял, что с печатками я поторопился, как я уже потом понял, программно-таймерное устройство c момента запуска должно единожды прогнать перечень команд в void setup и начать следить да датчиками уже в void loop. Следовательно для такого исполнения программы понадобилось дополнять схему парой транзисторов и реле, для коммутации питания ардуино самой на себя.
Ну что-то я в дебри полез. Нужен совет по скетчу. Дабы оставить печатные платы без изменений в первоначальном заказанном виде, хочу избавиться от удерживающего питание реле. Но это получится сделать только если есть возможность в void setup скинуть скетч на начало работы при определенных условиях, но только не средствами reset, а именно программно? Чтото вроде того, что при начале светча, при несоблюдении условий продолжения работы сетап начинал выполняться с первой строки. Ниже часть пока еще сырого пробного скетча.
#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 это все заставить работать, так как программе не нужна цикличность.
Вариант первый.
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грС)
Есть ребёнок сломавший фотоаппарат - значит есть жена - у жены есть волосы и их надо сушить - значит есть фен.
Он не мастер в ремонте, но у него есть фен годный к применению для разбора фотика.
А вот "медиаторов" и прочих приспособ для расщепления, что МАВР выше указал, у него нет.
С уважением, Сергей
Да ладно , правда что ли? Мне например многие служившие Советской армии рассказывали что тот же питер например был советской гей столицей. И почему что в питере что в москве, секс меньшинства раза три больше чем у нас...И ходят они свободно и не скрываются.
а другие причины могут быть, как ты думаешь?
с жильем у меня проблем нет в питере. В Польшу только с России едут работать, Белоруссии и Украины. Не вариант.