чтобы можно было читать все входа разом и заменить кучу условий в строке 27 на элегантный case
void loop() {
uint8_t inputs = PORTD & mask; // читаем весь порт Д целиком и выделяем нужное маской
switch (inputs)
// 1-й
case (0b00100000)
digitalWrite(rA,HIGH);
digitalWrite(rB,LOW);
digitalWrite(rC,HIGH);
digitalWrite(rD,LOW);
break;
// 2-й и далее аналогично
}
}
можно тоже самое проделать и с выходами, будет еще короче
чтобы можно было читать все входа разом и заменить кучу условий в строке 27 на элегантный case
void loop() {
uint8_t inputs = PORTD & mask; // читаем весь порт Д целиком и выделяем нужное маской
switch (inputs)
// 1-й
case (0b00100000)
digitalWrite(rA,HIGH);
digitalWrite(rB,LOW);
digitalWrite(rC,HIGH);
digitalWrite(rD,LOW);
break;
// 2-й и далее аналогично
}
}
можно тоже самое проделать и с выходами, будет еще короче
можно поинтересоваться? а сколько блоков CASE планируется (на выход)?
чтобы можно было читать все входа разом и заменить кучу условий в строке 27 на элегантный case
void loop() {
uint8_t inputs = PORTD & mask; // читаем весь порт Д целиком и выделяем нужное маской
switch (inputs)
// 1-й
case (0b00100000)
digitalWrite(rA,HIGH);
digitalWrite(rB,LOW);
digitalWrite(rC,HIGH);
digitalWrite(rD,LOW);
break;
// 2-й и далее аналогично
}
}
можно тоже самое проделать и с выходами, будет еще короче
привязываться к конкретным пинам - тоже нехорошо. и неоднократные case и digitalWrite.
вариант
/* рисуем таблицу, например:
01
4321 DCBA
02
0000 0000
03
0001 0100
04
0010 0101
05
0011 0000
06
0100 1001
07
0101 0000
08
0110 0000
09
0111 1010
10
1000 0000
11
1001 0000
12
1010 0000
13
1011 0000
14
1100 0000
15
1101 1000
16
1110 0000
17
1111 0000
*/
// объявляем и настраиваем пины, дальше вся программа в 6 операторов:
const byte out = {B00000000, 00000100, 00000101, ....... B00000000};
loop() {
byte index = digitalRead(k4)*8 + digitalRead(k3)*4 + digitalRead(k2)*2 + digitalRead(k1);
привязываться к конкретным пинам - тоже нехорошо. и неоднократные case и digitalWrite.
ну можно и так. Хотя если мы проектируем конкретное устройство, почему бы не привязаться к конкретным пинам, они ж у нас все свободны.
Зато мой код будет читать состояние на порядок быстрее, чем ваша сложная формула :) А если повесить все выходы тоже на один порт - можно будет и писать выходы все разом, еще выиграв в быстроте
привязываться к конкретным пинам - тоже нехорошо. и неоднократные case и digitalWrite.
ну можно и так. Хотя если мы проектируем конкретное устройство, почему бы не привязаться к конкретным пинам, они ж у нас все свободны.
Зато мой код будет читать состояние на порядок быстрее, чем ваша сложная формула :) А если повесить все выходы тоже на один порт - можно будет и писать выходы все разом, еще выиграв в быстроте
куда торопиться-то? на выходах у нас автомобильные реле с типовым временем срабатывания порядка 10 миллисекунд - никакого заметного выигрыша в скорости не будет.
(как же весело Вам :) :) ), а я радуюсь, как в школе с БК-0010 :)
решил сделать мигающий диод, чтоб горел постоянно при замкнутом 4 пине.
Замкнут 4 пин на корпус - горит постоянно, если отпустили - моргает, как прежде.
Как можно это сделать проще и правильно?
uint8_t k1 = 4; // НАЗНАЧИЛ ПЕРЕМЕННУЮ к1 НА 4 пин
void setup() {
// initialize digital pin LED_BUILTIN as an output.
pinMode(LED_BUILTIN, OUTPUT);
pinMode(k1,INPUT_PULLUP); // ОБОЗНАЧИЛ к1 НА ВХОД
}
// the loop function runs over and over again forever
void loop() {
digitalWrite(LED_BUILTIN, HIGH); // turn the LED on (HIGH is the voltage level)
delay(1000); // wait for a second
if(!digitalRead(k1)) {goto lll;} // ПРОВЕРИЛ НА замыкание на - и если замкнуто, то переход на 111
digitalWrite(LED_BUILTIN, LOW); // turn the LED off by making the voltage LOW
delay(1000); // wait for a second
lll:{digitalWrite(LED_BUILTIN, HIGH);} // включить светодиод
}
void loop() {
digitalWrite(LED_BUILTIN, HIGH); // turn the LED on (HIGH is the voltage level)
delay(1000); // wait for a second
digitalWrite(LED_BUILTIN, !digitalRead(k1)); // turn the LED off or on
delay(1000); // wait for a second
}
дошло... если с воскл знаком - то св.диод принимает "активное" состояние по "активному состоянию - замкнут на минус вывод.
Не нужно ничего сочинять. Нужно хоть немного почитать что-нибудь о языке, на котором Вы пытаетесь программировать. Или "чукча не читатель, чукча - писатель"?
На какойнить древней пзу с физическим прожигом перемычек типа ре3 можно прожечь спец-дешифратор. Адреса- входы , данные - выходы.
Неубиваемая штука получится.
у ТС задача сделать на ардуино
я нарисовал дешифратор в #56. легко читаемый и конфигурируемый (что в массиве объявишь, то и сработает) и без хитровымудренных запутин со сложными условиями.
Необходимую задачу выполняет, однако есть ньюансы с "мозгами" акпп. Там несколько усложнен алгоритм. Не вдаваясь в подробности спрошу:
будет ли это работать? необходимо после поступления на входы определенной комбинации сначала включить определенные выходы, потом через 0,5 сек другие...
будет ли это работать? необходимо после поступления на входы определенной комбинации сначала включить определенные выходы, потом через 0,5 сек другие...
Ардуино так работать заставить можно. А вот как на это отреагируют "мозги" АКПП - это вопрос для другого форума.
Ну, вообще-то подход к составлению кода идеологически неправилен:
1. Обычно проверять следует не текущее состояние кнопок/реле/и пр., а отслеживать их переход из одного состояния в другое. Т.е. под if() должен быть номер состояния, описывающий общее состояние органов управления, основанное на анализе переходов, а не текущее состояние самих органов управления.
2. Программа на время delay() полностью блокирует всю работу контроллера. Иногда это годится. Но, если Вам нужно, чтобы контроллера реагировал на изменение ситуации своевременно, то лучше переходить с идеологии "blink" на идеологию "blink without delay".
Цитата:
Проверить сразу не могу - все оставил в гараже в машине, только завтра вечером смогу снова заняться
Ну так проверите - напишете. Зачем писать до проверки?
Или Вы всерьез думаете, что кто-то вот прямо сейчас побежит в Ваш гараж это проверять?
Есть проблемка, но не совсем пока разобрался. Иногда при быстром переключении рычага акпп мозги "падают" в аварию. релюшки отрабатывают четко, "дребезга" осциллографом не наблюдаю.
такое впечатление, что "слишком быстро" происходит команда от релюшек, поэтому мозги акпп не успевают "увидеть" быстропереключающиеся сигналы. Но в родном варианте простые контактные переключатели. Непонятно.
в целом было интересно.
так и не смог запустить драйвера мега2560 под 7-64 виндовозину. Дрова ставятся некорректно (чип ch340g)
Есть проблемка, но не совсем пока разобрался. Иногда при быстром переключении рычага акпп мозги "падают" в аварию. релюшки отрабатывают четко, "дребезга" осциллографом не наблюдаю.
такое впечатление, что "слишком быстро" происходит команда от релюшек, поэтому мозги акпп не успевают "увидеть" быстропереключающиеся сигналы. Но в родном варианте простые контактные переключатели. Непонятно.
"Слишком быстро" - в каком смысле? Тот сигнал, что должен быть позже другого, на самом деле приходит раньше (т.е. нарушена последовательность сигналов), или сигналы приходят в нужном порядки но со слишком маленьким интервалом?
Второй вариант мне кажется маловероятным, т.к. "быстропереключающиеся" с точки зрения контроллера - это намного быстрее, чем может обеспечить механика.
Первый вариант также маловеероятен - это как же надо напутать в прошивке, чтобы сигналы "перехлестнулись"!
В общем, я бы посмотрел сигналы логическим анализатором, чтобы выяснить, что же там происходит.
В общем, я бы посмотрел сигналы логическим анализатором, чтобы выяснить, что же там происходит.
Спасибо.
Подключу все 4 выхода с релюшек к осц-фу. Посмотрю, что там происходит.
Просто при переключении в "родном" варианте есть промежуточные состояния, которые в моем случае не реализованы. Возможно эбу не видя этих промежуточных некорректно работают.
строка 27 и дальше - некузяво.
Конечно некузяво. Строчки с кучей digitalRead() и условий - некрасиво.
Смотрим, у нас все входа на одном порту. порту D:
значит достаточно дополнить их маской:
чтобы можно было читать все входа разом и заменить кучу условий в строке 27 на элегантный case
можно тоже самое проделать и с выходами, будет еще короче
строка 27 и дальше - некузяво.
Конечно некузяво. Строчки с кучей digitalRead() и условий - некрасиво.
Смотрим, у нас все входа на одном порту. порту D:
значит достаточно дополнить их маской:
чтобы можно было читать все входа разом и заменить кучу условий в строке 27 на элегантный case
можно тоже самое проделать и с выходами, будет еще короче
можно поинтересоваться? а сколько блоков CASE планируется (на выход)?
можно поинтересоваться? а сколько блоков CASE планируется (на выход)?
ровно столько же, сколько строчек IF планировалось у вас. Видите - я в коде даже ваши комментарии // 1-1 //2-ой оставил.
Схема работы осталась та же, только вместо каждого
будет
я пока еще не планировал, как только с тумблерами потренируется хотел показать, где влетит на логике )))
Ты сильно тему не развивай, дай человеку светодиодиками поиграться, дальше покажу на if, а уже далее для расшаренных код )))
строка 27 и дальше - некузяво.
Конечно некузяво. Строчки с кучей digitalRead() и условий - некрасиво.
Смотрим, у нас все входа на одном порту. порту D:
значит достаточно дополнить их маской:
чтобы можно было читать все входа разом и заменить кучу условий в строке 27 на элегантный case
можно тоже самое проделать и с выходами, будет еще короче
вариант
/* рисуем таблицу, например:
01
4321 DCBA
02
0000 0000
03
0001 0100
04
0010 0101
05
0011 0000
06
0100 1001
07
0101 0000
08
0110 0000
09
0111 1010
10
1000 0000
11
1001 0000
12
1010 0000
13
1011 0000
14
1100 0000
15
1101 1000
16
1110 0000
17
1111 0000
*/
// объявляем и настраиваем пины, дальше вся программа в 6 операторов:
const byte out = {B00000000, 00000100, 00000101, ....... B00000000};
loop() {
byte index = digitalRead(k4)*8 + digitalRead(k3)*4 + digitalRead(k2)*2 + digitalRead(k1);
digitalWrite(rD, bitRead(out[index], 3));
digitalWrite(rC, bitRead(out[index], 2));
digitalWrite(rB, bitRead(out[index], 1));
digitalWrite(rA, bitRead(out[index], 0));
}
Ты сильно тему не развивай, дай человеку светодиодиками поиграться, дальше покажу на if, а уже далее для расшаренных код )))
а что тут развивать, тут уже все написано. Осталось еще два-три состояния таблички добавить - и все готово
привязываться к конкретным пинам - тоже нехорошо. и неоднократные case и digitalWrite.
ну можно и так. Хотя если мы проектируем конкретное устройство, почему бы не привязаться к конкретным пинам, они ж у нас все свободны.
Зато мой код будет читать состояние на порядок быстрее, чем ваша сложная формула :) А если повесить все выходы тоже на один порт - можно будет и писать выходы все разом, еще выиграв в быстроте
эй!... СТОП !
дайте:
..., дай человеку светодиодиками поиграться, дальше покажу на if, а уже далее для расшаренных код )))
а реально все расписали, пообсуждали :) бери и собирай и заливай..
мне еще контроллер для горелки на отработке делать, а Вы тут уже все выложили :)
Спасибо.
пс. пытаюсь установить и подключить свежекупленную "уно"
ппс. Установил, запустил, как сказано тут: http://arduino.ru/Guide/Windows
светодиод заморгал.
завтра, если магазины работают, посмотрю, может в наличии платы с релюшками есть..
сейчас пока со светодиодиками и тумблерами побалуюсь.
А если повесить все выходы тоже на один порт - можно будет и писать выходы все разом, еще выиграв в быстроте
не можно, а нужно, пины назначал с потолка
привязываться к конкретным пинам - тоже нехорошо. и неоднократные case и digitalWrite.
ну можно и так. Хотя если мы проектируем конкретное устройство, почему бы не привязаться к конкретным пинам, они ж у нас все свободны.
Зато мой код будет читать состояние на порядок быстрее, чем ваша сложная формула :) А если повесить все выходы тоже на один порт - можно будет и писать выходы все разом, еще выиграв в быстроте
Как так?
А дребезг кто воспроизводить будет?
ТС гайды читает, видимо заинтересуется )))
продолжаю песочные вопросы/эксперементы...
(как же весело Вам :) :) ), а я радуюсь, как в школе с БК-0010 :)
решил сделать мигающий диод, чтоб горел постоянно при замкнутом 4 пине.
Замкнут 4 пин на корпус - горит постоянно, если отпустили - моргает, как прежде.
Как можно это сделать проще и правильно?
Блин - работает, но в голове не укладывается.. слишком просто и сложно одновременно.
Получается, что по этой строке светодиод принимает то состояние в котором вход к1 ?
пошел долго думать....
спасибо.
пс...
убираю воскл. знак и получаю, что диод постоянно горит а при замыкании контакта начинает моргать..
если не трудно, можно расписать эти два варианта, чтоб до меня дошла логика работы...
ппс...
дошло... если с воскл знаком - то св.диод принимает "активное" состояние по "активному состоянию - замкнут на минус вывод.
если разомкнут контакт, то сост неактивное, тухнет, но в цикле снова загорается.
восклицательным знаком реализуется логическая функция НЕ (инверсия сигнала), в формате логических уравнений она записывалась штрихом над переменной
дошло... если с воскл знаком - то св.диод принимает "активное" состояние по "активному состоянию - замкнут на минус вывод.
На какойнить древней пзу с физическим прожигом перемычек типа ре3 можно прожечь спец-дешифратор. Адреса- входы , данные - выходы.
Неубиваемая штука получится.
Вы это с запутиными поосторожнее
Вы это с запутиными поосторожнее
ну, он же "за", а не против..
с фронта нет новостей - магазины были закрыты...
занимался переводом "мерина" на "январь" ... многие должны понять
занимался переводом "мерина" на "январь" ... многие должны понять
Ну этт ты зря... про многих то.
Давай посмотрим, скока ответят на вапрос: а нахрена мерину январь?
Особенно пятый январь с прошивкой под мерс
Один есть.
у меня Ногайский мерин, он без прошивок
Зря.
Доброго времени суток.
Потихоньку делаю..
плата с релюшками работает.
Необходимую задачу выполняет, однако есть ньюансы с "мозгами" акпп. Там несколько усложнен алгоритм. Не вдаваясь в подробности спрошу:
будет ли это работать? необходимо после поступления на входы определенной комбинации сначала включить определенные выходы, потом через 0,5 сек другие...
Проверить сразу не могу - все оставил в гараже в машине, только завтра вечером смогу снова заняться
...есть ньюансы с "мозгами" акпп...
будет ли это работать? необходимо после поступления на входы определенной комбинации сначала включить определенные выходы, потом через 0,5 сек другие...
Ардуино так работать заставить можно. А вот как на это отреагируют "мозги" АКПП - это вопрос для другого форума.
Ну, вообще-то подход к составлению кода идеологически неправилен:
1. Обычно проверять следует не текущее состояние кнопок/реле/и пр., а отслеживать их переход из одного состояния в другое. Т.е. под if() должен быть номер состояния, описывающий общее состояние органов управления, основанное на анализе переходов, а не текущее состояние самих органов управления.
2. Программа на время delay() полностью блокирует всю работу контроллера. Иногда это годится. Но, если Вам нужно, чтобы контроллера реагировал на изменение ситуации своевременно, то лучше переходить с идеологии "blink" на идеологию "blink without delay".
Проверить сразу не могу - все оставил в гараже в машине, только завтра вечером смогу снова заняться
Ну так проверите - напишете. Зачем писать до проверки?
Или Вы всерьез думаете, что кто-то вот прямо сейчас побежит в Ваш гараж это проверять?
если кратко: заработало в самом простом варианте.
большое спасибо, ua6em !
Есть проблемка, но не совсем пока разобрался. Иногда при быстром переключении рычага акпп мозги "падают" в аварию. релюшки отрабатывают четко, "дребезга" осциллографом не наблюдаю.
такое впечатление, что "слишком быстро" происходит команда от релюшек, поэтому мозги акпп не успевают "увидеть" быстропереключающиеся сигналы. Но в родном варианте простые контактные переключатели. Непонятно.
в целом было интересно.
так и не смог запустить драйвера мега2560 под 7-64 виндовозину. Дрова ставятся некорректно (чип ch340g)
Есть проблемка, но не совсем пока разобрался. Иногда при быстром переключении рычага акпп мозги "падают" в аварию. релюшки отрабатывают четко, "дребезга" осциллографом не наблюдаю.
такое впечатление, что "слишком быстро" происходит команда от релюшек, поэтому мозги акпп не успевают "увидеть" быстропереключающиеся сигналы. Но в родном варианте простые контактные переключатели. Непонятно.
"Слишком быстро" - в каком смысле? Тот сигнал, что должен быть позже другого, на самом деле приходит раньше (т.е. нарушена последовательность сигналов), или сигналы приходят в нужном порядки но со слишком маленьким интервалом?
Второй вариант мне кажется маловероятным, т.к. "быстропереключающиеся" с точки зрения контроллера - это намного быстрее, чем может обеспечить механика.
Первый вариант также маловеероятен - это как же надо напутать в прошивке, чтобы сигналы "перехлестнулись"!
В общем, я бы посмотрел сигналы логическим анализатором, чтобы выяснить, что же там происходит.
В общем, я бы посмотрел сигналы логическим анализатором, чтобы выяснить, что же там происходит.
Спасибо.
Подключу все 4 выхода с релюшек к осц-фу. Посмотрю, что там происходит.
Просто при переключении в "родном" варианте есть промежуточные состояния, которые в моем случае не реализованы. Возможно эбу не видя этих промежуточных некорректно работают.
В целом, все, что задумывалось - получилось.
а выложи код, что заработал