Você está na página 1de 39

Tutorial Microcontroladores AVR Atmega8

Instrumentao UnBall
Engenharia Mecatrnica Universidade de Braslia



Integrantes: Jos Oniram Limaverde
Joo Vitor Vilela
David Bevilaqua
Heyder Arajo
Tiago Silva

12 de Abril de 2010


Sumrio
1. Introduo
2. Microcontrolador Atmel AVR ATmega8
2.1 Arquitetura AVR RISC
2.2 Memria EEPROM
2.3 Memria Flash
2.4 Memria SRAM
2.5 Registradores do Avr
3. Tipos de Variveis
4. Arquitetura de um Programa
4.1 Estrutura Fundamental de um Programa
4.2 Cdigos Exemplos
5. Registradores e Comandos I/O
5.1 Registradores I/O
5.2 Acesso s portas
6. Interrupes
6.1Funcionamento Bsico
6.2 Registradores de Controle
6.3 Cdigos Exemplos
7. Timers/Counters
7.1Caractersticas dos Temporizadores
7.2 Cdigos Exemplos
8. USART
8.1 Registradores de Controle
8.2 Cdigos Exemplos
9. Concluses
10. Bibliografia

1. Introduo
Na rea de Controle e Automao, a necessidade de alguma unidade de processamento se tornou
algum imprescindvel nas mais diversas aplicaes. Dentre essas, os microcontroladores se destacam
como uma alternativa de menor custo, confiabilidade satisfatria, simplicidade, menor consumo de
energia, no entanto, com limitada capacidade de memria e processamento.
Um microcontrolador contm um processador, acesso a memria e perifricos de entrada/sada.
um microprocessador que pode ser programado para funes especficas, em contraste com outros
microprocessadores de propsito gerais (como os utilizados nos PCs). Basicamente, o uso de um
microcontrolador consiste no processamento de dados obtidos em um de seus perifricos, tendo como
sada outro conjunto de dados. Por exemplo, envio de dados via porta serial ou gerar uma reao no
sistema como acender um led.
A arquitetura de um microcontrolador em geral consiste em um ncleo de processamento,
barramento e perifricos:
Ncleo de processamento consiste no processador de dados (clculos, controle de fluxo
de programa, etc) e na administrao dos perifricos.
Barramento dividido em dados e endereos, consiste nas linhas de comunicao entre o
processador e os perifricos.
Perifricos caracterizam o conjunto de funcionalidades disponveis pelo microcontrolador
e so controlados pelo processador. Por exemplo, memria, porta serial, porta paralela e
conversor AD.
Microcontroladores so geralmente utilizados em automao e controle de produtos e
perifricos, como sistemas de controle de motores automotivos, controles remotos, mquinas de
escritrio e residenciais, brinquedos, sistemas de superviso, etc. Dentre os disponveis no mercado,
destaca-se a famlia de microcontroladores AVR da Atmel, em especial o modelo ATmega8, o qual
vai ser utilizado nos projetos do grupo de Instrumentao da UnBall.









2. Microcontrolador Atmel AVR ATmega8
O ATmega8 um microcontrolador de 8-bit com baixo consumo de tecnologia CMOS e
arquitetura RISC. Apresenta a capacidade de executar uma instruo por ciclo de relgio devido
conexo direta de seus 32 registradores gerais com a unidade lgica aritmtica e uma freqncia de
funcionamento numa faixa de 0 a 20 MHz. Alm disso, apesar de ser RISC, possui um grande
nmero de instrues, o que permite melhor otimizao do cdigo de alto nvel em linguagem C.
Outras caractersticas que permitem a maximizao do desempenho e do paralelismo so a
arquitetura Harvard e a tcnica do pipeline Alm disso, destacam-se a presena de memrias Flash,
EEPROM e SRAM, de trs temporizadores/contadores e acionar interrupes. \
2.1 A Arquitetura AVR RISC
A arquitetura RISC, (Reduced Instruction Set Computer), requer menos instrues que, por
exemplo, a tradicional arquitetura CISC, permitindo que os sistemas, nela baseados, possam rodar
mais rpido porque o microprocessador tem funes limitadas, em benefcio de seu desempenho.
O AVR utiliza o conceito de arquitetura Harvard na qual os barramentos de dados e de
instrues so fisicamente separados. A memria de programa executada em pipeline de dois
estgios. Enquanto uma instruo est sendo executada, a prxima instruo previamente buscada
da memria de programa. Esse conceito habilita a execuo de instrues em todo ciclo de clock.
A memria de programa do tipo flash, ou seja, com as instrues relativas de jump e call,
todo o espao de endereamento de 8 K diretamente acessado. A maioria das instrues AVR tem
um nico formato de palavra de 16-bit. Todo endereo da memria de programa contm uma
instruo de 32-bit.
2.2 Memria EEPROM
A EEPROM presente no AVR possui 512 bytes e est ligada ao barramento de dados 8-bit
interno permitindo que possa ser escrita diretamente sobre o microcontrolador durante o processo de
gravao ou que o prprio microcontrolador escreva os dados nas posies desta memria. O tempo
de acesso de gravao em mdia de 2,5 a 4ms, dependendo da tenso a qual submetida.
2.3 Memria Flash
A memria flash ou flash ROM pode ser definida como uma EEPROM que utiliza baixas
tenses de apagamento, e este feito em um tempo reduzido. O apagamento da memria flash
extremamente rpido e, ao contrrio da EEPROM, no possvel reprogramar apenas um nico
endereo, isto , quando a memria apagada, todos os seus endereos so zerados. O AVR
apresenta 8 Kbytes de memria Flash Programvel on-chip para armazenamento de programas.
2.4 Memria SRAM
As informaes existentes em uma memria RAM (Random Access Memor) no so estveis
e, caso no sejam salvas fisicamente, so perdidas ao se desligar o computador. Os 608 endereos
baixos pertencem s alocaes da Memria de Dados do Register File, Memria de I/O e a SRAM
interna. Os primeiros 96 endereos representam o Register File + Memria de I/O, e os prximos 512
endereos a SRAM interna.
2.5 Registradores do AVR
Uma caracterstica bsica a presena de um grupo de registradores internos. A arquitetura
AVR, apresenta 32 registradores de 8 bits, que podem ser manipulados tanto para leitura como para
escrita, como 16 palavras de 16-bit. H tambm os registradores de I/O, os quais so em nmero de
64 e podem ser endereados diretamente em instrues de apenas um ciclo de clock.
O grupo de instrumentao propem o desenvolvimento de um tutorial sobre as diversas
funcionalidades que o ATmega8 pode oferecer para o usurio. Alm disso, introduzir alguns
conhecimentos bsicos sobre a arquitetura de um programa e sobre comandos de entrada/sada.
A partir desse tutorial, o grupo acredita ser possvel que os prximos integrantes do mesmo
possam adquirir informaes importantes para manter a continuao dos projetos em
desenvolvimento.


















3. Tipos de Variveis
Para fazer o processamento, muitas vezes necessrio uso de variveis para armazenar valores a
serem usados posteriormente. Como a memria limitada, interessante que o compilador saiba o
tanto de espao na memria para reservar em relao a cada tipo de varivel, e que o programador
saiba utiliz-las de forma a otimizar o uso de memria.
O compilador gcc-avr nos permite a criao dessas variveis atravs de funes que alocam
essas variveis em endereos na memria do microcontrolador. A biblioteca referenciada pelo
cabealho inttypes.h, define os seguintes tipos:
typedef signed char int8_t;
typedef unsigned char uint8_t;
typedef short int16_t;
typedef unsigned short uint16_t;
typedef long int32_t;
typedef unsigned long uint32_t;
typedef long long int64_t;
typedef unsigned long long uint64_t;
















4. Arquitetura de um Programa
4.1 Estrutura Fundamental de um Programa
Existem basicamente dois mtodos de se escrever um programa, independentemente da
linguagem utilizada, para um microcontrolador: Programao Seqencial e Programao com
Interrupes Controladas.
4.1.1 Programao Seqencial
Nessa tcnica, temos que o programa fica envolvido por um lao continuo em que os dados de
sada retornam rotina inicial indefinidamente, como observado na Figura 4.1.

Figura 4.1 Estrutura bsica de um programa seqencial
4.1.2 Programao com Interrupes Controladas
Neste mtodo, primeiramente, so ativadas as entradas das interrupes para permitir a utilizao
das mesmas. Assim, dentro do loop contnuo do programa, temos que, se uma interrupo ativada,
automaticamente o cdigo referente interrupo executado.

Figura 4.2 Estrutura bsica de um programa com interrupo controlada
4.2 Cdigos exemplos
Uma simples implementao de um programa seqencial pode ser visualizado na Figura 5.3. O
loop contnuo caracterizado pelo while(1) {} em que toda seqncia do cdigo deve est presente
em seu interior.

Figura 4.3 Exemplo de um programa seqencial
Para um programa com interrupes controladas, temos uma implementao que pode ser
visualizada na Figura 4.4. Neste caso, temos que o programa responde a uma interrupo externa, a
qual feita atravs de um boto para alterar o estado de um LED.

Figura 4.4 Exemplo de um programa com interrupo controlada



5. Registradores e Comandos I/O
Os microcontroladores AVR possuem mltiplos registradores, mas a maior parte deles
utilizada para entrada/sada. Outros possuem funes especiais e alguns para acesso de dados na
memria do microcontrolador.
Alm disso, h registradores exclusivos em alguns modelos de AVR. Os nomes dos registradores
so definidos nos header files para os tipos apropriados de AVR, por exemplo, #include<avr/io.h>.

5.1 Registradores I/O
Os registradores de I/O so bastante utilizados para as diversas funes de controle no AVR.
Eles controlam os acessos as portas e as interfaces com o microcontrolador. Deve-se ressaltar que h
diferenciao entre os registradores de 8-BITS e os de 16-BITS.
5.1.1 Leitura de um registrador de I/O
Para leitura, podem-se acessar os registradores de I/O como simples variveis. Em cdigos
fonte, o acesso de leitura feito pela funo inp(). Em verses mais atuais do compilador o acesso
pode ser feito de forma direta e a funo inp() no mais necessria, como observado no cdigo
abaixo.
#include <arv/io.h>

Uint8_t foo;
...

int main(void)
{
// Copia o status dos pinos da porta B na variavl foo
foo = PINB
...
}
5.1.2 Leitura de um bit
A biblioteca do AVR possui funes para averiguao de um bit individual do registrador:
bit_is_set (<Register>, <Bitnumber>):
A funo examina se um bit foi ativado, retornando um valor diferente de 0.
bit_is_clear (<Register>, <Bitnumber>):
A funo examina se o bit foi desativado, retornando um valor diferente de 0.
5.1.3 Escrevendo em um registrador I/O
Para escrita, podem-se acessar os registradores de I/O como simples variveis. Em cdigos fonte
o acesso de leitura feito pela funo outp(). Em verses mais atuais do compilador o acesso pode
ser feito de forma direta e a funo outp() no mais necessria, como observado a seguir.
#include <arv/io.h>
...
int main(void)
{
DDRA = 0xff; // Define todos os pintos como sada
PORTA = 0x03 // Define o nivel de lgico de cada sada
...
}
5.1.4 Escrita de Bits
Uma das maneiras de se alterar o valor de um bit individual atravs de operaes lgicas.

X |= (1 << BitNumber); // A bit in X is set
X &= ~(1 << BitNumber); // A bit is deleted in X

No exemplo abaixo, temos que o segundo bit do registrador est sendo ativado e, em seguida,
est sendo desativado.
#include <arv/io.h>
#define MyBIT 2

PORTA |= (1 << MyBIT); // O bit 2 da Porta A igual a 1
PORTA &= ~(1 << MyBIT); // O bit 2 da Porta A igual a 0
5.2 Acesso s portas do AVR
H trs endereos de memria (registradores) que so alocados para cada uma das portas do
AVR: PORTx (Data Register), DDRx (Data Direction Register) e PINx (Port Inputs Pins). Este
ltimo s utilizado para leitura enquanto que os outros dois podem ser utilizados tanto para leitura
como escrita. Estes esto especificados na Tabela 5.1.
Tabela 5.1 Registradores para direcionar as portas do Avr

Para definir os pinos de 0 a 4 da porta B como sada, podemos utilizar os seguintes comandos:
DDRB=0x0F; ou DDRB = (1 << DDB0)|(1 << DDB1)|(1 << DDB2)|(1 << DDB3);
Assim, para definir uma sada de nvel lgico alto, podemos utilizar os seguintes comandos:
PORTB |=(1 << PB2)|(1 << PB4);
6. Interrupes
Interrupes so eventos de software ou de hardware que ocasionam uma mudana no fluxo do
programa para uma sub-rotina que tratar esse evento.
6.1 Funcionamento Bsico
Aps ocorrer o evento de interrupo, o programa desviado (instruo jump), para um
endereo fixo pr-definido para cada CPU. Cada tipo de evento tem um endereo distinto, dessa
forma o compilador avr-gcc dispe da macro ISR( _vect ) que, a partir do vetor de interrupo, se
encarrega de carregar o cdigo no endereo destinado a interrupo. Os eventos que podem
ocasionar uma interrupo, junto com respectivos vetores de interrupo, so:
RESET
External interrupt 0 - (INT0_vect)
External interrupt 1 - (INT1_vect)
Timer/Counter 2 Compare match - (TIMER2_COMP_vect)
Timer/Counter 2 overflow - (TIMER2_OVF_vect)
Timer/Counter 1A Compare match - (TIMER1_COMPA_vect)
Timer/Counter 1B Compare match - (TIMER1_COMPB_vect)
Timer/Counter 1 overflow - (TIMER1_OVF_vect)
Timer/Counter 0 overflow - (TIMER0_OVF_vect)
UART indication receive - (USART_RXC_vect)
UART indication sent - (USART_TXC_vect)
UART data pointer empty - (USART_UDRE_vect)

Verses antigas no iom8.h

6.2 Registradores de Controle
No AVR, as interrupes so controladas por registradores especficos.
I) MCU Control Register - MCUCR

Este registrador contm os bits de controle para interrupes e funes gerais do MCU.
Bit 3,2 ISC11, ISC10: Interrupt Sense Control 1 Bit 1 and Bit 0
A interrupo externa 1 ativada pelo pino INT1 (PD3) caso o 1-bit de SREG e a mascara de
interrupo correspondente no registrador GICR est ativados. Para mais informaes de como gerar
uma interrupo a partir de INT1, observar a Tabela 6.1.
Tabela 6.1 Bits de controle para a interrupo externa 1

Bit 1,0 ISC01, ISC00: Interrupt Sense Control 0 Bit 1 and Bit 0
A interrupo externa 0 ativada pelo pino INT0 (PD2) caso o 1-bit de SREG e a mascara de
interrupo correspondente no registrador GICR est ativados. Para mais informaes de como gerar
uma interrupo a partir de INT0, observar a Tabela 6.2.
Tabela 6.2 Bits de controle para a interrupo externa 0

II) General Interrupt Control Register - GICR

Bit 7 INT1 External Interrupt Request 1
Quando este bit ativado junto com o 1-bit de SREG, temos que o pino de interrupo externa
ativado, no caso, o pino PD3. Os bits de controle ISC11 e ISC10 vo definir o modo como a
interrupo ser ativada.
Bit 6 INT0 External Interrupt Request 0
Quando este bit ativado junto com o 1-bit de SREG, temos que o pino de interrupo externa
ativado, no caso, o pino PD2. Os bits de controle ISC01 e ISC00 vo definir o modo como a
interrupo ser ativada.
III) General Interrupt Flag Register - GIFR

Bit 7 INTF1 External Interrupt Flag 1
Quando um evento no pino INT1 dispara um pedido de interrupo, temos que ITNF1 ativado.
Se o 1-bit de SREG e o bit INT1 do GICR esto ativados, o MCU vai para o correspondente vetor de
interrupo. O flag desativado quando a rotina de interrupo executada.
Bit 6 INTF0 External Interrupt Flag 0
Quando um evento no pino INT0 dispara um pedido de interrupo, temos que ITNF0 ativado.
Se o 1-bit de SREG e o bit INT0 do GICR esto ativados, o MCU vai para o correspondente vetor de
interrupo. O flag desativado quando a rotina de interrupo executada.
6.3 Cdigos exemplos
Para nosso exemplo, utilizaremos a interrupo para alterarmos o valor dos pinos da porta B
medida que fazemos uma transio de 0 para 5V na porta PD2. Antes de qualquer coisa habilitamos a
interrupo geral no registrador SREG (Status-Register, Accumulator flags) atravs do comando
sei(), para mais detalhes: http://www.avr-asm-tutorial.net/avr_en/beginner/PDETAIL.html#top.
Ativando a habilitao geral, definimos os registradores de controle para podermos perceber a
interrupo em INT0 na borda de subida. Observemos que, logo aps configurarmos, um loop
infinito em um for iniciado, isso , para mostrar que o processamento no ficar gastando
processamento com esse evento e ele s ir para o endereo de INT0_vect, quando o evento
ocorrer, ou seja, a rotina principal poder atender outras possveis prioridades.
// Funcao que responde aa interrupcao externa 0
ISR(INT0_vect)
{
PORTB = ~PORTB;
}

int main(void)
{
// Configurando a interrupcao
sei(); // habilitacao global das interrupcoes
MCUCR = _BV(ISC01) | _BV(ISC00); // Transicao positiva em PD2
(INT0)
GICR = _BV(INT0); // habilita interrupcao INT0
DDRB = _BV(DDB1); // Definindo Port B como sada

for(;;)
{ }
}

Por ltimo, comum encontrarmos exemplos que usam as macros INTERRUPT() ou SIGNAL()
em programas mais antigos. A diferena de uma e da outra que a primeira permite que outras
interrupes ocorram durante outra interrupo que ainda est sendo executada, enquanto que a
segunda no permite assim como IST() que a verso mais nova de SIGNAL().


7. Timers/Counters
Os timers so facilidades presentes no AVR responsveis por realizar contagens de eventos
externos, gerao de freqncia e de sinais PWM (Pulse Width Modulation) e outros.
Em termos simples, todos os timers incrementam ou decrementam em 1 o valor de um
registrador (TCNTx) para cada pulso de clock. Assim, o que ns podemos fazer com esses valores
que se torna bastante interessante.
Tais valores podem ser o mximo valor disponvel pelo contador, constantes, valores de outros
registradores ou zero. O AVR compara continuamente o valor do contador com algum outro
especificado por ns e, assim, pode realizar algum evento caso ocorra uma igualdade.
Cada timer difere na sua resoluo (8 bits ou 16 bits), nos valores que podemos definir como
TOP, em quais I/O pinos so acessveis pelo contador e quais eventos os timers podem fornecer
durante a contagem. Estes eventos podem ativar certo tipo de interrupo (a qual a nica forma para
executar um cdigo arbritrio) ou set/clear/toggle o valor de um I/O pino.
H trs tipos de timers no ATmega8: timer0 (8-bit), timer1 (16-bit) e timer2 (8-bit). O timer2
tem acesso a um I/O pino (OC2) e o timer1 tem acesso a dois I/O pinos (OC1A e OC1B). Enquanto
que o timer0 no possui acesso externo.
A contagem para cada um armazenada no registrador TCNTx. Os contadores sempre
incrementam a partir do zero, exceto quando decrementam durante a segunda metade do modo
Phase Correct PWM em que os timers 1 e 2 so capazes de fazer. O timer0 sempre incrementa. H
alguns registradores que so compartilhados pelos trs temporizadores como o TIFR (Timer/Counter
Interrupt Flag Register) e TIMSK (Timer/Counter Interrupt Mask Register), os quais so
responsveis por controlar a execuo de interrupes.
7.1 Caractersticas dos Temporizadores
7.1.1 Timer0
7.1.1.1 Caractersticas Gerais
o mais simples dos temporizadores no ATmega8 e no possui acesso a I/O pino. Assim, ele
no pode ser utilizado diretamente para PWM ou como um gerador de freqncia externa. O
registrador que armazena o valor da contagem o TCNT0.
Em relao forma que o contador pode ser clockeado, depende de valores atribudos aos bits
CS02:0 que esto definidos no registrador de controle do timer0 (TCCR0). Basicamente, h duas
formas: internamente (diretamente ou por fraes do clock interno) ou externamente.
De qualquer forma, o timer0 no apresenta uma unidade de comparao, ou seja, ele
simplesmente inicia a contagem de 0 (BOTTOM) a 255 ou 0xFF (MAX) repetidamente. H somente
uma interrupo quando ocorre overflow (retorna de 255 a 0). Alm disso, a freqncia de operao
igual a de entrada divida por 256.

7.1.1.2 Timer/Counter Register Description
I) Timer/Counter Control Register 0 TCCR0

Bit 2:0 CS02:0 Clock Select
Esses trs bits selecionam a fonte do clock a ser usado pelo contador. Para informaes
complementares, observar Tabela 7.1.
Tabela 7.1 Clock Select Bit Description

II) Timer/Counter Register 0 TCNT0


Oferece direto acesso e permite operaes de escrita e leitura para o contador.

III) Timer/Counter Interrupt Mask Register TIMSK

No caso do timer0, somente o bit 0 se referem a ele.
Quando o TOIE0 (Timer/Counter0 Overflow Interrupt Enable) ativado, temos que uma
interrupo pode ser executada se ocorrer um overflow no timer2.

IV) Timer/Counter Interrupt Flag Register TIFR

No caso do timer0, somente o bit 0 se refere a ele.
TOV1 (Timer/Counter2 Overflow Flag 1) ativado quando ocorre um overflow no timer0 e
pode ser utilizado para que uma interrupo seja executada neste instante, logo TOIE0 tambm precisa
est ativado.
7.1.2 Timer2
7.1.2.1 Caractersticas Gerais
O MAX para o timer2 255 j que ele possui uma resoluo de 8 bits. possvel determinar o
TOP de duas formas: 0xFF (MAX) ou qualquer valor armazenado no registrador OCR2. Este contador
incrementa na maioria das vezes, mas, no modo Phase Correct PWM ele pode decrementar.
Algumas definies bastante utilizadas, as quais podem ser visualizadas na Tabela 7.2.
Tabela 7.2 Definies padro para o timer2

A Unidade de Comparao continuamente compara TCNT2 com OCR2. Toda vez que ocorre
uma igualdade entre estes dois registradores, OCF2 = 1 para o prximo ciclo de clock. Caso OCIE2 =
1, temos que uma interrupo pode ser gerada. Assim, aps a execuo da interrupo, temos que
OCF2 = 0.
O timer2 apresenta 4 modos de gerao de onda definidos por WGM20 e 21 bits:
NORMAL MODE
O contador sempre incrementar;
Overflows para o zero aps atingir o MAX (255);
Pode disparar alguma interrupo quando o temporizador overflows de volta at o zero;
Pode disparar alguma interrupo quando TCNT2 = OCR2;
Pode set/clear/toggle o pino OC2 quando TCNT2 = OCR2;
Freqncia = clock/(2 * prescale * 256) ;

CTC (Clear Timer on Compare) MODE
Pode ser utilizado para uma base de tempo bem varivel ou gerao de uma onda
quadrada de freqncia varivel no pino OC2;
O contador sempre incrementar;
Recomea a contagem quando TCNT2 = OCR2;
Pode disparar alguma interrupo quando TCNT2 = OCR2 ( e overflows se OCR2 =
MAX);
Freqncia = clock/(2 * prescale * ( 1 + OCR2) );
FAST PWM MODE
Utilizado para PWM (Pulse Width Modulation);
O contador sempre incrementar;
Overflows para o zero aps atingir o MAX (255);
Pode disparar alguma interrupo quando o temporizador overflows de volta at o zero;
Pode disparar alguma interrupo quando TCNT2 = OCR2;
Freqncia = clock/(2 * prescale * 256) ;
A forma de onda PWM gerada pelo setting (ou clearing) o registrador OC2 quando
TCNT2 = OCR2, e clearing (ou setting) o registrador OC2 quando o contador
retorna ao inicio;
PHASE CORRECT PWM MODE
Possibilita a gerao da forma de onda PWM com alta resoluo no pino OC2;
A forma de onda de portadora triangular (dual-slope operation), ou seja, o contador
incrementa do BOTTOM ao MAX e, em seguida, do MAX ao BOTTOM;
OC2 sofre o toggle quando TCNT2 = OCR2 durante o processo de incremento ou
durante o processe de decremento;
Preferido para aplicaes que envolvam o controle de motores;
Freqncia = clock/(prescale * 510) ;
Normal mode e CTC mode so bons para temporizao interna e no necessita do pino OC2, ao
menos que se deseja fazer uma gerao de freqncia externa. Os outros dois modos necessitam que o
pino OC2 esteja conectado a algo.
7.1.2.2 Timer/Counter Register Description
I) Timer/Counter Control Register TCCR2


Bit 7 - FOC2 Force Output Compare
O bit FOC2 somente ativo quando WGW bits especificam Non-PWM mode (Normal ou CTC
Mode). Quando ativado, imediatamente uma comparao forada, logo, OC2 vai apresentar um
comportamento de acordo com valores presentes nos bits COM2:0.
Bit 6:3 WGM21:0 Waveform Generation Mode
Estes bits so responsveis por controlar a seqncia de contagem do contador, definir o valor de
TOP e qual o tipo de gerao da forma de onda a ser utilizada. Informaes complementares seguem
na Tabela 7.3.
Tabela 7.3 Wave Generation Mode Bit Description

Bit 5:4 COM21:0 Compare Match Output Mode
O COM21:0 determinam o comportamento do pino OC2. Dependendo do modo de gerao de
onda, OC2 pode se comportar de maneiras diferentes como se pode observar nas Tabelas 7.4, 7.5 e
7.6.
Tabela 7.4 Comportamento de OC2 para o Non-PWM Mode

Tabela 7.5 Comportamento de OC2 para o Fast PWM Mode


Tabela 7.6 Comportamento de OC2 para o Phase Correct PWM Mode

Bit 2:0 CS22:0 Clock Select
Esses trs bits selecionam a fonte do clock a ser usado pelo contador. Para informaes
complementares, observar Tabela 7.7.
Tabela 7.7 Clock Select Bit Description

II) Timer/Counter Register 2 TCNT2


Oferece direto acesso e permite operaes de escrita e leitura para o contador. Escrevendo no
registrador, temos que a comparao entre TCNT2 e OCR2 bloqueada no prximo intervalo de
clock.
III) Output Compare Register 2 OCR2


O registrador armazena o valor de 8-bit que constantemente comparado com o valor de
TCNT2. Uma igualdade entre os valores pode ser utilizada para gerar uma forma de onda (sada) no
pino OC2.

IV) Timer/Counter Interrupt Mask Register TIMSK

No caso do timer2, somente os bits 7 e 6 devem se referem a ele.
Quando OCIE2 (Timer/Counter2 Output Compare Match Interrupt Enable) ativado,
temos que uma interrupo pode ocorrer se a igualdade entre TCNT2 e OCR2 for vlida.
Quando TOIE2 (Timer/Counter2 Overflow Interrupt Enable) ativado, temos que uma
interrupo pode ser executada se ocorrer um overflow no timer2.
V) Timer/Counter Interrupt Flag Register TIFR

No caso do timer2, somente os bits 7 e 6 devem se referem a ele.
Quando OCF2 (Output Compare Flag 2) ativado, uma interrupo ser executada quando a
igualdade entre TCNT2 e OCR2 for vlida, logo OCIE2 tambm precisa est ativado.
Quando TOV2 (Timer/Counter2 Overflow Flag 2) ativado, uma interrupo ser executada
quando ocorrer um overflow no timer2, logo TOIE2 tambm precisa est ativado.
7.1.3 Timer1
7.1.3.1 Caractersticas Gerais
Diferentemente dos dois outros contadores, esse apresenta a resoluo de 16 bits. Essa
caracterstica permite que se alcance mais preciso no tempo de execuo de eventos, gerao de
ondas e medies envolvendo sinais.
Um ponto importante a se ressaltar capacidade de gerar sinais PWM de forma mais eficiente
que o timer2. Isso se deve h presena de duas unidades de comparao (OC1A e OC1B) e, alm
disso, com 16 bits em vez de 8 aumenta-se a quantidade de diferentes de duty cycles disponveis (256
para 65536).
Em relao aos registradores, temos que TCNT1 (Timer/Counter 1), OCR1A/B (Output
Compare Registers) e o ICR1 (Input Capture Register 1) so todos de 16 bits. H tambm o
TCCR1A/B (Timer/Counter Control Registers), mas esses so de 8 bits. As interrupes so realizadas
mediante aos bits de controle presentes nos registradores TIFR e TIMSK.
Sabe-se que os valores armazenados em OCR1A/B so comparados com valor presente no
contador todo o tempo. O resultado dessa comparao pode ser utilizado na gerao de formas de onda
ou um sinal PWM.
O valor de TOP, ou o mximo valor permitido pelo contador, pode, em alguns modos de
operao, ser definido pelo registrador OCR1A, pelo ICRI ou por valores j fixados. No entanto, a
utilizao de cada um pode causar algumas desvantagens, por exemplo, se utilizarmos o OCR1A como
TOP no modo PWM, este no pode ser utilizado para a gerao de sinais PWM na sada. Alm de
TOP, algumas outras definies para o timer0 so importantes de serem analisadas, como podemos
observar na Tabela 7.8.
Tabela 7.8 Definies padro para o timer1

Em relao forma que o contador pode ser clockeado, depende de valores atribudos aos bits
CS12:0 que esto definidos no registrador de controle B do timer0 (TCCR1B). Basicamente, h duas
formas: internamente (diretamente ou por fraes do clock interno) ou externamente.
A seqncia de contagem ser determinada a partir dos valores atribudos aos bits WGM13:0, os
quais esto definidos nos registradores de controle A e B do timer0 (TCCR1A e TCCR1B).
Escolhendo o modo de operao que vai ser possvel determinar como ser a forma de onda gerada
na sada. Alm disso, a gerao de uma interrupo determinada a partir de uma flag especifica do
timer1 TOV1.
Assim, a partir da combinao entre os bits CS12:0 e WGM13:0, podemos definir um dos 5
modos de operao do contador. O primeiro grupo de bits no interfere na seqncia de contagem
enquanto que o segundo interfere.
Alm disso, os bits CS12:0 se comportam de forma diferente entre os modos. Naqueles que
fornecem um sinal PWM na sada, temos que so responsveis por determinar se a sada deve ser ou
no invertida. No outro caso, temos que so responsveis por determinar se a sada vai ser ativada,
desativado ou invertida (toggle) quando a unidade de comparao informa que ocorreu uma igualdade.
Os diagramas de tempo para cada um dos modos pode ser visualizado do datasheet. As
caractersticas gerais de cada um podem ser visualizadas a seguir.


NORMAL MODE
Dentre todos, o mais simples;
A contagem sempre no sentido de incrementar o valor;
Ao atingir o MAX (0xFFFF), o contador retorna ao BOTTOM (0x0000);
No momento que o contador retorna ao inicio, a flag TV01 ativada, permitindo, assim,
que uma interrupo possa ser executada nesse instante;
Pode-se utilizar o a unidade de comparao para gerar interrupes em um dado instante;
No recomendado para a gerao de formas de onda;

CTC (Clear Timer on Compare) MODE
Utilizam-se os registradores OCR1A ou ICR1 para manipular a resoluo do contador, ou
seja, definem o valor mximo do contador (TOP);
O contador retorna a zero quando TCNT1 = OCR1A ou TCNT1 = ICR1;
Uma interrupo pode ser gerada a cada momento que o contador chega ao TOP
utilizando a flag OC1A ou ICF1 flag, de acordo com que registrador vai definir TOP;
Em relao gerao de onda, a sada OC1A pode ser invertida (toggle) a cada momento
que a unidade de comparao reconhece uma igualdade de valores. A freqncia mxima
obtida a metade da freqncia de clock.
No caso geral, temos que freqncia = clock/(2 * prescale * ( 1 + OCR2) );
Como no modo Normal, TOV1 ativado no ciclo de clock que o contador vai do MAX
at BOTTOM;

FAST PWM MODE
Utilizado para gerao de sinais PWM (Pulse Width Modulation) de alta freqncia;
Difere dos modos seguintes ao utilizar uma onda dente-de-serra (single-slope operation)
para gerao dos sinais PWM;
O contador somente incrementar;
No modo no-inversor, temos que OC1x ser desativado (cleared) quando TCNT1 =
OCR1x, enquanto que ser ativado (set) quando o contador retorna ao BOTTOM. No
modo inversor, ocorre a situao contrria;
Utilizados para regulao de potncia e retificao;
TOP definido a partir dos valores atribudos aos bits WGM13:0 podendo ser: valores
fixos definidos, ICR1 ou OCR1A. Ao atingir o TOP, o contador voltar a zero no ciclo de
clock seguinte;
TOV1 ativado a cada vez que o contador atingir TOP. Alm disso, as flag OCF1A e
ICF1 tambm so ativadas no mesmo ciclo de clock que TOV1 quando um deles
definido como TOP;
Para sinas PWM, temos que freqncia = clock/(prescale * ( 1 + TOP) ) ;

PHASE CORRECT PWM MODE
Utilizado para gerao de sinais PWM (Pulse Width Modulation) de alta freqncia;
Utiliza uma onda triangular (dual-slope operation) para gerao dos sinais PWM, ou seja,
o contador incrementa do BOTTOM ao MAX e, em seguida, do MAX ao BOTTOM;
No modo no-inversor, temos que OC1x ser desativado (cleared) quando TCNT1 =
OCR1x durante o processo de incremento, enquanto que ser ativado (set) durante o
processo de decremento. No modo inversor, ocorre a situao contrria;
TOP definido a partir dos valores atribudos aos bits WGM13:0 podendo ser: valores
fixos definidos, ICR1 ou OCR1A (recomendado). Ao atingir o TOP, o contador voltar a
zero no ciclo de clock seguinte;
A atualizao do registrador OCR1x pode ser feita durante um perodo;
Para sinas PWM, temos que freqncia = clock/(2* prescale * (TOP));
Utilizado para aplicaes que envolvem controle de motores;
PHASE and FREQUENCY CORRECT PWM MODE
Utilizado para gerao de sinais PWM (Pulse Width Modulation) de alta freqncia;
Utiliza uma onda triangular (dual-slope operation) para gerao dos sinais PWM, ou seja,
o contador incrementa do BOTTOM ao MAX e, em seguida, do MAX ao BOTTOM;
No modo no-inversor, temos que OC1x ser desativado (cleared) quando TCNT1 =
OCR1x durante o processo de incremento, enquanto que ser ativado (set) durante o
processo de decremento. No modo inversor, ocorre a situao contrria;
TOP definido a partir dos valores atribudos aos bits WGM13:0 podendo ser: ICR1 ou
OCR1A;
A principal diferena, em relao ao modo anterior, que a sada gerada ser simtrica
em todos os perodos. Isso se deve ao fato que o valor dos registradores OCR1x s so
atualizados no fim de um perodo, garantido assim a simetria da sada;
Para sinas PWM, temos que freqncia = clock/(2* prescale * (TOP));
Utilizado para aplicaes que envolvem controle de motores;
7.1.3.2 Timer/Counter Register Description
I) Timer/Counter 1 Control Register A TCCR1A

Bit 7:6 - COM1A1:0 Compare Output Mode for channel A
Bit 5:4 COM1B1:0 Compare Output Mode for channel B
Esses pares de bits controlam o comportamento dos pinos OC1A e OC1B respectivamente. Alm
disso, o modo de operao fundamental para determina esse junto com os bits como podemos ver nas
Tabelas 7.9, 7.10 e 7.11.
Tabela 7.9 Comportamento de OC1A e de OC1B para o Non-PWM Mode


Tabela 7.10 Comportamento de OC1A e de OC1B para o Fast PWM Mode

Tabela 7.11 Comportamento de OC1A e de OC1B para o Phase Correct e Phase and
Frequency Correct PWM Mode

Bit 3 FOC1A Force Output Compare for channel A
Bit 2 FOC1B Force Output Compare for channel B
Esses pares de bits somente so ativados quando estamos em Non-PWM mode. Assim, deve-se
garantir que eles esto desativados quando estivermos operando em modo PWM. Quando ativamos
FOC1A/FOC1B, fora-se uma comparao que pode ser utilizada para gerar uma forma de onda. A
sada determinada a partir da Tabela 09.
Bit 1:0 WGM11:0 Waveform Generation Mode
Combinado com os pares de bits WGM13:2 presentes no registrador TCCR1B, so responsveis
por controlar a seqncia de contagem do contador, o valor definido para TOP e que tipo de gerao
da sada (forma de onda) a ser usada. Para informaes mais detalhadas, observar a Tabela 7.12.
Tabela 7.12 Wave Generation Mode Bit Description

II) Timer/Counter 1 Control Register B TCCR1B

Bit 7 ICNC1 Input Capture Noise Canceler
Quando ativado, requere-se que 4 amostras iguais na entrada para que se possa alterar a sada, ou
seja, ocorre uma filtragem para garantir a qualidade do sinal de entrada, no entanto, teremos um atraso
na resposta da sada.
Bit 6 ICES1 Input Capture Edge Select
O nvel lgico deste bit indica qual a borda utilizada para definir um evento no pino ICP1. Caso
seja devido uma mudana 1 para 0 (borda negativa), devemos desativar ICES1. Caso contrrio, seja
devido por borda positiva, devemos ativ-lo. Em cada um dos casos, temos que o valor do contador
ser copiado para ICR1.
Bit 5 Reserved Bit
Este bit reservado para uso futuro, logo se deve mant-lo desativado.
Bit 4:3 WGM13:2 Waveform Generation Mode
Observar a descrio do TCCR1A.

Bit 2:0 CS12:0 Clock Select
Esses trs bits selecionam a fonte do clock a ser usado pelo contador. Para informaes
complementares, observar Tabela 7.13.
Tabela 7.13 Clock Select Bit Description

III) Timer/Counter 1 TCNT1H e TCNT1L


Oferecem direto acesso e permite operaes de escrita e leitura para o contador de 16 bits.
IV) Output Compare Register 1A (OCR1AH e OCR1AL) e Output Compare Register 1B
(OCR1BH e OCR1BL)

Cada registrador armazena um valor de 16-bits que constantemente comparado com o valor em
TCNT1. Uma igualdade entre os valores pode ser utilizada para gerar uma forma de onda (sada) no
pino OC1A ou OC1B.

V) Input Capture Register 1 ICR1H e ICR1L

atualizado com o valor armazenado em TCNT1 a cada vez que um evento ocorre no pino
ICP1. Alm disso, esse registrador pode ser utilizado para definir o valor de TOP.
VI) Timer/Counter Interrupt Mask Register TIMSK

No caso do timer1, somente os bits de 5 a 2 se referem a ele.
Quando TICIE1 (Input Capture Interrupt Enable) ativado, temos que uma interrupo pode
ocorrer caso ocorra uma captura de evento no pino de entrada ICP1.
Quando OCIE1A (Output Compare A Match Interrupt Enable) ativado, temos que uma
interrupo pode ocorrer se a igualdade entre TCNT1 e OCR1A for vlida.
Quando OCIE1B (Output Compare B Match Interrupt Enable) ativado, temos que uma
interrupo pode ocorrer se a igualdade entre TCNT1 e OCR1B for vlida.
Quando TOIE1 (Overflow Interrupt Enable) ativado, temos que uma interrupo pode ser
executada se ocorrer um overflow.
VII) Timer/Counter Interrupt Flag Register TIFR

No caso do timer1, somente os bits de 5 a 2 se referem a ele.
ICF1 (Input Capture Flag) ativado quando ocorre a captura de um evento no pino ICP1, logo
pode ser usado para executar uma interrupo.
OCF1A (Output Compare A Match Flag) ativado no ciclo de clock aps a igualdade entre
TCNT1 e OCR1A vlida, logo podendo ser usado para executar uma interrupo caso OCIE1A
tambm esteja ativado.
OCF1B (Output Compare B Match Flag) ativado no ciclo de clock aps a igualdade entre
TCNT1 e OCR1B vlida, logo podendo ser usado para executar uma interrupo caso OCIE1B
tambm esteja ativado.
TOV1 (Overflow Flag 1) tem seu comportamento definido, ou seja, ser ativado de acordo com
os WGM13:2 e WGM11:0. Alm disso, TOIE1 tambm precisa est ativado. Para maiores detalhes,
observar a Tabela 12.
7.2 Cdigos exemplos
Para melhor compreender a forma de utilizar os registradores de controle junto com os timers
para a gerao de sinais PWM, vamos analisar o seguinte cdigo. De forma geral, podemos dizer que o
programa se resume a definir os registradores de controle para o timer1 com o propsito de utilizar o
Phase and Frequency Correct PWM Mode e, em seguida, determina uma interrupo para quando
ocorrer um overflow no contador.
/* Gerao de sinais PWM a partir do contador1 utilizando o modo
de correo de fase e frequencia */

#include <inttypes.h>
#include <avr/io.h>
#include <avr/interrupt.h>
#include <avr/sleep.h>

#define OC1A 1
#define OC1B 2

/* Esta funcao servira para definir o modo de operacao do
contador1, assim como estabelecer o valor de TOP, que constitui uma
segunda maneira de alterar a frequencia de operacao, alem do fator
divisor do clk de entrada */

void inicializa_pwm(void)
{

/* Primeiro, vamos definir os pinos OC1A e OC1B como saida. Para
isso devemos inicializar a mascara de i/o da porta correspondente, o
registrador DDROC */

DDRB = (1<<OC1A)|(1<<OC1B); // OC1A = PB1 e OC1B = PB2

OCR1A = 0;
OCR1B = 0;

/* Vamos configurar o modo de operacao do PWM. Para isso serao
necessarios os registradores TCCR1A:B */

/* TCCR1A: bit7(COM1A1) bit6(COM1A0) bit5(COM1B1) bit4(COM1B0)
bit3(FOC1A) bit2(FOC1B) bit1(WGM11) bit0(WGM10)
COM1A1:0: Para o Phase and Frequency Correct PWM Mode, eles
serao inicializados como 3, fazendo com que OC1A seja ativado (1)
quando o valor do contador1 igualar o valor de comparacao OCR1A na
subida, e desativado (0) na descida;

COM1B1:0: Serao inicializados como 2, para observar o PWM
invertido;

FOC1A:b: Serao inicializados como 0, pois estamos operando no
modo PWM e, como vimos, so exclusivos para modos Non-PWM;

WGM11:0: Para operar no modo de operao desejado nesse exemplo,
ser inicializados como 0; */

TCCR1A = 0xC0; // Simplificando a configurao de TCCR1A

/* TCCR1B:bit7(ICNC1) bit6(ICES1) bit5(void) bit4(WGM13)
bit3(WGM12) bit2(CS12) bit1(CS11) bit0(CS10)

ICNC1: Nao tem utilidade nesta aplicacao, portanto sera
inicializado como 0 para evitar algum problema.

ICES1: Neste exemplo, utilizaremos ICR1 para definir o valor de
TOP, logo esse bit ser inicializado como 0.

WGM13:2: Para operar no modo de operao desejado nesse exemplo,
ser inicializados como 2.

CS12:0: Vamos inicializa-lo como 1, para utilizar o valor
original do clk. */

TCCR1B = 0x11; // Simplificando a configurao de TCCR1B

/* Em seguida vamos definir o valor maximo do contador1(TOP)
utilizando o registrador ICR1. Para isso vamos utilizar o
registrador ICR1 */

ICR1 = 0xFF; // TOP = MAX

/* Para garantir que a interrupo ocorra no momento em que
ocorrer um overflow no timer1, precisamos definir alguns bits no
registrador TIMSK. */

/* TIMSK:bit7(OCIE2) bit6(TOIE2) bit5(TICIE1) bit4(OCIE1A)
bit3(OCIE1B) bit2(TOIE1) bit1(void) bit0(TOIE0)

Como estamos utilizando o timer1, apenas os bits5:2 interessam.
Por precauo, os outros serao definidos como 0.

TICIE1: Como no interfere em nada, neste caso, iguala-se a 0.

OCIE1A: Como no estamos interessados em habilitar uma
interrupo quando o valor do contador atinge o valor armazenado no
registrador OCR1A, iguala-se a 0.

OCIE1B: Segue o mesmo raciocinio do bit anterior.

TOIE1: Para habilitar interrupcao quando ocorre overflow no
contador1, iguala-se a 1. De acordo os bits definidos para WGM13:0,
temos que a interrupcao correspondente(TOV1) ser ativada quando o
contador1 atinigir o valor de BOTTOM. */

TIMSK = 0x04; // Simplificando a configurao de TIMSK

// Definindo a rotina a ser executada durante a interrupo
ISR(TIMER1_OVF_vect)
{
static uint16_t pwm;
static uint8_t sentido;

switch(sentido)
{
case 1:
if(++pwm == ICR1)
sentido = 0;
break;

case 0:
if(--pwm == 0)
sentido = 1;
break;
}

OCR1A = pwm;
OCR1B = pwm;
}

// Rotina principal do programa
int main(void)
{
inicializa_pwm();

while(1)
sleep_mode();

return(0);
}

Assim, aps a definio de todos os registradores de controle, observamos que a interrupo
utilizada para fazer com que o contador incremente de BOTTOM at MAX e, em seguida, de MAX
at BOTTOM, como desejado no modo de operao utilizada em nosso exemplo. Toda vez que a
interrupo executada, temos que o nvel lgico do sinal PWM no pino de sada alterado.
8. USART
Em diversas situaes, a execuo de programas e a tomada de decises por parte do
microprocessador empregado no controle de alguma ou uma srie de tarefas depende de ordens ou
dados externos. Uma maneira simples e verstil de estabelecer a comunicao entre AVRs ou entre
um AVR e um hardware perifrico ou mesmo um PC ou qualquer que seja o dispositivo a se
comunicar com o AVR, a USART (Universal Synchronous Asynchronous serial Receiver and
Transmitter).
A USART difere da tradicional RS232 somente pelos nveis de tenso utilizados (na RS232 0
(3V,25V) e 1 (-3V,-25V) ). Desta forma, com o auxilio de apenas um adaptador de nvel de tenso
(MAX232, por exemplo), podemos acoplar um PC diretamente a um AVR atravs da porta serial.
Existem diversas configuraes possveis para a interface USART, dado que se deve escolher
tanto entre o modo sncrono (clock MASTER ou SLAVE) ou o assncrono de operao, quanto s
caractersticas de protocolo como n de bits de dados, n de bits de parada, tipo de paridade e taxa de
transmisso. O controle dessas variveis, que definem a transmisso, realizado obviamente atravs
de registradores.
No entanto, antes de descrever estes registradores importante saber como determinar o fator
UBRR (USART Baud Rate Register). Ele especifica a taxa de amostragem da porta, portanto
fundamental inicializ-lo com um valor correto, para que transmissor e receptor estejam
sincronizados. Como o AVR possui um clk interno, o calculo de UBRR est atrelado a este valor,
dessa forma podemos calcular UBRR:

importante lembrar que esta formula adequada para o modo de operao que seguiremos
neste tutorial. Caso fosse utilizado um modo alternativo, como o Asynchronous Double Speed
Mode(fator 8 ao invs de 16 no denominador), ou os Modos sncronos obteramos uma formula
diferente (fator 2 ao invs de 16 no denominador).
8.1 Registradores de Controle
Agora, podemos prosseguir e detalhar os registradores envolvidos.
I) USART Data Register - UDR

Registrador que contm os dados recebidos e a serem enviados. Apesar de estarem endereados
no mesmo registrador, os dados recebidos e transmitidos esto atrelados a pinos diferentes da porta
D: RXD(PD0) e TXD(PD1).
Deve-se ressaltar que s permitido utilizar a operao de escrita quando a flag UDRE alocada
no registrador UCSRA est ativada, se no, a mesma simplesmente ignorada.
II) USART Control and Status Register A UCSRA

Bit 7 - RXC USART Receive Complete
Este bit sinaliza quando h dados no-lidos no buffer de entrada. Pode ser utilizado como flag de
interrupo atravs do bit RXCIE alocado no registrador UCSRB.
Bit 6 TXC USART Transmit Complete
Este bit sinaliza quando o buffer de transmisso est vazio. Pode, da mesma forma, ser utilizado
como flag de interrupo atravs do bit TXCIE alocado no registrador UCSRB.
Bit 5 UDRE USART Data Register Empty
Indica quando o buffer de transmisso esta pronto para receber dados. Basicamente nos diz que o
AVR est pronto para enviar uma mensagem nova. Tambm um flag que, se habilitado atravs do bit
UDRIE alocado no registrador UCSRB, pode ser utilizado para realizar interrupes.
Bit 4 FE Frame Error
Sinaliza quando ocorre um erro no formato da recepo, ou seja, o primeiro bit de parada possui
um valor incorreto. Este flag s vlido enquanto o valor de UDR no lido, portanto, para ser
monitorado, este deve ser lido antes de UDR, o mesmo vale para DOR e PE. importante que quando
formos escrever em UCSRA, deveremos escrever 0 neste bit.
Bit 3 DOR Data OverRun
Indica que houve uma indicao de nova mensagem enquanto os buffers de entrada estavam
cheios, ou seja, uma nova mensagem chegou e no pde ser lida. importante que quando formos
escrever em UCSRA, deveremos escrever 0 neste bit.
Bit 2 PE Parity Error
Avisa quando ocorre um erro de paridade na mensagem recebida. importante que quando
formos escrever em UCSRA, deveremos escrever 0 neste bit.
Bit 1 U2X Double the USART Transmission Speed
Dobra a velocidade de funcionamento assncrona. Quando for utilizada a velocidade normal ou
modos sncronos deve ser inicializado como 0.
Bit 0 MPCM Multi-processor Communication Mode
Habilita a comunicao multiprocessador, que ser abordada posteriormente. Atua no sentido de
filtrar as mensagens que contem endereos, ignorando as que contm dados.
III) USART Control and Status Register B UCSRB

Bit 7 - RXCIE RX Complete Interrupt Enable
Quando ativado, temos que este bit habilita interrupes para a flag RCX.
Bit 6 TXC USART Transmit Complete
Quando ativado, temos que este bit habilita interrupes para a flag TCX.
Bit 5 UDRE USART Data Register Empty
Quando ativado, temos que este bit habilita interrupes para a flag UDRE.
Bit 4 RXEN Receiver Enable
Ativa o receptor da USART. Caso no seja ativado, o pino comporta-se como um i/o
normalmente.
Bit 3 TXEN Transmitter Enable
Ativa o transmissor da USART. Caso no seja ativado, o pino comporta-se como um i/o
normalmente. Entretanto, enquanto houver mensagens pendentes ou mensagens sendo transmitidas no
surtir efeito.
Bit 2 UCSZ2 Character Size
Combinado com UCSZ1:0, o qual est alocado no registrador UCSRC, define a quantidade de
bits de dados em cada mensagem.
Bit 1 RXB8 Receive Data Bit 8
Comporta-se como nono bit de dados recebido quando a quantidade de bits de dado em cada
mensagem igual a 9. Deve ser lido antes de UDR, pois aps a leitura deste, RXB8 apagado.
Bit 0 TXB8 Transmit Data Bit 8
Mesma funo de RXB8, mas para transmisso. Neste caso, deve ser escrito antes de UDR, para
que seja mandado.
IV) USART Control and Status Register C UCSRC
Existe um detalhe com relao ao UCSRC. Ele compartilha com UBRRH a mesma localizao
de i/o. Sendo assim, para escrev-lo, necessrio ativar URSEL, caso contrrio o valor ser escrito em
UBRRH.

Bit 7 - URSEL Register Select
Como explanado anteriormente, este bit seleciona qual dos registradores ser escrito.
Bit 6 - UMSEL USART Mode Select
Seleciona o modo de operao: assncrono (0) ou sncrono (1).
Bit 5:4 UPM1:0 Parity Mode
Estes dois bits definem os bits de paridade da mensagem. Para maiores informaes, observar a
Tabela 8.1.
Tabela 8.1 Configuraes dos bits UPM

Bit 3 - USBS Stop Bit Select
Seleciona o nmero de bits de parada: 1-bit (0) ou 2-bits (1).
Bit 2:1 UCSZ1:0 Character Size
Como exposto anteriormente, junto com UCSZ2 estes bits definem o Character Size, ou seja, a
quantidade de bits de dados em cada mensagem. Para maiores informaes, observar a Tabela 8.2.
Tabela 8.2 Configuraes dos bits UCSZ

Bit 0 UCPOL Clock Polarity
Define as bordas utilizadas para amostragem e transmisso de dados quando se utiliza o modo
sncrono. Deve ser escrito como 0 quando o modo a ser utilizado o assncrono. Para maiores
informaes, observar a Tabela 8.3.
Tabela 8.3 Configuraes do bit UCPOL

V) USART Baud Rate Registers UBRRL e UBRRHs

So os registradores que armazenam o valor que ser utilizado para calcular a taxa de
amostragem e transmisso de dados, de acordo com a frmula apresentada anteriormente.
UBRRH constitui os 4 bits mais significativos de UBRR. Alm disso, temos que definir URSEL
como 0 para que a operao de escrita seja em UBRRH e no em UCSRC. Os outros bits so
reservados, mas devem ser escritos como 0 quando estivermos escrevendo em UBRRH por segurana.
Alm disso, temos que UBRRL armazena os bits menos significativos de UBRR.

8.2 Cdigos Exemplos
Uma vez que descrevemos os registradores envolvidos na interface USART e como cada um
funciona, estamos aptos a gerar um cdigo. Inicialmente, vamos a um exemplo simples de envio de
mensagem.
Primeiramente vamos escrever a funo transmitir. Esta funo recebe a mensagem a ser
enviada, espera pela sinalizao de que o buffer est apto a receber dados e, portanto, enviar uma nova
mensagem.
No programa principal devemos definir o modo de utilizao. Neste caso, foi configurada uma
transmisso feita a 9600 bps, considerando um clk interno de 1MHz, assncrona, com 8 bits de dados,
paridade mpar e apenas 1 bit de parada. Em seguida, habilitamos UDRE.
Os registradores foram escritos explicitando-se cada bit, mas poderiam ter sido simplesmente
atribudos seus valores hexadecimais, por exemplo, poderamos ter escrito UCSRC =0xB6.


Figura 8.1 Primeiro programa para enviar mensagem pela interface serial

Agora um programa que recebe uma mensagem. Neste caso, devemos habilitar a RXC, que
sinalizar a chegada de uma mensagem e habilitar o prprio receptor.

Figura 8.2 Segundo programa para receber mensagem pela interface serial

Os dois programas anteriores realizam suas tarefas de enviar e receber mensagens, entretanto
este cdigo pode ser considerado extremamente ineficiente. Numa aplicao real, bastante provvel
que diversas mensagens sejam enviadas e recebidas.
Nos exemplos anteriores, o tempo gasto para esperar as sinalizaes de que existia uma
mensagem nova ou que o AVR estava pronto para enviar mensagens era tempo gasto de CPU, ou
seja, o processador estava exclusivamente dedicado incumbncia de monitorar estes eventos,
impossibilitando a realizao de outras tarefas.
Sendo assim, mais eficiente utilizar os recursos disponveis de interrupo, desta forma,
possvel nos dedicarmos a processar outras tarefas enquanto novas mensagens no chegam ou
enquanto no podemos enviar novas mensagens. Para tal, ser utilizada a macro ISR (Nome do vetor
de interrupo), onde tambm necessitaremos de outra macro, a sei (void), para habilitar as
interrupes. Cli (void) a macro que devemos utilizar para desabilitar as interrupes.
Outro aspecto importante o consumo. Supondo que tivssemos um sistema simplesmente
reativo, ou que, apenas enviasse mensagens na ocorrncia de novas mensagens recebidas, poderamos
simplesmente deixar o AVR em standby at a ocorrncia destes eventos, economizando bastante
energia e, muitas vezes at viabilizando aplicaes que sofreriam por limitaes de bateria e etc. Para
isto, necessrio acrescentar duas bibliotecas: a <avr/interrupt.h> e a <avr/sleep.h>.
Agora escreveremos um programa que simplesmente espera por uma mensagem e responde a
mesma mensagem.
Observe que, desta vez, habilitamos tanto o receptor como o transmissor, alm da flag de
interrupo RXC, mantendo a mesma configurao de transmisso dos exemplos anteriores. Observe
tambm que o programa principal tornou-se leve, j que o loopback da mensagem realizado por
interrupo.


Figura 8.3 Terceiro programa para receber mensagem e envi-la pela interface serial





9. Concluso
Este tutorial procurou desenvolver uma breve descrio das caractersticas do AVR e, em
seguida, aprofundar um pouco mais a forma como o AVR as disponibiliza para os seus usurios.
Assim, servindo como fonte de consulta durante o desenvolvimento dos prottipos no decorrer de sua
participao no grupo de Instrumentao.
Acredita-se que h ainda outros diversos pontos a serem abordados dentro deste tutorial a fim
de, cada vez mais, deix-lo mais completo, logo se espera lanar novas verses medida que o grupo
obter novas informaes sobre o microcontrolador.
A partir das informaes presentes nesse tutorial, espera-se que o leitor se estimule a buscar
outras fontes de consultas na internet ou no prprio datasheet do AVR com o objetivo de incrementar
seu conhecimento terico e, assim, iniciar o desenvolvimento de projetos prticos utilizando o
microcontrolador como, por exemplo, a construo de um carrinho de controle remoto.































10. Bibliografia

I. [Atmel2004] ATMEL. ATmega8 - CompleteDatasheet.[S.l.],2004.
II. Desenvolvimento com microcontroladores Atmel AVR Geovany Araujo Borges
Departamento de Engenharia Eltrica Universidade de Braslai 2006
III. http://www.atmel.com/
IV. http://www.societyofrobots.com/step_by_step_robot.shtml
V. http://forum.electronicapt.com/index.php/topic,1561.0.html
VI. http://www.avrbeginners.net/
VII. http://www.avrfreaks.net/
VIII. http://members.shaw.ca/climber/avr.html
IX. http://www.avrfreaks.net/index.php?name=PNphpBB2&file=viewtopic&t=50106&sid=20
d788f89772f7a108c5d6a8f8655654
X. http://www.avrfreaks.net/index.php?module=FreaksArticles&func=viewArticles
XI. http://paul.graysonfamily.org/thoughts/avrlinux/
XII. http://www.ime.eb.br/~pinho/micro/index.html
XIII. http://homepage.hispeed.ch/peterfleury/index.html

Você também pode gostar