






























Estude fácil! Tem muito documento disponível na Docsity
Ganhe pontos ajudando outros esrudantes ou compre um plano Premium
Prepare-se para as provas
Estude fácil! Tem muito documento disponível na Docsity
Prepare-se para as provas com trabalhos de outros alunos como você, aqui na Docsity
Encontra documentos específicos para os exames da tua universidade
Prepare-se com as videoaulas e exercícios resolvidos criados a partir da grade da sua Universidade
Responda perguntas de provas passadas e avalie sua preparação.
Ganhe pontos para baixar
Ganhe pontos ajudando outros esrudantes ou compre um plano Premium
Estudos básicos para eletrônica
Tipologia: Resumos
1 / 38
Esta página não é visível na pré-visualização
Não perca as partes importantes!































Resumo Esta nota técnica pretende auxiliar aqueles que dão seus primeiros passos no desenvolvimento de projetos com microcontroladores. Mais especificamente, ela deve servir como um guia introdu- tório ao microcontrolador AVR ATmega8, da Atmel, descrevendo os procedimentos básicos para programação e algumas de suas funções básicas.
Revisões: 01/06/2008 Atualização do texto para a mais recente distribuição do Wi- nAVR e correção no código exemplo para conversor A/D considerando a conexão usada no circuito de teste. 11/06/2006 Pequenas alterações (redução do tamanho da fonte usada para listagens de programas) e inclusão de uma figura que ilustra melhor a soldagem da placa da gravadora BSD com o conector DB-25. 04/06/2006 Revisão geral do texto, inclusão de material sobre gravadora BSD, LCD e terminal. 17/01/2005 Primeira versão da nota técnica sobre AVR
utiliza-se a técnica do pipeline, em que, enquanto uma instrução começa a ser executada, uma outra já é buscada na memória de programa para que a mesma possa ser executada no próximo ciclo de relógio. A Figura 1 ilustra o diagrama de blocos do microcontrolador [Atmel 2004].
3 Ferramentas de desenvolvimento
Para desenvolvimento com o ATmega8, o hardware mínimo sugerido é dado por um circuito de referência e pela gravadora BSD, mostrados na Figura 2. O circuito de referência contém o mínimo para o o ATmega8 funcionar apropriadamente, podendo ser conectado diretamente a uma protoboard para desenvolvimento. A gravadora possui um conector para o circuito de referência e um outro para porta paralela de microcomputadores PC. As seções seguintes apresentam seus circuitos e descrevem os procedimentos de montagem.
3.1.1 Gravadora BSD
A gravadora é um circuito faz a interface entre o microcomputador e o microcontrolador, realizando as tarefas de programação e configuração. Elas são projetadas de acordo com as particularidades técnicas de cada microcontrolador e utilizam geralmente as portas serial ou paralela do PC. Para o caso do AVR, existem alguns modelos comerciais, mas também existem muitos outros gratuitos, que podem ser montados sem muita dificuldade. No caso do LCVC, costuma-se utilizar a gravadora BSD. Seu diagrama esquemático está disponível na Figura 3. A gravadora é conectada ao microcomputador pela porta paralela, e ao microcontrolador por meio de um flat cable com conector de 10 pinos na extremidade. Sua alimentação é proveniente do circuito em que a gravadora será conectada. Os pinos 9 e 10 do conector da gravadora não devem ser usados. desta forma, se o usuário cometer o erro de inverter o conector, isto não deve causar a queima de componentes. Para montar a gravadora, são necessários os seguintes componentes (c.f. Figura 4):
Para a BSD, sugere-se o layout da Figura 5(a). Essa placa é soldada diretamente a um conector DB-25 macho, utilizado para conectar à porta paralela de um PC. Conforme as setas em azul na Figura 5(b), os quatro furos mais à esquerda são para conexões por meio de fios com os pinos 7, 8 , 9 e 10 do DB-25. Já nos oito furos à direita, são soldados cada fio do flat cable, tomando-se o cuidado que o terceiro fio é trocado com o quinto. Ainda na Figura 5(b), a linha vermelha vertical é um fio que une os dois furos nos extremos da placa e também fica na parte superior da mesma. O 74LS é soldado direto na placa, sem soquete, sendo que o pino 1 é o que está mais próximo do resitor de 6k8. Para a soldagem do conector DB-25, deve-se colocar a placa entre os pinos inferiores e superiores do conector, conforme mostras as Figuras 5(c)-(e). A face do cobre está voltada para os pinos inferiores
Figura 1: Diagrama de blocos do microcontrolador [Atmel 2004].
Figura 4: Material para montagem da gravadora BSD
(14 a 25). Certifique-se de que a placa está bem centralizada no mesmo e solde os pinos de 18 a 25 uns aos outros, conforme a Figura 5(c). Na placa, a face do cobre deve alcançar do pino 19 ao 23, que devem ser soldados à placa. Por último, para colocação do conector no flat cable, deve-se tomar cuidado para que o fio 1 do cabo corresponda ao pino 1 do conector, indicado por uma pequena seta em relevo, conforme mostra a Figura 5(f).
3.1.2 Circuito de referência
O circuito de referência é um circuito que serve de base para o desenvolvimento com o ATmega8. Nele estão os capacitores de desacoplamento para alimentação e conversor A/D, assim como um conector header para a gravadora BSD. Neste documento propõe-se o esquemático da Figura 6. Neste circuito, o cristal é opcional, devendo este ser usado quando a fonte de relógio da CPU for cristal externo. De forma similar à gravadora BSD, sugere-se uma placa de circuito impressso para o circuito de referência. Esta placa foi concebida de modo a permitir que o circuito de referência seja inserido em protoboard, facilitando assim o desenvolvimento com o ATmega8. Para a montagem desse módulo, são necessários os seguintes componentes (c.f. Figura 7(a)):
(a) Layout inferior (b) Face superior (fazer atenção com a seqüência dos fios do flat cable)
(c) Inserção da placa entre os pinos do conector DB-
(d) Montagem superior
(e) Montagem inferior (f) Conector
Figura 5: Placa da gravadora BSD e sua montagem no conector DB-25.
Figura 6: Circuito de referência para o ATmega
(a) Layout inferior (b) Face superior
(c) Vista superior (d) Vista inferior (e) Vista lateral
Figura 8: Montagem do circuito de referência ATmega
3.1.4 Observações muito importantes
Nunca se deve desconectar a gravadora do circuito (ou do PC) com o Atmega8 ligado. Este procedi- mento pode gerar gravação do registro LFUSE para o valor 00h (hexadecimal), que leva o microcon- trolador a operar somente com fonte de relógio externa. Isto impossibilita a gravação do ATmega com qualquer outra fonte de relógio, inclusive a que vinha sendo usada. Para recuperar o microcontro- lador, deve-se construir um oscilador externo a 1MHz, conectá-lo ao ATmega8, e usar o avrdude.exe no modo unsafe para alterar o conteúdo de LFUSE (e possivelmente HFUSE).
Tendo disponíveis a gravadora e o circuito do microcontrolador, deve-se providenciar o ambiente com- putacional que se comunicará com o dispositivo de acordo com o protocolo estabelecido pelo fabricante. De fato, necessita-se ao menos de um compilador e/ou um montador para o microcontrolador, e um programa responsável pela gravação do dispositivo por meio do hadware da gravadora. No caso do LCVC, utiliza-se largamente o WinAVR, um pacote de programas em código aberto para desenvolvimento com microcontroladores da família AVR da Atmel no ambiente Windows, que inclui um editor de texto, debugger, bibliotecas em C, entre outros. Entre os programas mais impor- tantes que acompanham o pacote, são descritos a seguir:
3.2.1 WinAVR
Como mencionado anteriormente, o WinAVR é um pacote de vários softwares utilitários para de- senvolvimento com a família AVR. O site da distribuição é http://winavr.sourceforge.net/. Sua instalação é trivial, bastando seguir os passos indicados pelo programa de instalação. Entretanto, no caso de Windows 2000/XP, faz-se necessário ter privilégios de administrador do sistema. Após instalação, é criado o diretório WinAVR na raiz de algum disco do microcomputador, assim como \WinAVR\bin;\WinAVR\utils\bin; é inserido na variável de ambiente PATH. Se os programas que compõem o WinAVR não funcionarem após instalação, deve-ser verificar se a variável PATH foi real- mente alterada. Caso não, sua alteração deve ser feita manualmente. Ap[os a instalação do WinAVR, recomenda-se uma leitura do seu manual, acessível no menu de programas.
3.2.2 Programmer’s Notepad
Programmer’s Notepad 2 (PN) é uma ambiente de desenvolvimento integrado (IDE, do inglês) que acompanha o pacote. Através do PN é possível criar um projeto, que é composto de um ou mais arquivos, editar os arquivos e compilar o projeto. A Figura 9 mostra o PC aberto com um projeto, em que se vê os arquivos que compõem o projeto (main.c e makefile), o arquivo main.c aberto para edição com diferentes cores para as estruturas do programa em linguagem C, e uma janela de saída, que contém mensagens de compilação. Quando instalado, o PN deve ser o programa default para abrir arquivos com a extensão .pnproj, que é a extensão do arquivo principal de um projeto. Os passos para criar um novo projeto são os seguintes:
3.2.4 avr-toochain
O projeto GNU (GNU is not GNU)^1 foi iniciado em 1984 por Richard Stallman com o objetivo de criar um sistema operacional totalmente livre, além de ferramentas para desenvolvimento. O projeto iniciou com as ferramentas, e abraçou o sistema operacional Linux em 1991 como alvo dos desenvolvimentos. Entretanto, muitas das ferramentas também funcionam no Windows, permitindo assim uma maior difusão do software livre. Desta forma, é possível desenvolver programas para vários microprocessadores e microcontroladores sem a necessidade de comprar ferramentas comerciais. Para o caso do AVR, tem-se, entre outras ferramentas, o avr-gcc (compilador C), avr-g++ (compilador C++), avr-as (assembler) e avr-ld (linker). No WinAVR, estas ferramentas estão instaladas no diretório \WinAVR\bin. As ferramentas GNU não são descritas em detalhe nesta versão do documento. Uma descrição detalhada é feita no site http://www.gnu.org/manual/manual.html, em que tem-se apenas o nome da ferramenta sem o prefixo avr-. Com a instalação do WinAVR, na barra de ferramentas é criada uma pasta WinAVR com al- guns links, entre eles o avr-libc manual. Este link aponta para o arquivo \WinAVR\doc\avr-libc
avr-libc-user-manual\index.html que é o manual da biblioteca LibC para a família AVR. LibC é a na verdade um conjunto de bibliotecas básicas para se trabalhar com linguagem C/C++ para a família AVR. O manual da biblioteca LibC é sempre bastante consultado para desenvolvimento.
4 Procedimentos básicos de desenvolvimento
Cabe dizer, neste momento, que esta nota técnica trata apenas do desenvolvimento de projetos em linguagem C. Para aqueles que gostariam de trabalhar com linguagem assembly, a principal diferença está que os arquivos fonte possuem extensão .s, mudando muito pouco a nível do processo de cons- trução da imagem hexadecimal a ser programada no microcontrolador. Porém, cabe colocar que a escolha pela programação em assembly não gera tantos benefícios em termos de desempenho quanto se obtém em outros microcontroladores, principalmente devido (i) ao grande número de instruções RISC da família AVR e (ii) porque o compilador da linguagem C (i.e., gcc) é bastante eficiente e foi amplamente testado. Entretanto, existe espaço para que trechos de código sejam escritos em as- sembly, principalmente se for desejado fazer manipulações diretamente em registradores da CPU ou realizar operações de muito baixo nível, não permitidas pela linguagem C. Considerando o circuito da Figura 12 no Anexo E, sugere-se um simples programa para acen- der intermitentemente um LED ligado a uma porta de E/S do microcontrolador. O algoritmo é extremamente simples e não requer maiores explicações além daquelas disponíveis no código, listado logo abaixo. De fato, o programa simplesmente liga e desliga o LED a um período que depende da constante TROCA. As montagem do circuito necessário para a visualização do resultado é composto unicamente pela ligação do LED e de um resistor de 220Ω entre o pino 5 (PD3) e +5V, conforme mostrado no circuito 12.
#include <inttypes.h> #include <avr/io.h> #define TROCA 10000
void main (void) { int cont = 0;
DDRD |= _BV(DDD3); /* Neste comando seta-se o pino correspondente como pino de saída. Poderia-se obter o mesmo efeito com o comando (^1) Para entender melhor o porquê desta sigla, sugere-se uma consulta ao site http://pt.wikipedia.org/wiki/GNU
DDRD |= 0x04; */ for(;;){ cont++; if (cont == TROCA){ cont = 0; PORTD = ~PORTD; } } }
Se denominarmos o programa acima de teste.c, ele deve fazer parte de um projeto do Program- mer’s Notepad, conforme explicado na Seção 3.2.2. Um exemplo de makefile é mostrado no Anexo D. Entretanto, aquele arquivo precisa sofrer uma alteração para funcionar corretamente com o projeto:
Com as alterações acima, o programa está pronto para ser compilado através da opção “[WinAVR] Make All” do menu Tools. Se nenhum erro ocorrer, o resultado projeto.hex poderá ser gravado no microcontrolador usando o programa Avrdude. Para tanto, basta chamar a opção “[WinAVR] Program” do menu Tools.
O ATmega8 possui alguns registros de configuração que não são acessíveis pelo programa gravado na memória flash. Estes registros definem a configuração de hardware do microcontrolador, habilitando ou não algumas de suas características. Estes registros são descritos na seção Memory Programming do manual [Atmel 2004]. São registros de proteção de código e dados (Lock bit byte), fusíveis de configuração (Fuse High byte e Fuse Low Byte), bytes de assinatura do dispositivo e byte de cali- bração do oscilador interno. Destes registros, um dos mais usados é o Fuse Low byte pois determina principalmente a principal fonte de relógio da CPU. Para alterar qualquer um dos registros de configuração, isto somente pode ser feito através do programa avrdude.exe operando no modo unsafe (opção -u). Por exemplo, a seqüência de operações abaixo permite obter os valores gravados nos registros Fuse High byte (hfuse no avrdude) e Fuse Low byte (lfuse no avrdude):
C:>avrdude.exe -p atmega8 -c bsd -P lpt1 -t -u avrdude.exe: AVR device initialized and ready to accept instructions Reading | ################################################## | 100% 0.00s avrdude.exe: Device signature = 0x1e avrdude> d hfuse
d hfuse 0000 d9 |+ | avrdude> d lfuse d lfuse
(a) (b) (c)
Figura 11: Conexões de fontes externas de relógio: (a) Cristal/ressonador externo, C1 = C2 = 22pF, (b) Circuito RC externo com freqüência dada por f = 1/(3RC) e (c) Oscilador externo [Atmel 2004].
microcontrolador mais imune a interferência externa e permitindo XTAL2 ser conectado a uma porta CMOS/TTL. Por outro lado, com CKOPT programado em 1, a faixa de variação de XTAL2 é bem pequena, o que implica também em menor consumo de energia;
Ainda de acordo com a Figura 10, cada um dos sinais de relógio gerados pode ser desligado independentemente (ver seção Power Managament and Sleep Modes, em [Atmel 2004]). Além disso, é importante destacar que o Watchdog Timer, que funciona como um dispositivo de proteção que reinicia o microcontrolador após o não cumprimento de determinada condição em um intervalo de tempo especificado, é conectado diretamente à fonte de relógio, e não à Unidade de Controle do Relógio, para proporcionar maior confiabilidade ao sistema. Deve ser observado que o ATmega8 já vem de fábrica configurado para fonte de relógio dada pelo circuito RC interno a 1MHz [Atmel 2004]. Para alterar a fonte de relógio a ser utilizada, deve-se escrever no registro de configuração Fuse Low Byte, conforme ilustrado pela Seção 4.2. A Tabela 1 apresenta as fontes de relógio e o conteúdo que deve conter os bits CKOPT (registro Fuse High Byte) e CKSEL3, CKSEL2, CKSEL1 e CKSEL0 (registro Fuse Low Byte). Algumas vezes, alguma efeito externo provoca a gravação do Fuse Low Byte para 00h, que implica no uso de fonte externa de relógio. Se isto ocorrer, um procedimento que vem sendo usado no LCVC consiste em aplicar uma onda quadrada de aproximadamente 1MHz em XTAL1 e refazer a programação dos registros usando o avrdude.exe. Uma vez alterada a fonte do relógio, a alteração somente tem efeito após reiniciar o microcontro- lador. Isto significa que da próxima vez que avrdude for usado para gravação, a nova fonte de relógio já passa a ser utilizada. O mesmo ocorre com o programa da Flash, que passa a operar com a nova fonte de relógio selecionada.
Tabela 1: Seleção da fonte de relógio e bits CKOPT, CKSEL3..0 do registro Low Fuse Byte. Bit CKSEL Fonte de relógio Freqüência CKOPT 3 2 1 0 Oscilador externo no pino 9 (XTAL1) 0 - 16 MHz X 0 0 0 0 Circuito RC interno calibrado 1,0 MHz X 0 0 0 1 Circuito RC interno calibrado 2,0 MHz X 0 0 1 0 Circuito RC interno calibrado 4,0 MHz X 0 0 1 1 Circuito RC interno calibrado 8,0 MHz X 0 1 0 0 Circuito RC externo < 0,9 MHz X 0 1 0 1 Circuito RC externo 0,9 MHz - 3,0 MHz X 0 1 1 0 Circuito RC externo 3,0 MHz - 8,0 MHz X 0 1 1 1 Circuito RC externo 8,0 MHz - 12,0 MHz X 1 0 0 0 Cristal externo (baixa freqüência) alguns KHz X 1 0 0 1 Cristal externo (média freqüência) 0,9 MHz - 3,0 MHz X 1 1 0 1 Cristal externo (alta freqüência) 3,0 MHz - 16,0 MHz X 1 1 1 1 Ressonador cerâmico externo 0,4 MHz - 0,9 MHz 1 1 0 1 0
5 Funcionalidades particulares
Esta seção pretende ilustrar o uso de algumas das principais funções disponibilizadas pelo AVR. Essas funções são, em alguns casos, implementações em hardware de funcionalidades que até poderiam ser executadas por software, mas que, dessa forma, poderiam resultar em um código bastante complexo, além de um custo computacional consideravelmente maior.
Um aspecto muito importante na utilização de um microcontrolador é o tratamento das interrupções, que podem ser tanto internas quanto externas. Pode-se descrever interrupções como sendo desvios condicionais efetuados pelo programa em função da ocorrência de um fenômeno prioritário ocorrido em um determinado instante. As interrupções são muito importantes, pois elas permitem o processamento adequado em resposta a eventos internos ou externos, aumentado a possibilidade de interação com o meio. De acordo com [Atmel 2004], como medida de segurança, existe para cada interrupção um vetor de registradores único. Essa configuração impede a execução de uma nova instância da mesma interrup- ção quando outra estiver sendo executada. Um outro fato importante é a existência de prioridades na execução das interrupções, ou seja, caso a prioridade de uma interrupção seja maior que a de outra, o seu endereço é colocada no vetor geral de interrupção como prioritária e conseqüentemente será processada primeiro em caso dos eventos ocorrerem simultaneamente. Para cada fonte de interrupção, existe um bit responsável por sua habilitação. Este bit fica em algum dos registros do periférico associado à interrupção. Mas também existe o bit I do registro SREG (registro de estado do microcontrolador) que, quando setado em 1, habilita a ocorrência de qualquer interrupção que tenha sido habilitada em seu periférico reponsável. Se este bit for colocado em 0, então nenhuma solicitação de interrupção será atendida, mesmo se a interrupção for habilitada em seu periférico. Se ocorrer uma solicitação de interrupção habilitada com o bit I em 0, então o atendimento somente ocorrerá quando o bit I for colocado em 1. Para garantir atomicidade no procedimento de alteração do bit I em linguagem C, deve-se usar as funções sei() e cli(), que correspondem às instruções assembly sei (set I bit) e cli (clear I bit). Asism, sei() habilita globalmente as interrupções, enquanto que cli() desabilita globalmente as interrupções. Nesta seção serão tratadas apenas as interrupções externas, visto que a maior parte dos outras interrupções disponíveis estão relacionadas às funcionalidades descritas nas próximas seções. Para
Cada um desses dispositivos pode ser controlado tanto por uma fonte interna ou externa de relógio. Na maior parte dos casos, entretanto, em que se deseja alterar a base de tempo do timer, utiliza-se a mesma fonte de relógio do programa conjuntamente com o chamado prescaler, que se trata basicamente de um divisor de freqüência que altera o período de atualização do timer. A definição do valor do prescaler é feita por meio do registrador TCCRX. Caso o relógio de referência seja 8 , 000 M Hz e o prescaler seja configurado em 8 , por exemplo, a freqüência resultante será dada por:
f = 8 M Hz 8 = 1 M Hz
5.2.1 Funções Periódicas
Uma das interessantes aplicações dos timers/counters disponíveis no AVR é a geração de funções periódicas. Essas funções podem ser utilizadas tanto para aquisição de dados e atuação em sistemas de controle de acordo com taxas de amostragem de período fixo, quanto para contagem de pulsos em determinado intervalo de tempo para medição de velocidade de rotação de um motor, por exemplo. Mais especificamente, a função periódica nada mais é do que um interrupção gerada pelo tem- porizador quando este atinge o valor máximo de contagem (overflow ). Para o caso do timer 0, por exemplo, para ativar esta função, basta garantir que o bit TOIE0 do registrador TIMSK esteja escrito com o valor 1. Desta forma, no momento em que o contador ultrapassar seu valor máximo, será exe- cutado o código contido na macro SIGNAL(TIMER _OVERFLOW0). Caso o relógio de referência seja 8. 000 KHz e o prescaler seja configurado em 8 , por exemplo, o período de amostragem da função será dado por:
Ta =
= 0, 256 ms
Caso seja do interesse utilizar taxas de amostragem mais precisas, além de alterar os valores do relógio e do prescaler, pode-se, por exemplo, escrever determinado valor no registrador TCNT0 toda vez em que ocorrer o sinal de overflow. Assim, cada contagem se dará a partir do valor escrito, e não do zero, que é o padrão. A configuração destas funcionalidades nos outros dois timers é similar. Basta consultar [Atmel 2004] para verificar os registradores envolvidos.
5.2.2 PWM
Com exceção do timer/counter 0, os outros temporizadores trazem consigo a funcionalidade da con- figuração do PWM. Como já foi dito, este tipo de modulação é muito utilizado para o acionamento de motores de corrente contínua. Um exemplo de circuito utilizado para tal finalidade com o uso do AVR e do circuito integrado L298 encontra-se disponível no circuito do Anexo E. Neste exemplo, implementou-se um controle bidirecional de velocidade (um ciclo de trabalho de 50 % mantém o motor parado e o sinal do pino 14 deve ser o complemento do sinal do pino 15). A geração do sinal PWM com o AVR se baseia na comparação dos estados dos contadores com valores pré-determinados. Assim, o resultado dessa comparação é utilizado para alterar a saída do PWM e, em última instância, definir o ciclo de trabalho do sinal PWM gerado. Neste contexto, o ATmega8 permite a geração de três sinais PWM simultâneos. Dois deles são gerados com o timer/counter 1, que permite resolução de 16 bits, e o outro com o timer/counter 2, cuja resolução permitida é de 8 bits. A configuração dessa função é relativamente simples, bastando atentar às tabelas de configuração referentes aos registradores TCCR1A, TCCR1B ou TCCR2, dependendo do caso, disponíveis em [Atmel 2004]. Abaixo demonstra-se um exemplo de função para inicializar a geração de dois sinais PWM simultâneos a partir do timer/counter 1. Para alterar o valor da taxa de trabalho, basta escrever nos registradores OCR1AH e OCR1AL para o sinal A e OCR1BH e OCR1BL para o sinal B.
void PWM_Iniciar (void){ // valores iniciais dos sinais PWM OCR1AH = 0x03; OCR1AL = 0xFF; OCR1BH = 0x03; OCR1BL = 0xFF; // configuracao do PWM TCCR1A = _BV(COM1A1) | _BV(COM1A0) | _BV(COM1B1) | _BV(COM1B0) | _BV(WGM10) | _BV(WGM11); TCCR1B = _BV(CS11) | _BV(WGM12); // set PB1 e PB2 as output DDRB = _BV(DDB1) | _BV(DDB2); }
Na configuração acima descrita, o prescaler foi configurado para 8 (CS11) e é utilizado o Fast PWM de 10 bits (WGM10,11,12). Os bits COMXXX são utilizados para definir a saída da operação de comparação.
Muitos sistemas que utilizam microcontroladores requerem a medição de variáveis de natureza analó- gica. Alguns exemplos são a temperatura medida por um termômetro, a posição angular medida por um potenciômetro, entre outros. Neste contexto, para que essas informações possam ser utilizadas pelo microcontrolador, há a necessidade de se converter tais sinais para seus correspondentes digitais. O dispositivo utilizado para esta operação é o conversor analógico/digital, ou conversor A/D. O AVR possui um conversor A/D com resolução de 10 bits. Esse mesmo conversor pode ser acessado por seis diferentes canais nos encapsulamentos PDIP. Ou seja, com um AVR ATmega8 neste encapsulamento pode-se medir facilmente seis sinais analógicos, porém não simultaneamente. Isso se dá porque existe um único conversor A/D com entradas multiplexadas. Além do mais o AVR possui um circuito sample-and-hold que mantém o valor analógico da entrada constante durante o processo de conversão, o que quer dizer que o projetista não precisa se preocupar quanto a esse aspecto no projeto do circuito. De fato, está disponível em anexo um simples circuito para conexão dos valores a serem medidos nos pinos correspondentes. Este circuito oferece certa proteção ao conversor A/D contra sub- e sobre-tensões. Além disso, a conversão A/D se utiliza uma fonte de tensão distinta (AVCC), cujo valor não pode diferir muito do valor de VCC, sendo na verdade a alimentação VCC passada por um filtro para minimizar flutuações na tensão de alimentação do conversor. O conversor A/D ainda requer uma tensão de referência analógica (AREF), que pode ser tanto interna como externa. De fato, o máximo valor obtido na conversão, que seria 1023 visto que o conversor A/D é de 10 bits, ocorrerá quando a entrada se igualar ao valor de AREF. Recomenda-se a consulta ao manual do microcontrolador [Atmel 2004] para melhor compreender o funcionamento do conversor A/D e atentar para restrições de operação, sob o risco de danificar permanentemente o conversor. A utilização das funções de conversão A/D também não é complicada, conforme mostra o exemplo a seguir:
void AD_Iniciar (void) { // enable ADC e prescaler com division factor 64(ADPS2 e ADPS1) ADCSRA = _BV(ADEN) | _BV(ADPS2) | _BV(ADPS1); // setar referência ADMUX = _BV(REFS0); }
void AD_Converter(unsigned char canal, unsigned char *pdatah, unsigned char *pdatal){ ADMUX = _BV(REFS0) | (canal & 0x0F); ADCSRA |= (0x01<<ADSC); // esperar fim de conversao while((ADCSRA & (0x40)));