Sunteți pe pagina 1din 129

Microcontroladores AVR

Baseado no ATmega328
Prof. Eduardo G. Bertogna
DAELN/UTFPR

Sistema Microprocessado Mnimo

Microprocessador;

Circuito de Clock;

Circuito de Reset;

Circuito de Seleo;

Memria de Programa - Somente de Leitura, no-voltil;

Memria de Dados - Leitura e Escrita, voltil

Portas de Entrada e Sada;

Fonte de Alimentao.

Viso Geral da Famlia AVR

Desenvolvido em 1996, no Instituto de Cincia e Tecnologia da Noruega, por 2 estudantes: Alf-Egil Bogen e Vergard
Wollan, sendo a sigla AVR para Advanced Virtual RISC;

Possui arquitetura RISC de 8 bits com conceito Harvard, e


pipeline de um nvel garantindo assim o paralelismo;

Conjunto de 133 instrues, a maioria sendo executadas em


um nico ciclo de clock;

32 registros de uso geral, todos conectados diretamente


ULA, permitindo que dois registros quaisquer sejam acessados
em um nico ciclo de clock ;

Perto de 32 MIPS, com o clock mximo de 32 MHz: 1MIPS


por MHz, 10x mais rpido que os microcontroladores de arquitetura CISC;

Memria Flash ISP, 10.000 ciclos de escrita/apagamento;

Tenses de alimentao em alguns elementos entre 1,8V e


5,5V, e possibilidade de operao em baixo consumo;

Ecincia na gerao de cdigo, tanto em C como em assembly, comparvel ao CISC;

Grande suporte de hardware e software para o desenvolvimento, muitos destes de natureza livre e aberta.

Elementos da Famlia AVR

tinyAVR

megaAVR

XmegaAVR

Battery Management

Automotive AVR
Famlia AVR - tinyAVR e megaAVR

tinyAVR - Entre 6 e 20 pinos de E/S linhas, pe-

quena rea de memria Flash (1kB ou 2kB), poucos


perifricos internos, ideal para aplicaes de baixa
complexidade, e baixo custo.

megaAVR -Entre 8kB e 256kB de memria Flash,

entre 23 e 54 pinos de E/S, inmeros perifricos


internos: Canais de ADC, Canais de PWM, Comparador Analgico, Canais TWI/I2C, UART e SPI,
ideal para as aplicaes de mdia complexidade.
4

Componentes das Sub-Famlias tinyAVR, e megaAVR


Modelo* Caractersticas Principais
tiny11 1kB Flash, 1 T/C de 8bits, 6 Pinos de E/S.
tiny12 Idem ao tiny11, com 64B de EEPROM.
tiny13 Idem ao tiny12, com 64B de SRAM, e 4 ADC's.
tiny15 Idem ao tiny12, com 4 ADC's.
tiny26 2kB Flash, 128B EEPROM, 128B SRAM, 2 T/C
tiny28
tiny2313
mega8
mega8515
mega8535
mega16
mega162
mega32
mega64
mega128
mega48
mega88
mega168
mega256

de 8bits, 16 Pinos de E/S, 11 ADC's de 8bits.


2kB Flash, 1 Timer/Counter de 8bits, 20 Pinos de E/S.
2kB Flash, 128B de EEPROM, 128B de SRAM, 2 T/C
(1 de 8bits, 1 de 16bits), 18 Pinos de E/S, 1 Serial.
8kB Flash, 512B EEPROM, 512B SRAM, 3 T/C (2x8,1x16)
23 Pinos de E/S, 1 Serial, 3 PWM, 8 ADC' s,
8kB Flash, 512B EEPROM, 512B SRAM, 2 T/C (1x8,1x16)
35 Pinos de E/S, 1 Serial, 3 Canais de PWM
Idem ao mega8515, com 2 Timer/Counter de 8bits,
4 Canais de PWM, 8 ADC's, e 32 Pinos de E/S.
16kB Flash, 1KB EEPROM, 1KB SRAM, 3 T/C (2x8,1x16)
32 Pinos de E/S, 1 Serial, 6 Canais de PWM, 8 ADC' s,
Idem ao mega16, c/ 2 T/C de 16bits, 4 Canais de PWM,
2 Canais Seriais, 35 Pinos de E/S, porm sem ADC's.
Idem ao mega16, c/ 32kB de Flash, 2kB SRAM, 4 PWM.
64kB Flash, 2kB EEPROM, 4kB SRAM, 4 T/C (2x8,1x16)
54 Pinos de E/S, 2 Serial, 8 Canais de PWM, 8 ADC's.
Idem ao mega64, com 128kB Flash, 4kB EEPROM.
4kB Flash, 256B EEPROM, 512B SRAM, 3 T/C (2x8,1x16)
24 Pinos de E/S, 1 Serial, 5 Canais de PWM, 8 ADC's.
Idem ao mega48, c/ 8kB Flash, 512B EEPROM, 1kB RAM.
Idem ao mega88, c/ 16kB de Flash.
Idem ao mega128, c/ 256kB Flash, 8kB SRAM, 16 PWM.
5

Ambientes de Desenvolvimento p/ AVR

CodeVisionAVR - apenas desenvolvimento em C,


sem simulador/depurador. Atravs de Wizard gera
cdigo automtico, com as conguraes dos registros sendo funo da seleo de perifricos escolhidos, bastando inserir os trechos de cdigo que
o completam.

AVR Studio 4 e Atmel Studio 7 - desenvolvi-

mento em assembly e C, com simulador/depurador. Freeware fornecido pela Atmel. AVR Studio.
No desenvolvimento em C pode ser usado com o
compilador GNU GCC WinAVR e com o AVR Toolchain da Atmel.

Ncleo da Arquitetura AVR RISC

Recursos do ATmega328
131 Instrues (maioria executada em 1 ciclo clock)
32 kB Memria Flash ISP 10.000 ciclos de escrita
2.048 B Memria SRAM
1.024 B Memria EEPROM 100.000 ciclos de escrita
32 Registros de 8 bits de uso geral
23 pinos de I/O programveis individualmente
2 T/C de 8 bits, c/ prescaler separado e Modo de
Comparao
1 T/C de 16 bits, c/ prescaler separado e Modos de
Comparao e de Captura
6 Canais de PWM
Contador de Tempo Real c/ oscilador independente
Watchdog Timer c/ oscilador independente
6 Conversores A/D de 10-bits (8 ADCs em TQFP/MLF)
Multiplicador por Hardware (2 ciclos de clock)
1 Comparador Analgico
1 Serial TWI compatvel c/ I2C Philips
1 USART
1 SPI Master/Slave
2 Interrupes Externas e 23 Interrupes/Wake-Up de I/O
6 Modos de Baixo Consumo
Deteco de Brown-out e Power-On Reset
Oscilador RC Interno Calibrado
Encapsulamentos DIP-28, TQFP-32, MLF-28
Tenses: 1,8V-5,5V
Clock: 0-20 MHz

Arquitetura Interna do ATmega328

10

Pinagem do ATmega328 (DIP-28)

Descrio dos Pinos do ATmega328

Vcc - Tenso de Alimentao de 1,8 a 5,5V

GND - Referncia.

AVcc

- Entrada da Tenso do Conversor A/D, devendo ser


conectado externamente a Vcc. Se o ADC usado deve ser
conectado a Vcc via ltro passa-baixas.

AREF - Entrada da Tenso de Referncia do Conversor A/D


11

PORTAS B, C e D (PCINT0...PCINT22) - Todos os 23

pins de E/S das Portas B, C e D possuem a funo alternativa


de ativar uma interrupo na mudana de estado do respectivo pino, servindo assim como uma interrupo externa.

PORTB (PB0...PB7) - Porta de 8 bits bidirecional de E/S.

Cada pino desta porta possui uma funo alternativa, ver


tabela abaixo.

Pinos
PB0
PB1
PB2
PB3
PB4
PB5
PB6
PB7

CLK0
ICP1
OC1A
OC1B

Funes Alternativas

Sada de clock dividido


Entrada de Captura do T/C1
Sada Comparao A do T/C1
Sada Comparao B do T/C1
SS
Seleo Master/Slave da SPI
OC2A Entr. Inv. do Comp. Analgico
MOSI Sada Output/Slave da SPI
MISO Sada Input/Slave da SPI
SCK
Entrada de Clock da SPI
XTAL1 Entrada Clock Externo 1
TOSC1 Entrada Clock T/C2 qdo Osc. RC
XTAL2 Entrada Clock Externo 2
TOSC2 Entrada Clock T/C2 qdo Osc. RC

12

PORTC (PC0...PC6) - Porta de 7 bits bidirecional de E/S.

Cada pino desta porta possui uma funo alternativa, ver


tabela a seguir.

Pinos

Funes Alternativas

PC0...PC5 ADC0...ADC5 Entradas conversores A/D


PC4
SDA
Entrada/Sada de Dados da I2C
PC5
SCL
Entrada/Sada de Clock da I2C
PC6
RESET
Entrada de Reset

PORTD (PD0...PD7) - Porta de 8 bits bidirecional de E/S.

Cada pino desta porta possui uma funo alternativa, ver


tabela a seguir.

Pinos
PD0
PD1
PD2
PD3
PD4
PD5
PD6
PD7

RXD
TXD
INT0
INT1
OC2B
T0
XCK
T1
OC0B
AIN0
OC0A
AIN1

Funes Alternativas

Entrada de Recepo Serial


Sada de Transmisso Serial
Entrada Interrupo Externa INT0
Entrada Interrupo Externa INT1
Sada de Comparao B do T/C2
Entrada Contagem do T/C0
Entrada/Sada Clock Externo da USART
Entrada Contagem do T/C1
Sada de Comparao B do T/C0
Entrada Positiva Comparador Analgico
Sada de Comparao A do T/C0
Entrada Negativa Comparador Analgico

13

Sistema de Clock do ATmega328

Seleciona a fonte primria de clock de 5 fontes: Cristal Externo, Osc. RC Interno e Clock Externo. Fornece os sinais
de clock derivados da fonte primria;

14

Sinais de clock derivados da fonte primria:

Clk CPU
Clk IO
Clk Flash
Clk ADC
Clk ASY

Ncleo AVR e RAM


Mdulo de E/S, T/C's, Canal SPI, e UART;
Memria Flash, ativado junto c/ clock da CPU;
Conversor A/D;
T/C2 clock assncrono

Arbitra a ativao dos sinais de clock, acima, no necessariamente ativos simultaneamente, em razo dos modos de baixo
consumo.

Fontes de Sinal de Clock


So 5 diferentes possibilidades para a fonte de gerao de sinal de
clock, listadas a seguir:

Cristal/Ressonador Cermico Externo;

Cristal de Baixa Freqncia Externo;

Fonte de Clock Externa;

Oscilador RC Interno de 128 kHz;

Oscilador RC Interno Calibrado.

15

Seleo da Fonte Primria de Clock - Fuse-bits CKSEL3...0


A fonte primria de clock selecionada quando da programao
do dispositivo, atravs dos fuse-bits CKSEL3...0 :

CKSEL3...0

Fonte de Clock Selecionada

1111-1000

Cristal Externo Baixa Potncia

0111-0110

Cristal Externo Excurso Completa

0101-0100

Cristal Externo de Baixa Frequncia

0011

Oscilador RC Interno de 128 kHz

0010

Oscilador RC Interno Calibrado

0000

Clock Externo

Seleo default de fbrica p/ Oscilador RC interno

Obs:

Maior atraso de inicializao (start-up time), possibilita usar


qualquer mtodos de gravao ISP disponvel.

Fontes Externas de Clock

Cristal Quartz Oscilador




- Figura (a)

Pinos XTAL1/XTAL2: Entrada/Sada do amplicador inversor usado como oscilador interno.


O cristal oscilador e dois capacitores, ou um ressonador
cermico devem ser conectados conforme a gura (a).

Fonte de Clock Externa - Figura (b)

Pino XTAL1: Entrada de fonte de clock externa;

Pino XTAL2: No conectado, conforme gura (b).

16

Oscilador Interno Calibrado

Quando se deseja minimizar o uso de componentes externos,


e existe uma certa tolerncia na preciso do sinal de clock;

Por default 8 MHz a 25C e Vcc=3V


usurio de 7,3 a 8,1 MHz 1%;

Preciso dependente de temperatura e tenso de alimentao;

Registro de Calibrao OSCCAL permite ajustar a calibrao


do oscilador RC Interno, no Reset um valor associado ao byte
de assinatura carregado neste registro.

10%, ou calibrado pelo

Start-up do Oscilador Interno Calibrado


Os tempos de inicializao do Oscilador RC Interno, feita atravs
dos fuse-bits SUT1 e SUT0:

Start-up Time para Oscilador Interno (Vcc=5V)


Start-Up Time
Adicional
Recomenaps Power-Down aps Reset*
dao

SUT0
SUT1

00
01
10
11

6 Clocks
6 Clocks
6 Clocks

14 Clks
BOD Habilit.
14 Clk + 4,1 ms Fonte Rpida
14 Clk + 65 ms Fonte Lenta
Reservado
17

Circuito de Reset

Faz a carga dos Registros de E/S com seus valores iniciais e


carrega o PC com o vetor de Reset: 0000H;

Aps sua ativao, um atraso de tempo, Start-Up Time,


gerado conforme seleo dos fuse-bits CKSEL3...CKSEL0;

A execuo do programa inicia no endereo RESET, e uma


instruo de desvio desvia a execuo p/ a rotina principal.

Modo de operao do Circ.


de Reset, depende dos bits
de controle: WDRF , BORF , EXTRF , e PORF , do Reg.
MCUSR.

18

Fontes de Ativao do Reset

Sinal de Ativao Externo: sinal de nvel lgico


baixo por mais de 50ns no pino de RESET;

Power-On Reset: tenso Vcc abaixo da tenso

limite de Power-On Reset (Power-On Threshold) VP OT , tipicamente entre 1,4V e 2,3V;

Watchdog Timer Reset: perodo programado no

Temporizador Watchdog expira antes da instruo


WDR ser executada, com o WDT habilitado;

Brown-Out Reset: tenso Vcc abaixo de um valor

limite, (Brown-Out Threshold) VBOT , c/ o detector de Brown-Out (BOD) habilitado pelo fuse bit
BODEN.





VBOT selecionada pelo fuse-bit BODLEVEL: Programado - VBOT = 4, 0V


Desprogramado, VBOT = 2, 7V .
Por default BODEN estar desprogramado
Bits BODSE e BODS no registro MCUCR permite desligar o circuito de BOD em modo Sleep.

19

Registro de e Status da CPU - MCUSR

MCUSR

WDRF

BORF

EXTRF

PORF

Bit PORF : Power-On Reset Flag, Sinalizador de


Power-On Reset, setado no Power-On, e resetado
somente por software;

Bit EXTRF : External Reset Flag, Sinalizador de


