Descreve a função de cada linha do programa mostrado a seguir e qual rotina está sendo executada.
#define F_CPU 16000000UL //clock of 16MHz Unsigned Long (UL)
#include <avr/io.h>
#include <avr/interrupt.h>
#include <util/delay.h>
int counter=0;
\int main(void)
{
DDRD=0x00;
PORTD=0x00;
PORTB =0x3F;
sei();
EICRA=0x01;
EIMSK=0x01;
while (1)
{
}
}
|ISR(INT0_vect){
counter++;
PORTB=counter;
if (counter>=10){
PORTB = 0;
counter=0;
}
}

Passo 1

Beleza, vamos lá! A questão pede para a gente descrever a função de cada linha do programa fornecido e identificar qual rotina está sendo executada. O assunto aqui é programação para microcontroladores AVR, usando interrupções. Para resolver isso, vamos analisar cada linha do código e entender o que ela faz dentro do contexto de um sistema embarcado.

Passo 2

Vamos começar com a primeira linha:
#define F_CPU 16000000UL //clock of 16MHz Unsigned Long (UL)
Aqui, estamos definindo uma constante chamada F_CPU que representa a frequência de operação do microcontrolador, que é de 16 MHz. O UL no final indica que o valor é do tipo “Unsigned Long”, ou seja, um número inteiro sem sinal de longa duração.

Passo 3

#include <avr/io.h>
Essa linha inclui o arquivo de cabeçalho io.h da biblioteca AVR, que contém definições de I/O (entrada/saída) específicas para o microcontrolador. Isso permite que a gente manipule portas e registradores do hardware.

Passo 4

#include <avr/interrupt.h>
Aqui, estamos incluindo o arquivo de cabeçalho interrupt.h, que fornece funções e definições para lidar com interrupções no microcontrolador. Interrupções são eventos que podem interromper o fluxo normal do programa para executar uma rotina específica.

Passo 5

#include <util/delay.h>
Esta linha inclui o arquivo delay.h da biblioteca UTIL, que oferece funções para criar delays (pausas) no programa. Isso é útil para controlar o tempo entre ações, como piscar LEDs.

Passo 6

int counter=0;
Aqui, declaramos uma variável inteira chamada counter e a inicializamos com valor zero. Essa variável será usada para contar o número de vezes que uma interrupção ocorre.

Passo 7

int main(void)
{
Iniciamos a função principal main, que é o ponto de entrada do programa. Tudo dentro dessa função será executado quando o microcontrolador iniciar.

Passo 8

DDRD=0x00;
DDRD é o registrador de direção da porta D. Ao atribuir 0x00, estamos configurando todos os pinos da porta D como entrada.

Passo 9

PORTD=0x00;
Aqui, estamos definindo o valor dos pinos da porta D como baixo (0). Como os pinos estão configurados como entrada, isso desativa os resistores de pull-up internos.

Passo 10

PORTB =0x3F;
PORTB é o registrador de saída da porta B. Ao atribuir 0x3F, estamos configurando os primeiros 6 pinos (bits 0 a 5) da porta B como alto (1), ligando LEDs ou outros dispositivos conectados a esses pinos.

Passo 11

sei();
A função sei() significa “Set External Interrupts”. Ela habilita interrupções globais no microcontrolador, permitindo que as rotinas de interrupção sejam executadas quando eventos específicos ocorrerem.

Passo 12

EICRA=0x01;
EICRA é o registrador de controle de interrupções externas. Ao definir 0x01, estamos configurando a interrupção INT0 para ser ativada em uma borda de baixa para alta (rising edge).

Passo 13

EIMSK=0x01;
EIMSK é o registrador de máscara de interrupção externa. Ao atribuir 0x01, estamos habilitando a interrupção externa INT0.

Passo 14

while (1)
{
}
Este é um loop infinito que mantém o programa rodando continuamente. Enquanto o microcontrolador está neste loop, ele pode responder a interrupções externas.

Passo 15

}
Fechamos a função main.

Passo 16

ISR(INT0_vect){
Aqui, definimos a rotina de serviço de interrupção (ISR) para a interrupção externa INT0. Quando a interrupção INT0 é acionada, este bloco de código é executado.

Passo 17

counter++;
Dentro da ISR, incrementamos a variável counter em 1 cada vez que a interrupção acontece.

Passo 18

PORTB=counter;
Atualizamos o valor de PORTB com o valor atual de counter. Isso pode, por exemplo, alterar o estado dos LEDs conectados à porta B para refletir o número de interrupções ocorridas.

Passo 19

if (counter>=10){
Aqui, verificamos se o counter atingiu 10. Se sim, executamos o bloco de código dentro do if.

Passo 20

PORTB = 0;
Reseta todos os pinos da porta B para baixo (0), apagando os LEDs ou desligando os dispositivos conectados.

Passo 21

counter=0;
Reseta o counter para zero, pronto para contar novamente as interrupções futuras.

Passo 22

}
Fecha o bloco do if.

Passo 23

}
Fecha a rotina de interrupção (ISR).

Resposta

Cada linha do programa configura e gerencia as interrupções externas no microcontrolador AVR. O programa configura a porta D como entrada e a porta B como saída, habilita a interrupção INT0 para detectar mudanças na porta D, e incrementa um contador a cada interrupção. Quando o contador atinge 10, ele reseta os LEDs conectados à porta B e reinicia a contagem. A rotina de interrupção ISR(INT0_vect) é responsável por lidar com o evento de interrupção, atualizando o estado dos LEDs conforme o contador.

Exercícios relacionados