Yurkin2015 Опубликовано 21 июля, 2019 Поделиться Опубликовано 21 июля, 2019 18 minutes ago, mosfetx said: (PIND&(1<<x) В результате этой операции получится не 1, а тоже сдвинутая на х единица. Поэтому сравнение с просто 1 не работает. Надо сравнивать так if ((PIND&(1<<x)) ! = 0) 0 Ссылка на комментарий Поделиться на другие сайты Поделиться
IMXO Опубликовано 21 июля, 2019 Поделиться Опубликовано 21 июля, 2019 1 hour ago, mosfetx said: Хотел опрашивать все 8 пинов. на наличии лог1. так не работает КМК то шо вы написали вообще ни как не работает... если пин0=1, будет постоянный инкремент переменной темр и никакого опроса других пинов не будет. и в выражении PIND&(1<<x) делать сдвиг переменной х , есть тупое бесполезное увеличение размера кода. 0 Ссылка на комментарий Поделиться на другие сайты Поделиться
Реле, вентиляторы, корпуса, разъемы, а так же любые электронные компоненты в нашем каталоге! Бесплатная доставка + 15% кэшбэк + скидки!Перейти на сайт ТМ Электроникс Реклама: ООО ТМ ЭЛЕКТРОНИКС, ИНН: 7806548420, info@tmelectronics.ru, +7(812)4094849
Starichok Опубликовано 21 июля, 2019 Поделиться Опубликовано 21 июля, 2019 переменная x там вообще не нужна. номер пина задает переменная цикла i. 0 Мудрость приходит вместе с импотенцией... Когда на русском форуме переходят на Вы, в реальной жизни начинают бить морду. Ссылка на комментарий Поделиться на другие сайты Поделиться
Сравнительное тестирование аккумуляторов EVE Energy и Samsung типоразмера 18650Инженеры КОМПЭЛ провели сравнительное тестирование аккумуляторов EVE и Samsung популярного для бытовых и индустриальных применений типоразмера 18650. Для теста были выбраны аккумуляторы литий-никельмарганцевой системы: по два образца одного наименования каждого производителя – и протестированы на двух значениях тока разряда: 0,5 А и 2,5 А. Испытания проводились в нормальных условиях на электронной нагрузке EBD-USB от ZKEtech, а зарядка осуществлялась от лабораторного источника питания в режиме CC+CV в соответствии с рекомендациями в даташите на определенную модель. Подробнее>> Реклама: АО КОМПЭЛ, ИНН: 7713005406, ОГРН: 1027700032161
pndbr Опубликовано 23 июля, 2019 Поделиться Опубликовано 23 июля, 2019 (изменено) здравствуйте. я тут набыдлокодил..с си знакомство только начал,да и вообще с языками программирования Quote #define F_CPU 8000000UL #define BUT4H PB0 #define BUT4L PB1 #define MODE4H (~(PINB&(1<<2))&&~(PINB&(1<<3)))// проверка на минус на 23 #define MODE4L (~(PINB&(1<<4))&&~(PINB&(1<<5)))// проверка на минус на 45 #define MODE2H (~(PINB&(1<<3))&&~(PINB&(1<<5)))// проверка на минус на 35 #define LEFT PB6 #define RIGHT PB7 #define LIGHT4H PD0 #define LIGHT4L PD1 #define ERROR PD2 #define CONTROL4L PD3 #include <avr/io.h> #include <util/delay.h> void port_init() { DDRB|=(1<<DDB6)|(1<<DDB7);//OUTPUTS DDRB&=~(1<<DDB0)&~(1<<DDB1)&~(1<<DDB2)&~(1<<DDB3)&~(1<<DDB4)&~(1<<DDB5);//INPUTS DDRD|=(1<<DDD0)|(1<<DDD1)|(1<<DDD2);//OUTPUT DDRD&=~(1<<DDD3);//INPUT PORTB&=~(1<<LEFT)&~(1<<RIGHT);//STOP PORTB|=(1<<PB0)|(1<<PB1)|(1<<PB2)|(1<<PB3)|(1<<PB4)|(1<<PB5); PORTD|=(1<<LIGHT4H)|(1<<LIGHT4L)|(1<<ERROR); PORTD|=(1<<PD3);// } void set_to2h() { if(MODE4H) { do { PORTB|=(1<<LEFT) ; } while (MODE2H); PORTD|=(1<<LIGHT4H);// ТУШИМ ЛАМПОЧКУ 4HI } else if(MODE4L && ~(PIND&(1<<3))) // ПРОВЕРКА УСЛОВИЯ ВКЛЮЧЕН 4ЛО И ВКЛЮЧЕН РУЧНИК(ПАРКИНГ) { do { PORTB|=(1<<LEFT) ; } while (MODE2H); PORTD|=(1<<LIGHT4L);// ТУШИМ ЛАМПОЧКУ 4LO } else { PORTD&=~(1<<ERROR) ; } } void set_to4h() { if(MODE2H) { do { PORTB|=(1<<RIGHT) ; } while (MODE4H); PORTD&=~(1<<LIGHT4H);// ЗАЖИГАЕМ ЛАМПОЧКУ 4HI } else if(MODE4L && ~(PIND&(1<<3))) // ПРОВЕРКА УСЛОВИЯ ВКЛЮЧЕН 4ЛО И ВКЛЮЧЕН РУЧНИК(ПАРКИНГ) { do { PORTB|=(1<<LEFT) ; } while (MODE4H); PORTD|=(1<<LIGHT4L);// ТУШИМ ЛАМПОЧКУ 4LO PORTD&=~(1<<LIGHT4H);// ЗАЖИГАЕМ ЛАМПОЧКУ 4HI } else { PORTD&=~(1<<ERROR) ; } } void set_to4l() { if(MODE2H && ~(PIND&(1<<3))) // проверка включен ли паркинг { do { PORTB|=(1<<RIGHT) ; } while (MODE4L); PORTD&=~(1<<LIGHT4H);// ЗАЖИГАЕМ ЛАМПОЧКУ 4LO } else if(MODE4L && ~(PIND&(1<<3))) { do { PORTB|=(1<<RIGHT) ; } while (MODE4L); PORTD|=(1<<LIGHT4H);// ТУШИМ ЛАМПОЧКУ 4H PORTD&=~(1<<LIGHT4L);// ЗАЖИГАЕМ ЛАМПОЧКУ 4L } else { PORTD&=~(1<<ERROR) ; } } void button_read() { if(~(PINB&(1<<0))) { set_to4h(); } else if(~(PINB&(1<<1))) set_to4l(); else set_to2h(); } int main(void) { port_init(); while (1) { button_read(); } } пытался вставить как код,но выдает ошибку,видимо плохой код) прошу Вас указать на критичные ошибки. это только заготовка,усложнять задержками и таймерами буду позже,пока главное отладить быдлокод на этом этапе.. спасибо за внимание. сильно не пинать,только учусь,..) Изменено 23 июля, 2019 пользователем pndbr 0 Ссылка на комментарий Поделиться на другие сайты Поделиться
Новый аккумулятор EVE серии PLM для GSM-трекеров, работающих в жёстких условиях (до -40°С)Компания EVE выпустила новый аккумулятор серии PLM, сочетающий в себе высокую безопасность, длительный срок службы, широкий температурный диапазон и высокую токоотдачу даже при отрицательной температуре. Эти аккумуляторы поддерживают заряд при температуре от -40/-20°С (сниженным значением тока), безопасны (не воспламеняются и не взрываются) при механическом повреждении (протыкание и сдавливание), устойчивы к вибрации. Они могут применяться как для автотранспорта (трекеры, маячки, сигнализация), так и для промышленных устройств мониторинга, IoT-устройств. Подробнее параметры и результаты тестов новой серии PLM по ссылке. Реклама: АО КОМПЭЛ, ИНН: 7713005406, ОГРН: 1027700032161
IMXO Опубликовано 23 июля, 2019 Поделиться Опубликовано 23 июля, 2019 КМК весь код одна большая критическая ошибка. начиная от отсутствия хотя бы элементарного подавления дребезга контактов и заканчивая вечными циклами ожидания событий, 56 minutes ago, pndbr said: сильно не пинать,только учусь,..) попробуйте почитать/посмотреть что такое "конечные автоматы" или "машина состояний" и как они реализуются . здесь в лекциях 298..305 есть не плохое введение. на ХАБРе есть пару статей по этой теме с примерами реализации. для начала реализовать ее при помощи оператора swith/case и самое наверно главное распараллелить задачи, отделить опрос кнопок от машины состояний, при этом четко понимать, что у любой кнопки не два состояния , а четыре: кнопка нажата, кнопка отжата , нажатие кнопки , отпускание кнопки. и в зависимости от состояния кнопок и состояния машины изменять состояние последней. 2 Ссылка на комментарий Поделиться на другие сайты Поделиться
Литиевые батарейки и аккумуляторы от мирового лидера EVE в КомпэлКомпания Компэл, официальный дистрибьютор EVE Energy, бренда №1 по производству химических источников тока (ХИТ) в мире, предлагает продукцию EVE как со склада, так и под заказ. Компания EVE широко известна в странах Европы, Америки и Юго-Восточной Азии уже более 20 лет. Недавно EVE была объявлена поставщиком новых аккумуляторных элементов круглого формата для электрических моделей «нового класса» компании BMW.Продукция EVE предназначена для самого широкого спектра применений – от бытового до промышленного. Подробнее>> Реклама: АО КОМПЭЛ, ИНН: 7713005406, ОГРН: 1027700032161
Yurkin2015 Опубликовано 23 июля, 2019 Поделиться Опубликовано 23 июля, 2019 #define MODE4H (~(PINB&(1<<2))&&~(PINB&(1<<3)))// проверка на минус на 23 Например, вот это MODE4H выражение и ему подобные всегда будет равно true при любых значениях PINB. Я бы проверял вот так: #define MODE4H !(PINB & (1<<2 | 1<<3)) // проверка на минус на 23 1 Ссылка на комментарий Поделиться на другие сайты Поделиться
pndbr Опубликовано 24 июля, 2019 Поделиться Опубликовано 24 июля, 2019 6 hours ago, IMXO said: КМК весь код одна большая критическая ошибка. начиная от отсутствия хотя бы элементарного подавления дребезга контактов и заканчивая вечными циклами ожидания событий, Про подавления дребезга в курсе,,но это я оставил на потом) Мне как раз нужны были советы относительно осного алгоритма,как реализовывать подобные задачи.. Спасибо за ссылки и совет и за то что рассмотрели это мракобесие) 6 hours ago, Yurkin2015 said: #define MODE4H !(PINB & (1<<2 | 1<<3)) // проверка на минус на 23 Спасибо, а то я ломал голову почему не правильно работала написанная мной конструкция) 0 Ссылка на комментарий Поделиться на другие сайты Поделиться
IMXO Опубликовано 24 июля, 2019 Поделиться Опубликовано 24 июля, 2019 15 hours ago, Yurkin2015 said: Я бы проверял вот так: не согласен с таким решением. с точки зрения оптимизации и быстродействия запись у @pndbr более правильная, единственная ошибка использована побитовая инверсия вместо логической , те должно быть #define MODE4H (!(PINB&(1<<2))&& !(PINB&(1<<3)))// проверка на минус на 23 0 Ссылка на комментарий Поделиться на другие сайты Поделиться
ART_ME Опубликовано 31 мая, 2020 Поделиться Опубликовано 31 мая, 2020 (изменено) Просьба не считать вопрос провоцирующим. Нужно сотворить программку для несложного промышленного автомата, программа очень похожа на программу для ПЛК, но написать её надо на Си. Если упрощенно, структура программы выглядит так. При запуске программы опрашивается галетник на 10 положений, и программа стартует с метки, указанным этим галетником. Программа всегда последовательно проходит все шаги начиная с указанного галетником. Т.е. если выставили 1, то будут последовательно выполнены шаги с 1 по 10, если выставили 5, то будут исполняться шаги с 5 по 10. Назад программа возвращаться не будет никогда, перескакивать через шаги или пропускать их тоже. Как то напрашивается в такой ситуации goto. но больно уж си-воды на это goto блажат. А чем заменить не пойму, ведь ни циклов, ни выбора путей в данном случае нет. Для эксперимента проверил goto, работает без замечаний. Изменено 31 мая, 2020 пользователем ART_ME 0 Никогда не спорьте с дураками. Они опустят Вас до своего уровня и победят за счет опыта. Ссылка на комментарий Поделиться на другие сайты Поделиться
optima Опубликовано 31 мая, 2020 Поделиться Опубликовано 31 мая, 2020 Попробуй кейс (case) 0 Сергей. Ссылка на комментарий Поделиться на другие сайты Поделиться
mail_robot Опубликовано 31 мая, 2020 Поделиться Опубликовано 31 мая, 2020 применение goto оправданно только в одном случае - в случае недостаточного знания языка 0 Нужно делать то, что нужно. А то, что не нужно, делать не нужно. (С) Винни Пух Ссылка на комментарий Поделиться на другие сайты Поделиться
ARV Опубликовано 31 мая, 2020 Поделиться Опубликовано 31 мая, 2020 5 минут назад, mail_robot сказал: применение goto оправданно только в одном случае Не начинайте холивар, вы не правы. Применение любой возможности языка обусловлено исключительно практическим смыслом. 0 Если забанить всех, кто набрался смелости думать независимо, здорово будет на форуме - как на кладбище: тишина, птички поют... Ссылка на комментарий Поделиться на другие сайты Поделиться
ART_ME Опубликовано 31 мая, 2020 Поделиться Опубликовано 31 мая, 2020 (изменено) 43 минуты назад, optima сказал: Попробуй кейс Типа удалить из этого все break? Оно будет без break работать? 40 минут назад, mail_robot сказал: goto оправданно только в одном случае - в случае недостаточного знания языка А вот этого флуда никак нельзя было обойтись? Не удержался? Изменено 31 мая, 2020 пользователем ART_ME 0 Никогда не спорьте с дураками. Они опустят Вас до своего уровня и победят за счет опыта. Ссылка на комментарий Поделиться на другие сайты Поделиться
optima Опубликовано 31 мая, 2020 Поделиться Опубликовано 31 мая, 2020 Вроде будет, если блок операций указывает на выход к примеру в другую процедуру. Но лучше оставить! 0 Сергей. Ссылка на комментарий Поделиться на другие сайты Поделиться
ART_ME Опубликовано 31 мая, 2020 Поделиться Опубликовано 31 мая, 2020 (изменено) 18 минут назад, optima сказал: ... будет, если блок операций указывает на выход к примеру в другую процедуру. Блок не указывает на выход ни в другую процедуру, ни вообще куда либо. Потому как выходить не надо. Наверное проще объяснить это применением goto. If (var == 1) goto label 1; if (var == 2) goto label 2; .... if (var == 10) goto label 10; label 1: { ; } label 2: { ; } .... label 10: { ; } Изменено 31 мая, 2020 пользователем ART_ME 0 Никогда не спорьте с дураками. Они опустят Вас до своего уровня и победят за счет опыта. Ссылка на комментарий Поделиться на другие сайты Поделиться
optima Опубликовано 31 мая, 2020 Поделиться Опубликовано 31 мая, 2020 но после выполнения к примеру label 1: куда далее пойдет программа? 0 Сергей. Ссылка на комментарий Поделиться на другие сайты Поделиться
ART_ME Опубликовано 31 мая, 2020 Поделиться Опубликовано 31 мая, 2020 (изменено) 1 минуту назад, optima сказал: но после выполнения к примеру label 1: куда далее пойдет на label 2: А после исполнения тела по label2: на label 3:, и так до label 10: Изменено 31 мая, 2020 пользователем ART_ME 0 Никогда не спорьте с дураками. Они опустят Вас до своего уровня и победят за счет опыта. Ссылка на комментарий Поделиться на другие сайты Поделиться
optima Опубликовано 31 мая, 2020 Поделиться Опубликовано 31 мая, 2020 Если так? switch(значение выключателя) case 01: label 1 (); break; case 02: label 2 (); break; case 03: label 3 (); break; case 04: label 4 (); break; case 05: label 1 (); label 2 (); label 3 (); label 4 (); break; ................ Оператор goto Кроме goto, в языке С есть другие операторы управления (например break, continue), поэтому необходимости в применении goto практически нет. В результате чрезмерного использования операторов goto программа плохо читается, она становится "похожей на спагетти". Чаще всего такими программами недовольна администрация фирм, производящих программный продукт. То есть оператор goto весьма непопулярен, более того, считается, что в программировании не существует ситуаций, в которых нельзя обойтись без оператора goto. Но в некоторых случаях его применение все же уместно. Иногда, при умелом использовании, этот оператор может оказаться весьма полезным, например, если нужно покинуть глубоко вложенные циклы 0 Сергей. Ссылка на комментарий Поделиться на другие сайты Поделиться
hasl Опубликовано 31 мая, 2020 Поделиться Опубликовано 31 мая, 2020 (изменено) это вопрос для пеcочницы switch (stage) { case: 0: stage++; break; case 1 stage++;: break; } можно переходить с любой стадии на любой switch (stage) { case: 0: case 1 case 2 } а можно так. Какой stage будет в начале с той и начнет дальше выполнятся все остальные последовательно Читайте основы Си Изменено 31 мая, 2020 пользователем hasl 0 Ссылка на комментарий Поделиться на другие сайты Поделиться
optima Опубликовано 31 мая, 2020 Поделиться Опубликовано 31 мая, 2020 Точно, даже не задумался что значение можно увеличить! switch(stage) { case 01: label 1 (); stage++; case 02: label 2 (); stage++; case 03: label 3 (); stage++; case 04: label 4 (); stage++; case 05: label 5 (); break; } 1 Сергей. Ссылка на комментарий Поделиться на другие сайты Поделиться
ART_ME Опубликовано 31 мая, 2020 Поделиться Опубликовано 31 мая, 2020 Первый вариант понятен, но выглядит громоздким. А во втором очепятки нет? 3 минуты назад, optima сказал: Точно, даже не задумался Я правильно понял, что тут придется всю программу на процедуры разбивать? 0 Никогда не спорьте с дураками. Они опустят Вас до своего уровня и победят за счет опыта. Ссылка на комментарий Поделиться на другие сайты Поделиться
ARV Опубликовано 31 мая, 2020 Поделиться Опубликовано 31 мая, 2020 Хоть я и не хотел в эту тему встряваь, но, поскольку тут стали всякую чушь писать, все-таки вступлю. switch(galetnik){ case 0 : // здесь сколько угодно действий 0-го этапа // break НЕ НУЖЕН! case 1 : // здесь сколько угодно действий 1-го этапа // break НЕ НУЖЕН! case 2 : // здесь сколько угодно действий 2-го этапа // break НЕ НУЖЕН! case 3 : // здесь сколько угодно действий 3-го этапа // break НЕ НУЖЕН! case 4 : // здесь сколько угодно действий 4-го этапа // break НЕ НУЖЕН! case 5 : // здесь сколько угодно действий 5-го этапа // break НЕ НУЖЕН! case 6 : // здесь сколько угодно действий 6-го этапа // break НЕ НУЖЕН! case 7 : // здесь сколько угодно действий 7-го этапа // break НЕ НУЖЕН! case 8 : // здесь сколько угодно действий 8-го этапа // break НЕ НУЖЕН! case 9 : // здесь сколько угодно действий 9-го этапа // break НЕ НУЖЕН! } 1 Если забанить всех, кто набрался смелости думать независимо, здорово будет на форуме - как на кладбище: тишина, птички поют... Ссылка на комментарий Поделиться на другие сайты Поделиться
optima Опубликовано 31 мая, 2020 Поделиться Опубликовано 31 мая, 2020 Действий можешь указать сколько угодно, если нужно делать их по порядку тогда в кейсе нужно galetnik++, и не вписывать break, тогда все кейсы будут выполнятся по порядку, но если инкремента не достаточно тогда galetnik нужно присвоить конкретное значение, зависит от значения galetnik break прописать только в последней строчке. То есть если твой переключатель в позиции 5, то и кейсы будут выполнятся с 5 по 9 к примеру 1 Сергей. Ссылка на комментарий Поделиться на другие сайты Поделиться
ART_ME Опубликовано 31 мая, 2020 Поделиться Опубликовано 31 мая, 2020 (изменено) Собственно по порядку-то и не нужно, т.к. технологически эти операции друг от друга независимы. Тогда получается, что сначала описываем все 10 процедур, а в программе указываем только порядок их исполнения, пользуясь для обеспечения последовательного их выполнения инкрементом galetnik. ИМХО должно выглядеть неплохо. Спасибо, буду пробовать этот вариант. Изменено 31 мая, 2020 пользователем ART_ME 0 Никогда не спорьте с дураками. Они опустят Вас до своего уровня и победят за счет опыта. Ссылка на комментарий Поделиться на другие сайты Поделиться
ARV Опубликовано 31 мая, 2020 Поделиться Опубликовано 31 мая, 2020 (изменено) 2 часа назад, optima сказал: кейсе нужно galetnik++, и не вписывать break, тогда все кейсы будут выполнятся по порядку, Для выполнения кейсов последовательно достаточно не ставить брейки, инкремент не требуется. Да и не будет инкремент без цикла работать. А для выборочного выполнения кейсов по одному, как нужно при инкременте, брейки как раз обязательны. 2 часа назад, optima сказал: break прописать только в последней строчке А это ещё нафига? Нафига огород, если мой вариант выполняет все требуемое: выполняет шаги от galetnik и до последнего?! Изменено 31 мая, 2020 пользователем ARV 0 Если забанить всех, кто набрался смелости думать независимо, здорово будет на форуме - как на кладбище: тишина, птички поют... Ссылка на комментарий Поделиться на другие сайты Поделиться
Рекомендуемые сообщения
Присоединяйтесь к обсуждению
Вы публикуете как гость. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.
Примечание: Ваш пост будет проверен модератором, прежде чем станет видимым.