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.
* /