Форум программистов, компьютерный форум, киберфорум
Наши страницы
Микроконтроллеры Atmega AVR
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.52/27: Рейтинг темы: голосов - 27, средняя оценка - 4.52
srossyxx
0 / 0 / 0
Регистрация: 02.04.2016
Сообщений: 17
1

Как правильно составить условие

06.04.2016, 09:06. Просмотров 4883. Ответов 17
Метки нет (Все метки)

При моделировании в Proteus не отключается PORTB.2. Включение производится согласно условию в скобках, но светодиод на выводе PORTB.2 продолжает гореть. Вот код с CVAVR:

while (1)
{
PORTB.2=(PIND.4==0&&PIND.5==0 || PIND.5==1&&PIND.4==0 || PIND.5==0&&PIND.4==1);
};}

Не работает даже при сокращении выражения в скобках.

PORTB.4=(PIND.0==0&&PIND.1==0&&PIND.2==0&&PIND.3==0 || PIND.5==0); - а вот так работает, но мне нужно реализовать то. Нужно, чтобы срабатывал PORTB.2 только при одном активном входе: или PIND.5 или PIND.4.
0
QA
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
06.04.2016, 09:06
Ответы с готовыми решениями:

Как правильно составить функциональную схему?
День добрый! Как новичку объясните пожалуйста, как верно составить функциональную схему подключения...

Как правильно составить условие if
У меня в текстовом документе находится 200 чисел по порядку от 1 до 200 При создании формы я...

Как правильно составить условие?
procedure TForm21.Button2Click(Sender: TObject); begin if Edit1.Text='М'; Edit2.Text='У';...

Как правильно составить двойное условие?
всем доброго времени суток! начал изучать ассемблер, есть пример c определением четверти (x и y не...

Как правильно составить условие для изменения?
Есть две константы K1 и K2 и переменная M. Как проверить , если например значение n...

17
Финский
0 / 0 / 0
Регистрация: 11.12.2011
Сообщений: 789
06.04.2016, 09:17 2
PORTB.2=((PIND.4==0&&PIND.5==0) || (PIND.5==1&&PIND.4==0) || (PIND.5==0&&PIND.4==1));

так попробуйте
или так
Код
if ((PIND.4 && !PIND.5) || (PIND.5 && !PIND.4))
{
PORTB.2 = 1;
}
else
{
PORTB.2 = 0;
}
0
srossyxx
0 / 0 / 0
Регистрация: 02.04.2016
Сообщений: 17
06.04.2016, 09:39 3
Цитата Сообщение от Финский
PORTB.2=((PIND.4==0&&PIND.5==0) || (PIND.5==1&&PIND.4==0) || (PIND.5==0&&PIND.4==1));

так попробуйте
или так
Код:
if ((PIND.4 && !PIND.5) || (PIND.5 && !PIND.4))
{
PORTB.2 = 1;
}
else
{
PORTB.2 = 0;
}

то же самое... Косяк в Протеусе? Не работает даже вот так:

while (1)
{
PORTB.2=(PIND.4==0&&PIND.5==0);
};}

Включается норм при зажатых 4 и 5, но потом никаких реакций вообще. Светодиод остается гореть.
0
Bytt
0 / 0 / 0
Регистрация: 22.08.2009
Сообщений: 525
06.04.2016, 09:39 4
Цитата Сообщение от Финский
PORTB.2=((PIND.4==0&&PIND.5==0) || (PIND.5==1&&PIND.4==0) || (PIND.5==0&&PIND.4==1));

так попробуйте
или так
Код:
if ((PIND.4 && !PIND.5) || (PIND.5 && !PIND.4))
{
PORTB.2 = 1;
}
else
{
PORTB.2 = 0;
}
Интересно, а что получится, если просто
Код
if (PIND.4 ^ PIND.5)
PORTB.2 = 1;
else
PORTB.2 = 0;
0
06.04.2016, 09:39
Bytt
0 / 0 / 0
Регистрация: 22.08.2009
Сообщений: 525
06.04.2016, 09:41 5
Цитата Сообщение от srossyxx
Косяк в Протеусе?

Включается норм при зажатых 4 и 5, но потом никаких реакций вообще. Светодиод остается гореть.
Может для начала схему показать?
0
Финский
0 / 0 / 0
Регистрация: 11.12.2011
Сообщений: 789
06.04.2016, 09:53 6
Код
DDRB |= 1<<DDRB2;
PORTD |= 1<<4|1<<5;