Reset Externo, setado no reset externo e resetado
unicamente por software;

Bit BORF : Brown-Out Reset Flag, Sinalizador de


Brown-Out Reset, setado no reset por Brown-Out,
e resetado por software ou Power-On;

Bit WDRF : Watchdog Reset Flag, Sinalizador de


Watchdog Reset, setado pelo reset do WDT, e resetado por software ou no Power-On.
20

Registro de Controle da CPU - MCUCR

- BODS

BODSE

MCUCR
PUD

- - IVSEL IVCE

Bit IVSEL: Interrupt Vector Selection, setado move


os vetores de interrupo p/ o incio do setor de
boot;

Bit IVCE: Interrupt Vector Change Enable, setado


habilita a funo do bit IVSEL. Resetado por hardware 4 ciclos de clock aps ter sido setado, ou
quando IVSEL setado.

Bit PUD: Pull-Up Disable, setado desabilita todos


os pull-ups em todos os pinos das portas;

Bit BODSE: BOD Sleep Enable, setado permite


que o bit BODS desligue o circuito de deteco de
Brown-out durante estado Sleep;

Bit BODS: Deve ser setado para desligar o circuito


de deteco de Brown-out durante estado alguns
modos Sleep;
21

Modos de Baixo Consumo - Sleep Modes


O modo de baixo consumo ativado se o bit de Habilitao do
Modo Sleep, SE =1 (registro SMCR), e uma instruo SLEEP for
executada.

Modo Idle
- CPU parada;
- Perifricos e Interrupes continuam funcionando;
- CPU retorna do modo Idle ao ocorrer uma destas interrupes;
- Circuito de BOD no pode ser desativado neste modo.

Modo Power-Down
- Oscilador externo parado;
- Circuitos dos TWI, WDT, e Interrupes, permanecem funcionando;
- Retorno do Power-Down atravs de uma interrupo destes circuitos, de um Reset externo, ou Reset por Brown-out.

Modo Power-Save
- Idntico ao Power-Down, exceto que T/C2 continua ativo;
- Adicionalmente, pode retornar deste modo por interrupes do
T/C2;
- Se o T/C2 no ser usado recomenda-se o modo Power-Down.

Modo Standby
- Idntico ao Power-Down, exceto que o oscilador externo se mantm funcionando;
- Somente possvel de ser usado com Cristal/Ressonador externo.

Modo Standyby Extendido


- Idntico ao modo Power-Save, exceto que o oscilador externo se
mantm funcionando.
- Somente possvel de ser usado com Cristal/Ressonador externo.

22

Reg.

de Controle dos Modos de Sleep -

SMCR

SMCR

    SM2 SM1 SM0 SE

Bit SE: Sleep Enable, setado bit permite que o ATmega328 entre em dos 5 modos de baixo consumo
disponveis aps a execuo da instruo SLEEP.

Bits SM0...SM2: Modos Sleep, seleciona um dos 5


modos de operao sleep conforme tabela abaixo.

Modos de Baixo Consumo


SM2

SM1

SM0

Modo

Modo Idle
Reduo de rudo do ADC
Modo Power-down
Modo Power-save
Reservado
Reservado
Modo Standby
Modo Standby extendido

23

Registro de Status da CPU - SREG

SREG
S

Flag T : Bit de alocao temporria usado p/ teste em bits,


atravs das instrues BLD e BST;

Flag

H:

Half-Carry, vai-um do nibble inferior p/ o superior;

Flag

S:

Indica o resultado:

Flag V : Overow, indica se o byte sinalizado em complemento


de 2, est na faixa de -127 a 128;

Flag

N:

Resultado negativo em operao aritmtica/lgica;

Flag

Z:

Resultado zero em operao aritmtica/lgica;

Flag C : Ocorrncia de vai-um, em uma operao aritmtica/lgica.

Bit I : Setado p/ que qualquer fonte de interrupo possa ter


efeito.

N V

Exemplo de declarao em C no WinAVR para habilitar e


desabilitar interrupes:

#include
...

<a v r / i n t e r r u p t . h> // Arq . h e a d e r i n t e r r u p .

/* D e s a b i l i t a i n t e r r u p e s

cli ();
...

/* H a b i l i t a i n t e r r u p e s

sei ();

*/

*/

24

Stack Pointer - SPH/SPL

Pilha: regio da SRAM onde endereos de retorno


de rotinas/rotinas de interrupo so guardados
pela CPU qdo ocorre uma chamada de rotina/ou
atendimento de um pedido de interrupo.

Ao trmino da execuo da rotina/rotina de interrupo, o endereo de retorno buscado na pilha,


e o programa retorna a execuo do ponto onde estava antes da chamada de rotina/atendimento da
interrupo.

No ATmega328 o SP designado por: SPH e SPL,


e que respectivamente guardam o byte superior e o
byte inferior do endereo da pilha.

SPL/SPH devem ser sempre inicializados no incio


do programa principal, sempre que subrotinas e/ou
interrupes so usadas

A inicializao dever conter um endereo acima de


0060H, que o limite inferior da SRAM interna.

Como prtica comum o limite superior da SRAM


utilizado, uma vez que o endereo ser decrementado em operaes de escrita na pilha.
25

Organizao de Memria do
ATmega328
Memria SRAM

A rea de memria SRAM Interna de 2.048 bytes


aloca a rea dos Registros de Uso Geral e de E/S,
de forma contiguas, como na gura a seguir.

R0 a R31 no se entrelaa com a rea de SRAM


que comea no endereo 001FH.

R26 a R31, proporcionam aos pares ponteiros para


acesso indireto memria de dados, sendo denominados de registros X, Y, e Z.
26

Memria FLASH

Memria Flash de 32 kB, organizada como 16 kW,


instrues de 16 ou 32 bits, e PC de 14 bits.

Programa Boot Loader, alocado na Seo de Boot,


possibilita carga/descarga de cdigo, por qualquer
meio ou protocolo de comunicao disponvel.

Capacidade de autoprograo, atualizao de aplicaes, e at mesmo atuar na rea do Boot Loader, modicando-se a si prprio, ou mesmo se apagando, caso no seja mais necessrio.
27

Recursos

Registros de E/S do ATmega328

Sinalizadores
Stack Pointer
Fonte de Reset
Brown-out
Clock do Sist.

Siglas

SREG
SPH/SPL
MCUSR
MCUCR
CLKPR
EIRCRA
Interrupes Ext. EIMSK
EIFR
Interrupes
TIFR0/1/2
dos Temp./Cont. TIMSK0/1/2
Temp./Cont.0
TCCR0A/TCCR0B
T/C0 (8 bits)
TCNT0
OCR0A/OCR0B
TCCR1A/B/C
Temp./Cont.1
TCNT1H/L
T/C1 (16 bits)
OCR1A/B H/L
ICR1H/L
TCCR2A/B
Temp./Cont.2
TCNT2
T/C2 (8 bits)
OCR2A/B
ASSR
GTCCR
EEARH/EEARL
EEPROM
EEDR
EECR
SPCR
Canal SPI
SPSR
SPDR

Nome do Registro de E/S

Status Register
Stack Pointer
MCU Status Reg
MCU Control Reg
Clock Prescaler Reg
Ext. Interr. Control Reg A
Ext. Interr. Mask Reg
Ext. Interr. Flag Reg
T/Cs Interrupt Flag Regs
T/C Interr. Mask T/C0, 1 e 2
T/C0 Control Register A e B
T/C0 Counter Register
T/C0 Output Comp. Reg A/B
T/C1Control Reg. A/B/C
T/C1 Reg. High/Low
Output Compare 1A/1B H/L
Input Capture 1 H/L
T/C2 Control Reg. A/B
T/C2 Reg. High/Low
Output Compare 2A/1B
Asyncronous Status Reg
General T/C Control Reg
EEPROM Address Registers
EEPROM Data Register
EEPROM Control Register
SPI Control Register
SPI Status Register
SPI Data Register
28

Registros de E/S do ATmega328 (cont.)

Recursos

Siglas

Modos Sleep
SMCR
Contr. Potncia PRR
Watchdog Timer WDTCSR
UDRn
Canais USART
UCSRnA/B/C
UCR
UBRRnH/UBRRnL
Compar.Analg. ACSR
ADCL/H
Conversor A/D
ADCSRA/B
ADMUX
TWBR
TWCR
Canais TWI
TWSR
TWDR
TWAR
TWAMR
PORTB
PORTC
PORTD
Portas de E/S
DDRB
B, C, e D
DDRC
DDRD
PINB
PINC
PIND

Nome do Registro de E/S

Sleep Mode Control Register


Powe Reduction Register
WDT Control & Status Reg
UART Data Register
UART Control/Status Regs
UART Control Register
UART Baud Rate Registers
Analog Comp. Control/Status
ADC Data Registers L/H
ADC Control/Status Reg A/B
ADC Multiplexer Selection Reg
TWI Baud Rate Register
TWI Control Register
TWI Status Register
TWI Data Register
TWI Address Register
TWI Address Mask Register
Port B/C/D Data Regs
Data Direction Registers
Input Pin Address Registers

29

Portas de Entrada e Sada

So 3 as portas E/S do ATmega328 designadas como PORTB,


PORTC e PORTD

Sendo: PORTB de 8 bits, PORTC de 7 bits e PORTD de 8


bits

23 linhas de E/S que podem ser usadas como pinos de Entrada/Sada Digital de uso geral.

Estas portas de E/S tem resistores de pull-up internos selecionveis individualmente.

Buers de sada podem de drenar at 40 mA.

Os pinos contam ainda com diodos de proteo para Vcc e


GND.

30

Registros Associados s Portas de E/S

Registros de Direo de Dados - DDRB, DDRC, DDRD

Registros de Dados - PORTB, PORTC, PORTD

Pinos de Entrada das Portas - PINB, PINC, PIND

Porta Sigla

Nome/Funo

PORTB
Dados Porta B
DDRB Direo de Dados B
PINB
Entrada do Pino B
PORTC
Dados Porta C
DDRC Direo de Dados C
PINC
Entrada do Pino C
PORTD
Dados Porta D
DDRD Direo de Dados D
PIND
Entrada do Pino D

B
C
D

Registros de Direo de Dados (DDRx)


DDxn=1 => Pxn

ser congurado como Sada.

DDxn=0 => Pxn

ser congurado como Entrada.

PUD=0 => Pxn

ter o resistor de pull-up conectado

31

Modos de Operao dos Pinos das Portas

DDRx PORTx
( ) ( )
DDxn

Pxn

0
0
0
1
1

0
1
1
0
1

PUD

x
0
1
x
x

E/S Pull-UP
Interno*
E
E
E
S
S

OFF
ON
OFF
OFF
OFF

Descrio
Alta Impedncia
Fornece corrente em 0
Alta Impedncia
Drena corrente em 0
Fornece corrente em 1

PORTx e DDRx so registros tipo R/W, enquanto os PINx


so somente de leitura.

*Se o bit PUD =1 (MCUCR) - Pull-UP Disable, todos os


resistores de Pull-Up sero desabilitados.

Se congurado como entrada, e o bit


este pino ter seu pul-up ativado.

Para desconectar o pull-up deve-se resetar o bit


gurar este pino como sada.

Na condio de RESET, os pinos estaro em tri-state, mesmo


sem pulsos de clock ativos.

Pxn=1

no reg. PORTn,

Pxn,

ou con-

32

Exemplo de Congurao dos Pinos de E/S


O trecho de programa a seguir, congura os pinos PB0 e PB1
como sadas, e os pinos PB2 a PB7 como entradas, dene o
estado dos pinos PB0, PB1, PB6 e PB7, e ento l o estado da
porta B. Finalmente, escreve nos pinos PB0 e PB1, resetando
PB0 e setando PB1. PB0 e PB1 so denidos como RELE 1 e
RELE 2.

#include <avr/io.h>

// Arq. header p/ famlia AVR

#define RELE_1 0
#define RELE_2 1

//Pino conectado ao rel 1


//Pino conectado ao rel 2

unsigned char i;

// ou, ainda: uint8_t i;

int main(void)
{
// Define Pinos PB0, PB1 como sadas, PB2 a PB7 entradas
DDRB |= (1<<DDB1)|(1<<DDB0);
// Define estado dos Pinos PB0, PB1, PB6 E PB7 em nvel alto
// e pinos PB2, PB3, PB4 e PB5 em nvel baixo
PORTB |= (1<<PB7)|(1<<PB6)|(1<<PB1)|(1<<PB0);
// Leitura dos Pinos da Porta B
i = PINB;
// Leva pino PB0 para nvel lgico 0
PORTB &= ~(1<<RELE_1);
// Leva pino PB1 para nvel lgico 1
PORTB |= (1<<RELE_2);
return 0;
}

33

Sintaxe do AVR-GCC para


Setar/Resetar/Complementar bits em Registros

Setando-se um bit de um registro:

Para se setar um bit aplicar uma operao OR do registro alvo com


uma mscara de bits montada com o operador de deslocamento
esquerda do c: <<, tendo o operando esquerda o valor 1, e o
operando direita, o nr. de deslocadas esquerda correspondente
posio do bit no registro. Exemplo de como se setar o bit 2
(DDRB2 ) do registro DDRB :
7 6 5 4 3 2 1 0
1
0 0 0 0 0 0 0 1
1<<2
_
.
MSK 0 0 0 0 0 1 0 0
Com a mscara MSK como operando da direita do OR, aplica-se
este ao registro alvo:
DDRB |= (1<<DDB2);

Resetando-se um bit de um registro:

Para se resetar um bit aplica-se a operao AND, ao invs de OR,


do registro alvo com uma mscara de bits montada como explicado
acima, porm complementada pelo operador de complementao do
C: ~ Exemplo de como se resetar o bit 2 (DDRB2 ) do registro DDRB :
7 6 5 4 3 2 1 0
1
0 0 0 0 0 0 0 1
~(1<<2)
_
.
MSK
1 1 1 1 1 0 1 1
Com a mscara MSK como operando da direita do AND, aplica-se
este ao registro alvo:
DDRB &= ~ (1<<DDB2);

34

Setando-se mais de um bit de um registro:

Para se setar um mais de um bit aplicar a operao OR do registro


alvo com mltiplos ORs das vrias mscaras de bits correspondentes
aos bits que se deseja setar. Exemplo de como se setar os bits 2 e 3
(DDRB2 e DDRB3 ) do registro DDRB :
DDRB |= (1<<DDB3) | (1<<DDB2);

Resetando-se um bit de um registro:

Para se resetar um mais de um bit aplicar a operao AND do registro alvo com o complemento dos mltiplos ORs das vrias mscaras
de bits correspondentes aos bits que se deseja resetar. Exemplo de
como se resetar os bits 2 e 3 (DDRB2 e DDRB3 ) do registro DDRB :
DDRB &= ~ ((1<<DDRB3) | (1<<DDB2));

