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;
}
}
#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.