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); X &= ~(1 << BitNumber); // A bit in X is set // 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); PORTA &= ~(1 << MyBIT); // O bit 2 da Porta A igual a 1 // 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 TCNT2 = OCR2; 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;

Pode disparar alguma interrupo quando o temporizador overflows de volta at o zero; Freqncia = clock/(2 * prescale * 256) ;

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 #include #include #include <inttypes.h> <avr/io.h> <avr/interrupt.h> <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); 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) // OC1A = PB1 e OC1B = PB2

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. II.

[Atmel2004] ATMEL. ATmega8 - CompleteDatasheet.[S.l.],2004. Desenvolvimento com microcontroladores Atmel AVR Geovany Araujo Borges Departamento de Engenharia Eltrica Universidade de Braslai 2006

III. IV. V. VI. VII. VIII. IX.

http://www.atmel.com/

http://www.societyofrobots.com/step_by_step_robot.shtml http://forum.electronicapt.com/index.php/topic,1561.0.html http://www.avrbeginners.net/ http://www.avrfreaks.net/ http://members.shaw.ca/climber/avr.html http://www.avrfreaks.net/index.php?name=PNphpBB2&file=viewtopic&t=50106&sid=20 d788f89772f7a108c5d6a8f8655654

X. XI. XII. XIII.

http://www.avrfreaks.net/index.php?module=FreaksArticles&func=viewArticles http://paul.graysonfamily.org/thoughts/avrlinux/ http://www.ime.eb.br/~pinho/micro/index.html http://homepage.hispeed.ch/peterfleury/index.html

Você também pode gostar