Todos os sistemas computacionais, assim como os de tempo real, ou sistemas embarcados, são controlados por um programa, elaborado por um ou mais programadores, que controla o resto do conjunto através de periféricos internos e externos devidamente ajustados. Entre os periféricos mais utilizados, de maneira geral podemos destacar as portas digitais, os temporizadores, e as fontes de interrupção.
Nesta questão, você deve desenvolver um algoritmo simples, que utiliza os três periféricos do ATmega328 estudados na terceira unidade: as portas digirais, as interrupções (primeiras), e os temporizadores. A Porta D será conectada à 8 leds, que acenderão, um de cada vez, em sequência. No primeiro ciclo, cada led deve ficar aceso durante 1 segundo. Depois disso (dos oito acionamentos), no segundo ciclo, cada led fica aceso durante 500ms. No terceiro ciclo, esse intervalo cai para 250 ms, e no quarto e último, cada led fica 125 ms aceso. Depois de terminar o quarto ciclo, o sistema deve voltar à fase inicial, o primeiro ciclo. Caso o botão, conectado ao canal PB0, seja acionado, a qualquer instante do processo, sistema deve voltar para a primeira fase (ciclo 1 e led 1). Os intervalos de tempo devem ser gerados a partir do módulo temporizador zero, através de interrupção, assim como o acionamento do botão. Não é necessário que você memorize todos os registradores e comandos para programar, por isso, utiliza como base para a sua solução o programa na figura abaixo. O exemplo pisca o led da placa Arduino em 1 Hz através do temporizador zero em modo comparador (CTC), e reinicia o processo quando um botão, externo à placa, e conectado ao canal PB0, gera uma interrupção. Veja com seu professor se é possível aproveitar as funções de configuração do exemplo, para não as reescrever (mas você deve entender tudo o que ocorre lá!). Agora é hora de trabalhar, vamos lá!
RESPOSTA É AS IMAGENS!!! Me Deem Pontuação!!
Soluções para a tarefa
//Boa noite à todos!//
#include < avr/io.h>
#include <avr/interrupt.h>
#define F_CPU 16000000UL
#include <util/delay.h>
volatile char mudalet;
unsigned int Cnt;
unsigned long int atraso=1000; int
contador=0;
int i=0;
int i seqleds[8] = {0b10000000, 0b00100000, 0b00010000, 0b00001000, 0b00000100, 0b00000010, 0b00000001};
void ConfigPCINT0(void)
{
POTB |= (1<<PORTB0);
PCICR |= (1<<PCIE0);
PCMSK0 |= (1<<PCINT0);
}
Void ConfigTIMER0_CTC(VOID)
{
TCCR0A = (1<<WGM01); OCR0A = 249;
TCCR0B = (1<<CS01) | (1<<CS00);
TIMSK0 = (1<<OCIE0A);
}
Int main(void)
{
DDRD = 0XFF;
ConfigPCINT0();
ConfigTIMER0_CTC();
Sei();
While(1)
{
While(i<8)
{
If(mudaled)
{
PORTD = seqleds[contador]; mudaled=0;
Contador++;
i++;
}
}
Atraso=(atraso/2); i=0;
contador=0;
if(atraso<125)
{
atraso=1000;
}
}
ISR(PCINT0_vect)
{
Cnt=0;
atraso=1000; i=0;
contador=0;
portd=0x00;
}
ISR(TIMER0_COMPA_vect)
{
Cnt++;
If(Cnt>=atraso)
{
Cnt=0;
Mudaled=1;
}
}