while(1)
{
if (((PIND & 1<<PIND4) && !(PIND & 1<<PIND5)) || (!(PIND & 1<<PIND4) && (PIND & 1<<PIND5)))
{
PORTB |= 1<<PORTB2;
}
else
{
PORTB &= ~(1<<PORTB2);
}
}
работает в протеусе






Нужно, чтобы срабатывал PORTB.2 только при одном активном входе: или PIND.5 или PIND.4.
Срабатывал - это выдавал "1" или "0"? Активный уровень на входе - высокий или низкий?
0
yiv91
0 / 0 / 0
Регистрация: 31.01.2013
Сообщений: 1,625
06.04.2016, 10:02 7
Программирование методом тыка - это и есть эволюционные алгоритмы, о которых я упоминал ранее. Позволяет найти решения, которые невозможно найти никакими другими методами.
0
Bytt
0 / 0 / 0
Регистрация: 22.08.2009
Сообщений: 525
06.04.2016, 10:09 8
Цитата Сообщение от yiv91
Программирование методом тыка - это и есть эволюционные алгоритмы, о которых я упоминал ранее. Позволяет найти решения, которые невозможно найти никакими другими методами.
В данном случае не нужно ничего "тыкать". Нужно просто знать.
0
dimyurk1978
0 / 0 / 0
Регистрация: 07.02.2106
Сообщений: 3,047
06.04.2016, 10:36 9
Код
//========================================================================
#define set_bit(reg, bit)  reg |= (1<<(bit))    // Onoaiiaea aeoa.
#define clr_bit(reg, bit)   reg &= (~(1<<(bit))) // Na?in aeoa.
#define switch_bit(reg, bit)  reg ^= (1<<(bit)) // Ia?aee??aiea aeoa.
//------------------------------------------------------------------------
#define check_bit(reg, bit) (reg & (1<<bit))    // I?iaa?ea aeoa.
//========================================================================

if (PIND & (1<<4) == 0 || PIND & (1<<5) == 0) // 0b00110000
set_bit (PORTB, 2);
else
clr_bit (PORTB, 2);
В протеусе на входы повесьте резисторы. Один контакт на вход (кнопка), второй на плюс. Это называется подтяжка входов.
0
srossyxx
0 / 0 / 0
Регистрация: 02.04.2016
Сообщений: 17
06.04.2016, 12:51 10
Цитата Сообщение от Bytt
Цитата Сообщение от Финский
PORTB.2=((PIND.4==0&&PIND.5==0) || (PIND.5==1&&PIND.4==0) || (PIND.5==0&&PIND.4==1));

так попробуйте
или так
Код:
if ((PIND.4 && !PIND.5) || (PIND.5 && !PIND.4))
{
PORTB.2 = 1;
}
else
{
PORTB.2 = 0;
}
Интересно, а что получится, если просто
Код
if (PIND.4 ^ PIND.5)
PORTB.2 = 1;
else
PORTB.2 = 0;
не выходит
0
srossyxx
0 / 0 / 0
Регистрация: 02.04.2016
Сообщений: 17
06.04.2016, 12:53 11
Цитата Сообщение от Финский
Код:
DDRB |= 1<<DDRB2;
PORTD |= 1<<4|1<<5;

while(1)
{
if (((PIND & 1<<PIND4) && !(PIND & 1<<PIND5)) || (!(PIND & 1<<PIND4) && (PIND & 1<<PIND5)))
{
PORTB |= 1<<PORTB2;
}
else
{
PORTB &= ~(1<<PORTB2);
}
}работает в протеусе
2016-04-07_08-38-00.png2016-04-07_08-38-19.png2016-04-07_08-38-39.png

Нужно, чтобы срабатывал PORTB.2 только при одном активном входе: или PIND.5 или PIND.4.
Срабатывал - это выдавал "1" или "0"? Активный уровень на входе - высокий или низкий?
Тоже не работает. Активный уровень на входе - 0. На выходе активный - 1.
0
srossyxx
0 / 0 / 0
Регистрация: 02.04.2016
Сообщений: 17
06.04.2016, 12:55 12
Цитата Сообщение от Bytt
Цитата Сообщение от srossyxx
Косяк в Протеусе?

Включается норм при зажатых 4 и 5, но потом никаких реакций вообще. Светодиод остается гореть.
Может для начала схему показать?
После всех советов светодиод не гаснет, я в тупике. Вот схема

