ввести логическую переменную и в нее считать данные с порта и потом уже с ней работать
И мы опять получим неявное преобразование типов из байта в булевскую величину (не пишу в бит, т.к. не уверен что там именно бит).
нет, будет сравнивать bool с bool, или возможно сравнивать char c char (но преобразует данные правильно)
(заодно уберется двойное считывание порта),
А где у меня двойное считывание?
#define V_SENS (PINB&(1<<PINB6))
Это макрос чтения из порта, первый раз в условии, а второй раз когда сохраняет в переменную - смотри
листинг 2 команды чтения
in r**,p03или так
- Код:
if ((bool)V_SENS != _VSensLS) {
это более логично, т.к. проблема в том что с порта читается байт, и его нужно преобразовать к 0 или 1
или если мне не изменяет память = может прокатить так
- Код:
if (!(V_SENS) == _VSensLS)
Опять же неясно, как на это посмотрит компилятор и оптимизирует
Тут 2 выхода я вижу:
1. объявить локальную логическую (bool) переменную и в нее считать с порта и с ней работать:
- Код:
bool sVRS = 0;
if (PINB.6) sVRS = 1;
if (sVRS != _VSensLS) {
_VSensLS = sVRS;
switch (VSMode) {
***
}
2. считать байт с порта, сделать маску (AND (1<<(6 или 0))) и далее ее сохранять и проверять
Главное: компилятор char преобразовывает к int - как вот это ненужное преобразование убрать
т.е. выше видно что 0 сравнивает с 0, да еще и загрузка в разные регистры, кароч бестолковый мусор кода
Последний раз редактировалось
alcxa Пт июл 16, 2021 18:25:33, всего редактировалось 2 раз(а).