Considere o registrador PINx (
ou
), para leitura digital. Elabore um programa em linguagem C que realize a leitura do terminal digital 2 do ATMega328P e, caso a leitura forneça um nível alto, envie um bit alto para o terminal digital 13.
Passo 1
Beleza, vamos lá! O exercício pede para a gente trabalhar com os registradores digitais do microcontrolador ATMega328P usando a linguagem C. Precisamos ler o estado do terminal digital 2 e, se ele estiver em nível alto (ou seja, ligado), enviar um sinal alto para o terminal digital 13. Para resolver isso, vamos precisar entender como configurar os registradores de entrada e saída, além de saber como ler e escrever nos pinos digitais.
Passo 2
Primeiro, precisamos configurar o terminal digital 2 como entrada e o terminal digital 13 como saída. No ATMega328P, os pinos estão divididos em portas (como PORTB, PORTC e PORTD). O terminal digital 2 está no PORTD, bit 2 (PD2), e o terminal digital 13 está no PORTB, bit 5 (PB5).
Para configurar um pino como entrada ou saída, usamos o registrador DDRx (Data Direction Register). Se colocarmos um bit como
0
, ele é configurado como entrada; se for 1
, como saída.Então, vamos definir PD2 como entrada e PB5 como saída.
DDRD &= ~(1 << DDD2); // Configura PD2 como entrada
DDRB |= (1 << DDB5); // Configura PB5 como saída
Passo 3
Agora que configuramos os pinos, precisamos ler o estado do terminal digital 2. Para isso, usamos o registrador PINx correspondente, que é o PIND para a porta D. Vamos verificar se o bit 2 está alto (
1
) ou baixo (0
.Se o bit 2 estiver alto, a gente manda um sinal alto para o terminal digital 13 usando o registrador PORTB.
if (PIND & (1 << PIND2)) {
PORTB |= (1 << PORTB5); // Envia nível alto para PB5
} else {
PORTB &= ~(1 << PORTB5); // Envia nível baixo para PB5
}
Passo 4
Para que esse código funcione continuamente, precisamos colocar tudo dentro de um loop infinito (
while(1)
). Isso fará com que o microcontrolador sempre esteja verificando o estado do terminal digital 2 e ajustando o terminal digital 13 de acordo.Também é uma boa prática definir tudo dentro da função
main
e incluir o cabeçalho avr/io.h
, que contém as definições necessárias para manipular os registradores.Resposta
Aqui está o programa completo em C que faz o que foi solicitado:
#include <avr/io.h>
int main(void) {
// Configura PD2 como entrada
DDRD &= ~(1 << DDD2);
// Configura PB5 como saída
DDRB |= (1 << DDB5);
while (1) {
// Verifica se PD2 está alto
if (PIND & (1 << PIND2)) {
// Envia nível alto para PB5
PORTB |= (1 << PORTB5);
} else {
// Envia nível baixo para PB5
PORTB &= ~(1 << PORTB5);
}
}
return 0;
}
Esse programa configura o terminal digital 2 como entrada e o terminal digital 13 como saída. No loop infinito, ele lê o estado de PD2 e, se estiver alto, define PB5 como alto; caso contrário, define PB5 como baixo.