Как мне прочитать цифровой ввод на ATmega16?

18

Что мне нужно сделать, чтобы прочитать цифровой вход (кнопку) на ATmega16 ? Нужно ли включать нагрузочные резисторы или я могу использовать 10 кОм? Каким будет какой-то простой код? Просто «включи светодиод, когда нажата вещь».

Есть ли урок для начинающих? Я пробовал гуглить и AVR Freaks , но там все превращается в драку, и я не получаю свой ответ. Я действительно не нашел учебников по этому поводу. Тонны конкретных вещей, но ничего простого в моем микроконтроллере AVR ...

любопытный
источник
4
На этот вопрос можно ответить практически в любом уроке для начинающих, и я боюсь, что полный ответ здесь подорвет ваше понимание больше, чем помощь. Какие предыдущие усилия вы сделали, чтобы учиться?
Ян Вернье
Не уверен, что вы видели мой пост или вы можете его увидеть (извините, все еще немного озадачен этим сайтом ...) Но я знаю код, позвольте мне ответить на вопрос: мне просто подключить контакт к GND и его низкий уровень?
любопытно
2
Почему бы не отредактировать ваше сообщение, чтобы более точно отразить это, и включить сообщение ниже в исходное сообщение тоже.
Амос
Попробуйте Учебное пособие «С нуля», посвященное AVR, на этой странице. Вы найдете гораздо больше вещей там.
Леон Хеллер

Ответы:

24

Бразильские поздравления!

Прежде всего, спасибо Джоби за ваш пример. Во-вторых, в его примере есть небольшая ошибка. Число 0x20 не правильно. Это должно быть 0x04. Кроме того, как совет, я бы не использовал шестнадцатеричные числа, такие как 0xFB, 0x20 или 0x04 в коде. Я бы предложил использовать определения порта PIN, найденные в io.h, и другие, на которые ссылается заголовочный файл. Ниже я переписал пример Джоби с некоторыми комментариями для начинающих.

# include <avr/io.h>

int main (void)
{
    // set all pins on PORTB for output
    DDRB = 0xFF;

    // set port pin PORTD2 as input and leave the others pins 
    // in their originally state (inputs or outputs, it doesn't matter)
    DDRD &= ~(1 << PD2);        // see comment #1

    while (1) 
    {
        if (PIND & (1<<PD2))    // see comment #2
            PORTB |= (1<<PB2);  // see comment #3
        else
            PORTB &= ~(1<<PB2); // see comment #4
    }
    return 0;
}

/ *

комментарии для начинающих

комментарий № 1: (1 << PD2) генерирует двоичный код 00000100. Операция «~» переворачивает все цифры, т. Е. Двоичный код теперь равен 11111011. Наконец, символ & = применяет логику «И» между DDRD и 11111011, и результат помещается снова в памяти DDRD. Примечание: оператор «И» выполняет для каждого бита в памяти DDRD, он сравнивается с двоичным числом, указанным выше. Если бит в DDRD равен 0 и бит в двоичном файле в той же позиции прикуса равен 1, то результирующий бит равен 0, если DDRD равен 1, а бит в двоичном файле равен 1, результирующий бит равен 1, и если бит в DDRD равен 1 или 0, а бит в двоичном файле равен 0, тогда результирующий бит всегда равен 0. Таким образом, команда DDRD & = ~ (1 << PD2) изменяет только бит PD2 на ноль и оставляет другие (нули или единицы) без изменений. Это кажется немного сложным, но после того, как вы к нему привыкнете, это лучший способ изменить бит за укус, не меняя другие биты.

Комментарий № 2 : (1 << PD2) генерирует двоичный код 00000100. Используя ту же логику «И», описанную в комментарии № 1, команда «PIND & 0000100» проверяет только, если PIND2 (наш входной контакт, к которому подключена кнопка) к) установлен на высокий или нет. Все остальные выводы будут FALSE, поскольку двоичные биты установлены в 0, а поскольку двоичный бит # 2 установлен в 1, оператор IF будет TRUE, только если для входа PD2 установлено высокое значение, или FALSE, если вход PD2 установить на низком уровне.

Комментарий № 3 : Следуя логике, объясненной в комментарии № 1, эта команда устанавливает высокое напряжение на выходном выводе PINB2 в порту PORTB. Если ваш светодиод правильно подключен к этому контактному порту с резистором ~ 300 Ом, и этот резистор подключен к земле, светодиод должен включиться.

Комментарий № 4 : светодиод должен погаснуть по тем же причинам, что и в предыдущих комментариях.

Заключительные соображения:

а) Во избежание колебаний напряжения на входном выводе PD2, когда кнопка не нажата (разомкнутая цепь), я настоятельно рекомендую установить понижающий резистор (1 кОм или выше), чтобы светодиод не загорелся случайно из-за к этому случайному колебанию напряжения.

б) Отказ от ответственности: идеи, описанные здесь, должны использоваться только в образовательных целях, и их НЕ следует использовать в какой-либо реальной системе до консультации со специалистом по электронике.

* /

Сообщество
источник
3
Я не призываю вас указывать адрес электронной почты, потому что переписка по электронной почте делает общение приватным. Так что никто другой не может принести пользу. Но если вы действительно хотите предоставить свою электронную почту для личных сообщений, лучшее место для этого - в вашем профиле.
Даниэль Грилло
Разве это не наоборот - № 3 выключает светодиод, № 4 - светодиод?
sitilge
2

https://www.mainframe.cx/~ckuethe/avr-c-tutorial/

https://www.mainframe.cx/~ckuethe/avr-c-tutorial/#digital-in

#include <avr/io.h>

/*
 * Assumptions:
 *  - LED connected to PORTB.2
 *  - Switch connected to PORTD.2
 */

int main (void)
{
    /* set PORTB for output*/
    DDRB = 0xFF;
    /* set PORTD for input*/
    DDRD &= 0xFB;
    PORTD |= 0x04;

    while (1) {
        if (PIND & 0x04)
            PORTB &= ~0x20;
        else
            PORTB |= 0x20;
    }
    return 0;
}
Тоби джеффи
источник
Спасибо @joby Taffey за предоставленную ссылку. Я искал функции EEPROM и получил большую помощь от: mainframe.cx/~ckuethe/avr-c-tutorial/lesson11.c Большое спасибо.
Бишал Паудель
0

При работе с цифровым входом от механического переключателя следует учитывать еще и отскакивание контактов - изменение того, что должно быть нажатием одной кнопки, на несколько нажатий.

Что-то вроде включения светодиода, когда кнопка нажата, вам, вероятно, не придется беспокоиться о том, чтобы отменить действие. Для чего-то более сложного (например, переключение светодиода на нажатие кнопки), дебасинг является обязательным.

У Джека Гэнслла есть хорошее руководство по разоблачению

Майк
источник