С Новым годом! Форум программистов, компьютерный форум, киберфорум
Микроконтроллеры ATmega AVR
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.75/4: Рейтинг темы: голосов - 4, средняя оценка - 4.75
2 / 2 / 2
Регистрация: 05.09.2018
Сообщений: 173
1

Чтение состояния портов

09.11.2023, 12:12. Показов 643. Ответов 9

Author24 — интернет-сервис помощи студентам
Всем привет!
Встал в ступор с достаточно простой задачкой.
Контроллер Atmega32, работаю в Atmel Studio.
На портах PA0-PA5 кнопки, подтянутые через резисторы к 5В. Раз в 5 мс срабатывает прерывание, по которому я хочу произвести опрос состояния портов.
И если я делаю опрос непосредственно одного бита, то всё работает:
C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
uint8_t i=PINA;
    uint8_t test=0b00111111;
    
    if (!(i&0b00000001)) {
        //GLCD_WriteString("Some button was pressed"); // write text        
        // Нажата какая-то кнопка
        PORTD|=(1<<PD7);  
        } else {
            
        PORTD&=~(1<<PD7);   
        
    }
 
}
Если же я хочу сразу опросить несколько портов( а мне именно так и надо), то почему-то следующий код не работает:
C
1
2
3
4
5
6
7
8
9
if (!(i&0b00111111)) {
        //GLCD_WriteString("Some button was pressed"); // write text        
        // Нажата какая-то кнопка
        PORTD|=(1<<PD7);  
        } else {
            
        PORTD&=~(1<<PD7);   
        
    }
В данном случае PD7 загорится, только если все шесть бит совпадут, т.е. все шесть кнопок нажаты.
Понятно, что есть вариант через ИЛИ сравнить PINA с конкретным битом, но неужели нельзя сделать эту процедуру разом?
0
Лучшие ответы (1)
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
09.11.2023, 12:12
Ответы с готовыми решениями:

Сканер состояния портов
Стоит задача: написать утилиту для сканирования портов заданного сервера с целью определения,...

IAR ARM: как создать лог состояния портов (I/O Log File)???
Почитав документацию на IAR, вроде как включил запись лога портов в файл, файл создался, но в него...

Чтение и запись состояния CheckBox в SQLite
Всем привет. Есть DataGridView с 3 столбцами. 1 - Checkbox, 2 и 3 текстовый. Заполняю руками...

Встраивание типа и чтение его состояния из вмещающего типа
Как можно в Go сделать так, чтобы состояние (актуальные значения полей) встроенного класса типа...

Смесь двух газов нагревается при постоянном давлении из состояния P,V1,T1 до состояния P,V2,T2
Добрый вечер, необходимо решить задачу, но я не понимаю как... Смесь двух газов нагревается при...

