Страница 1 из 1

Как устранить инверсию в коде(метод?)

Добавлено: Пн янв 27, 2020 20:54:08
shrus43
if (PINB.0==1){PORTC.0=1;}
if (PINB.0==0){PORTC.0=0;}//или else {PORTC.0=0;}
if ((PIND.1==1)&&(PINB.0==1)){PORTC.0=0;}

пин В0 кнопка,пин С0 светодиод,а пин D1 датчик,когда датчик срабатывает при нажатой кнопке должен погаснуть светодиод,с таким кодом получается карнавал в протеусе(мигалка и загрузка CPU по полной)что естественно при данном коде,пробовал всяко if else if else,не получается,а надо что бы светодиод погас на секунду при включенном датчике и кнопке и снова заработал через секунду при нажатой кнопке,вообще по задумке таких кнопок и светодиодов четыре,типо пульта для кранбалки,ток позиционирование на одном датчике,подскажите ребят,как можно реализовать такое.Как я понял надо что бы программа стопорнулась или сделала паузу при включенной кнопке и датчике и через секунду возобновила свою работу или произошло аннулирование вот этой строчки if (PINB.0==1){PORTC.0=1;}

Re: Как устранить инверсию в коде(метод?)

Добавлено: Вт янв 28, 2020 03:32:21
VALNER
У Вас логически не верно составлена программа.

Код: Выделить всё

if (PINB.0==1){PORTC.0=1;}
if (PINB.0==0){PORTC.0=0;}//или else {PORTC.0=0;}
if ((PIND.1==1)&&(PINB.0==1)){PORTC.0=0;}
Вот смотрите.
Кнопка нажата, согласно первой строчке PORTC.0=1 и сразу же согласно второй строчке PORTC.0=0 так как условие if (PINB.0==0) не
будет истинным и выполнится часть с else блока. Из-за этого и мигалка. После выполнится проверка с третьей строчки и обратно же
на выходе порта будет 0.

Согласно заданию программа будет выглядеть приблизительно так.

Код: Выделить всё

while(1) //Бесконечный цикл (Не обьязательно должно быть так)
{
    if ((PIND.1==1)&&(PINB.0==1)) //Условие 1: нажатая кнопка и сработка датчика
    {
        PORTC.0=0;
        _delay_ms(1000); //Задержка в 1с (Справедливо для атмел студии)
    }
    else if (PINB.0==1) //Условие 2: Выполняется только тогда, когда Условие 1 не выполняется (только нажатая кнопка)
    {
        PORTC.0=1;
    }
    else //Условие 3: Выполняется только тогда, когда Условия 1 и 2 не выполнились. (кнопка не нажатая)
    {
        PORTC.0=0;
    }
}
Даная программа ужасно не оптимальна с точки зрения использования машинного времени ЦП, но алгоритм работы примерно такой.
И учтите то, что протеус не моделирует в реальном времени.

Re: Как устранить инверсию в коде(метод?)

Добавлено: Вт янв 28, 2020 05:12:02
shrus43
Огромное спасибо,буду пробывать,объясните пожалуйсто,как понимать,не моделирует в реальном времени?

Re: Как устранить инверсию в коде(метод?)

Добавлено: Вт янв 28, 2020 05:28:04
Ivanoff-iv
не усппвает...
поэтому задержки нужно смотреть не на своих часах, а на часах протеуса - в нижней его строке

Re: Как устранить инверсию в коде(метод?)

Добавлено: Ср янв 29, 2020 09:59:05
Demiurg
Мда-с, с такой подготовкой замахиваться на кран балку… это самоубийство. Как исполнителя, так и заказчика.
Дребезг контактов знаем что это такое? Организация программных модулей. Программные таймеры. Конечные автоматы.

Re: Как устранить инверсию в коде(метод?)

Добавлено: Ср янв 29, 2020 18:14:54
shrus43
Для себя делаю,не волнуйтесь,дребезг и таймеры примерно знаем что такое)а вот про программные модули расскажите пожалуйста,походу здесь надо что-то подобное реализовывать,потому что,вышеуказанный код меня опять в тупик привел,хоть и рабочий,потому что при запуске программы допустим,если уже кран балка(светодиод включен) стоит на позиции(сработка датчика)то кнопка не работает,а надо чтоб при нажатий кнопки повторно или просто при нажатий на позиции она поехала(светодиод загорелся)даже если на позиции,тобишь то условие с датчиком анулировалось и опять по новой все,по задумке-это тупо кран балка,у которой есть позиции,на ней установлен без контактный датчик,а на позициях флажки металлические(позиции)добавлял дополнительные условия if else,либо не работает все совсем либо опять карнавал с миганием,пробовал с таймерами всякие махинации(типо впихнуть в условие задержку),ну что-то не получилось,я уж сам запутался во всем этом

