Як читати цифровий вхід на ATmega16?


18

Що мені потрібно зробити, щоб прочитати цифровий вхід (кнопка) на ATmega16 ? Чи потрібно вмикати підтягувальні резистори чи можу я використовувати 10 кілометрів? Яким був би простий код? Просто простий "Увімкніть світлодіод при натисканні на нього".

Чи є підручник для початківців? Я спробував гуглінг та AVR Freaks , але все просто перетворюється на бійку, і я не отримую своєї відповіді. Я справді не знайшов підручників з цього приводу. Тони конкретних речей, але нічого простого в моєму мікроконтролері AVR ...


4
На це можна буде відповісти майже в будь-якому навчальному посібнику для початківців, і я побоююся, що повна відповідь тут би більше підірвала ваше розуміння, ніж допомогу. Які попередні зусилля ви зробили, щоб навчитися?
Yann Vernier

Не впевнений, чи бачив ви мою публікацію чи чи зможете ви її бачити (вибачте, все ще заплутався на цьому сайті ...) Але я знаю код, давайте моє запитання: чи я просто підключую шпильку до GND та її низьку?
цікаво

2
Чому б не відредагувати свою публікацію, щоб більш точно відобразити це і включити публікацію нижче в оригінальну публікацію.
Амос

Спробуйте "Навчальний посібник AVR" на цій сторінці AVR Freaks. Ви знайдете там ще багато речей.
Леон Хеллер

Відповіді:


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 (наш вхідний контакт, де підключена кнопка). до) встановлено на високу чи ні. Всі інші штифти будуть ЛІЖНІ, оскільки двійкові біти встановлені на 0, а оскільки бінарний біт №2 встановлений на 1, оператор IF буде ПРАВИЛЬНИМ лише у випадку, якщо для входу PD2 встановлено високе значення або ЛІЖНЕ, якщо вхід 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 Дуже дякую.
Bishal Paudel

2

У Хакадею було чудово записатись на програмування AVR, у ньому багато чудової інформації, яка могла б вам допомогти

http://hackaday.com/2010/11/19/avr-programming-04-writing-code-etc/

http://hackaday.com/2010/11/05/avr-programming-03-reading-and-compiling-code/

http://hackaday.com/2010/10/25/avr-programming-02-the-hardware/

http://hackaday.com/2010/10/23/avr-programming-introduction/



0

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

Щоб увімкнути світлодіод при натисканні кнопки, вам, мабуть, не доведеться турбуватися про розблокування. Щось дещо складніше (наприклад, увімкнення світлодіода при натисканні кнопки), деблокування є обов'язковим.

Джек Гансл має хороший путівник з дебютації

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.