Escolar Documentos
Profissional Documentos
Cultura Documentos
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
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
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.
interna. Os primeiros 96 endereos representam o Register File + Memria de I/O, e os prximos 512 endereos a SRAM interna.
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.
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.
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.
#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
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.
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.
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
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.
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.
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
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.
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.
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) );
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.
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
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
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.
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;
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.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.
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
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.
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.
#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).
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
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.
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
http://www.atmel.com/