Re: Как устранить инверсию в коде(метод?)

Добавлено: Ср янв 29, 2020 19:53:09
Самсусамыч
Ну что за партизанщина… может стоит уже описать подробно весь алгоритм, что в итоге желаешь получить… как это должно работать? :) А то ведь все экстрасенсы заняты… :lol: или интересны пляски с бубном? :dont_know:

Re: Как устранить инверсию в коде(метод?)

Добавлено: Ср янв 29, 2020 19:56:53
Demiurg
Вы замахнулись на сложный проект, на самом деле. Предлагаю отказаться от него. И, если вы хотите дальше продолжать, начать с простых проектов. Купить книги по архитектуре AVR, воспользоваться обучалками на сайтах. Например, easyelectronics.ru, chipenable.ru.
Что такое программный модуль.
Программные таймеры. Вариант 1, вариант 2, моя реализация.
Грубое приблизительное объяснение, что такое конечный автомат.
Как видите, вы зря взялись сейчас за этот проект. Для вас на данном этапе это сложно. Вам нужно переварить целые пласты информации, теории и практики.
Мое предложение такое - купите бумажные книги по архитектуре МК AVR. С примерами. Запаситесь терпением и поэтапно осваивайте азы.

Re: Как устранить инверсию в коде(метод?)

Добавлено: Ср янв 29, 2020 21:59:02
Dimon456
А мне одно не понятно, кран-балка, 4-6 кнопок, 2-3 реверсивных пускателя, датчик, куда тут контроллер запихать и для чего?

Re: Как устранить инверсию в коде(метод?)

Добавлено: Чт янв 30, 2020 06:40:43
shrus43
[uquote="Самсусамыч",url="/forum/viewtopic.php?p=3781972#p3781972"]Ну что за партизанщина… может стоит уже описать подробно весь алгоритм, что в итоге желаешь получить… как это должно работать? :) А то ведь все экстрасенсы заняты… :lol: или интересны пляски с бубном? :dont_know:[/uquote]
Ак принцип как у кранбалки,тока у нее есть позиции

Re: Как устранить инверсию в коде(метод?)

Добавлено: Чт янв 30, 2020 08:15:15
Ivanoff-iv
всёравно не понятно... 4 канала (независимых друг от друга?)
у каждого канала есть кнопка "К", датчик "Д", таймер "Т" и выход "О"
алгоритм:
1) если (Д(0->1)) Т=1сек //в момент прихода сигнала с датчика (при нарастающем фронте) таймер включается на одну секунду
2) О = (К==1) и (Т==0) //на выходе 1 если нажата кнопка и выключен таймер
я правильно понял алгоритм?

Re: Как устранить инверсию в коде(метод?)

Добавлено: Чт янв 30, 2020 08:36:22
Самсусамыч
[uquote="shrus43",url="/forum/viewtopic.php?p=3782117#p3782117"]Ак принцип как у кранбалки[/uquote]
Не хочешь, как хочешь… не сильно и хотелось. :tea:

Re: Как устранить инверсию в коде(метод?)

Добавлено: Чт янв 30, 2020 14:15:17
Dimon456
Давайте попробуем погадать...
Имеем кран-балку, 2 кнопки, реверсивный пускатель и 1 датчик - геркон, а на самой балке кучу магнитов прилепим.

Нужен код управления реверсивным пускателем, если отбросить конечные автоматы антидребезг программные таймеры и тп, то получится что-то вроде этого
Спойлер

Код: Выделить всё

			   if (BitIsClear(PINB, 0) && !blokirovka) {
					motorA_B_on; blokirovka = true;	// питание A-B
				} 

				if (BitIsClear(PINB, 1) && !blokirovka) {
					motorB_A_on; blokirovka = true;	// питание B-A
				} 

			if (BitIsSet(PINB, 0) && BitIsSet(PINB, 1)) {
				motor_AB_off;  blokirovka = false; 
			}		
Далее датчик, при срабатывании датчика мы должны остановить "систему"
Спойлер

Код: Выделить всё

				if (BitIsClear(PINB, 4)) {			// датчик
				motor_AB_off;
				} 
но это не все
shrus43 писал(а):если уже кран балка(светодиод включен) стоит на позиции(сработка датчика)то кнопка не работает,а надо чтоб при нажатий кнопки повторно или просто при нажатий на позиции она поехала(светодиод загорелся)даже если на позиции,тобишь то условие с датчиком анулировалось и опять по новой все
значит мы должны игнорировать состояние этого датчика пока находимся в зоне действия (сработки датчика)
Спойлер

Код: Выделить всё

			if (!state) {	// игнорировать датчик
				if (BitIsClear(PINB, 4)) {			// датчик
				state = true;
				motor_AB_off;
				} 
			}

			if (BitIsSet(PINB, 4)) {			// обнуление датчик
				state = false;
			}