Complementando-se um bit de um registro:

Para se complementar um bit aplicar a operao XOR do registro


alvo com a mscara de bits correspondente ao bit que se deseja complementar. Exemplo de como se complementar o bits 2 (PORTB2 )
do registro PORTB :
PORTB ^= (1<<PORTB2);

Mscara de Bit com a Macro

BV():

Pode-se usar a macro BV() denida em AVR Libc que a mesma


coisa que (1<<n).
Exemplo de como se complementar o bits 2 (PORTB2 ) do registro
PORTB usando a macro BV():
PORTB ^= BV(2);

35

Controle de Fluxo do AVR-GCC usando teste de


bits em Registros

Espera at que bit bit de um registro Setado:


// Neste exemplo o loop executado at que PB0 v a 1

#dene PORT USADO PINB


#dene BIT TESTADO PB0
...
while ( ! ( PORT USADO & ( 1<< BIT TESTADO ) ) );
...

Espera at que bit bit de um registro Resetado:


// Neste exemplo o loop executado at que PB0 v a 0

#dene PORT USADO PINB


#dene BIT TESTADO PB0
...
while ( PORT USADO & ( 1<<BIT TESTADO ) );
...

Tipos de Dados denidos em stdint.h e inttypes.h


ANSI C

stdint.h

signed char
int8 t
unsigned char
uint8 t
short
int16 t
unsigned short
uint16 t
long
int32 t
unsigned long
uint32 t
long long
int64 t
unsigned long long uint64 t

36

Estrutura Geral dos Pinos de E/S

37

Interrupes no ATmega328

Vetor Endereo
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26

0x0000
0x0002
0x0004
0x0006
0x0008
0x000A
0x000C
0x000E
0x0010
0x0012
0x0014
0x0016
0X0018
0X001A
0x001C
0x001E
0x0020
0x0022
0x0024
0x0026
0x0028
0x002A
0x002C
0X002E
0x0030
0x0032

Fonte

Denio

RESET
Reset Ext., Power-On Reset,
INT0
Int. Externa no pino INT0
INT1
Int. Externa no pino INT1
PCINT0
Mudana estado pino Req. 0
PCINT1
Mudana estado pino Req. 1
PCINT2
Mudana estado pino Req. 2
WDT
Watchdog Time-out
TIMER2 COMPA
T/C2 Compare Match A
TIMER2 COMPB
T/C2 Compare Match B
TIMER2 OVF
T/C2 Overow
TIMER1 CAPT
T/C1 Evento de Captura
TIMER1 COMPA
T/C1 Compare Match A
TIMER1 COMPB
T/C1 Compare Match B
TIMER1 OVF
T/C1 Overow
TIMER0 COMPA
T/C0 Compare Match A
TIMER0 COMPB
T/C0 Compare Match B
TIMER0 OVF
T/C0 Overow
SPI, STC
SPI Transfer. completa
USART, RX
USART Recep. completa
USART, UDRE
USART Reg. dados vazio
USART, TX
USART Transm. completa
ADC
Conv. A/D completada
EE READY
EEPROM Pronta
ANALOG COMP
Comparador Analgico
TWI
2-Wire serial interface
SPM READY
Memria Flash Pronta
38

Interrupes no ATmega328 (cont.)

26 fontes de interrupo, bit de Seleo de Vetores de Interrupo - IVSEL=1: vetores de interrup. no setor de programa; se IVSEL=0 estes ocupam incio do setor de boot.

Interrupes Externas

Solicitadas pelos pinos INT0, INT1, ou PCINT0...23, funes alternativas de PORTD: PD2 (INT0) e PD3 (INT1), e
PORTB, PORTC e PORTD (PCINT0...23).

INT0 e INT1 podem ser ativadas por nvel zero, mudana de


estado, na borda de descida e subida, e PCINT0...23 quando
ocorre uma mudana de estado.

A seleo do modo de ativao de INT0 e INT1 feita atravs


do Reg. EICRA: bits ISC00 /ISC01 , para INT0; ISC11 /ISC10 ,
para INT1

Habilitadas/Mascaradas atravs dos bits INT0 e INT1 do Registro de Mscara de Interrupes - EIMSK, se o bit I do
SREG=1

PCINT0...23 tem a seleo de ativao feita atravs do bit


de controle PCIE0...2 , do Registro PCICR.

Quando a interrupo externa atendida, o programa desvia


p/ o vetor de interrupo correspondente, o bit I resetado,
assim como o respectivo bit dos registros EIFR e PCIFR.

Pode-se deslocar os Vetores de Interrupo do inicio da memria Flash, p/ o inicio do setor de boot, atravs dos bits
IVSEL e IVCE . Isso s ser possvel se o bit IVCE =1.

39

Reg. de Mscara de Interrup. Externa - EIMSK


EIMSK

      INT1 INT0

Bits INT0, INT1: Setado habilita a interrupo externa correspondente, desde que o bit I do SREG
esteja setado;

Reg. de Controle de Interrup. Ext. A - EICRA

Modo de Ativao das Interrupes Externas por


nvel, borda de descida, ou borda de subida.


EICRA

  ISC11 ISC10 ISC01 ISC00

Bits ISC00 /ISC01 e ISC10 /ISC11 : Interrupt Sense Control,


aos pares seleciona o modo de ativao das interrupes externas INT0, e INT1, por nvel, borda de descida, ou de subida.

Ativao de INT0/INT1

ISC01/ISC11

ISC00/ISC10

Nvel zero em INTn

Mudana de estado em INTn

Borda de descida em INTn

Borda de subida em INTn

40

Reg. de Sinalizao de Interrup. Externa - EIFR


EIFR

      INTF1 INTF0

Bits INTF0, INTF1: Interrupt Flag Bits 0 e 1, ou


Sinalizadores de Interrupo, qdo o pino INT0 ou
INT1 ativado, o ag correspondente setado,
sendo resetado por hardware no atendimento da
interrupo.

Reg. de Controle de Interrupo da Mudana de


Estado de Pino - PCICR
PCICR

     PCIE2 PCIE1 PCIE0

Bits PCIE0, PCIE1 e PCIE2: Setados, desde que


o bit I do SREG tambm esteja setado, habilitam
as interrupes externas correspondentes aos pinos
PCI0...7, PCI8...14 e PCI16...23, respectivamente,
quando estes pinos mudam de estado. A mscara
de interrupo por mudana de estado feita no
registro PCMSK0, PCMSK1 e PCMSK2, para os
pinos: PCI0...7, PCI8...14 e PCI16...23, respectivamente.
41

Exemplo de uso das interrupes externas


Controle da temperatura de um forno

Sensores de temperatura ligados aos pinos de interrupo


INT0 e INT1.

Sensor de 120C provoca interrupo INT0 e sensor de 100C


provoca a interrupo INT1.

Quando o sensor associado ao pino INT0 ativado, na borda


de descida, ento a temperatura do forno ultrapassou 120C,
e o forno deve ser desligado, uma vez que a temperatura
atingiu o seu valor mximo.

Quando o sensor associado ao pino INT1 ativado, na borda


de descida, indicando que a temperatura do forno est abaixo
de 100C, o forno deve ser ligado, por estar abaixo da temperatura limite inferior.

42

Cdigo em C editado no CodeVision:


#include <mega328p.h>
// Definies de registros
#define ACIONADOR PORTB.0
void inicializa(void);
void main(void)
{
inicializa();
ACIONADOR=1;
if(INTF0==1)
ACIONADOR=0;
while (1);
}

// Prottipo da funo

// Inicializa perifricos
// Inicia ligando o forno
// Desliga forno se T>120C
// Espera ativao de sensores

// Rotina de Interrupo Externa 0 ativada pelo sensor de 120C


interrupt [EXT_INT0] void ext_int0_isr(void)
{
ACIONADOR=0;
// Desliga forno sensor 120C ativo
}
// Rotina de Interrupo Externa 1 ativada pelo sensor de 100C
interrupt [EXT_INT1] void ext_int1_isr(void)
{
ACIONADOR=1;
// Liga forno sensor 100C ativo
}
void inicializa(void)
{
// Pino PB0 sada
DDRB|=(1<<DDB0);
PORTB=0x00;
// INT0 e INT1: Ativos na borda de descida
EICRA=(1<<ISC11) | (0<<ISC10) | (1<<ISC01) | (0<<ISC00);
// Habilita INT0 e INT1 aps I=1 (SREG)
EIMSK=(1<<INT1) | (1<<INT0);
// Habilitao Global de Interrupes, I=1
#asm("sei")
}

43

Interface com Mdulo de LCD


A conexo do LCD com o microcontrolador pode ser feita atravs
de 4 bits de dados, utilizando os pinos D4 a D7 do LCD, ou em 8
bits de dados, utilizando os pinos D0 aD7. Alm destes sinais de
dados, 3 sinais de controle so usados:

Sinal de habilitao (EN);

Sinal de seleo de escrita ou leitura (RW);

Sinal de seleo de registro de controle ou de dado (RS).

A pinagem de um LCD padro Hitachi apresentada na tabela, a


seguir:

Pino
1
2
3
4
5
6
7
8
9
10
11
12
13
14

Sigla Funo
GND Terra
Vcc Alimentao de +5V
Pot Terminal central do trimpot
RS Register Select - Seleo de Registro
RW Read/Write - Sinal de Leitura e Escrita
EN Enable - Sinal de Habilitao
D0 Sinal de dados D0 (LSB)
D1 Sinal de dados D1
D2 Sinal de dados D2
D3 Sinal de dados D3
D4 Sinal de dados D4
D5 Sinal de dados D5
D6 Sinal de dados D6
D7 Sinal de dados D7 (MSB)
44

Funes da Biblioteca alcd.h do Codevision

void lcd init(unsigned char lcd columns) - Inicializa o controlador do LCD conforme tipo em nr de colunas;

void lcd clear(void) - Limpa o LCD;

void lcd gotoxy(unsigned char x, unsigned char y) - Posiciona


cursor do LCD na posio x,y (x=0..39 e y=0..3);

void lcd putchar(char c) - Escreve no LCD um caracter;

void lcd puts(char *str) - Escreve string de caracteres no


LCD;

void lcd putsf(char ash *str) - Escreve no LCD string de


caracteres localizada na memria Flash;

void lcd putse(char eeprom *str) - Escreve no LCD string de


caracteres localizada na memria EEPROM;

unsigned char lcd read byte(unsigned char addr) - L da memria de caracteres;

void lcd write byte(unsigned char addr, unsigned char data) Escreve na memria de caracteres;

Obs1: RS=RW=EN=0 selecionam escrita no registro de controle;

Obs2: RS=1 e RW=EN=0 selecionam escrita no registro de


dados;

Obs3: Modo de operao do LCD: interface em 4.

45

Interface com LCD em 4 Bits no Codevision

A mensagem que ser apresentada a clssica mensagem


ALO MUNDO na 1 linha e HELLO WORLD! na 2 linha.

/*******************************************************
Chip: ATmega328P Clock: 16,000000 MHz
*******************************************************/
#include <mega328p.h>
#include <alcd.h>
// Prottipo da funo inic()
void inic(void);
void main(void){
inic();
lcd_puts("ALO MUNDO!");
// Escreve string na coluna 0 linha0
lcd_gotoxy(0,1);
// Posiciona cursor na coluna 0 linha1
lcd_puts("HELLO WORLD!"); // Escreve string na coluna 0 linha1
while (1);
}
void inic(void){
// LCD Alfanumerico: inicializao
// RS:PB4, RD:GND, EN:PB5, D4:PB0, D5:PB1, D6:PB2, D7:PB3
// Caracteres/linha: 16
lcd_init(16);
// Inicializa o LCD conforme acima
}

46

Interface com Teclado Matricial

A mensagem Pressione tecla apresentada na 1 linha e o


caracter da tecla na linha 2 linha.

#include <mega328p.h>
#include <delay.h>
#include <alcd.h>
#define COL1 PORTD4
#define COL2 PORTD5
#define COL3 PORTD6
#define
#define
#define
#define

C1L1
C1L2
C1L3
C1L4

0b11101110
0b11101101
0b11101011
0b11100111

#define
#define
#define
#define

C2L1
C2L2
C2L3
C2L4

0b11011110
0b11011101
0b11011011
0b11010111

#define
#define
#define
#define

C3L1
C3L2
C3L3
C3L4

0b10111110
0b10111101
0b10111011
0b10110111

void inic(void);

47

void le_tecla(void);
void print(unsigned char tecla);
void main(void)
{
inic();
lcd_puts("Pressione tecla");
lcd_gotoxy(0,1);
while(1){
le_tecla();
}
}
void le_tecla(void)
{
PORTD|=(1<<COL1)|(1<<COL2)|(1<<COL3);
PORTD&=~(1<<COL1);
delay_ms(100);
switch(PIND){
case C1L1:print('1');
break;
case C1L2:print('4');
break;
case C1L3:print('7');
break;
case C1L4:print('*');};
PORTD|=(1<<COL1);
PORTD&=~(1<<COL2);
delay_ms(100);
switch(PIND){
case C2L1:print('2');
break;
case C2L2:print('5');
break;
case C2L3:print('8');
break;
case C2L4:print('0');};
PORTD|=(1<<COL2);
PORTD&=~(1<<COL3);
delay_ms(100);
switch(PIND){
case C3L1:print('3');
break;
case C3L2:print('6');
break;
case C3L3:print('9');
break;
case C3L4:print('#');};

PORTD|=(1<<COL3);
}
void print(unsigned char tecla)
{
lcd_putchar(tecla);
while((PIND & 0x0F)!=0x0F);
}
void inic(void)
{
DDRD=0xF0;
//
PORTD=0xFF;
//
UCSR0B=0x00; //
lcd_init(16); //
}

Bits7..4=Sadas e Bits2..0=Entradas
Bits7..4=0 e Bits3..0=Pullup
USART desabilitada
LCD tipo 16 caracters/linhas

Interrupes dos Temporizadores/Contadores

Interrupo por Overow:

Interrupo por Comparao de Valores:

Interrupo por Captura de Valores:

Quando o Registro de Contagem do T/C atinge o mximo valor de contagem;

Quando uma
comparao entre o Registro de Contagem e o de Comparao, resulta verdadeiro;

Quando o pino de
Captura ICP ativado, o valor de contagem corrente no Registro de Contagem, capturado.

Interrupo por Overow na Contagem

Ocorre se a contagem no registro de contagem de 8 bits


TCNT0 ou TCNT2, dos T/C0 e T/C2, ou no de 16 bits do
T/C1 - TCNT1, alcana o valor mximo/mnimo de contagem, no caso: 255/0 ou 65535/0, respectivamente.

O ag TOV0 , TOV1 ou TOV2 do registro TIFR0, TIFR1


ou TIFR2, setado em resposta ocorrncia do overow na
contagem do T/C0, T/C1 ou T/C2, repectivamente.

A interrupo deve ser habilitada setandos-se os bits:

TOIE0 , TOIE1

E bit de Habilitao Global de Interrupes,

ou TOIE2 => T/C0, T/C1 ou T/C2


Registros TIMSK0, TMSK1 ou TMSK2, respectivamente;

I =1.
48

Interrupo por Comparao de Valores

Ocorre quando os contedos do Reg. de Sada de Comparao e do Registro de Contagem de um T/C se igualam:

T/C
0
1
2

Reg. Comparao

OCR0A/OCR0B
OCR1A(H/L)/OCR1B(H/L)
OCR2A/OCR2B

Reg. de Contagem
TCNT0
TCNT1(H/L)
TCNT2

As interrupes so individualmente habilitadas setando-se os


respectivos bits de habilitao de cada T/C, de acordo com
a tabela a seguir, devendo-se ainda, setar o bit I em SREG.

T/C
0
1
2

Bit

OCIE0A/OCIE0B
OCIE1A/OCIE1B
OCIE2A/OCIE2B

Reg. de Mscara de Interrupo


TIMSK0
TIMSK1
TIMSK2

49

O ags: OCF0A ou OCF0B do registro TIFR0, sinalizam a


ocorrncia da igualdade na comparao do T/C0

O ags: OCF1A ou OCF1B do registro TIFR1, sinalizam a


ocorrncia da igualdade na comparao do T/C1

O ags: OCF2A ou OCF2B do registro TIFR2, sinalizam a


ocorrncia da igualdade na comparao do T/C2

Interrupo por Captura de Valores

Ocorre quando o pino ICP ativado, levando captura do


valor de contagem corrente, no registro ICR1.

Pode-se, ainda, utilizar a sada do comparador analgico como


sinal de disparo para a captura.

Em resposta, o ag ICF1 setado, e caso a interrupo por


captura esteja habilitada (bit TICIE1=1 em TIMSK, e I =1
em MCUCR), o programa desviar para o vetor de interrupo
localizado em 0003.

Reg. de Mscara de Interrup. dos T/C's

TIMSK0


OCIE0B

OCIE0A

TOIE0

ICIE1

OCIE1B

OCIE1A

TOIE1

OCIE2B

OCIE2A

TOIE0

TIMSK1
TIMSK2

Bits

TOIE0, TOIE1 e TOIE2 :

Bits

OCIE0A/B, OCIE1A/1B

Bit ICIE1 :

Timer Overow Interrupt


Enable dos T/C0, T/C1 e T/C2, setado habilita a interrupo do T/C correspondente por Overow na Contagem,
desde que o bit I tambm esteja setado;

OCIE2A/2B :

Output
Compare Interrupt Enable A e B dos T/C0, T/C1 e T/C2,
setado habilita a interrupo do T/C correspondente, por
Comparao de Valores A ou B, respectivamente, desde que
o bit I tambm esteja setado;

Input Capture Interrupt Enable do T/C1, setado


habilita a interrupo do T/C1 por Captura de Valores, desde
que o bit I tambm esteja setado

50

Reg. de Sinaliz. de Interrup. dos T/C's

TIFR0


ICF1

Bit

Bits

Bit ICF1 :

OCF0B

OCF0A

TOV0

OCF1B

OCF1A

TOV1

OCF2B

OCF2A

TOV2

TIFR1
TIFR2

TOV 0 , TOV 1 e TOV 2 :

Timer Overow Interrupt


Flag do T/C1, setado por hardware quando ocorre Overow
na Contagem do T/C1. Resetado por hardware no atendimento da interrupo;

OCF0A/B, OCF1A/B e OCF2A/B :

Output Compare Interrupt Flag A e B dos T/C0, T/C1 e T/C2, setado


por hardware na Comparao de Valores A ou B do respectivo
T/C, quando verdadeira. Resetado por hardware no atendimento da interrupo;

Input Capture Interrupt Flag do T/C1, setado na


captura de valores via pino ICP. Resetado por hardware no
atendimento da interrupo;

51

Temporizadores/Contadores - T/C's

- T/C0 de 8 bits.
- T/C2 de 8 bits.
- T/C1 de 16 bits.
Temporizador de Pr-Diviso de 10 bits
Circuito comum aos 2 T/C's que faz a pr-diviso sinal de clock
interno - CK , oriundo do circuito de clock, independentemente,
obtendo-se: CK/8 , CK/64 , CK/256 , ou CK/1024 .

Obs1:

T0 e T1 no passam pelo bloco de pr-diviso, portanto


a ao do Prescaler Timer se restringe a operao dos T/C's no
modo temporizador.

Obs2:

Os bits de controle de Seleo de Clock: CS00:2 e CS10:2 ,


so os responsveis pela seleo da fonte do sinal de clock que
ser efetivamente enviado a cada T/C.

52

Temporizador/Contador 0 de 8 Bits

Caractersticas Principais do T/C0:

Temporizador/Contador de Eventos Bidirecional de 8 bits;

Pr-Diviso (Prescaler) do clock da CPU de 10 bits;

Unidade de Comparao de Valores c/ Recarga Automtica;

Gerador de Frequncias;

Sada PWM c/ Resoluo de 8 bits;

Duas fontes de interrupo: Overow e Comparao

53

Arquitetura Interna do T/C0

54

Registro de Contagem - TCNT0

onde ocorre a contagem em 8 bits, podendo contar de forma crescente ou decrescente;

Quando o valor de contagem chega em 255 (FFH),


na contagem crescente, ou 0 (zero), na contagem
decrescente, ocorre o Overow na contagem;

Neste caso, bit de ag TOV0 setado, e uma interrupo por Overow ser requisitada, se previamente habilitada.

T/C0 como Temporizador ou Contador

Se a origem do sinal de clock o Temporizador


de Pre-Diviso, a operao do T/C0 ser como
Temporizador;

Se a origem deste sinal de clock o pino T0, a


operao ser como Contador de Eventos;

A seleo do modo de operao, feita atravs dos


bits: CS02, CS01, e CS00, do Registro de Controle
do T/C0 - TCCR0.
55

Modos de Operao do T/C0

Aps selecionar a operao do T/C0 como: Temporizador (com um determinado fator de prescaler), ou
Contador de Eventos (ativo na borda de descida ou subida), deve-se congurar, em seguida o modo de contagem em TCNT0, atravs dos bits de Seleo de Modo
de Gerao de Onda: WGM02, WGM01 e WGM00:

Modo Normal: Contagem crescente at valor m-

Modo CTC: Sigla de Clear Timer on Compare

Modo PWM Rpido: Gerao de sinal PWM no

ximo (255), sem recarga automtica;

Match, onde a contagem crescente em TCNT0


ocorre at a comparao c/ o Reg. de Comparao - OCR0, resultar verdadeiro, quando TCNT0
zerado, e o pino OC0 ser setado, resetado, ou
complementado, dependendo da programao efetuada previamente nos bits COM01 /COM00 ;
pino OC0, c/ frequncias de PWM cerca de duas
vezes mais altas, que no PWM Corrigido em Fase;

PWM Corrigido em Fase: Gerao de sinal PWM

no pino OC0, onde se obtm um sinal PWM com


fase corrigida, apesar de resultar em frequncias
menores que o modo anterior.
56

57

Registro de Controle do T/C0 - TCCR0A

TCCR0A
COM0A1

COM0A0

COM0B1

COM0B0

- -

WGM01

WGM00

Bits COM0A1, COM0A0: Compare Output Mode,


ou Modo de Sada de Comparao, seleciona o
modo como o pino de sada OC0A se comportar.
Modo de Ativao da Saida OC0A

COM0A1

COM0A0

0
0
1
1

0
1
0
1

COM0A1

COM0A0

0
0
1
1

0
1
0
1

COM0A1

COM0A0

0
0
1

0
1
0

Modo Normal (WGM02...0=000)

OC0A Desconectado.
OC0A Muda de Estado na Comparao .
Reseta OC0A na Comparao.
Seta OC0A na Comparao.

Modo PWM Rpido (WGM02...0=011)

OC0A Desconectado.
Reservado.
OC0A=0 na Comparao, 1 no valor MX.
OC0A=1 na Comparao, 0 no valor MX.

PWM Fase Corrig. (WGM02...0=001)


OC0A Desconectado.
Reservado.
OC0A=0 na Comparao em contagem
crescente, OC0A=1 na contagem decres.
OC0A=1 na Comparao em contagem
crescente, OC0A=0 na contagem decres.

58

Bits COM0B1, COM0B0: Compare Output Mode,


ou Modo de Sada de Comparao, seleciona o
modo como o pino de sada OC0B se comportar.
Modo de Ativao da Saida OC0B

COM0B1

COM0B0

0
0
1
1

0
1
0
1

COM0B1

COM0B0

0
0
1
1

0
1
0
1

COM0B1

COM0B0

0
0
1

0
1
0

Modo Normal (WGM02...0=000)

OC0B Desconectado.
OC0B Muda de Estado na Comparao .
Reseta OC0B na Comparao.
Seta OC0B na Comparao.

Modo PWM Rpido (WGM02...0=011)

OC0B Desconectado.
Reservado.
OC0B=0 na Comparao, 1 no valor MX.
OC0B=1 na Comparao, 0 no valor MX.

PWM Fase Corrig. (WGM02...0=001)


OC0B Desconectado.
Reservado.
OC0B=0 na Comparao em contagem
crescente, OC0=1 na contagem decres.
OC0B=1 na Comparao em contagem
crescente, OC0B=0 na contagem decres.

59

Registro de Controle do T/C0 - TCCR0B

TCCR0B
FOC0A

FOC0B

WGM01

CS02

CS01

CS00

Bits CS02, CS01, CS00 : Bits Clock Selection, selecionam


a operao do T/C0, como Temporizador ou Contador de
Eventos, o fator de prescaler (se no modo Temporizador),
e o modo Contador de Eventos, a ativao do sinal T0 na
borda de descida ou subida:

Clock do Contador

CS02

CS01

CS00

Para a contagem do T/C0

Clock proveniente do clock da CPU

Clock = clock da CPU/8

Clock = clock da CPU/64

Clock = clock da CPU/256

Clock = clock da CPU/1024

Clock = T0 na borda de descida

Clock = T0 na borda de subida

Bits WGM01, WGM00 : Bits Wave Form Generator Mode, selecionam o modo de operao: Normal, PWM Rpido, PWM
Corrigido em Fase, e CTC.
WGM02..1

000
001
010
011
100
101
110
111

Modo

TOP OCRx Update

Normal (00->FF) 0xFF


PWM Corr. Fase 0xFF
CTC
OCRA
PWM Rpido
0xFF
Reservado
PWM Corr. Fase OCRA
Reservado
PWM Rpido
OCRA

Imed.
TOP
Imed.
BOTTOM
TOP
BOTTOM

60

Bits FOC0A/B: Force Output Compare, quando


setado, fora a sada de comparao OC0 a produzir uma mudana, de acordo com o comportamento
selecionado nos bits COM01, COM00, porm somente nos modos no PWM (bit WGM00=0).

61

Operao do T/C0 no Modo Normal - Timer Overow

Seleo operao modo normal em TCCR0A:


Bits WGM01/WGM00=00;

Seleo do clock de contagem em TCCR0B:


Bits CS00/CS01/ CS02=00;

Contagem em TCNT0 de modo crescente, por Overow na Contagem;

No Overow, o bit de ag TOV0 (Timer Overow


0) setado no mesmo ciclo de clock em que a
contagem vai a 0;

Interrupo habilitada atravs do bit TOIE0 (Timer Overow Interrupt Enable), do Reg. TIMSK0;

Desvio para o endeero 0007 se o bit I=1 (Habilitao Global de Interrupes) e TOIE0=1.

Quando da execuo da rotina de interrupo o ag


TOV0 automaticamente resetado.
62

Exemplo: Piscando um Led a cada 1,0s via T/C0

Usando o T/C0, c/ clock de contagem: fclk /1024, p/ um


cristal de 16,0MHz, o perodo de contagem do T/C0 caria:

Tclk = 0, 0625us.1024 = 64us

Inicializando-se TCNT0 c/ 100, aps 156 pulsos de contagem


de 64us, TCNT0=255, e um pedido de interrupo do T/C0
por Overow na Contagem gerado, isso aps um tempo de:
T=0,009984s = (156x64us) ' 10ms.

A interrupo do T/C0, tendo sido habilitada atravs do registro TIMSK0, o programa desviar para o vetor de interrupo
do T/C0, no endereo 0x010.

Para se chegar a 1,0 segundo, bastar repetir 100 vezes a


interrupo do T/C0, ou seja:
T' 10ms.100 = 1000ms = 1s.

Aps 100 repeties, um registro de contagem foi de 100 at


0, podendo-se mudar o estado do pino PB5 fazendo o LED
piscar. Deve-se ento, reiniciar o registro de contagem em
100, para repetir o processo ciclicamente.

63

Cdigo em C no CodeVision:
/* Chip: ATmega328

Clock: 16,000000 MHz */

#include <mega328.h>
void inicializa(void);
unsigned char i=100;
// Timer 0 overflow interrupt service routine
interrupt [TIM0_OVF] void timer0_ovf_isr(void)
{
TCNT0=100;
// Valor de recarga p/ T=9,984 ms
i--;
if (i==0) {
i=100;
// Aps 100x T=0,9984 s
PORTB.5=~PORTB.5;} // Complementa pino PB0
}
void main(void)
{
inicializa();
while (1);
}
void inicializa(void)
{
DDRB=(1<<DDB5);
PORTB=0x00;
TCCR0A=0x00; // Clock source: System Clock; Mode: Normal top=0xFF
TCCR0B=(0<<WGM02)|(1<<CS02)|(0<<CS01)|(1<<CS00); // Clk T/C0=15,625 kHz
TCNT0=100;
// Timer Period: 9,984 ms
// Timer/Counter 0 Interrupt(s) initialization
TIMSK0=(0<<OCIE0B)|(0<<OCIE0A)|(1<<TOIE0); // T/C0 Interrupo por overflow
#asm("sei")
// Habilitao Global de Interrupes
}

64

Cdigo em C no WinAVR:
/* Chip: ATmega328P

Clock: 16,000000 MHz */

#include <avr/io.h>
#include <avr/interrupt.h>
void inializa(void);
unsigned char i=100;
// Timer 0 overflow interrupt service routine
ISR(TIMER0_OVF_vect)
{
TCNT0=100;
// Valor de recarga p/ T=9,984 ms
i--;
if(i==0){
i=100;
// Aps 100x T=0,9984 s
PORTB ^= (1<<PB5); // Complementa pino PB5
}
else
return;
}
int main(void)
{
inializa();
while (1);
}
void inializa(void)
{
DDRB=(1<<DDB5);
PORTB=0x00;
TCCR0A=0x00; // Clock source: System Clock; Mode: Normal top=0xFF
TCCR0B=(0<<WGM02)|(1<<CS02)|(0<<CS01)|(1<<CS00); // Clk T/C0=15,625 kHz
TCNT0=100; // Timer Period: 9,984 ms
TIMSK0=(0<<OCIE0B)|(0<<OCIE0A)|(1<<TOIE0); // T/C0 Interrupo por overflow
sei();
// Habilitao Global de Interrupes
}

65

Exemplo: Piscando um Led a cada 1,0s via T/C0


sem interrupo
Neste caso o bit de overow (TOV0) deve ser continuamente
vericado para se saber quando o overow ocorreu (TOV0=1).
Este ag deve ser resetado por software (fazendo TOV=1) j que
no haver interrupo para reset-lo automaticamente.

Cdigo em C no CodeVision:
/* Chip: ATmega328

Clock: 16,000000 MHz */

#include <mega328.h>
void inicializa(void);
unsigned char i=100;
void main(void)
{
inicializa();
while (1){
while(!(TIFR0 & (1<<TOV0)));
TIFR0|=(1<<TOV0);
TCNT0=100;
// Valor de recarga p/ T=9,984 ms
i--;
if (i==0) {
i=100;
// Aps 100x T=0,9984 s
PORTB.5=~PORTB.5;} // Complementa pino PB0
}
}
void inicializa(void)
{
DDRB=(1<<DDB5);
PORTB=0x00;
TCCR0A=0x00;
// Clock: Clock da CPU/1024 (T/C0=15,625 kHz)
TCCR0B=(0<<WGM02)|(1<<CS02)|(0<<CS01)|(1<<CS00);
TCNT0=100;
// Timer Period: 9,984 ms
// T/C0 Interrupes desabilitadas
TIMSK0=(0<<OCIE0B)|(0<<OCIE0A)|(0<<TOIE0);
}

66

T/C0 no Modo CTC - Clear Timer on Compare


Match

Seleo feita nos Reg. de Controle do T/C0 - TCCR0A/B:


WGM02..00 =010;

Contagem sempre de modo crescente;

TCNT0, comparado continuamente o c/ o Reg. de Comparao - OCR0A ou OCR0B, fazendo TCNT0=0, e ativando
o pino OC0A ou OC0B, quando houver igualdade entre seus
contedos.

O registros OCR0A ou OCR0B determina o valor mximo de


contagem (TOP), e portanto a resoluo;

O bit de ag:

Interrupo de comparao habilitada, atravs do bit

Desvio para o endereo 000E, se o bit


de interrupes), e OCIE0 =1.

O ag OCF0 automaticamente resetado, quando do atendimento da interrupo.

Pino OC0, poder setar, resetar, ou complemetar seu estado,


de acordo com os bits de Seleo de Modo de Sada de Comparao: COM01 /COM00 .

OCF0

setado no prximo ciclo de clock.

I=1

OCIE0 ;

(habilitao global

67

O ag de Overow na Contagem - TOV0 , poder gerar interrupes se o bit TOIE0=1, e o bit I=1;

Na gerao de forma de onda em OC0, esta sada deve ser


congurada p/ complementar seu estado a cada comparao,
sendo que:




A frequncia mxima gerada:


OCR0=0;

A frmula para outros valores de frequncia em: OCR0,


poder ser calculada como sendo:

fOC0A/B =
Onde:

fOC0 = fClkIO /2 quando

fClkIO
2.N.(1 + OCR0A/B)

N =fator de prescaler; e fClkIO = Clock de E/S

Ser necessrio ainda, congurar a direo do pino OC0A


(PD6) ou OC0B (PD5), como pino de sada, atravs do
Registro de Direo de Dados - DDRB.

Exemplo: Gerao de 20kHz em PD6 (OC0A) c/ T/C0 no


Modo CTC
Onda quadrada de 20kHz em PD6=OC0A. Frequncia de clock
(fCLK ) do ATmega328 de 16MHz, e o fator de prescaler (N) do
T/C0 de 8. A frequncia de 20kHz gerada com o T/C0 funcionando no modo CTC, quando na comparao do reg. OCR0A
c/ o reg. TCNT0, o pino OC0A (PD6) complementa seu estado
sempre que OCR0A=TCNT0.

A frequncia gerada no pino OC0A ser de:

f =

fClkIO
16.000.000
=
= 20.000Hz
2.N.(1 + OCR0A)
2.8.(1 + OCR0A)

o que leva a um valor para OCR0A de 49=0x31.

68

Cdigo em C editado no CodeVision:


/*******************************************************
Chip: ATmega328P
Clock frequency: 16,000000 MHz
*******************************************************/
#include <mega328p.h>
void inic(void);
void main(void)
{
inic();
while (1);
}
void inic(void)
{
DDRD=(1<<DDB6);
PORTD=(1<<PORTD6);
// Timer/Counter 0: Clock source: System Clock
// Clock value: 2 MHz
// Mode: CTC top=OCR0A
// OC0A output: Toggle OC0A on compare match
TCCR0A=(0<<COM0A1) | (1<<COM0A0) | (0<<COM0B1) | (0<<COM0B0)
| (1<<WGM01) | (0<<WGM00);
TCCR0B=(0<<WGM02) | (0<<CS02) | (1<<CS01) | (0<<CS00);
TCNT0=0x00;
OCR0A=0x31;
// Valor de OCR0A p/ f=20kHz (T/2: 0,025 ms)
}

69

Temporizador/Contador 1 de 16 Bits

Caractersticas principais do T/C1

Contagem em 16 bits Bidirecional;

Pr-Diviso (Prescaler) do clock da CPU de 10 bits;

Gerao de sada em PWM, com at 16 bits de resoluo;

Sada em PWM com perodo varivel;

Duas unidades comparadoras Independentes de 16 bits;

Uma unidade de captura c/ cancelamento de rudo na entrada


ICP;

Clear Timer on Compare Match (CTC - Auto reload);

Quatro fontes de interrupo independentes (TOV1, OCF1A,


OCF1B e ICF1).

70

O Registro de Contagem TCNT1 deve ser acessado, em 2 acessos de 8 bits, atravs dos registros
TCNT1H e TCNT1L, usando-se as instrues de
IN e OUT.

No T/C1 existem 2 registros de controle: TCCR1A


e TCCR1B, alm do Registro de Entrada de Captura ICR1, e 2 Registros de Comparao OCR1A e
OCR1B.

O clock de contagem (CLKT1) pode ser oriundo de


2 fontes distintas: do Prescaler Timer, ou do pino
externo T1, diferenciando o funcionamento como
Temporizador ou Contador de Eventos.

Os bits de Seleo de Clock: CS12, CS11, e CS10,


do Registro de Controle B (TCCR1B) determina a
origem do sinal de clock e o fator de prescaler.

Selecionada a operao como Temporizador ou Contador de Eventos (bits CS12, CS11, e CS10), o
modo de contagem em TCNT1, e o comportamento dos pinos OC1A/OC1B, ser feito pelos
bits:




WGM13 , WGM12 , WGM11 , WGM10 (TCCR1B/TCCR1A)


COM1A1 , COM1A0 , COM1B1 , COM1B0 (TCCR1A)

71

Arquitetura Interna do T/C1

72

Modos de Operao do T/C1

Modo Normal: Contagem crescente at valor m-

ximo (65.535), sem recarga automtica;

Modo CTC: Clear Timer on Compare Match, onde

a contagem ocorre crescentemente at que OCR1A


ou ICR1=TCNT1, quando TCNT1 zerado;

Modo PWM Rpido: Gerao de sinal PWM no


pino OC0, com frequncias mais elevadas;

Modo PWM Corrigido em Fase: Gerao de si-

nal PWM Corrigido em Fase, para melhor resoluo


de sinal;

Modo PWM Corrigido em Fase/Frequncia:

Gerao de sinal PWM Corrigido em Fase e em


Frequncia, para aplicaes que exigem um sinal
PWM de alta resoluo.

73

T/C1 no Modo Normal

WGM13:0=0000 ;

Selecionado quando os bits

A contagem em TCNT1 ocorre sempre no modo crescente,


por Estouro de Contagem (Overow);

Se TCNT1=65.535 (FFFFH), ocorre o Overow na contagem e o bit de ag TOV1 setado.

Interrupo de overow do T/C1 habilitada, atravs do bit


TOIE1 do registro TIMSK

Desviar para 0006, se o bit

Quando da execuo da rotina de interrupo o ag


automaticamente resetado.

As unidades de Entrada de Captura, e Sada de Comparao, (Registros ICR1 e OCR1A/OCR1B), funcionam normalmente, podendo mesmo gerar interrupes se programadas
para tal.

Quando a comparao resulta verdadeira a ativao dos pinos OC1A (funo alternativa de PD5) e OC1B poder ser
setado, resetado, ou complemetado, sendo a seleo feita
atravs dos bits COM1A1 /COM1B1 , COM1A0 /COM1B0 ,
do Registro TCCR1A.

I=1 ,

TOIE1 =1.
TOV1

74

T/C1 no Modo CTC (Clear Timer on


Compare Match)

Continuamente TCNT1 comparado com o Reg.


de Comparao A: OCR1A, se os bits WGM13:0=4,
ou com o Registro de Captura: ICR1, se os bits
WGM13:0=12, fazendo TCNT1=0, e ativando o
pino externo OC1A (funo alternativa de PD5),
sempre que TCNT1=OCR1A ou ICR1.

OCF1A, ou ICF1, setado no prximo ciclo de


clock.

Interrupo de comparao A, ou de captura, habilitada atravs do bit OCIE1A ou TICIE1, respectivamente,

75

Desvio para 0004 ou 0005, se uma instruo SEI,


setou o bit I, e OCIE1A ou TICIE1=1;

Quando da execuo da rotina de interrupo o


bit de ag OCF1A ou TICF1, conforme o caso,
automaticamente resetado.

Quando TCNT1=OCR1A ou ICR1, o pino OC1A,


poder ser setado, resetado, ou complemetado, seleo feita atravs dos bits COM1A1/COM1B1,
COM1A0/COM1B0, (Reg. de Controle TCCR1A).

Na gerao de forma de onda atravs da sada


OC1A, a frequncia mnima gerada ser de:

fOC1A = fClkIO /2,

quando OCR1A=0, e a frmula para outros valores em: OCR1A, poder


ser calculada como sendo:
fClkIO
fOC1A =
2.N.(1 + OCR1A)

Onde: N =fator de prescaler; e


de E/S

fClkIO =

Sinal de clock
76

T/C1 no Modo PWM Rpido

A contagem crescente ocorre do valor inicial: 0, at


o mximo: TOP, denido pelo Reg. de Comparao ou de Captura (OCR1A ou ICR1), reiniciando
a contagem em 0.

No modo Inversor, qdo TCNT1=OCR1A/OCR1B,


o pino OC1A/OC1B, respect., resetado, voltando
a ser setado quando o contador atinge o valor mximo, reiniciando a contagem no valor 0.

No modo No-Inversor, ocorre o oposto: OC1A ou


OC1B setado, voltando a ser resetado quando
o contador atinge o valor mximo, reiniciando a
contagem no valor 0.

77

Resolues no modo PWM Rpido

3 Modos com resoluo xa:








Resoluo dada por OCR1A ou ICR1


Resoluo mnima de 2bits, quando o valor em OCR1A
ou ICR1 for 3;
Resoluo mxima de 16bits, quando OCR1A ou ICR1 for
de 65535.
Outras resolues dadas por:

OP +1)
R = log(T
log(2)

Seleo do modo atravs dos bits:

WGM13 , WGM12 , WGM11 ,

Bits dos Regs. TCCR1A, e TCCR1B


*

Largura dos pulsos no pino OC1A dependem do valor em


OCR1A ou ICR1;

2 Modos com resoluo varivel:

8, 9, ou 10bits, sendo que os registros OCR1A ou ICR1


devero ser carregados com valores de comparao que
devero ser: 255, 511, ou 1023, p/ 8, 9 e 10 bits.

WGM10 *

Alm destes 5 modos de PWM Rpido, outros 10 modos


so possveis, totalizando 15 modos de operao do T/C1.

WGM12/WGM11/WGM10==CTC1/PWM11/PWM10 no AT90S8515.
78

Frequncia do sinal PWM (OC1A/OC1B):


fOC1A =

fClkIO
N.(1 + T OP )

Onde: T OP =valor em OCR1A ou ICR1, de 3 a 65.536


fClkIO = Sinal de clock de E/S
No modo PWM, os bits FOC1A e FOC1B , do registro TCCR1A, devero
estar em nvel lgico 0.
O sinalizador de Overow - TOV1, ser setado sempre que a contagem
atingir o valor mximo denido em OCR1A, e sempre que uma comparao resulta verdadeira, o ag correspondente: OCF1A/OCF1B tambm
setado no mesmo ciclo de clock.
Interrupes de comparao do T/C1 so habilitadas, atravs do bit
OCIE1A, ou OCIE1B ;
Desvio para 0004, ou 0005, respectivamente, se as interrupes foram
previamente habilitadas e o bit I=1 .
O bit de ag OCF1A ou OCF1B automaticamente resetado, quando
do atendimento da respectiva interrupo, onde pode-se atualizar o valor
mximo - TOP, e o valor de comparao.
O uso do Registro de Captura - ICR1, para a denio do valor mximo
(TOP), de forma a manter este xo, o modo mais apropriado para este
registro. Se for necessrio a mudana da frequncia do sinal PWM de
forma dinmica, atravs da mudana deste valor mximo, deve-se usar o
Registro OCR1A, uma vez que este conta com um buer duplo.

79

T/C1 no Modo PWM Corrigido em Fase

Contagem crescente/decrescente de 0 ao valor mximo respectivo resoluo desejada, e voltando a contar de forma
decrescente at 0, ciclicamente.

O PWM Corrigido em Fase opera com dupla inclinao, reduzindo com isto a frequncia de operao.

Quando TCNT1=OCR1A/OCR1B => PD5 (OC1A)/OC1B


sero setados ou resetados, conforme: COM1A1 /COM1A0
p/ OC1A, e COM1B1 /COM1B0 p/ OC1B (TCCR1A).

80

No modo No-Inversor, quando TCNT1=OCR1A


ou OCR1B, na contagem crescente, a sada OC1A
ou OC1B resetada. Na contagem decrescente,
OC1A ou OC1B setada.

No modo Inversor da Sada de Comparao, a operao inversa a descrita acima.

O modo como se comportar o pino de sada OC1A,


ou OC1B, determinada pelos bits de Seleo de
Modo de Sada de Comparao: COM1x1 e COM1x0.

Frequncia/Resoluo (OC1A/OC1B):

fOC1A =

Onde:

fClkIO =

T OP =valor

fClkIO
2.N.T OP

Sinal de clock de E/S

em OCR1A ou ICR1, de 3 a 65.536

Resoluo, a mesma que para o PWM Rpido:


log(T OP + 1)
R=
log(2)

81

T/C1 no Modo PWM Corrigido em Fase


e Frequncia

Contagem de 0 ao valor mximo respectivo resoluo desejada, e voltando a contar de forma decrescente at 0, ciclicamente repetindo o processo,
dando origem a dupla inclinao.

Diferena em relao ao modo Corrigido em Fase:


atualizao do Registro de Comparao - OCR1x,
que agora atualizado no valor mnimo de contagem, ou seja em 0. Com isto os instantes de
comparao sero simtricos.

Resoluo e frequncia do sinal PWM so as mesmas do modo PWM Corrigido em Fase.

82

Reg. de Controle B do T/C1 - TCCR1B

TCCR1B
ICNC1

ICES1

WGM13

WGM12

CS12

CS11

CS10

Bits CS12, CS11, CS10: Clock Selection do T/C1,


selecionam a operao como Temporizador com um
valor de prescaler (8/64/256/1024), ou Contador
de Eventos com ativao do sinal T1 na borda de
descida ou subida.
Clock do Contador

CS12

CS11

CS10

Para a contagem do T/C1

Clock proveniente do clock da CPU

Clock = clock da CPU/8

Clock = clock da CPU/64

Clock = clock da CPU/256

Clock = clock da CPU/1024

Clock=T1na borda de descida

Clock=T1 na borda de descida

Bit ICNC1: Input Capture Noise Canceler, quando


setado, ativa o Circuito Cancelador de Rudo da Entrada de Captura (ICP1). Produz um atraso nesta
entrada de 4 ciclos de clock;

Bit ICES1: Input Capture Edge Select, setado seleciona a ativao do pino ICP1, por borda de subida,
resetado por borda de descida.
83

Bits WGM13, WGM12 : Wave Form Generator Mode, junto


com os bits WGM11, WGM10 , de TCCR1A, selecionam o
modo como operar o T/C1.

Operao
do T/C1

WGM13..0

Obs.2

TOP

Normal
0000
FFFFH
PWM c/ Cor0001
00FFH
reo de Fase
PWM c/ Cor0010
01FFH
reo de Fase
PWM c/ Cor0011
03FFH
reo de Fase
CTC
0100
OCR1A
PWM Rpido
0101
00FFH
PWM Rpido
0110
01FFH
PWM Rpido
0111
03FFH
PWM Corrigido
1000
ICR1
em Fase/Freq.
PWM Corrigido
1001
OCR1A
em Fase/Freq.
PWM Corrigido
1010
ICR1
em Fase
PWM Corrigido
1011
OCR1A
em Fase
CTC
1100
ICR1
Reservado
1101
PWM Rpido
1110
ICR1
PWM Rpido
1111
OCR1A
1 Resoluo
2 CTC1/PWM11/PWM10 no AT90S8515

Res. OCR1x TOV1


Obs.1 Atualiz. Ativo
8 bits

Imediato
TOP

FFFFH
0000

9 bits

TOP

0000

10 bits

TOP

0000

OCR1A
8 bits
9 bits
10 bits
ICR1

Imediato
0000
0000
0000
0000

FFFFH
TOP
TOP
TOP
0000

OCR1A

0000

0000

ICR1

TOP

0000

OCR1A

TOP

0000

ICR1
ICR1
OCR1A

Imediato
0000
0000

FFFFH
TOP
TOP

84

Reg. de Controle A do T/C1 - TCCR1A

TCCR1A
COM1A1

COM1A0

COM1B1

COM1B0

- -

WGM11/10

Bits WGM11, WGM10 : Wave Form Generator Mode, junto


com os bits WGM13, WGM12 , de TCCR1B, seleciona o
modo de operao do T/C1, como visto na tabela anterior.

Bits COM1A1, COM1A0, COM1B1, COM1B0 : Comparator Output Mode, selecionam o comportamento dos pinos
OC1A/OC1B.

Modos No-PWM

COM1X1

0
0

Modo de Ativao das Saidas OC1A e OC1B


Comportortamento de OC1A e OC1B
COM1X0

0
1

OC1A/OC1B Desconectados.
OC1A/OC1B Muda de estado quando a Comparao resultar verdadeira.
OC1A/OC1B=0 quando a Comparao resulta verdadeira.
OC1A/OC1B=1 quando a Comparao resulta verdadeira.

85

Modo PWM Rpido

COM1X1

0
0

Modo de Ativao das Saidas OC1A e OC1B


Comportortamento de OC1A e OC1B
COM1X0

0
1

OC1A/OC1B Desconectados.
OC1A Muda de estado na Comparao quando
WGM13:0=15 , e OC1B em OFF. Nos demais
modos, OC1A/OC1B em OFF.
OC1A/OC1B=0 quando a Comparao resulta
verdadeira, seta no valor mximo (TOP).
OC1A/OC1B=1 quando a Comparao resulta
verdadeira, reseta no valor mximo (TOP).

Modo PWM c/ Correo de Fase/Freq.


COM1X1

0
0

Modo de Ativao das Saidas OC1A e OC1B


Comportortamento de OC1A e OC1B
COM1X0

0
1

OC1A/OC1B Desconectados.
OC1A Muda de estado na Comparao quando
WGM13:0=9 ou 14 , e OC1B em OFF. Nos
demais modos, OC1A/OC1B em OFF.
OC1A/OC1B=0 quando a Comparao resulta
verdadeira em contagem crescente.
OC1A/OC1B=1 na contagem decrescente.
OC1A/OC1B=1 quando a Comparao resulta
verdadeira em contagem crescente.
OC1A/OC1B=0 na contagem decrescente.

86

Conversor Analgico p/ Digital do


ATmega328
Arquitetura Interna

87

Faixa tenses de entrada entre 0 a Vcc, resoluo de 10 bits


com erro de no linearidade de 1/2 LSB e erro absoluto de
2 LSB;

Conversor A/D por aproximaes sucessivas com clock entre


50kHz e 200kHz, e tempo de converso entre 13 e 260 s;;

Habilitado pelo bit

Clock do ADC proveniente de um Prescaler alimentado pelo


clock da CPU e fator de prescaler selecionado pelos bits
ADPS2..0 no Reg. de Status ADCSRA;

6 Canais de entrada multiplexadas (8 p/ TQFP,QFN,MLF)


selecionados pelos bits MUX3..0 no Reg. de Multiplexao
ADMUX. Um canal de entrada com sensor de temperatura;

Opes de tenso de referncia: pino AREF, pino AVcc, ou


ref. interna de 1,1V;

Seleo da tenso de referncia pelos bits


de Multiplexao ADMUX; ;

Inicio de converso feita setando-se o bit ADSC no Reg. de


Status ADCSRA, ou auto-trigger via INT0, T/C0 ou T/C1;

Final de converso indicada pelo bit


ADCSRA;

Resultado obtido no par de registros ADCL,ADCH:

ADEN=1

ADC =

no Reg. de Status ADCSRA;

ADIF

VIN .1024
VREF

Interrupo por Converso Completada;

REFS1..0

no Reg.

no Reg. de Status

Registro de Controle e Status A do ADC


- ADCSRA

ADCSRA
ADEN

ADSC

ADATE

ADIF

ADIE

ADPS2

ADPS1

ADPS0

Bits ADPS2, ADPS1, ADPS0 : Bits A/D Prescaler Selection,


selecionam o fator de prescaler para a diviso do clock da
CPU para alimentar o clock do ADC:

Clock do ADC

ADPS2

ADPS1

ADPS0

Clock = clock da CPU/2

Clock = Clock da CPU/2

Clock = clock da CPU/4

Clock = clock da CPU/8

Clock = clock da CPU/16

Clock = clock da CPU/32

Clock = clock da CPU/64

Clock = clock da CPU/128

Bit ADIE : Bit A/D Interrupt Enable, juntamente com o bit I


de SREG, quando setados habilitam a interrupo por Converso Completada do ADC;

Bit ADIF : Bit A/D Interrupt Flag, setado por harware para indicar a solicitao de interrupo por Converso Completada
do ADC. Resetado por hardware quando do atendimento da
interrupo, ou por software se esta interrupo no foi habilitada;

Bit ADATE : Bit A/D Auto Trigger Enable, quando setado


habilita o auto trigger na borda de subida de uma das fontes
de trigger possveis e selecionados por ADTS em ADCSRB;

88

Bit ADSC : Bit A/D Start Conversion, setado para iniciar a


converso pelo ADC;

Bit

ADEN :

Bit A/D Enable, quando setado habilita o ADC.

Registro de Controle e Status B do ADC


- ADCSRB

ADCSRAB
-

ACME

ADTS2

ADTS1

ADTS0

Bits ADTS2, ADTS1, ADTS0 : Bits A/D Trigger Selection,


selecionam a fonte de disparo do ADC:

Fonte de Trigger do ADC

ADTS2

ADTS1

ADTS0

Modo Free Running

Comparador Analgico

Interrupo Externa 0

T/C0 Comparao A

T/C0 Overow

T/C1 Comparao B

T/C1 Overow

T/C1 Evento de Captura

Bit ACME: Analog Comparator Multiplex Enable - Qunado setado habilita a multiplexao das entradas ADC0..7 para a entrada inversora do Comparador Analgico, nesse caso ADEN
deve car em 0 desabilitando o ADC. Resetado seleciona AN1
para a entrada inversora do Comparador Analgico.

89

Registro dO Multiplex de Seleo do ADC


- ADMUX

ADMUX
REFS1

REFS0

ADLAR

MUX3

MUX2

MUX1

MUX0

Bits MUX3, MUX2, MUX1, MUX0 : Bits Analog Channel Multiplexer 0...3, selecionam o canal de entrada analgica que
ser conectado ao ADC:

MUX3..0

0000..0111
1 0 0 0
1001...1101

Entrada Analgica Selecionada


ADC0...ADC7
ADC8 - Sensor de Temperatura
Reservado

1 1 1 0

1,1V - Tenso de Bandgap

1 1 1 1

0V - GND

Bit ADSC : Bit A/D Start Conversion, setado para iniciar a


converso pelo ADC;

Bits REFS1, REFS0 : Bits Reference Selection 0..1, selecionam a fonte da tenso de referncia que ser conectado ao
ADC:

REF1..0

Tenso de Referncia Selecionada

0 0

Pino AREF.

0 1

Pino AVcc c/ capacitor ext. em AREF.

1 0

Reservado

1 1

Tenso de Bandgap 1,1V c/ cap. ext. em AREF

90

Ex: Leitura de sensor LM35 via ADC7 a cada 1,0s

Cdigo em C editado no CodeVision:


// Chip:
#include
#include
#include
#include
#include

ATmega328P Clock: 16 MHz


<mega328p.h>
<delay.h>
<alcd.h>
<stdio.h>
<stdlib.h>

// Vref: Int.1.1V, cap. em AREF


#define ADC_VREF_TYPE ((1<<REFS1)|(1<<REFS0)|(0<<ADLAR))
// Variveis Globais
unsigned int conta_10ms=100;
// Prottipos das Funes
void inic(void);
unsigned int read_adc(unsigned char adc_input);
// Timer 0 overflow interrupt service routine
interrupt [TIM0_OVF] void timer0_ovf_isr(void){
unsigned int valor;
float grausC;
unsigned char s[5];

91

TCNT0=100;
conta_10ms--;
if(conta_10ms==0) {
conta_10ms=100;
lcd_gotoxy(2,0);
valor=read_adc(7);
grausC =valor/9.3; // Vin(V)=1,1*Valor lido/1024 => T(C)=Vin/10mV
ftoa(grausC,2,s); // Converte valor em string de ASCIIs
lcd_puts(s);}
else
return;
}
// Rotina de leitura do ADC
unsigned int read_adc(unsigned char adc_input){
ADMUX=adc_input | ADC_VREF_TYPE;
delay_us(10);
// Atraso p/ estabilizao da tenso em Vin
ADCSRA|=(1<<ADSC); // Sinal de Start Conversion (ADSC) ativado
while ((ADCSRA&(1<<ADIF))==0);// Espera final de converso
ADCSRA|=(1<<ADIF);
// Reseta flag de interrupo
return ADCW;
// Valor de retorno da converso
}
void main(void){
inic();
lcd_puts("T=
(C)");
while(1);
}
void inic(void){
// T/C0: Clock: 15,625 kHz
// Mode: Normal to,0p=0xFF, Timer Period: 9,984 ms
TCCR0A=0x00;
TCCR0B=(0<<WGM02) | (1<<CS02) | (0<<CS01) | (1<<CS00);
TCNT0=100;
// Timer/Counter 0 Interrupt(s) initialization
TIMSK0=(0<<OCIE0B) | (0<<OCIE0A) | (1<<TOIE0);
// ADC Clock: 1000,000 kHz, ADC VRef: Int., ADC Start: ADSC
ADMUX=ADC_VREF_TYPE;
ADCSRA=(1<<ADEN)|(0<<ADSC)|(0<<ADATE)|(0<<ADIF)
|(0<<ADIE)|(1<<ADPS2)|(0<<ADPS1)|(0<<ADPS0);
// LCD: RS:PB4, RD:GND, EN:PB5, D4...D7:PB0..3
lcd_init(16);
// Caracteres/linha: 16
#asm("sei")
// Seta bit de habilitao global de interrupo
}

USART
Arquitetura Interna da USART

92

Caractersticas da USART:

Comunicao Full Duplex, com registros de transmisso e


recepo separados;

Operaes Sncrona e Assncrona;

Em operao sncrona, seleo da origem do sinal de clock:


Mestre ou Escravo;

Possibilidade de comunicao Multiprocessador;

Taxas de transferncia geradas por um circuito de gerao de


Baud Rate (bps) de alta resoluo;

Quadros com 5, 6, 7, 8 ou 9 bits de dados, e 1 ou 2 Stop


Bits;

Gerao de Paridade Par ou mpar;

Filtragem de rudo;

Deteco de erros como: falso Start Bit, erro de quadro, e


Overrun;

Trs interrupes distintas ocorrendo nas seguintes condies: Transmisso Concluda, Recepo Concluda, e Registro de Transmisso Vazio;

Seleo de Velocidade Dobrada no modo Assncrono.

93

Transmisso de Dados via UART


TXEN

Habilitado pelo bit

PD1 assume a funo alternativa TXD, sendo conectado ao


transmissor da USART, e passa a ser um pino de sada, independente do bit DDD1 em DDRD.

do Reg. UCSRB

Passos da Transmisso

1. O Byte a ser transmitido deve ser escrito no Reg. de Dados da USART


(UDR);

2. Este passa p/ o Shift Register (SR) somente qdo o Stop Bit do ltimo
byte enviado foi deslocado. Com SR vazio, o bit UDRE=>1 (Data Reg.
Empty no Reg. Contr./Status A da USART (UCSRA), o byte passa do
UDR p/ SR;

3. Se o bit UDRE=1 um novo byte pode ser enviado;


4. Qdo o byte passa do UDR p/ SR, o bit 0 deste registro de 10/11bits

resetado, gerando o Start Bit, e o bit 9/10 setado gerando o Stop Bit.

5. Se a USART opera c/ 9 bits de dados, o bit TXB8 de UCSRB transferido


para o bit 9 do SR;

6. Com a taxa de transm. j programada (Reg. Baud Rate da USART -

UBRR), o Gerador de Baud Rate produz o clock p/ SR que de inicio


transmite o Start Bit, seguido de 8/9 bits da dados (LSB primeiro), e do
Stop Bit;

7. Se um novo dado no foi escrito no reg. UDR qdo o Stop Bit estiver
sendo enviado, o bit UDRE car setado at que um dado seja ali escrito;

8. Se ao nal do envio do Stop Bit o dado ainda no foi escrito no registro


UDR o sinalizador de trmino de envio TXC do registro USR setado.
94

Recepo de Dados via UART

RXEN

Habilitado atravs do bit

PD0 assume a sua funo alternativa (RXD) sendo conectado


ao receptor da USART, e passa a ser um pino de entrada
independente do bit DDD0 do registro DDRD.

do Registro UCR;

Passos da Recepo
1. RXD amostrado numa taxa 16x maior que Baud Rate, vericando a

ocorrncia do Start Bit. Conrmaes ocorrem nas amostras 8, 9, e 10


deste sinal amostrado. No havendo ao menos 2 ocorrncias positivas, o
Start Bit descartado, sendo considerado rudo;

2. O Start Bit detectado corretamente, segue-se a amostragem dos bits de


dados da mesma forma, (amostras 8, 9, e 10), devendo haver coincidncia
em pelo menos 2 dos 3 eventos. A medida que estes bits so amostrados
so imediatamente deslocados para o SR;

3. No nal da recepo, agora o Stop Bit amostrado (amostras 8, 9, e


10). No havendo ao menos 2 nveis lgicos 1, o Flag de Erro de Quadro
- FE=>1 (Framing Error do Reg. USR). Deve-se, ento vericar o bit
FE antes de se ler UDR;

4. Aps o dado ter sido recebido serialmente ele enviado ao UDR mesmo

que um erro de quadro ocorra. Quando o dado j est presente do registro UDR o bit sinalizador de Recepo Completada - RXC , presente no
registro USR, setado;

5. Se a leitura do UDR no foi executada aps um novo byte de dados


ter sido recebido, ocorrer um erro de Sobre-escrita, e o bit de Flag ed
Sobreescrita - OR=>1 (Over Run do USR).

6. Na operao da UART com 9 bits de dados (seleo feita pelo bit CHR9 ),

este bit adicional enviado p/ RXB8 do Reg. UCR, podendo ser usado
como um bit extra de Stop Bit, ou outra informao qquer.
95

Reg. de Controle/Status A - UCSR0A

UCSR0A
RXC0

TXC0

UDRE0

FE0

DOR0

UPE0

U2X0

MPCM0

Bit RXC0 : Receive Complete, setado quando o receptor tem


um dado pronto para ser lido no buer de recepo, podendo
ser usado para gerar uma interrupo de Recepo Completada;

Bit TXC0 : Transmit Complete, setado quando o dado que


estava no buer de transmisso j foi completamente transmitido atravs do registrador de deslocamento, podendo ser
usado para gerar uma interrupo de Transmisso Completada;

Bit UDRE0 : USART Data Register Empty, setado quando


o o buer de recepo est vazio e pronto para receber um
novo dado, podendo ser usado para gerar uma interrupo de
Registro de Dados Vazio;

Bit FE0 : Frame Error, setado quando um Erro de Quadro


ocorreu no dado recebido pelo buer de recepo. Este bit
deve ser resetado quando se escreve em UCSR0A. O bit FE0
vlido at que o registro de dados UDR0 lido, sendo
resetado quando o Stop Bit recebido.

96

Bit DOR0 : Data Overrun, setado quando o buer de recepo est cheio, um novo dado recebido pelo registrador de
deslocamento, e um novo Start Bit recebido. O bit DOR0
vlido at que o registro de dados UDR0 lido, devendo
ser resetado quando se escreve em UCSR0A.

Bit PE0 : Parity Error, setado quando um Erro de Paridade


ocorreu no dado recebido pelo buer de recepo, caso a
vericao de paridade tenha sido habilitada atravs do bit
UPM0 . Este bit deve ser resetado quando se escreve em
UCSR0A. O bit PE0 vlido at que o registro de dados
UDR0 lido.

Bit U2X0 : Sigla de USART Double Transmission Speed,


tendo efeito somente quando na operao Assncrona, dever ser resetado na operao sncrona. Se setado, este bit
permite dobrar a taxa de transmisso, pelo divisor do clock
que ao invs de 16 ser 8.

Bit MPCM0 : Sigla de Multi-Processor Communication Mode,


este bit quando setado habilita a Comunicao Multiprocessador, onde os quadros recebidos pelo circuito Receptor da
USART sem informaes de endereo sero ignorados. O
circuito Transmissor da USART no afetado por este bit.

97

Reg. de Controle/Status B - UCSR0B

UCSR0B
RXCIE0/TXCIE0

UDRIE

RXEN0/TXEN0

UCSZ2

RXB80/TXB80

Bit RXCIE0 : Sigla de RX Complete Interrupt Enable. Este


bit quando setado habilita a interrupo pelo ag RXC0 .

Bit TXCIE0 : Sigla de TX Complete Interrupt Enable. Este


bit quando setado habilita a interrupo pelo ag TXC0 .

Bit UDRIE0 : Sigla de USART Data Register Empty Interrupt


Enable. Este bit quando setado habilita a interrupo pelo
ag UDRE0 .

Bit RXEN0 : Sigla de Receiver Enable, quando setado este


bit habilita a recepo de dados pela USART. O pino PD0,
que tem como funo alternativa: RXD, que o pino de
recepo serial, assume esta funo, desconsiderando alguma
congurao anterior.

Bit TXEN0 : Sigla de Transmitter Enable, quando setado


este bit habilita a transmisso de dados pela USART. O pino
PD1, que tem como funo alternativa: TXD , que o pino
de transmisso serial, assume esta funo, desconsiderando
alguma congurao anterior.

Bit UCSZ02 : Sigla de Character Size. Este bit, em conjunto


com os bits UCSZ1:0 do Registro UCSRC, seleciona o nmero
de bits da palavra de dados em um quadro a ser transmitido
ou recebido.

98

Bit RXB80 : Sigla de Receive Data Bit 8, representa o nono


bit da palavra de dados recebida, quando operando com palavras de dados de 9 bits. Este bit dever ser lido antes da
leitura dos demais bits em UDR0.

Bit TXB80 : Sigla de Transmit Data Bit 8, representa o nono


bit da palavra de dados a ser transmitida, quando operando
com palavras de dados de 9 bits. Este bit dever ser escrito
antes da escrita dos demais bits em UDR0.

Reg. de Controle/Status C - UCSR0C

UCSR0C
UMSEL01..0

UPM01..0

USBS0

UCSZ01..0

UCPOL0

Bits UMSEL01..0 : Sigla de USART Mode Select, que permite selecionar o modo de operao da USART, em operao
assncrona, com UMSEL=00, sncrona, com UMSEL=01, ou
Master SPI com UMSEL=11.

Bits USBS0 : Sigla de USART Stop Bit Select. Este bit


seleciona o nmero de Stop-Bits a ser inserido no quadro de
dados pelo transmissor. Se setado seleciona 2 Stop Bits, se
resetado, seleciona 1 Stop Bit.

Bit UCPOL0 : Sigla de Clock Polarity, este bit seleciona a


polaridade do sinal de clock na operao Sncrona.

Seleo da Polaridade do Clock no Modo Sncrono


UCPOL0 Mudana de Dado Amostragem do Dado
em TXD
em RXD
0

Borda de Subida

Borda de Descida

Borda de Descida

Borda de Subida

99

Bits UPM01..0 : Sigla de Parity Mode. Este bit habilita e


seleciona o modo de gerao do bit de vericao de paridade.
Na transmisso, o bit de paridade gerado e transmitido
jundo com o dado, e na recepo o bit de paridade gerado
pelo dado recebido, e comparado com o bit de paridade que
acompanha este dado. Se houver um erro de paridade este
ser indicado pelo sinalizador PE , em UCSRA.

Habilitao e Seleo da Paridade

UPM01

UPM00

Mode de Paridade

Desabilita Paridade

Reservado

Habilita Paridade Par

Habilita Paridade Impar

Bits UCSZ1:0 : Sigla de Character Size. Estes bits, em conjunto com os bits UCSZ2 do Registro UCSRB, seleciona o
nmero de bits da palavra de dados em um quadro a ser
transmitido ou recebido.

Seleo do Tamanho da Palavra de Dados

Tamanho da Palavra

UCSZ02

UCSZ01

UCSZ00

5 Bits de Dados

6 Bits de Dados

7 Bits de Dados

8 Bits de Dados

Reservado

Reservado

Reservado

9 Bits de Dados

100

Baud Rate (bps) x Frequncia do Cristal (MHz)


Contedos de UBRR0 para Erro 2%
Taxa 1,000 1,000 1,8432 1,8432 2,0000 2,0000
U2X0 0
1
0
1
0
1

2400
4800
9600
14,4K
19,2K
28,8K
38,4K
57,6K
76,8K
115,2K
230,4K
250K

25
12
-

51
25
12
-

47
23
11
7
5
3
2
1
0
-

95
47
23
15
11
7
5
3
2
1
0
-

51
25
12
-

103
51
25
12
0

2400
4800
9600
14,4K
19,2K
28,8K
38,4K
57,6K
76,8K
115,2K
230,4K
250K
0,5M

95
47
23
15
11
7
5
3
2
1
0
-

191
95
47
31
23
15
11
7
5
3
1
-

103
51
25
12
0
-

207
103
51
34
25
12
1
0

191
95
47
31
23
15
11
7
5
3
1
-

383
191
95
63
47
31
23
15
11
7
3
-

Taxa 3,6864 3,6864 4,0000 4,0000 7,3728 7,3728


U2X0 0
1
0
1
0
1

101

Taxa 8,000 8,000 11,0592 11,0592 14,7456 14,7456


U2X0 0
1
0
1
0
1

2400
4800
9600
14,4K
19,2K
28,8K
38,4K
57,6K
76,8K
115,2K
230,4K
250K
0,5M
1M

207
103
51
34
25
12
1
0
-

416
207
103
68
51
34
25
12
3
1
0

287
143
71
47
35
23
17
11
8
5
2
-

575
287
143
95
71
47
35
23
17
11
5
-

383
191
95
63
47
31
23
15
11
7
3
-

767
383
191
127
95
63
47
31
23
15
7
-

2400
4800
9600
14400
19200
28800
38400
57600
76800
115200
230,4K
250K
0,5M
1M

416
207
103
68
51
34
25
12
3
1
0

832
416
207
138
103
68
51
34
25
7
3
1

479
239
119
79
59
39
29
19
14
9
4
-

959
479
239
159
119
79
59
39
29
19
9
-

520
259
129
86
64
42
32
21
15
10
4
-

1041
520
259
173
129
86
64
42
32
21
10
9
4
102

Taxa 16,000 16,000 18,4320 18,4320 20,000 20,000


U2X0 0
1
0
1
0
1

Equaes para Baud Rate e UBRR da USART


Modo
Clculo de Baud Rate* Clculo de UBRR*
Assncr. Normal
(U2X=0)
Assncr. Dobro
da Tx. (U2X=1)
Sncr. Mestre

BAU D =

fOSC
16.(U BRR+1)

U BRR =

fOSC
16.BAU D

BAU D =

fOSC
8.(U BRR+1)

U BRR =

fOSC
8.BAU D

BAU D =

fOSC
2.(U BRR+1)

U BRR =

fOSC
2.BAU D

*BAU D=Baud Rate, fosc=Freq. do Cristal, U BRR=Contedo de UBRR

Ex: Leitura de sensor LM35 via ADC7 a cada 1,0s


e envio de dados p/ USART, cdigo em C editado
no CodeVision:
// Chip: ATmega328P
Clock: 16,000000 MHz
#include <mega328p.h>
#include <delay.h>
#include <stdio.h>
#include <stdlib.h>
// Voltage Reference: Int., cap. on AREF
#define ADC_VREF_TYPE ((1<<REFS1)|(1<<REFS0)|(0<<ADLAR))
// Variveis Globais
unsigned int time_ms=100;
// Rotina de Inicializaes
void inic(void){
// Timer/Counter 0 Clock: System Clock (15,625 kHz)
// Mode: Normal top=0xFF
// Timer Period: 9,984 ms
TCCR0A=(0<<COM0A1) | (0<<COM0A0) | (0<<COM0B1) | (0<<COM0B0) |
(0<<WGM01) | (0<<WGM00);
TCCR0B=(0<<WGM02) | (1<<CS02) | (0<<CS01) | (1<<CS00);
TCNT0=0x64;
// Timer/Counter 0 Interrupt(s) initialization
TIMSK0=(0<<OCIE0B) | (0<<OCIE0A) | (1<<TOIE0);
// USART: 8 Data, 1 Stop, No Parity
// USART Receiver: Off,
Transmitter: On
// USART0 Mode: Asynchronous, Baud Rate: 9600
UCSR0A=0;
UCSR0B|=(1<<TXEN0)|(1<<UCSZ01)|(1<<UCSZ00);
UBRR0H=0x00;

103

UBRR0L=0x67;
// ADC Clock: 1000,000 kHz, VRef: Int., cap. on AREF
// ADC Auto Trigger Source: ADC Stopped
ADMUX=ADC_VREF_TYPE;
ADCSRA|=(1<<ADEN)|(1<<ADPS2)|(0<<ADPS1)|(0<<ADPS0);
ADCSRB=(0<<ADTS2) | (0<<ADTS1) | (0<<ADTS0);
// Global enable interrupts
#asm("sei")
}
// Timer 0 overflow interrupt service routine
interrupt [TIM0_OVF] void timer0_ovf_isr(void){
unsigned int i, valor;
float grausC;
unsigned char s[5];
TCNT0=0x64;
time_ms--;
if(time_ms==0) {
time_ms=temp1;
valor=read_adc(0);
grausC =valor/9.3; // Temp(C)=(1.1*Valor Lido)/(1023*10mV)
ftoa(grausC,2,s); // Converte valor em string de ASCIIs
for(i=0;i<=4;i++){
while(!(UCSR0A & (1<<UDRE0)));
UDR0=s[i];}
while(!(UCSR0A & (1<<UDRE0)));
UDR0=0x0a;}
// ASCII do LF (New Linha)
else
return;
}
// L resultado da converso do canal adc_input
unsigned int read_adc(unsigned char adc_input){
ADMUX=adc_input | ADC_VREF_TYPE;
delay_us(10);
// Delay para estabilizao de Vin
ADCSRA|=(1<<ADSC); // Start the AD conversion
while ((ADCSRA & (1<<ADIF))==0); // Espera final de converso
ADCSRA|=(1<<ADIF);
return ADCW;
}
// Rotina Principal
void main(void){
inic();
while(1);
}

Memria EEPROM

1kB de capacidade com rea separada da rea de dados;

At 100.000 ciclos de apagamento e escrita;

Usada como uma rea de dados ocasionais, de congurao


do sistema, ou variveis que devem ser lidas no re-incio do
programa, ou quaisquer outras situaes parecidas.

Um circuito de temporizao permite que o software possa


detectar quando um prximo byte pode ser escrito com segurana.

Quando um ciclo de escrita na EEPROM est em andamento


a CPU espera por dois ciclos de clock antes que a prxima
instruo possa ser executada, e no ciclo de leitura esta espera
de quatro ciclos de clock.

Ciclo de Escrita na EEPROM

1.
2.

Esperar que o bit de habilitao de escrita


v a 0;

EEPE

(Reg. EECR)

Esperar que o bit de habilitao de escrita na Flash


(Reg. SPMCR) v a 0;

SPMEN
104

3.
4.
5.
6.
7.

Carregar os reg. de Endereo da EEPROM:


EEARL/EEARH c/ o endereo destino de escrita;

Carregar o dado a ser escrito no registro de Dados da EEPROM - EEDR (opcional);

Fazer bit mestre de habilit.


EECR);

de escrita:

EEMPE=1

(Reg.

Antes de quatro ciclos de clock, setar o bit de habilitao de


escrita EEPE ;

Aps um tempo entre 2,5 e 4ms (conforme tenso Vcc) o bit


EEPE ser resetado por hardware.

Ciclo de Leitura da EEPROM

1.

Carregar os registros de Endereo da EEPROM: EEARL e


EEARH com o endereo fonte de leitura;

2.

Setar o bit de habilitao de leitura: EERE e esperar at


que este bit seja resetado por hardware indicando a leitura do
dado requerido. Este bit encontra-se no registro de Controle
da EEPROM - EECR;

3.

O bit EEPE deve ser recenseado pelo programa, antes de se


iniciar um ciclo de leitura de modo a evitar a perda do dado
em processo de escrita.

Reg. de Controle da EEPROM - EECR

- - EEPM1

EECR
EEPM0

EERIE

EEMPE

EEPE

EERE

Bit EERE : EEPROM Read Enable, quando setado dispara a


leitura da EEPROM no endereo previamente carregado no
registro EEAR, e a CPU ca em estado de halt por 4 ciclos
de clock. Uma vericao no bit EEPE deve ser feita para
assegurar que uma escrita no est em andamento.

Bit EEPE : EEPROM Write Enable, dever ser levado a 1,


aps o endereo de leitura ter sido colocado nos Registros
de Endereo - EEARH/L para disparar a operao de escrita
nesse endereo.

Bit EEMPE : Sigla para EEPROM Master Write Enable, este


bit dever ser setado, para permitir a escrita na EEPROM,
sendo automaticamente resetado aps 4 ciclos de clock.

Bit EERIE : EEPROM Read Interrupt Enable, quando setado


habilita a interrupo a leitura da EEPROM no endereo previamente carregado no registro EEAR, desde que o bit I tambm esteja setado.

Bits EEPM1..0 : EEPROM Program Mode, permite selecionar o modo de operao da escrita, conforme tabela a seguir:

Modo de Escrita da EEPROM


Modo

EEPM1

EEPM0

Apaga e escreve em uma s operao.

Apaga somente.

Escreve somente.

Reservado para uso futuro.

Registros de Endereo Superior e Inferior


da EEPROM - EEARH/EEARL

Par de registros que constitui o endereo de acesso EEPROM, podendo acessar at 512 posies da EEPROM. Seu
valor inicial indenido, sendo portanto necessrio sua inicializao quando se for acessar algum dos 512 endereos da
EEPROM.

Registro de Dados da EEPROM - EEDR

Conter o dado a ser escrito na EEPROM, na posio de


memria especicada no par de registros EEARH/L, quando
a operao for de escrita, e receber o dado proveniente desta
posio de memria quando da operao de leitura.

Funes da biblioteca do Codevision em


eeprom.h
void eeprom write byte(addr,value);
unsigned char eeprom read byte(addr)

Cdigos em C das funes de escrita e leitura em


EEPROM editado no CodeVision:
void EEPROM_write(unsigned int Address, unsigned char Data)
{
// Espera a ltima escrita se completar
while(EECR & (1<<EEPE));
// Carrega Endereo e Dado
EEAR = Address;
EEDR = Data;
// Seta EEMPE
EECR |= (1<<EEMPE);
// Inicia escrita na EEPROM setando EEPE
EECR |= (1<<EEPE);
}

unsigned char EEPROM_read(unsigned int Address)


{
// Espera a ltima escrita se completar
while(EECR & (1<<EEPE));
// Carrega Endereo
EEAR = Address;
// Inicia leitura da EEPROM setando EERE
EECR |= (1<<EERE);
// Retorna dado lido do Registro de Dados
return EEDR;
}

105

Comparador Analgico

Compara os valores de tenso presentes no pinos de AIN0 e


AIN1, funes alternativas de PD6 e PD7, levando na sada
ACO=1 se AIN0>AIN1; ou alternativamente, compara AIN0
com ADCn, n selecionvel pelos bits ACME em ADCSRB,
ADEN em ADCSRA, e MUX2..0 em ADMUX.

Interrupo habilitada pelo bit ACIE=1 do Reg.


do Comp. Analgico - ACSR, e I =1.

Pode disparar a captura no T/C1, se o bit


ACSR, e TICIE1=1 no Reg. TIMSK.

Desta forma, toda a lgica vista para o processo de captura


do T/C1 pode ser utilizada pelo Comparador Analgico.

de Contr.

ACIC =1

no Reg.

106

O bit ACD de ACSR, se setado desabilita o Comparador Analgico, desconectando-o da fonte de alimentao, reduzindo
o consumo de energia]

Antes de se fazer a desconexo, a interrupo do Comparador Analgico deve ser desabilitada, com bit ACIE-0 , caso
contrrio, uma interrupo poder ocorrer.

Alm disto, importante observar que ACD , aps o Reset


estar em 0, deixando o Comp. Analgico conectado a Vcc.

Reg. A de Controle e de Status do Comparador Analgico - ACSRA

ACSRA
ACD

ACBG

ACO

ACI

ACIE

ACIC

ACIS1

ACIS0

Bit ACD : Setado desliga o Circuito do Comparador Analgico


da alimentao, diminuindo o consumo de energia. Aps o
reset, ACD =0, ligando o Comparador Analgico a alimentao;

Bit ACBG : Setado, coloca uma tenso de referncia xa em


AIN0, em lugar da tenso proveninte do circuito externo.

107

Bit ACO : Sada do Comparador Analgico, setado se a tenso


em AIN0>AIN1, resetado em contrrio. ACO ser atrasado
de 1 a 2 clocks.

Bit ACI : Setado por hardware quando a interrupo disparada. Se o bit ACIE=1 e I=1 , uma requisio de interrupo
gerada. Resetado quando a interrupo atendida. Pode-se
resetar ACI por software, setando-se este bit.

Bit ACIE : Setado habilita a interrupo do Comparador Analgico, desde que I=1 em SREG.

Bit ACIC : Setado habilita a funo de Captura do T/C1 a ser


disparada pelo Comparador Analgico. Resetado, desabilita
esta conexo.

Bits ACIS0/1 : Seleo de que evento dispara a interrupo


do Comparador Analgico:

ACIS1

ACIS0

Modo de Interrupo*

Mudana de Estado de ACO

Reservado

Borda de Descida de ACO

Borda de Subida de ACO

* Quando se atua nos bits ACIS1/0, o bit ACIE deve estar


resetado caso contrrio uma interrupo poder ser gerada

108

Reg. B de Controle e de Status do Conversor Analgico p/ Digital - ADCSRB

ADCSRB
-

ACME

ADTS2

ADTS1

ADTS0

Bit ACME : Quando este bit setado e o Circuito do Conversor A/D est desligado da alimentao (ADEN=0 em ADCSRA),
o multiplex do ADC seleciona uma das entradas ADC0..7
como entrada negativa. Se resetado seleciona AIN1 como
entrada negativa, independente do estado de ADEN. Se ambos os bits ACME e ADEN esto setados AIN1 tambm
selecionado como entrada negativa;

ACME

ADEN

MUX2..0

Entrada Negativa

xxx

AIN1

xxx

AIN1

xxx=n

ADCn

Bits ADTS2..0 : No inui no Comparador Analgico sendo


usado pelo Circuito do Conversor A/D para seleo do modo
de auto-trigger.

109

Temporizador Watchdog - WDT


O WDT conta com um oscilador interno independente de 128kHz.
Produzir um Reset caso uma instruo WDR no seja executada
antes do timeout do WDT.

Registro de Controle e Status do Temporiz. Watchdog - WDTCSR:


WDTCSR
WDIF

WDIE

WDP3

WDCE

WDE

WDP2

WDP1

WDP0

Bit WDE:

Watchdog Enable, quando setado habilita o


WDT. S possvel resetar WDE, se o bit WDCE estiver
setado, imediatamente antes de se resetar WDE ;

110

Bit WDCE:

Watchdog Change Enable, quando setado


permite que o WDT possa ser desabilitado atravs do bit
WDE quando este for ser resetado.

Bits WDP2, WDP1, WDP0:

Watchdog Prescaler
Bits2...0, selecionam o fator de pr-diviso do clock de 1MHz:

Seleo do Perodo p/ o WDT


Ciclos do Time-out
Osc. WDT (5,0V)

WDP3

WDP2

WDP1

WDP0

0
0
0
0
0
0
0
0

0
0
0
0
1
1
1
1

0
0
1
1
0
0
1
1

0
1
0
1
0
1
0
1

WDP3

1
1
1
1
1
1
1
1

2K
4K
8K
16K
32K
64K
128K
256K

16 ms
32 ms
64 ms
0,125 s
0,25 s
0,5 s
1,0 s
2,0 s

Seleo do Perodo p/ o WDT (Continuao)


Ciclos do Time-out
Osc. WDT (5,0V)
WDP2

WDP1

WDP0

0
0
0
0
1
1
1
1

0
0
1
1
0
0
1
1

0
1
0
1
0
1
0
1

512K
4,0 s
1024K
8,0 s
Reservado
Reservado
Reservado
Reservado
Reservado
Reservado

Interface com RTC - DS1302

O DS1302 um Relgio de Tempo Real (RTC) que conta


segundos, minutos, horas, dia do ms, dia da semana, ms,
ano, e ano bissexto at 2100;

Alimentado entre 2,0 e 5,5V consumindo 300nA em 2,0V;

TTL Compatvel e Interface com 3 linhas: RST, SCLK e I/O;

Usa cristal externo de 32,768kHz conectado aos pinos X1 e


X2;

31 bytes de RAM no-voltil por bateria de 3,0V conectada


aos pinos Vcc1 e GND.

Dados de relgio lidos dos registros estaro em BCD.

Funes de biblioteca para controle do DS1302 fornecidas


pelo arquivo de cabealho <ds1302.h>.

111

RTC - DS1302
unsigned char ds1302 read(unsigned char addr);
void ds1302 write(unsigned char addr,unsigned char data);
void rtc init(unsigned char tc on,unsigned char diodes,unsigned
char res);
void rtc get time(unsigned char *hour,unsigned char *min,unsigned
char *sec);
void rtc set time(unsigned char hour,unsigned char min,unsigned
char sec);
void rtc get date(unsigned char *day,unsigned char *month,unsigned
char *year);
void rtc set date(unsigned char day,unsigned char month,unsigned
char year);

REGISTRO FUNO
DADOS PERMITIDOS
0X80 Escrita Segundos
00-59
0X81 Leitura Segundos
00-59
0X82 Escrita Minutos
00-59
0X83 Leitura Minutos
00-59
0X84 Escrita Horas (bit 7 12/24)
00-23/01-12
0X85 Leitura Horas (bit 7 12/24)
00-23/01-12
0X86 Escrita Dia
00-28/29/30/31
0X87 Leitura Dia
00-28/29/30/31
0X88 Escrita Ms
00-12
0X89 Leitura Ms
00-12
0X8A Escrita Dia da Semana
00-07
0X8B Leitura Dia da Semana
00-07
0X8C Escrita Ano
00-99
0X8D Leitura Ano
00-99
112

Cdigo em C editado no CodeVision:


/* Chip: ATmega328P Clock: 16 MHz */
#include <mega328p.h>
#include <stdlib.h>
#include <alcd.h>
// Alphanumeric LCD functions
#include <delay.h>
// DS1302 Real Time Clock functions
#asm
.equ __ds1302_port=0x08 ;PORTC
.equ __ds1302_io=0
.equ __ds1302_sclk=1
.equ __ds1302_rst=2
#endasm
#include <ds1302.h>
void init();
unsigned char *bcd2string(unsigned char dado);
unsigned char s[3];
void main(void){
unsigned char temp;
init();
//rtc_set_time(13,50,0); Para setar a hora 13:50:00
//rtc_set_date(2,9,14); Para setar a data 02/09/14
temp=ds1302_read(0x87);
// Leitura do Dia

113

lcd_puts(bcd2string(temp));
lcd_putchar('/');
temp=ds1302_read(0x89);
lcd_puts(bcd2string(temp));
lcd_putchar('/');
temp=ds1302_read(0x8d);
lcd_puts(bcd2string(temp));
lcd_gotoxy(0,1);
lcd_puts("Time:");
while(1){
lcd_gotoxy(5,1);
temp=ds1302_read(0x85);
lcd_puts(bcd2string(temp));
lcd_putchar(':');
temp=ds1302_read(0x83);
lcd_puts(bcd2string(temp));
lcd_putchar(':');
temp=ds1302_read(0x81);
lcd_puts(bcd2string(temp));
delay_ms(1000);}
}

// Leitura do Ms
// Leitura do Ano

// Leitura das Horas


// Leitura dos minutos
// Leitura dos segundos

unsigned char *bcd2string(unsigned char dado){


s[1]=(dado & 0x0f)+0x30;
s[0]=((dado & 0xf0)>>4)+0x30;
return s;
}
void init(){
UCSR0B=0x00;
ACSR=0x80;
// Analog Comparator: Off
// DS1302 Real Time Clock initialization
// Trickle charger: On
// Trickle charge resistor: None
// Trickle charge diode(s): 1
rtc_init(1,0,0);
lcd_init(16);
}

114

115

116

117

S-ar putea să vă placă și