Informática, perguntado por Viana77, 1 ano atrás

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!!

Anexos:

Soluções para a tarefa

Respondido por ricardomaquinas
7

//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;

}

}


juniorjrsj: Obrigado!!!
Perguntas interessantes