9
2128 / 1211 / 503
Регистрация: 11.10.2018
Сообщений: 6,107
09.11.2023, 12:44 2
В зависимости от задачи: хоть одну, хоть все нажимайте. Какая у Вас задача?
1
2 / 2 / 2
Регистрация: 05.09.2018
Сообщений: 173
09.11.2023, 12:58  [ТС] 3
Мне нужно, чтобы даже при одной нажатой кнопки выполнилось условие if -True, т.е:
C
1
2
3
4
if (!(i&0b00000001)) {
        //GLCD_WriteString("Some button was pressed"); // write text        
        // Нажата какая-то кнопка
        PORTD|=(1<<PD7);
А сейчас условие выполняется только при полном совпадении PINA и байта сравнения
0
2128 / 1211 / 503
Регистрация: 11.10.2018
Сообщений: 6,107
09.11.2023, 15:07 4
Ну, как вариант, проверять последовательно кнопки и использовать булевские переменные и потом смотреть, если хоть одна переменная true, то это кнопка нажата и условие if будет по ИЛИ(оператор ||).

Добавлено через 3 минуты
Еще вариант: цикл for и бегущая единица от 0 бита в байте до 5 бита включительно. Использовать оператор << - сдвиг бита на определенное количество бит. Если по побитовому И(оператор &) будут все 1, то значит ни одна кнопка не нажата. Если хоть одна кнопка нажата, то по if-then.
1
3351 / 2446 / 558
Регистрация: 11.09.2009
Сообщений: 8,882
09.11.2023, 17:20 5
Зачем так сложно? Маска и if > 0.
"Нажата любая кнопка" - это отработать по ИЛИ.
0
Модератор
Эксперт по электронике
8950 / 6716 / 921
Регистрация: 14.02.2011
Сообщений: 23,704
09.11.2023, 17:40 6
Лучший ответ Сообщение было отмечено iaz5 как решение

Решение

Цитата Сообщение от iaz5 Посмотреть сообщение
Понятно, что есть вариант через ИЛИ сравнить PINA с конкретным битом, но неужели нельзя сделать эту процедуру разом?
есть пропиши все комбинации(64 ) и используй switch

Добавлено через 4 минуты
Цитата Сообщение от iaz5 Посмотреть сообщение
if (!(i&0b00111111))
C
1
2
3
4
if(((~i)&0b00111111)!=0)
{
// Нажата какая-то кнопка
}
1
2128 / 1211 / 503
Регистрация: 11.10.2018
Сообщений: 6,107
09.11.2023, 18:09 7
C
1
2
3
4
if((~i)&0b00111111)
{
//Нажата какая-то кнопка
}
1
2 / 2 / 2
Регистрация: 05.09.2018
Сообщений: 173
10.11.2023, 05:54  [ТС] 8
Цитата Сообщение от ValeryS Посмотреть сообщение
if(((~i)&0b00111111)!=0)
Сработало!
Цитата Сообщение от FFPowerMan Посмотреть сообщение
if((~i)&0b00111111)
Тоже рабочий способ!
Спасибо!
0
3351 / 2446 / 558
Регистрация: 11.09.2009
Сообщений: 8,882
10.11.2023, 07:02 9
Цитата Сообщение от iaz5 Посмотреть сообщение
Тоже рабочий способ!
Написано одно и то же.
1
Модератор
Эксперт по электронике
8950 / 6716 / 921
Регистрация: 14.02.2011
Сообщений: 23,704
10.11.2023, 08:11 10
Цитата Сообщение от iaz5 Посмотреть сообщение
Сработало!
Цитата Сообщение от iaz5 Посмотреть сообщение
Тоже рабочий способ!
так "Правило де Моргана" однако https://ru.wikipedia.org/wiki/Законы_де_Моргана
1
10.11.2023, 08:11
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
10.11.2023, 08:11
Помогаю со студенческими работами здесь

Графы: найти все состояния, которые являются достижимыми из заданного состояния
Помогите написать программу: Модель работы некоторой системы представлена ориентированным...

QStateMachine: возможность создания недетерминированного КА с переходами из одного состояния в разные состояния
Можно с помощью qstatemachine сделать недетерминированный КА с переходами из одного состояния в...

Устранить недостижимые состояния и исключить эквивалентные состояния конечного автомата
Помогите, пожалуйста, с заданием: 1. Устранить недостижимые состояния конечного автомата. 2....

Настройка портов роутера. Открытие портов и чем это чревато
Здравствуйте, я хотел бы проконсультироваться по такому вопросу. Я в администрировании полнейший...

Создание нового state состояния в корневом компоненте зависящим от состояния другого элемента
Помогите, пожалуйста, разобраться с состояниями в классовом компоненте, пока что нуб в React, такой...

Открыть текстовый файл в необходимом режиме (на чтение, на чтение и запись, на добавление)
Открыть текстовый файл в необходимом режиме (на чтение, на чтение и запись, на добавление). (В...


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

Или воспользуйтесь поиском по форуму:
10
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru