Documente Academic
Documente Profesional
Documente Cultură
Baseado no ATmega328
Prof. Eduardo G. Bertogna
DAELN/UTFPR
Microprocessador;
Circuito de Clock;
Circuito de Reset;
Circuito de Seleo;
Fonte de Alimentao.
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;
Grande suporte de hardware e software para o desenvolvimento, muitos destes de natureza livre e aberta.
tinyAVR
megaAVR
XmegaAVR
Battery Management
Automotive AVR
Famlia AVR - tinyAVR e megaAVR
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.
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
10
GND - Referncia.
AVcc
Pinos
PB0
PB1
PB2
PB3
PB4
PB5
PB6
PB7
CLK0
ICP1
OC1A
OC1B
Funes Alternativas
12
Pinos
Funes Alternativas
Pinos
PD0
PD1
PD2
PD3
PD4
PD5
PD6
PD7
RXD
TXD
INT0
INT1
OC2B
T0
XCK
T1
OC0B
AIN0
OC0A
AIN1
Funes Alternativas
13
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
Clk CPU
Clk IO
Clk Flash
Clk ADC
Clk ASY
Arbitra a ativao dos sinais de clock, acima, no necessariamente ativos simultaneamente, em razo dos modos de baixo
consumo.
15
CKSEL3...0
1111-1000
0111-0110
0101-0100
0011
0010
0000
Clock Externo
Obs:
- Figura (a)
16
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
18
limite, (Brown-Out Threshold) VBOT , c/ o detector de Brown-Out (BOD) habilitado pelo fuse bit
BODEN.
19
MCUSR
WDRF
BORF
EXTRF
PORF
- BODS
BODSE
MCUCR
PUD
- - IVSEL IVCE
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.
22
Reg.
SMCR
SMCR
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.
SM1
SM0
Modo
Modo Idle
Reduo de rudo do ADC
Modo Power-down
Modo Power-save
Reservado
Reservado
Modo Standby
Modo Standby extendido
23
SREG
S
Flag
H:
Flag
S:
Indica o resultado:
Flag
N:
Flag
Z:
N V
#include
...
/* 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
Organizao de Memria do
ATmega328
Memria SRAM
Memria FLASH
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
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
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
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
29
23 linhas de E/S que podem ser usadas como pinos de Entrada/Sada Digital de uso geral.
30
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
31
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
Pxn=1
no reg. PORTn,
Pxn,
ou con-
32
#include <avr/io.h>
#define RELE_1 0
#define RELE_2 1
unsigned char 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
34
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));
BV():
35
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
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
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).
Habilitadas/Mascaradas atravs dos bits INT0 e INT1 do Registro de Mscara de Interrupes - EIMSK, se o bit I do
SREG=1
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
INT1 INT0
Bits INT0, INT1: Setado habilita a interrupo externa correspondente, desde que o bit I do SREG
esteja setado;
EICRA
Ativao de INT0/INT1
ISC01/ISC11
ISC00/ISC10
40
INTF1 INTF0
42
// Prottipo da funo
// Inicializa perifricos
// Inicia ligando o forno
// Desliga forno se T>120C
// Espera ativao de sensores
43
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
void lcd init(unsigned char lcd columns) - Inicializa o controlador do LCD conforme tipo em nr de colunas;
void lcd write byte(unsigned char addr, unsigned char data) Escreve na memria de caracteres;
45
/*******************************************************
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
#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
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.
TOIE0 , TOIE1
I =1.
48
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
T/C
0
1
2
Bit
OCIE0A/OCIE0B
OCIE1A/OCIE1B
OCIE2A/OCIE2B
49
TIMSK0
OCIE0B
OCIE0A
TOIE0
ICIE1
OCIE1B
OCIE1A
TOIE1
OCIE2B
OCIE2A
TOIE0
TIMSK1
TIMSK2
Bits
Bits
OCIE0A/B, OCIE1A/1B
Bit ICIE1 :
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;
50
TIFR0
ICF1
Bit
Bits
Bit ICF1 :
OCF0B
OCF0A
TOV0
OCF1B
OCF1A
TOV1
OCF2B
OCF2A
TOV2
TIFR1
TIFR2
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:
Obs2:
52
Temporizador/Contador 0 de 8 Bits
Gerador de Frequncias;
53
54
Neste caso, bit de ag TOV0 setado, e uma interrupo por Overow ser requisitada, se previamente habilitada.
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:
57
TCCR0A
COM0A1
COM0A0
COM0B1
COM0B0
- -
WGM01
WGM00
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
OC0A Desconectado.
OC0A Muda de Estado na Comparao .
Reseta OC0A na Comparao.
Seta OC0A na Comparao.
OC0A Desconectado.
Reservado.
OC0A=0 na Comparao, 1 no valor MX.
OC0A=1 na Comparao, 0 no valor MX.
58
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
OC0B Desconectado.
OC0B Muda de Estado na Comparao .
Reseta OC0B na Comparao.
Seta OC0B na Comparao.
OC0B Desconectado.
Reservado.
OC0B=0 na Comparao, 1 no valor MX.
OC0B=1 na Comparao, 0 no valor MX.
59
TCCR0B
FOC0A
FOC0B
WGM01
CS02
CS01
CS00
Clock do Contador
CS02
CS01
CS00
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
Imed.
TOP
Imed.
BOTTOM
TOP
BOTTOM
60
61
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.
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.
63
Cdigo em C no CodeVision:
/* Chip: ATmega328
#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
#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
Cdigo em C no CodeVision:
/* Chip: ATmega328
#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
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 bit de ag:
OCF0
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;
fOC0A/B =
Onde:
fClkIO
2.N.(1 + OCR0A/B)
f =
fClkIO
16.000.000
=
= 20.000Hz
2.N.(1 + OCR0A)
2.8.(1 + OCR0A)
68
69
Temporizador/Contador 1 de 16 Bits
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.
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:
71
72
73
WGM13:0=0000 ;
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
75
fClkIO =
Sinal de clock
76
77
OP +1)
R = log(T
log(2)
*
WGM10 *
WGM12/WGM11/WGM10==CTC1/PWM11/PWM10 no AT90S8515.
78
fClkIO
N.(1 + T OP )
79
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.
80
Frequncia/Resoluo (OC1A/OC1B):
fOC1A =
Onde:
fClkIO =
T OP =valor
fClkIO
2.N.T OP
81
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.
82
TCCR1B
ICNC1
ICES1
WGM13
WGM12
CS12
CS11
CS10
CS12
CS11
CS10
Bit ICES1: Input Capture Edge Select, setado seleciona a ativao do pino ICP1, por borda de subida,
resetado por borda de descida.
83
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
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
TCCR1A
COM1A1
COM1A0
COM1B1
COM1B0
- -
WGM11/10
Bits COM1A1, COM1A0, COM1B1, COM1B0 : Comparator Output Mode, selecionam o comportamento dos pinos
OC1A/OC1B.
Modos No-PWM
COM1X1
0
0
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
COM1X1
0
0
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).
0
0
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
87
ADEN=1
ADC =
ADIF
VIN .1024
VREF
REFS1..0
no Reg.
no Reg. de Status
ADCSRA
ADEN
ADSC
ADATE
ADIF
ADIE
ADPS2
ADPS1
ADPS0
Clock do ADC
ADPS2
ADPS1
ADPS0
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;
88
Bit
ADEN :
ADCSRAB
-
ACME
ADTS2
ADTS1
ADTS0
ADTS2
ADTS1
ADTS0
Comparador Analgico
Interrupo Externa 0
T/C0 Comparao A
T/C0 Overow
T/C1 Comparao B
T/C1 Overow
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
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
1 1 1 0
1 1 1 1
0V - GND
Bits REFS1, REFS0 : Bits Reference Selection 0..1, selecionam a fonte da tenso de referncia que ser conectado ao
ADC:
REF1..0
0 0
Pino AREF.
0 1
1 0
Reservado
1 1
90
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:
Filtragem de rudo;
Trs interrupes distintas ocorrendo nas seguintes condies: Transmisso Concluda, Recepo Concluda, e Registro de Transmisso Vazio;
93
do Reg. UCSRB
Passos da Transmisso
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;
resetado, gerando o Start Bit, e o bit 9/10 setado gerando o 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;
RXEN
do Registro UCR;
Passos da Recepo
1. RXD amostrado numa taxa 16x maior que Baud Rate, vericando a
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;
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
UCSR0A
RXC0
TXC0
UDRE0
FE0
DOR0
UPE0
U2X0
MPCM0
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.
97
UCSR0B
RXCIE0/TXCIE0
UDRIE
RXEN0/TXEN0
UCSZ2
RXB80/TXB80
98
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.
Borda de Subida
Borda de Descida
Borda de Descida
Borda de Subida
99
UPM01
UPM00
Mode de Paridade
Desabilita Paridade
Reservado
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.
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
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
-
101
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
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
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
1.
2.
EEPE
(Reg. EECR)
SPMEN
104
3.
4.
5.
6.
7.
de escrita:
EEMPE=1
(Reg.
1.
2.
3.
- - EEPM1
EECR
EEPM0
EERIE
EEMPE
EEPE
EERE
Bits EEPM1..0 : EEPROM Program Mode, permite selecionar o modo de operao da escrita, conforme tabela a seguir:
EEPM1
EEPM0
Apaga somente.
Escreve somente.
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.
105
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.
ACSRA
ACD
ACBG
ACO
ACI
ACIE
ACIC
ACIS1
ACIS0
107
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.
ACIS1
ACIS0
Modo de Interrupo*
Reservado
108
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
109
WDIE
WDP3
WDCE
WDE
WDP2
WDP1
WDP0
Bit WDE:
110
Bit WDCE:
Watchdog Prescaler
Bits2...0, selecionam o fator de pr-diviso do clock de 1MHz:
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
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
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
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
114
115
116
117