tutorial avr - atmega 8

Upload: fabiodin7337

Post on 12-Oct-2015

137 views

Category:

Documents


10 download

TRANSCRIPT

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

    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

    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 (, ):

    A funo examina se um bit foi ativado, retornando um valor diferente de 0.

    bit_is_clear (, ):

    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

    ...

    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

  • 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

    #include

    #include

    #include

    #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

  • 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 e a .

    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