shrus43, все? или еще что?
Если все, то заставьте идеально этот код работать хотя бы в протеусе, а уж потом обвешивайте его конечными автоматами антидребезгом программными таймерами и тп.

Re: Как устранить инверсию в коде(метод?)

Добавлено: Чт янв 30, 2020 16:05:43
shrus43
[uquote="Самсусамыч",url="/forum/viewtopic.php?p=3782138#p3782138"][uquote="shrus43",url="/forum/viewtopic.php?p=3782117#p3782117"]Ак принцип как у кранбалки[/uquote]
Не хочешь, как хочешь… не сильно и хотелось. :tea:[/uquote]
)кранбалка с четырымя кнопками на пульте (вверх,вниз,в лево,в право),на ней находится без контактный датчик,который реагирует когда она ездить продольно(в лево,в право)позиции в виде металлических флажков находятся на раме,кран балка допустим поехала в лево и наткнувшись датчиком на флажок позиции,должна остановится на секунду и при нажатой или же при повторном нажатий кнопки,поехать дальше при чем,имела возможность поехать как в лево так и в право,как то так,надо было с самого начало описать все для себя),а то как то все проще казалось(

Добавлено after 2 minutes 8 seconds:
Dimon456,спасибо,код мне не очень понятен,но буду пробовать и изучать

Re: Как устранить инверсию в коде(метод?)

Добавлено: Чт янв 30, 2020 17:36:00
Demiurg
Отписался от темы. Здесь все ясно. ТС-у желаю поштудировать уголовный кодекс... Ответственность и все такое...

Re: Как устранить инверсию в коде(метод?)

Добавлено: Пт янв 31, 2020 02:41:59
shrus43
Вас смущает,что датчик один,который на кранбалке,а допустим не несколько именно на позициях?

Re: Как устранить инверсию в коде(метод?)

Добавлено: Пт янв 31, 2020 04:50:09
Ivanoff-iv
товарисч жгуче не желает иметь возможности делить с вами соседние шконки в случае если этот модифицированный механизм причинит кому нибудь материальный или не дай Бог физиологический ущерб... или просто станет объектом достаточно тщательной проверки (даже этого запросто может оказаться достаточно)

Re: Как устранить инверсию в коде(метод?)

Добавлено: Сб фев 01, 2020 04:04:49
shrus43
шума много ребят,все для себя,ни какой коммерции и тд,давайте тему закроем,все опять таки сводится к тому,что мне надо самому все изучить конкретно и сделать,жаль что,времени мало имеется для одного из моих любимых хобби

Re: Как устранить инверсию в коде(метод?)

Добавлено: Сб фев 01, 2020 10:30:08
Самсусамыч
[uquote="shrus43",url="/forum/viewtopic.php?p=3782322#p3782322"]надо было с самого начало описать все для себя),а то как то все проще казалось([/uquote]
Вот об этом то и речь. У тебя не определено, какие кнопки будут использоваться (НО или НЗ)? Что представляет из себя датчик? Его контакты в каком состоянии (НО или НЗ)? Как составлять алгоритм не зная нюансов? Вот пишешь: «и наткнувшись на флажок позиции, должна остановится на секунду и при нажатой, или же при повторно нажатой кнопки, поехать дальше…» Контакты датчика при переходе через флажок какое состояние будут иметь? В общим я показал вопросы, которые необходимо описывать при каждом конкретном моменте и только при таком раскладе алгоритм получается наиболее работоспособным и правильным. Ещё один момент в плане безопасности: убрать из алгоритма вот этот момент – «и наткнувшись на флажок позиции, должна остановится на секунду и при нажатой, поехать дальше». Оставив лишь повторное нажатие.
все опять таки сводится к тому,что мне надо самому все изучить конкретно
Кто же виноват, что нет от тебя подробностей…? :dont_know: Претензии предъявляй только себе любимому, так как требуя помощи по типу: «сходи туда - не зная куда, принеси то - не зная что», не возможно её получить.

Re: Как устранить инверсию в коде(метод?)

Добавлено: Сб фев 01, 2020 12:27:25
Ivanoff-iv
ну почему? можно ответить на Русском: (примерно так)
зауодим таймер, чтоб тикал с требумой частотой...
если кнопка нажата включаем мотор...
и т.д. т.е. столько же конкретики сколько е в вопросе
а там уж сам пусть расписывает нажата кнопка это пина.3==1 или пинб.1==0...
а так, да, ты прав, надоело партизанам помогать, не война же :)

Добавлено after 1 hour 36 minutes 20 seconds:
хотя, может точных сведений у ТСа и у самого нет...
и его какраз устроит ответ общего плана...