Làm cách nào để đọc đầu vào kỹ thuật số trên ATmega16?


18

Tôi phải làm gì để đọc đầu vào kỹ thuật số (nút nhấn) trên ATmega16 ? Tôi có phải kích hoạt điện trở pullup hay tôi có thể sử dụng điện trở 10 kohm không? Một số mã đơn giản sẽ là gì? Chỉ đơn giản là 'Bật đèn LED khi nó ấn'.

Có hướng dẫn cho người mới bắt đầu? Tôi đã thử googling và AVR Freaks , nhưng mọi thứ chỉ phát triển thành một cuộc chiến ở đó và tôi không nhận được câu trả lời của mình. Tôi thực sự không tìm thấy bất kỳ hướng dẫn về công cụ này. Hàng tấn những thứ cụ thể nhưng không có gì đơn giản về vi điều khiển AVR của tôi ...


4
Điều này sẽ được trả lời trong hầu hết mọi hướng dẫn của người mới bắt đầu và tôi sợ một câu trả lời hoàn chỉnh ở đây sẽ làm suy yếu sự hiểu biết của bạn hơn là giúp đỡ. Những nỗ lực trước bạn đã làm để học?
Yann Vernier

Không chắc chắn nếu bạn đã xem bài đăng của tôi hoặc bạn có thể xem nó không (xin lỗi vẫn hơi nhầm lẫn về trang web này ...) Nhưng tôi biết mã, hãy nói câu hỏi của tôi là: tôi chỉ kết nối một pin với GND và nó có thấp không?
tò mò

2
Tại sao không chỉnh sửa bạn đăng để phản ánh chính xác hơn điều này và bao gồm bài viết dưới đây trong bài viết gốc quá.
A-mốt

Hãy thử Hướng dẫn từ From-Scratch AVR trên trang AVR Freaks này. Bạn sẽ tìm thấy nhiều thứ hơn ở đó.
Leon Heller

Câu trả lời:


24

Lời chào Brazil!

Trước hết cảm ơn Joby cho ví dụ của bạn. Thứ hai, ví dụ của anh ta chỉ là một lỗi nhỏ. Số 0x20 không đúng. Nó phải là 0x04. Ngoài ra, chỉ là một gợi ý, tôi sẽ không sử dụng các số thập lục phân như 0xFB, 0x20 hoặc 0x04 trong mã. Tôi sẽ đề nghị sử dụng các định nghĩa cổng PIN được tìm thấy trong io.h và các định nghĩa khác được tham chiếu bởi tệp tiêu đề. Tôi đã viết lại ví dụ của Joby bên dưới, với một số bình luận cho người mới bắt đầu.

# 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;
}

/ *

ý kiến ​​cho người mới bắt đầu

bình luận số 1: (1 << PD2) tạo nhị phân 00000100. Thao tác "~" lật tất cả các chữ số, tức là, nhị phân bây giờ là 11111011. Cuối cùng, & = áp dụng logic "AND" giữa DDRD và 11111011 và kết quả được đặt lại trong bộ nhớ DDRD. Lưu ý: Những gì toán tử "AND" làm là cho mỗi bit trong bộ nhớ DDRD, nó so sánh với số nhị phân ở trên. Nếu bit trong DDRD là 0 và bit trong nhị phân ở cùng vị trí cắn là 1, thì bit kết quả là 0, nếu DDRD là 1 và bit trong nhị phân là 1, bit kết quả là 1 và nếu bit trong DDRD là 1 hoặc 0 và bit trong nhị phân là 0 thì bit kết quả luôn là 0. Tóm lại, lệnh DDRD & = ~ (1 << PD2) chỉ thay đổi bit PD2 thành 0 và không để lại các bit khác (số không hoặc số không). Có vẻ hơi phức tạp, nhưng sau khi bạn quen với nó, đó là cách tốt nhất để thay đổi một chút trong một vết cắn mà không thay đổi các bit khác.

nhận xét # 2 : (1 << PD2) tạo nhị phân 00000100. Sử dụng cùng logic "VÀ" được mô tả trong nhận xét # 1, lệnh "PIND & 0000100" chỉ kiểm tra nếu PIND2 (pin đầu vào của chúng tôi có nút ấn được kết nối đến) được đặt thành cao hay không. Tất cả các chân khác sẽ là FALSE vì các bit nhị phân được đặt thành 0 và vì bit nhị phân # 2 được đặt thành 1, câu lệnh IF sẽ chỉ TRUE nếu đầu vào PD2 được đặt thành cao hoặc FALSE nếu đầu vào PD2 là đặt ở mức thấp.

Nhận xét # 3 : Theo logic được giải thích trong nhận xét # 1, lệnh này đặt chân PINB2 đầu ra ở cổng PORTB thành điện áp cao. Nếu đèn LED của bạn được kết nối đúng với cổng pin này với điện trở ~ 300 ohms và điện trở đó được kết nối với mặt đất, đèn LED sẽ bật.

bình luận # 4 : Đèn LED sẽ tắt vì những lý do tương tự được giải thích trong các bình luận trước đó.

Cân nhắc cuối cùng:

a) Để tránh dao động điện áp trong chân đầu vào PD2 khi không nhấn nút ấn (mạch hở), tôi khuyên bạn nên đặt điện trở kéo xuống (1 kOhm trở lên), để đèn LED không sáng lên do vô tình đến dao động điện áp ngẫu nhiên này.

b) Một lưu ý từ chối trách nhiệm: Các ý tưởng được mô tả ở đây chỉ được sử dụng như mục đích giáo dục và chúng KHÔNG nên được sử dụng trong bất kỳ hệ thống thực nào trước khi tham khảo ý kiến ​​chuyên gia về điện tử.

* /


3
Tôi không khuyến khích bạn cung cấp email của bạn vì tương ứng bởi email làm cho việc liên lạc trở nên riêng tư. Vì vậy, không ai khác có thể có lợi. Nhưng nếu bạn thực sự muốn cung cấp email của mình để liên lạc riêng tư, nơi tốt nhất để làm điều đó là trong hồ sơ của bạn.
Daniel Grillo

Không phải là ngược lại - # 3 tắt đèn led, # 4 bật đèn led?
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;
}

Cảm ơn @joby Taffey cho liên kết được cung cấp. Tôi đã tìm kiếm các chức năng EEPROM và tôi đã nhận được rất nhiều sự giúp đỡ từ: mainframe.cx/~ckuethe/avr-c-tutorial/lesson11.c Cảm ơn bạn rất nhiều.
Bishal Paudel



0

Một cái gì đó khác để xem xét khi xử lý một đầu vào kỹ thuật số từ một công tắc cơ học là các tiếp điểm nảy - thay đổi những gì nên là một nút ấn vào những gì trông giống như nhiều lần đẩy.

Đối với một cái gì đó như bật đèn LED khi nhấn nút, có lẽ bạn không phải lo lắng về việc gỡ bỏ. Đối với một cái gì đó phức tạp hơn một chút (như bật đèn LED trên nút nhấn), việc gỡ lỗi là điều bắt buộc.

Jack Ganssle có một Hướng dẫn tốt về Nợ

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.