Saluti brasiliani!
Prima di tutto grazie Joby per il tuo esempio. In secondo luogo, il suo esempio ha solo un piccolo errore. Il numero 0x20 non è corretto. Dovrebbe essere 0x04. Inoltre, come suggerimento, non userei numeri esadecimali come 0xFB, 0x20 o 0x04 nel codice. Suggerirei di utilizzare le definizioni della porta PIN presenti in io.h e altre a cui fa riferimento il file di intestazione. Ho riscritto l'esempio di Joby di seguito, con alcuni commenti per i principianti.
# 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;
}
/ *
commenti per principianti
commento n. 1: (1 << PD2) genera il binario 00000100. L'operazione "~" inverte tutte le cifre, ovvero il binario ora è 11111011. Infine il & = applica la logica "AND" tra DDRD e 11111011 e il risultato viene nuovamente inserito nella memoria DDRD. Nota: ciò che l'operatore "AND" fa è per ciascun bit nella memoria DDRD, confronta con il numero binario sopra. Se il bit in DDRD è 0 e il bit nel binario nella stessa posizione del morso è 1, il bit risultante è 0, se il DDRD è 1 e il bit nel binario è 1, il bit risultante è 1, e se il bit nel DDRD è 1 o 0 e il bit nel binario è 0, quindi il bit risultante è sempre 0. In breve, il comando DDRD & = ~ (1 << PD2) cambia solo il bit PD2 in zero e lascia intatti gli altri (zeri o quelli). Sembra un po 'complicato, ma dopo esserti abituato, è il modo migliore per cambiare un po' in un morso senza cambiare gli altri bit.
commento # 2 : (1 << PD2) genera il binario 00000100. Usando la stessa logica "AND" descritta nel commento # 1, il comando "PIND & 0000100" controlla solo se il PIND2 (il nostro pin di input a cui è collegato il pulsante a) è impostato su alto o no. Tutti gli altri pin saranno FALSE poiché i bit binari sono impostati su 0 e poiché il bit binario n. 2 è impostato su 1, l'istruzione IF sarà TRUE solo se l'ingresso PD2 è impostato su alto o FALSO se l'ingresso PD2 è impostato su basso.
commento n. 3 : seguendo la logica spiegata nel commento n. 1, questo comando imposta il pin di uscita PINB2 nella porta PORTB su alta tensione. Se il LED è collegato correttamente a questa porta pin con una resistenza di ~ 300 ohm e quella resistenza è collegata a terra, il LED dovrebbe accendersi.
commento n. 4 : il LED dovrebbe spegnersi per gli stessi motivi spiegati nei commenti precedenti.
Considerazioni finali:
a) Per evitare oscillazioni di tensione nel pin di ingresso PD2 quando il pulsante non viene premuto (circuito aperto), si consiglia vivamente di posizionare una resistenza di pull-down (1 kOhm o superiore), in modo che il LED non si accenda accidentalmente a causa di a questa oscillazione di tensione casuale.
b) Una nota di esclusione di responsabilità: le idee qui descritte devono essere utilizzate solo a scopo didattico e NON devono essere utilizzate in alcun sistema reale prima di consultare un esperto in elettronica.
* /