·

Engenharia de Software ·

Microeletrônica

Envie sua pergunta para a IA e receba a resposta na hora

Fazer Pergunta

Texto de pré-visualização

1 RELATÓRIO 9 Data Disciplina E209 Prof João Pedro Magalhães de Paula Paiva Monitores Thalita Domingos João Henrique Delfino Pedro Fraga Conteúdo Microcontrolador ATMega328p Tema ATMega 328 Temporizador Nome Matrícula Curso OBJETIVOS Utilizar a ferramentas de simulação para desenvolver programas para o ATMega328p Desenvolver um programa de controle que faça uso do temporizador interno Utilizar as entradas e saídas do ATMega328p com circuitos de aplicação Parte Teórica Temporizador Timer O timer é um bloco interno do microcontrolador capaz de contar tempo Qualquer temporizador programável é um contador no qual os pulsos de clock possuem um período fixo Ou seja se o clock está ajustado para um período de 1ms e o contador apresenta em um determinado momento o número 100 significa que se passaram 100ms admitindo o início em 0 O ATMega328p possui 3 temporizadores internos sendo o timer 0 e 2 de 8 bits e o timer 1 de 16 bits com fonte de clock ajustável A base de tempo dos TIMERS podem ser ajustadas entre algumas opções No caso que vamos abordar a fonte de clock do timer é o clock do cristal XTAL 16MHzO valor padrão é 16 MHz ou seja o período base é de 625ns Atentese que esse valor de frequência está ajustado na inicialização do programa pela calibração do oscilador interno que também possui outros valores calibrados Além disso é possível ajustar diferentes fatores de divisão para o sinal de clock dos TIMERS em 8 64 256 1024 ou seja Se fator de divisão 8 Fclk 16MHz8 2MHz Tclk 500ns Se fator de divisão 64 Fclk 16MHz64 250kHz Tclk 4μs Se fator de divisão 256 Fclk 16MHz256 625kHz Tclk 16μs Se fator de divisão 1024 Fclk 16MHz1024 156kHz Tclk 64μs O timer do ATMega238p tem vários modos normal CTC Clear timer on compare match PWM Fast PWM O nosso interesse é no modo CTC ou seja modo de comparação que é feito pela configuração dos campos WGM00 0 WGM01 1 no registrador TCCR0A A contagem é realizada pelo registro TCNT0 e ele é comparado com o registro OCR0A ou OCR0B Essa contagem está representada nas Figuras 1 e 2 Quando o valor do TCNT0 atinge o valor de OCR0A ou OCR0B o fim da contagem é indicado por um bit de sinalização chamado de flag de interrupção nesse caso a flag do canal OCR0A que é OCF0A Nesse momento o valor do TCNT0 é automaticamente zerado e a contagem é reiniciada e o processo se repete Figura 1 Contagem crescente do Timer0 até o valor do OCR0A 2 Os 3 timers internos do ATMega328p são independentes Timer0 Timer1 e Timer2 Como iremos utilizar o Timer0 os registros TCCR0A TCCR0B OCR0A e TIMSK0 devem ser configurados para gerar uma interrupção a cada intervalo desejado De forma geral sempre utilizamos a seguinte sequência de configurações para um timer qualquer 1 Configurar o modo de operação do timer e o divisor de clock TCCR0A e TCCR0B 2 Configurar o valor máximo de contagem OCR0A 3 Habilitar a interrupção do comparador desejado TIMSK0 4 Habilitar a interrupção global do microcontrolador sei Exemplos de como configurar o Timer linhas de comando no programa Para essa etapa você primeiro deve saber exatamente como quer preparar seu timer ou seja qual a base de tempo e como vai gerar a interrupção de tratamento A primeira coisa é configurar o modo do contador para CTC TCCR0A 1 WGM01 Após configurar o modo é necessário decidir o divisor do clock base FCPU 16MHZ os valores oferecidos são 8 64 256 1024 Se optar por usar a divisão lembrese que o tempo base de contagem irá mudar por exemplo O clock de 16MHZ dividido por 256 será igual à 625kHz 16MHZ256 165kHz assim você terá um período base de 16μs TCCR0B 1 CS02 Após escolher o clock base e o divisor você estará apto a escolher o tempo que quer que seu timer conte Sabendo que o timer conta quantos ciclos de clock ocorreram se ele contar 10 clocks de 16μs cada ele terá contado por 160us Dessa forma se quer contar 100ms com um período de clock de 16μs é necessário contar 6250 pulsos de clock Lembrese que o TIMER tem 8 bits logo pode contar de 0 a 255 O valor a ser contado deve ser OCR0A INTERVALO Agora temos um timer configurado e contando um tempo específico entretanto ele ainda não é capaz de avisar ao ATMega328p que o tempo definido foi alcançado Para isso é necessário ligar a Interrupção do comparador e criar a função de tratamento Lembrese de acionar a interrupção global caso ela ainda não esteja acionada Linha para ligar interrupção do comparador A do timer0 TIMSK0 1 OCIE0A Linha para ligar interrupção GLOBAL sei Função de tratamento da interrupção ISRTIMER0COMPAvect aqui você colocara o que será realizado toda vez que o timer estourar Algo muito comum de acontecer é quando a capacidade de contagem do timer não é o suficiente para alcançar o tempo desejado para isso podemos dividir o valor total em pequenos valores que cabem entre 0 e 255 Dentro da interrupção do timer colocamos uma variável que contará quantas vezes o timer estourou Número de interrupções geradas Usando essa variável podemos saber quanto tempo já se 3 passou desde que o timer iniciou e se o tempo que queremos já foi alcançado Por exemplo Para contar 1 segundo usando um clock de 16MHz e o divisor 1024 Tclock 64us com limite de 200 contagens no OCR0A ou seja cada vez que o TCNT0 zerar terá se passado64us x 200 128ms sendo assim conseguiremos contar 1 segundo Então dividimos esse 1 segundo por 128ms ou seja teremos que entrar na função de interrupção 78 vezes 78 128ms 1s ISRTIMER0COMPAvect Vetor de interrupção compa cont ifcont 78 aqui você colocará sua lógica toda vez que o timer estourar 78 vezes totalizando 1 segundo cont 0 Dica Ao invés de digitar todas essas linhas em sua função MAIN podemos criar funções extras para diferentes propósitos como void ConfigTimer0void TCCR0B 1CS021CS00 TCCR0A 1WGM01 OCR0A INTERVALO TIMSK0 1OCIE0A E também void DisableTimer0void TCCR0B 0 Essas funções extras que criamos tornam o código mais organizado e fácil de identificar erros Parte Prática Programa 1 Pisca LED Crie um projeto que após a inicialização do ATMega328p um LED Vermelho fique piscando com um tempo de 150ms O projeto deve fazer uso do periférico TIMER e não pode conter linhas de delay Programa 2 Cronômetro Desenvolva um programa que faça com que um LED Vermelho indique cada segundo fique aceso por 100ms e apaga e um LED Verde indique os minutos acende por 100ms e apaga Use o temporizador 4 ANEXO Registros principais fonte UserManual ATMega328p