Considere o registrador PINx ( x=B, C ou D ), 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.

Exercícios relacionados