0
dimyurk1978
0 / 0 / 0
Регистрация: 07.02.2106
Сообщений: 3,047
06.04.2016, 13:10 13
Выше поправил пример. Пробуйте.
0
srossyxx
0 / 0 / 0
Регистрация: 02.04.2016
Сообщений: 17
06.04.2016, 17:17 14
Цитата Сообщение от dymyurk1978
Выше поправил пример. Пробуйте.
не работает... то ли лыжи не едут, то ли я тупой.
Код
void main(void)
{

PORTB=0x00000000;     //«0» -(напряжение равное GND) «1» -(напряжение равное Vcc)
DDRB=0x11111111;      //«0» - разряды порта на режим "Вход" «1» - разряды порта на режим "Выход"

PORTD=0x01111111;     //«0» -(напряжение равное GND) «1» -(напряжение равное Vcc)
DDRD=0x00000000;      //«0» - разряды порта на режим "Вход" «1» - разряды порта на режим "Выход"

//========================================================================
#define set_bit(reg, bit)  reg |= (1<<(bit))    // Onoaiiaea aeoa.
#define clr_bit(reg, bit)   reg &= (~(1<<(bit))) // Na?in aeoa.
#define switch_bit(reg, bit)  reg ^= (1<<(bit)) // Ia?aee??aiea aeoa.
//------------------------------------------------------------------------
#define check_bit(reg, bit) (reg & (1<<bit))    // I?iaa?ea aeoa.
//========================================================================

if (PIND & (1<<4) == 0 || PIND & (1<<5) == 0) // 0b00110000
set_bit (PORTB, 2);
else
clr_bit (PORTB, 2);
}
вот так ведь? но зачем эта подтяжка, если я внешними резисторами подтянул?

Выкладывать код нужно с использованием тэгов [code].
0
Bytt
0 / 0 / 0
Регистрация: 22.08.2009
Сообщений: 525
06.04.2016, 17:42 15
Цитата Сообщение от srossyxx
не работает... то ли лыжи не едут, то ли я тупой.

if (PIND & (1<<4) == 0 || PIND & (1<<5) == 0) // 0b00110000
set_bit (PORTB, 2);
else
clr_bit (PORTB, 2);
Приоритеты операций не учтены, потому и не работает. Скобки в условии правильно расставьте.
0
srossyxx
0 / 0 / 0
Регистрация: 02.04.2016
Сообщений: 17
06.04.2016, 18:03 16
Цитата Сообщение от Bytt
Цитата Сообщение от srossyxx
не работает... то ли лыжи не едут, то ли я тупой.

if (PIND & (1<<4) == 0 || PIND & (1<<5) == 0) // 0b00110000
set_bit (PORTB, 2);
else
clr_bit (PORTB, 2);
Приоритеты операций не учтены, потому и не работает. Скобки в условии правильно расставьте.
Это с блокнота так скопировалось ровно.
0
srossyxx
0 / 0 / 0
Регистрация: 02.04.2016
Сообщений: 17
06.04.2016, 18:11 17
Вот тут работает отлично, почему в основной не фурычит - хз. Вот так и доверяй протеусу, что ему не нравится?
Код
#include <tiny2313.h>

void main(void)
{

PORTB=0x00000000;     //«0» -(напряжение равное GND) «1» -(напряжение равное Vcc)
DDRB=0x00000100;      //«0» - разряды порта на режим "Вход" «1» - разряды порта на режим "Выход"

PORTD=0x00110000;     //«0» -(напряжение равное GND) «1» -(напряжение равное Vcc)
DDRD=0x00000000;      //«0» - разряды порта на режим "Вход" «1» - разряды порта на режим "Выход"

while (1)
{
PORTB.2=(PIND.4==0&&PIND.5==0 || PIND.5==1&&PIND.4==0 || PIND.5==0&&PIND.4==1);
};
}
0
dimyurk1978
0 / 0 / 0
Регистрация: 07.02.2106
Сообщений: 3,047
06.04.2016, 20:27 18
Зачем такая сложная конструкция? Сейчас у вас правильная схема для проверки. Попробуйте теперь мой пример.
0
06.04.2016, 20:27
Answers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
06.04.2016, 20:27

Как правильно составить условие для цикла
Вылетает ошибка---Fatal error: Maximum execution time of 180 seconds exceeded in...

Как правильно составить условие для цикла?
Здравствуйте, есть такой код: TIniFile *ini = new TIniFile(&quot;.\\Database Settings.ini&quot;); for...

Правильно составить условие if then
Привет! Помогите задать значение для then ,то есть я хочу когда пишешь (-) оно отнимало если (+)...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
18
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2019, vBulletin Solutions, Inc.