Jak czytać wejście cyfrowe na ATmega16?


18

Co muszę zrobić, aby odczytać wejście cyfrowe (przycisk) na ATmega16 ? Czy muszę włączyć rezystory podciągające, czy mogę użyć 10 kΩ? Jaki byłby jakiś prosty kod? Po prostu proste „Włącz diodę LED po naciśnięciu”.

Czy jest tutorial dla początkujących? Próbowałem google i AVR Freaks , ale wszystko ewoluuje tam do walki i nie dostaję odpowiedzi. Naprawdę nie znalazłem żadnych samouczków na ten temat. Mnóstwo konkretnych rzeczy, ale nic prostego w moim mikrokontrolerze AVR ...


4
Odpowiedzi na to udzieli praktycznie każdy samouczek dla początkujących i obawiam się, że pełna odpowiedź tutaj podważy twoje zrozumienie bardziej niż pomoc. Jakie wysiłki uczyniłeś, aby się uczyć?
Yann Vernier

Nie jestem pewien, czy widziałeś mój post, czy jesteś w stanie go zobaczyć (przepraszam, nadal trochę myliłem się co do tej strony ...) Ale znam kod, powiedzmy, że moje pytanie brzmi: czy po prostu podłączam pin do GND i jego niskiego poziomu?
ciekawy

2
Dlaczego nie edytować swojego posta, aby dokładniej to odzwierciedlić i dołączyć również poniższy post do oryginalnego postu.
Amos

Wypróbuj samouczek AVR From-Scratch na tej stronie maniaków AVR. Znajdziesz tam o wiele więcej rzeczy.
Leon Heller

Odpowiedzi:


24

Brazylijskie pozdrowienia!

Przede wszystkim dziękuję Joby za twój przykład. Po drugie, jego przykład zawiera tylko niewielki błąd. Liczba 0x20 jest nieprawidłowa. Powinien to być 0x04. Ponadto, jako sugestia, nie używałbym w kodzie liczb szesnastkowych, takich jak 0xFB, 0x20 lub 0x04. Sugerowałbym użycie definicji portów PIN znajdujących się w pliku io.h oraz innych, do których odwołuje się plik nagłówka. Ponownie napisałem przykład Joby'ego z kilkoma komentarzami dla początkujących.

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

/ *

komentarze dla początkujących

komentarz nr 1: (1 << PD2) generuje wartość binarną 00000100. Operacja „~” odwraca wszystkie cyfry, tzn. Wartość binarna wynosi teraz 11111011. W końcu & = stosuje logikę „AND” między DDRD a 11111011, a wynik jest umieszczany ponownie w pamięci DDRD. Uwaga: Operator „AND” robi dla każdego bitu w pamięci DDRD, porównuje go z powyższą liczbą binarną. Jeśli bit w DDRD ma wartość 0, a bit w pliku binarnym w tej samej pozycji zgryzu wynosi 1, to bit wynikowy ma wartość 0, jeśli DDRD ma wartość 1, a bit w pliku binarnym ma wartość 1, bit wynikowy wynosi 1, a jeśli bit w DDRD ma wartość 1 lub 0, a bit w pliku binarnym ma wartość 0, wówczas bit wynikowy ma zawsze wartość 0. Podsumowując, polecenie DDRD & = ~ (1 << PD2) zmienia tylko bit PD2 na zero i pozostawia pozostałe (zera lub jedynki) nietknięte. Wydaje się to trochę skomplikowane, ale po przyzwyczajeniu się do niego jest to najlepszy sposób na zmianę trochę w kęsie bez zmiany innych bitów.

komentarz nr 2 : (1 << PD2) generuje wartość binarną 00000100. Korzystając z tej samej logiki „AND” opisanej w komentarzu nr 1, polecenie „PIND & 0000100” sprawdza tylko, czy PIND2 (nasz pin wejściowy, do którego podłączony jest przycisk) to) jest ustawiony na wysoki lub nie. Wszystkie pozostałe piny będą NIEAKTYWNE, ponieważ binarne bity są ustawione na 0, a ponieważ bit binarny # 2 jest ustawiony na 1, instrukcja JEŻELI będzie PRAWDA tylko wtedy, gdy wejście PD2 jest ustawione na wysokie lub FAŁSZ, jeśli wejście PD2 jest ustawione na ustawiony na niski.

komentarz nr 3 : Zgodnie z logiką objaśnioną w komentarzu nr 1 to polecenie ustawia pin wyjściowy PINB2 w porcie PORTB na wysokie napięcie. Jeśli dioda LED jest prawidłowo podłączona do tego portu stykowego z rezystorem ~ 300 omów, a ten rezystor jest podłączony do ziemi, dioda LED powinna się włączyć.

komentarz nr 4 : Dioda LED powinna zgasnąć z tych samych powodów, które wyjaśniono w poprzednich komentarzach.

Uwagi końcowe:

za) Aby uniknąć oscylacji napięcia na wtyku wejściowym PD2, gdy przycisk nie jest wciśnięty (obwód otwarty), zdecydowanie zalecam umieszczenie rezystora obniżającego (1 kOhm lub wyższego), aby dioda LED nie zaświeciła się przypadkowo z powodu do tej przypadkowej oscylacji napięcia.

b) Nota zrzeczenia się odpowiedzialności: Opisane tutaj pomysły należy wykorzystywać wyłącznie w celach edukacyjnych i NIE należy ich używać w żadnym prawdziwym systemie przed skonsultowaniem się ze specjalistą w dziedzinie elektroniki.

* /


3
Nie zachęcam do podania adresu e-mail, ponieważ korespondencja przez e-mail sprawia, że ​​komunikacja jest prywatna. Więc nikt inny nie może skorzystać. Ale jeśli naprawdę chcesz podać swój adres e-mail do prywatnej komunikacji, najlepszym miejscem do tego jest Twój profil.
Daniel Grillo,

Czy nie jest odwrotnie - # 3 wyłącza diodę, # 4 włącza diodę?
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;
}

Dziękuję @joby Taffey za dostarczony link. Szukałem funkcji EEPROM i otrzymałem wiele pomocy od: mainframe.cx/~ckuethe/avr-c-tutorial/lesson11.c Dziękuję bardzo.
Bishal Paudel



0

Kolejną kwestią do rozważenia w przypadku cyfrowego wejścia z mechanicznego przełącznika jest odbijanie styków - zmiana, co powinno być naciśnięciem jednego przycisku, na coś, co wygląda jak wielokrotne naciśnięcia.

W przypadku czegoś takiego jak włączenie diody LED, gdy przycisk jest wciśnięty, prawdopodobnie nie musisz się martwić o ogłoszenie. W przypadku czegoś nieco bardziej skomplikowanego (jak przełączanie diody LED po naciśnięciu przycisku) ogłoszenie jest koniecznością.

Jack Ganssle ma dobry Przewodnik do debugowania

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.