Saudações brasileiras!
Antes de tudo, agradeça a Joby pelo seu exemplo. Em segundo lugar, seu exemplo tem apenas um pequeno erro. O número 0x20 não está correto. Deve ser 0x04. Além disso, apenas como sugestão, eu não usaria números hexadecimais como 0xFB, 0x20 ou 0x04 no código. Eu sugeriria usar as definições de porta PIN encontradas no io.he outras referenciadas pelo arquivo de cabeçalho. Reescrevi o exemplo de Joby abaixo, com alguns comentários para os iniciantes.
# 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;
}
/ *
comentários para iniciantes
comentário # 1: (1 << PD2) gera o binário 00000100. A operação "~" inverte todos os dígitos, ou seja, o binário agora é 11111011. Finalmente, o & = aplica a lógica "AND" entre DDRD e 11111011 e o resultado é colocado novamente na memória DDRD. Nota: O que o operador "AND" faz é para cada bit na memória DDRD, comparado com o número binário acima. Se o bit no DDRD for 0 e o bit no binário na mesma posição da picada for 1, o bit resultante será 0, se o DDRD for 1 e o bit no binário for 1, o bit resultante será 1 e se o bit no DDRD é 1 ou 0 e o bit no binário é 0, o bit resultante é sempre 0. Em resumo, o comando DDRD & = ~ (1 << PD2) altera apenas o bit PD2 para zero e deixa os outros (zeros ou uns) intocados. Parece um pouco complicado, mas depois que você se acostuma, é a melhor maneira de mudar um pouco sem alterar os outros bits.
comentário nº 2 : (1 << PD2) gera o 00000100 binário. Usando a mesma lógica "AND" descrita no comentário nº 1, o comando "PIND & 0000100" verifica apenas se o PIND2 (nosso pino de entrada onde o botão está conectado para) está definido como alto ou não. Todos os outros pinos serão FALSE, pois os bits binários estão definidos como 0 e, como o bit binário # 2 está definido como 1, a instrução IF será TRUE somente se a entrada PD2 estiver definida como alta ou FALSE se a entrada PD2 for definido para baixo.
comentário 3 : Seguindo a lógica explicada no comentário 1, este comando define o pino de saída PINB2 na porta PORTB para alta tensão. Se o seu LED estiver correto conectado a essa porta de pinos com um resistor de ~ 300 ohms e esse resistor estiver conectado ao terra, o LED deverá acender.
comentário nº 4 : O LED deve desligar pelos mesmos motivos explicados nos comentários anteriores.
Considerações finais:
a) Para evitar oscilação de tensão no pino de entrada PD2 quando o botão não é pressionado (circuito aberto), recomendo colocar um resistor de pull-down (1 kOhm ou superior), para que o LED não acenda acidentalmente devido a essa oscilação aleatória de tensão.
b) Uma nota de isenção de responsabilidade: As idéias descritas aqui devem ser usadas apenas como educacionais e NÃO devem ser usadas em nenhum sistema real antes de consultar um especialista em eletrônica.
* /