Professional Documents
Culture Documents
Baseado no ATmega328
Prof. Eduardo G. Bertogna
DAELN/UTFPR
1
Sistema Microprocessado Mínimo
• Microprocessador;
• Circuito de Clock;
• Circuito de Reset;
• Circuito de Seleção;
• Fonte de Alimentação.
2
Visão Geral da Família AVR
• Desenvolvido em 1996, no Instituto de Ciência e Tecnolo-
gia da Noruega, por 2 estudantes: Alf-Egil Bogen e Vergard
Wollan, sendo a sigla AVR para Advanced Virtual RISC;
3
Elementos da Família AVR
• tinyAVR
• megaAVR
• XmegaAVR
• Battery Management
• Automotive AVR
4
Componentes das Sub-Famílias tinyAVR, e megaAVR
Modelo* Características 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
de 8bits, 16 Pinos de E/S, 11 ADC's de 8bits.
tiny28 2kB Flash, 1 Timer/Counter de 8bits, 20 Pinos de E/S.
tiny2313 2kB Flash, 128B de EEPROM, 128B de SRAM, 2 T/C
(1 de 8bits, 1 de 16bits), 18 Pinos de E/S, 1 Serial.
mega8 8kB Flash, 512B EEPROM, 512B SRAM, 3 T/C (2x8,1x16)
23 Pinos de E/S, 1 Serial, 3 PWM, 8 ADC' s,
mega8515 8kB Flash, 512B EEPROM, 512B SRAM, 2 T/C (1x8,1x16)
35 Pinos de E/S, 1 Serial, 3 Canais de PWM
mega8535 Idem ao mega8515, com 2 Timer/Counter de 8bits,
4 Canais de PWM, 8 ADC's, e 32 Pinos de E/S.
mega16 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,
mega162 Idem ao mega16, c/ 2 T/C de 16bits, 4 Canais de PWM,
2 Canais Seriais, 35 Pinos de E/S, porém sem ADC's.
mega32 Idem ao mega16, c/ 32kB de Flash, 2kB SRAM, 4 PWM.
mega64 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.
mega128 Idem ao mega64, com 128kB Flash, 4kB EEPROM.
mega48 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.
mega88 Idem ao mega48, c/ 8kB Flash, 512B EEPROM, 1kB RAM.
mega168 Idem ao mega88, c/ 16kB de Flash.
mega256 Idem ao mega128, c/ 256kB Flash, 8kB SRAM, 16 PWM.
5
Ambientes de Desenvolvimento p/ AVR
• CodeVisionAVR - apenas desenvolvimento em C,
sem simulador/depurador. Através de Wizard gera
código automático, com as congurações dos re-
gistros sendo função da seleção de periféricos es-
colhidos, bastando inserir os trechos de código que
o completam.
6
• AVR Studio 4 e Atmel Studio 7 - desenvolvi-
mento em assembly e C, com simulador/depura-
dor. Freeware fornecido pela Atmel. AVR Studio.
No desenvolvimento em C pode ser usado com o
compilador GNU GCC WinAVR e com o AVR To-
olchain da Atmel.
7
Núcleo da Arquitetura AVR RISC
8
Recursos do ATmega328
131 Instruções (maioria executada em 1 ciclo clock)
32 kB Memória Flash ISP 10.000 ciclos de escrita
2.048 B Memória SRAM
1.024 B Memória EEPROM 100.000 ciclos de escrita
32 Registros de 8 bits de uso geral
23 pinos de I/O programáveis individualmente
2 T/C de 8 bits, c/ prescaler separado e Modo de
Comparação
1 T/C de 16 bits, c/ prescaler separado e Modos de
Comparação 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 Analógico
1 Serial TWI compatível c/ I2C Philips
1 USART
1 SPI Master/Slave
2 Interrupções Externas e 23 Interrupções/Wake-Up de I/O
6 Modos de Baixo Consumo
Detecção de Brown-out e Power-On Reset
Oscilador RC Interno Calibrado
Encapsulamentos DIP-28, TQFP-32, MLF-28
Tensões: 1,8V-5,5V
Clock: 0-20 MHz
9
Arquitetura Interna do ATmega328
10
Pinagem do ATmega328 (DIP-28)
• GND - Referência.
12
• PORTC (PC0...PC6) - Porta de 7 bits bidirecional de E/S.
Cada pino desta porta possui uma função alternativa, ver
tabela a seguir.
13
Placas da Família Arduino AVR
14
Placa Atmel Xplained328
Gravadores ISP
15
Sistema de Clock do ATmega328
17
Seleção da Fonte Primária de Clock - Fuse-bits CKSEL3...0
A fonte primária de clock é selecionada quando da programação
do dispositivo, através dos fuse-bits CKSEL3...0 :
18
Oscilador Interno Calibrado
• Quando se deseja minimizar o uso de componentes externos,
e existe uma certa tolerância na precisão do sinal de clock;
20
Fontes de Ativação do Reset
21
Registro de e Status da CPU - MCUSR
MCUSR
WDRF BORF EXTRF PORF
22
Registro de Controle da CPU - MCUCR
MCUCR
- BODS BODSE PUD - - IVSEL IVCE
Modo Idle
- CPU é parada;
- Periféricos e Interrupções continuam funcionando;
- CPU retorna do modo Idle ao ocorrer uma destas interrupções;
- Circuito de BOD não pode ser desativado neste modo.
Modo Power-Down
- Oscilador externo é parado;
- Circuitos dos TWI, WDT, e Interrupções, permanecem funcio-
nando;
- Retorno do Power-Down através de uma interrupção destes cir-
cuitos, de um Reset externo, ou Reset por Brown-out.
Modo Power-Save
- Idêntico ao Power-Down, exceto que T/C2 continua ativo;
- Adicionalmente, pode retornar deste modo por interrupções do
T/C2;
- Se o T/C2 não será usado recomenda-se o modo Power-Down.
Modo Standby
- Idêntico ao Power-Down, exceto que o oscilador externo se man-
tém funcionando;
- Somente possível de ser usado com Cristal/Ressonador externo.
24
Reg. de Controle dos Modos de Sleep -
SMCR
SMCR
SM2 SM1 SM0 SE
25
Registro de Status da CPU - SREG
SREG
I T H S V N Z C
28
Memória FLASH
• Memória Flash de 32 kB, organizada como 16 kW,
instruções de 16 ou 32 bits, e PC de 14 bits.
30
Registros de E/S do ATmega328 (cont.)
Recursos Siglas Nome do Registro de E/S
Modos Sleep SMCR Sleep Mode Control Register
Contr. Potência PRR Powe Reduction Register
Watchdog Timer WDTCSR WDT Control & Status Reg
UDRn UART Data Register
Canais USART UCSRnA/B/C UART Control/Status Regs
UCR UART Control Register
UBRRnH/UBRRnL UART Baud Rate Registers
Compar.Analóg. ACSR Analog Comp. Control/Status
ADCL/H ADC Data Registers L/H
Conversor A/D ADCSRA/B ADC Control/Status Reg A/B
ADMUX ADC Multiplexer Selection Reg
TWBR TWI Baud Rate Register
TWCR TWI Control Register
Canais TWI TWSR TWI Status Register
TWDR TWI Data Register
TWAR TWI Address Register
TWAMR TWI Address Mask Register
PORTB
PORTC Port B/C/D Data Regs
PORTD
Portas de E/S DDRB
B, C, e D DDRC Data Direction Registers
DDRD
PINB
PINC Input Pin Address Registers
PIND
31
Portas de Entrada e Saída
• São 3 as portas E/S do ATmega328 designadas como PORTB,
PORTC e PORTD
32
Registros Associados às Portas de E/S
• Registros de Direção de Dados - DDRB, DDRC, DDRD
33
Modos de Operação dos Pinos das Portas
34
Exemplo de Conguração dos Pinos de E/S
O trecho de programa a seguir, congura os pinos PB0 e PB1
como saídas, e os pinos PB2 a PB7 como entradas, dene o
estado dos pinos PB0, PB1, PB6 e PB7, e então lê o estado da
porta B. Finalmente, escreve nos pinos PB0 e PB1, resetando
PB0 e setando PB1. PB0 e PB1 são denidos como RELE 1 e
RELE 2.
int main(void)
{
// Define Pinos PB0, PB1 como saídas, PB2 a PB7 entradas
DDRB |= (1<<DDB1)|(1<<DDB0);
// Define estado dos Pinos PB0, PB1, PB6 e PB7 em nível alto
// e pinos PB2, PB3, PB4 e PB5 em nível baixo
PORTB |= (1<<PB7)|(1<<PB6)|(1<<PB1)|(1<<PB0);
return 0;
}
35
Sintaxe para Setar, Resetar, Complementar e
Testar bits em registros
36
• Setando-se mais de um bit de um registro:
Aplicar a operação OR do registro alvo com múltiplos ORs das várias
máscaras de bits correspondentes aos bits que se deseja setar.
Exemplo de como se setar os bits 2 e 3 (DDRB2 e DDRB3 ) do re-
gistro DDRB :
DDRB |= (1<<DDB3) | (1<<DDB2);
37
Macros para Setar, Resetar, Complementar e Testar bits
Pode-se para efeito de clareza ou praticidade criar macros como as a mostradas
a seguir:
#define SetBit_Reg(Reg,Bit) (Reg|=(1<<Bit))
}
...
38
Exemplo 1: Uso das macros para testar bits. Enquanto pino
PD0=0 o pino PB5=0, se PD0=1 pino PB5=1.
#include <io.h>
#include <delay.h>
void main(void)
{
DDRB|=(1<<DDB5); // Pino PB5 como saída
PORTD|=(1<<PORTD2); // Pull-up em PD2
while (1)
{
ClrBit_Reg(PORTB,5);
while(TstBit_Reg(PIND,2)); // Espera Pino PD0 ir a 0
SetBit_Reg(PORTB,5);
while(!TstBit_Reg(PIND,2)); // Espera Pino PD0 ir a 1
}
}
#include <io.h>
#include <delay.h>
void main(void)
{
DDRB|=(1<<DDB5); // Pino PB5 como saída
while (1)
{
ClrBit_Reg(PORTB,5);
delay_ms(1000); // Espera 1,0 segundo
SetBit_Reg(PORTB,5);
delay_ms(1000); // Espera 1,0 segundo
}
}
39
Estrutura Geral dos Pinos de E/S
40
Exemplo 3: neste exemplo há a mudança de estado do LED em
PB5 cada vez que push button em PD2 é pressionado.
#include <io.h>
#include <delay.h>
void main(void)
{
DDRB|=(1<<DDB5); // Pino PB5 como saída
PORTD|=(1<<PORTD2); // Pull-up em PD2
while(1){
if(!TstBit_Reg(PIND,2)){
while(!TstBit_Reg(PIND,2)); // Espera liberar push-button
delay_ms(100); // Atraso de 100 ms de debouncing
CplBit_Reg(PORTB,5); }} // Complementa estado do LED em PB5
}
41
Interrupções no ATmega328
Vetor Endereço Fonte Denição
1 0x0000 RESET Reset Ext., Power-On Reset,
2 0x0002 INT0 Int. Externa no pino INT0
3 0x0004 INT1 Int. Externa no pino INT1
4 0x0006 PCINT0 Mudança estado pino Req. 0
5 0x0008 PCINT1 Mudança estado pino Req. 1
6 0x000A PCINT2 Mudança estado pino Req. 2
7 0x000C WDT Watchdog Time-out
8 0x000E TIMER2 COMPA T/C2 Compare Match A
9 0x0010 TIMER2 COMPB T/C2 Compare Match B
10 0x0012 TIMER2 OVF T/C2 Overow
11 0x0014 TIMER1 CAPT T/C1 Evento de Captura
12 0x0016 TIMER1 COMPA T/C1 Compare Match A
13 0X0018 TIMER1 COMPB T/C1 Compare Match B
14 0X001A TIMER1 OVF T/C1 Overow
15 0x001C TIMER0 COMPA T/C0 Compare Match A
16 0x001E TIMER0 COMPB T/C0 Compare Match B
17 0x0020 TIMER0 OVF T/C0 Overow
18 0x0022 SPI, STC SPI Transfer. completa
19 0x0024 USART, RX USART Recep. completa
20 0x0026 USART, UDRE USART Reg. dados vazio
21 0x0028 USART, TX USART Transm. completa
22 0x002A ADC Conv. A/D completada
23 0x002C EE READY EEPROM Pronta
24 0X002E ANALOG COMP Comparador Analógico
25 0x0030 TWI 2-Wire serial interface
26 0x0032 SPM READY Memória Flash Pronta
42
Interrupções no ATmega328 (cont.)
• 26 fontes de interrupção, bit de Seleção de Vetores de In-
terrupção - IVSEL=1: vetores de interrup. no setor de pro-
grama; se IVSEL=0 estes ocupam início do setor de boot.
Interrupções Externas
• Solicitadas pelos pinos INT0, INT1, ou PCINT0...23, fun-
ções alternativas de PORTD: PD2 (INT0) e PD3 (INT1), e
PORTB, PORTC e PORTD (PCINT0...23).
43
Reg. de Máscara de Interrup. Externa - EIMSK
EIMSK
INT1 INT0
EICRA
ISC11 ISC10 ISC01 ISC00
44
Reg. de Sinalização de Interrup. Externa - EIFR
EIFR
INTF1 INTF0
46
Código em C editado no CodeVision:
void main(void)
{
inicializa(); // Inicializa periféricos
ACIONADOR=1; // Inicia ligando o forno
if(INTF0==1)
ACIONADOR=0; // Desliga forno se T>120°C
while (1); // Espera ativação de sensores
}
void inicializa(void)
{
// Pino PB0 saída
DDRB|=(1<<DDB0);
PORTB=0x00;
PORTD|=(1<<2)|(1<<3); // Pull-ups nos pinos INT0 e INT1
// INT0 e INT1: Ativos na borda de descida
EICRA=(1<<ISC11) | (0<<ISC10) | (1<<ISC01) | (0<<ISC00);
// Habilita INT0 e INT1 após I=1 (SREG)
EIMSK=(1<<INT1) | (1<<INT0);
// Habilitação Global de Interrupções, I=1
#asm("sei")
}
47
Interface com Módulo de LCD
A conexão do LCD com o microcontrolador pode ser feita através
de 4 bits de dados, utilizando os pinos D4 a D7 do LCD, ou em
8 bits de dados, utilizando os pinos D0 a D7. Além destes sinais
de dados, 3 sinais de controle são usados:
49
Interface com LCD em 4 Bits no Codevision
Exemplo de código em C:
/*******************************************************
Chip: ATmega328P Clock: 16,000000 MHz
*******************************************************/
#include <mega328p.h>
#include <alcd.h>
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: inicialização
// 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
}
50
Interface LCD em 8 Bits com Shift Register
Pode-se conectar o LCD ao ATmega328 em 8 bits utilizando um
shift register 74HC164. Neste caso os pinos D0 a D7 do LCD são
oriundo da saída do 74HC164, o qual recebe estes 8 bits de forma
serial pela linha de dados (A) sincronizados com o clock (CLK).
Os pinos de controle RS e EN do LCD são conectados a pinos
disponíveis de uma das portas, e o RD aterrado.
Exemplo de código em C:
/*******************************************************
Chip: ATmega328P Clock: 16,000000 MHz
*******************************************************/
#include <mega328p.h>
#include "shift_reg.h"
void main(void){
lcd164_inic();
lcd164_puts(msg1); // Escreve string na coluna 0 linha0
lcd164_gotoxy(0,1); // Posiciona cursor na coluna 0 linha1
lcd164_puts(msg2); // Escreve string na coluna 0 linha1
while (1);
}
51
Código do arquivo de cabeçalho shift reg.h:
#include <io.h>
#include <delay.h>
#include <mega328p.h>
#include <delay.h>
#include <alcd.h>
void inic(void);
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 inic(void)
{
DDRD=0xF0; // Bits7..4=Saídas e Bits2..0=Entradas
PORTD=0xFF; // Bits7..4=0 e Bits3..0=Pullup
UCSR0B=0x00; // USART desabilitada
lcd_init(16); // LCD tipo 16 caracters/linhas
}
Interrupções dos Temporizadores/Contadores
53
Interrupção por Comparação de Valores
55
Reg. de Sinaliz. de Interrup. dos T/C's
TIFR0
OCF0B OCF0A TOV0
TIFR1
ICF1 OCF1B OCF1A TOV1
TIFR2
OCF2B OCF2A TOV2
56
Temporizadores/Contadores - T/C's
- T/C0 de 8 bits.
- T/C2 de 8 bits.
- T/C1 de 16 bits.
57
Temporizador/Contador 0 de 8 Bits
Características Principais do T/C0:
• Gerador de Frequências;
58
Arquitetura Interna do T/C0
59
Registro de Contagem - TCNT0
TCCR0A
COM0A1 COM0A0 COM0B1 COM0B0 - - WGM01 WGM00
63
• Bits COM0B1, COM0B0: Compare Output Mode,
ou Modo de Saída de Comparação, seleciona o
modo como o pino de saída OC0B se comportará.
64
Registro de Controle do T/C0 - TCCR0B
TCCR0B
FOC0A FOC0B WGM01 CS02 CS01 CS00
66
Operação do T/C0 no Modo Normal - Timer Over-
ow
68
Código 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);
}
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 Interrupção por overflow
#asm("sei") // Habilitação Global de Interrupções
}
69
Código 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;
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 Interrupção por overflow
sei(); // Habilitação Global de Interrupções
}
70
Exemplo: Piscando um Led a cada 1,0s via T/C0
sem interrupção
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
não haverá interrupção para resetá-lo automaticamente.
Código 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; // Após 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 Interrupções desabilitadas
TIMSK0=(0<<OCIE0B)|(0<<OCIE0A)|(0<<TOIE0);
}
71
T/C0 no Modo CTC - Clear Timer on Compare
Match
72
• O ag de Overow na Contagem - TOV0 , poderá gerar in-
terrupções se o bit TOIE0=1, e o bit I=1;
fClkIO
fOC0A/B =
2.N.(1 + OCR0A/B)
Onde: N =fator de prescaler; e fClkIO = Clock de E/S
fClkIO 16.000.000
f = = = 20.000Hz
2.N.(1 + OCR0A) 2.8.(1 + OCR0A)
o que leva a um valor para OCR0A de 49=0x31.
73
Código 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)
}
74
Temporizador/Contador 1 de 16 Bits
Características principais do T/C1
75
• O Registro de Contagem TCNT1 deve ser aces-
sado, em 2 acessos de 8 bits, através dos registros
TCNT1H e TCNT1L, usando-se as instruções de
IN e OUT.
76
Arquitetura Interna do T/C1
Controle PWM
#include <io.h>
#include <delay.h>
// Função Proncipal
void main(void){
inic();
while(1){
if(!(PINB & 0b00000010)) incrementa();
if(!(PINB & 0b00000001)) decrementa();}
}
77
// Função de inicialização de periféricos
void inic(void){
// Porta D toda como saída
DDRD=0xFF;
PORTD=0x00;
// PB3 como saída PWM (OC2A) e PB0 e PB1 com pull-ups ativos
DDRB=0B00001000;
PORTB=0B00000011;
// T/C2 Clock: 2000,000 kHz
// Modo: Fast PWM; top=0xFF
// OC2A: PWM Não-Invertido; OC2B: Desconectado
// Pulso PWM: OC2A Periodo: 0,128 ms Largura: 0 us
ASSR=(0<<EXCLK) | (0<<AS2);
TCCR2A=(1<<COM2A1) | (0<<COM2A0) | (0<<COM2B1) | (0<<COM2B0) |
(1<<WGM21) | (1<<WGM20);
TCCR2B=(0<<WGM22) | (0<<CS22) | (1<<CS21) | (0<<CS20);
}
Modos de Operação do T/C1
78
T/C1 no Modo Normal
• Selecionado quando os bits WGM13:0=0000 ;
79
T/C1 no Modo CTC (Clear Timer on
Compare Match)
80
• Desvio para 0004 ou 0005, se uma instrução SEI,
setou o bit I, e OCIE1A ou TICIE1=1;
fClkIO
fOC1A =
2.N.(1 + OCR1A)
82
Resoluções no modo PWM Rápido
∗ WGM12/WGM11/WGM10==CTC1/PWM11/PWM10 no AT90S8515.
83
Frequência do sinal PWM (OC1A/OC1B):
fClkIO
fOC1A =
N.(1 + T OP )
84
T/C1 no Modo PWM Corrigido em Fase
• Contagem crescente/decrescente de 0 ao valor máximo res-
pectivo à resolução desejada, e voltando a contar de forma
decrescente até 0, ciclicamente.
85
• No modo Não-Inversor, quando TCNT1=OCR1A
ou OCR1B, na contagem crescente, a saída OC1A
ou OC1B é resetada. Na contagem decrescente,
OC1A ou OC1B é setada.
Frequência/Resolução (OC1A/OC1B):
fClkIO
fOC1A =
2.N.T OP
log(T OP + 1)
R=
log(2)
86
T/C1 no Modo PWM Corrigido em Fase
e Frequência
87
Reg. de Controle B do T/C1 - TCCR1B
TCCR1B
ICNC1 ICES1 WGM13 WGM12 CS12 CS11 CS10
89
Reg. de Controle A do T/C1 - TCCR1A
TCCR1A
COM1A1 COM1A0 COM1B1 COM1B0 - - WGM11/10
Modos Não-PWM
Modo de Ativação das Saidas OC1A e OC1B
COM1X1 COM1X0 Comportortamento de OC1A e OC1B
0 0 OC1A/OC1B Desconectados.
0 1 OC1A/OC1B Muda de estado quando a Com-
paração resultar verdadeira.
1 0 OC1A/OC1B=0 quando a Comparação resul-
ta verdadeira.
1 1 OC1A/OC1B=1 quando a Comparação resul-
ta verdadeira.
90
Modo PWM Rápido
Modo de Ativação das Saidas OC1A e OC1B
COM1X1 COM1X0 Comportortamento de OC1A e OC1B
0 0 OC1A/OC1B Desconectados.
0 1 OC1A Muda de estado na Comparação quando
WGM13:0=15 , e OC1B em OFF. Nos demais
modos, OC1A/OC1B em OFF.
1 0 OC1A/OC1B=0 quando a Comparação resulta
verdadeira, seta no valor máximo (TOP).
1 1 OC1A/OC1B=1 quando a Comparação resulta
verdadeira, reseta no valor máximo (TOP).
91
Exemplo de uso do PWM: Controle de Velocidade de Motor
Neste exemplo, a velocidade do motor CC varia de 0 a 90%
em passos de 10% de acordo com o indicado no display de 7-
segmentos, sendo o ajuste feito pelas teclas INCR e DECR. A
saída PWM usada é a correspondente ao pino PB3=OC2A, sendo
usado portanto, o T/C2 para a geração deste sinal que aciona o
motor via fotoacoplador 4N25 e transistor de potência TIP120.
Código em C no CodeVision:
#include <io.h>
#include <delay.h>
92
// Trata a tecla de incremento de potência
void incrementa(void){
counts++;
if(counts==10) counts=9;
PORTD=dado[counts];
OCR2A=pwm_cte[counts];
delay_ms(500);
}
// Função Proncipal
void main(void){
inic();
while(1){
if(!(PINB & 0b00000010)) incrementa();
if(!(PINB & 0b00000001)) decrementa();}
}
93
• Faixa tensões de entrada entre 0 a Vcc, resolução de 10 bits
com erro de não linearidade de 1/2 LSB e erro absoluto de
±2 LSB;
• Bit ADIF : Bit A/D Interrupt Flag, setado por harware para in-
dicar a solicitação de interrupção por Conversão Completada
do ADC. Resetado por hardware quando do atendimento da
interrupção, ou por software se esta interrupção não foi ha-
bilitada;
94
• Bit ADSC : Bit A/D Start Conversion, setado para iniciar a
conversão pelo ADC;
95
Reg. Multiplex do ADC - ADMUX
ADMUX
REFS1 REFS0 ADLAR - MUX3 MUX2 MUX1 MUX0
96
Ex: Leitura de sensor LM35 via ADC7 a cada 1,0s
// Variáveis Globais
unsigned int conta_10ms=100;
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 habilitação global de interrupção
}
USART
Arquitetura Interna da USART
98
Características da USART:
• Comunicação Full Duplex, com registros de transmissão e
recepção separados;
• Filtragem de ruído;
99
Transmissão de Dados via UART
• Habilitado pelo bit TXEN do Reg. UCSRB
Passos da Transmissão
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;
7. Se um novo dado não 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 não foi escrito no registro
UDR o sinalizador de término de envio TXC do registro USR é setado.
100
Recepção de Dados via UART
• Habilitado através do bit RXEN do Registro UCR;
Passos da Recepção
1. RXD é amostrado numa taxa 16x maior que Baud Rate, vericando a
ocorrência do Start Bit. Conrmações ocorrem nas amostras 8, 9, e 10
deste sinal amostrado. Não havendo ao menos 2 ocorrências positivas, o
Start Bit é descartado, sendo considerado ruído;
4. Após o dado ter sido recebido serialmente ele é enviado ao UDR mesmo
que um erro de quadro ocorra. Quando o dado já está presente do regis-
tro UDR o bit sinalizador de Recepção Completada - RXC , presente no
registro USR, é setado;
6. Na operação da UART com 9 bits de dados (seleção 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 informação qquer.
101
Reg. de Controle/Status A - UCSR0A
UCSR0A
RXC0 TXC0 UDRE0 FE0 DOR0 UPE0 U2X0 MPCM0
102
• Bit DOR0 : Data Overrun, setado quando o buer de recep-
ção está cheio, um novo dado é recebido pelo registrador de
deslocamento, e um novo Start Bit é recebido. O bit DOR0
é válido até que o registro de dados UDR0 é lido, devendo
ser resetado quando se escreve em UCSR0A.
103
Reg. de Controle/Status B - UCSR0B
UCSR0B
RXCIE0/TXCIE0 UDRIE RXEN0/TXEN0 UCSZ2 RXB80/TXB80
105
• Bits UPM01..0 : Sigla de Parity Mode. Este bit habilita e
seleciona o modo de geração do bit de vericação de paridade.
Na transmissão, o bit de paridade é gerado e transmitido
jundo com o dado, e na recepção 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.
106
Baud Rate (bps) x Frequência do Cristal (MHz)
Conteúdos 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 25 51 47 95 51 103
4800 12 25 23 47 25 51
9600 - 12 11 23 12 25
14,4K - - 7 15 - -
19,2K - - 5 11 - 12
28,8K - - 3 7 - -
38,4K - - 2 5 - -
57,6K - - 1 3 - -
76,8K - - - 2 - -
115,2K - - 0 1 - -
230,4K - - - 0 - -
250K - - - - - 0
Taxa 3,6864 3,6864 4,0000 4,0000 7,3728 7,3728
U2X0 0 1 0 1 0 1
2400 95 191 103 207 191 383
4800 47 95 51 103 95 191
9600 23 47 25 51 47 95
14,4K 15 31 - 34 31 63
19,2K 11 23 12 25 23 47
28,8K 7 15 - - 15 31
38,4K 5 11 - 12 11 23
57,6K 3 7 - - 7 15
76,8K 2 5 - - 5 11
115,2K 1 3 - - 3 7
230,4K 0 1 - - 1 3
250K - - 0 1 - -
0,5M - - - 0 - -
107
Taxa 8,000 8,000 11,0592 11,0592 14,7456 14,7456
U2X0 0 1 0 1 0 1
2400 207 416 287 575 383 767
4800 103 207 143 287 191 383
9600 51 103 71 143 95 191
14,4K 34 68 47 95 63 127
19,2K 25 51 35 71 47 95
28,8K - 34 23 47 31 63
38,4K 12 25 17 35 23 47
57,6K - - 11 23 15 31
76,8K - 12 8 17 11 23
115,2K - - 5 11 7 15
230,4K - - 2 5 3 7
250K 1 3 - - - -
0,5M 0 1 - - - -
1M - 0 - - - -
Taxa 16,000 16,000 18,4320 18,4320 20,000 20,000
U2X0 0 1 0 1 0 1
2400 416 832 479 959 520 1041
4800 207 416 239 479 259 520
9600 103 207 119 239 129 259
14400 68 138 79 159 86 173
19200 51 103 59 119 64 129
28800 34 68 39 79 42 86
38400 25 51 29 59 32 64
57600 - 34 19 39 21 42
76800 12 25 14 29 15 32
115200 - - 9 19 10 21
230,4K - - 4 9 - 10
250K 3 7 - - 4 9
0,5M 1 3 - - - 4
1M 0 1 - - - -
108
Equações para Baud Rate e UBRR da USART
Modo Cálculo de Baud Rate* Cálculo de UBRR*
Assíncr. Normal BAU D = fOSC
16.(U BRR+1)
U BRR = fOSC
16.BAU D
−1
(U2X=0)
Assíncr. Dobro BAU D = fOSC
8.(U BRR+1)
U BRR = fOSC
8.BAU D
−1
da Tx. (U2X=1)
Síncr. Mestre BAU D = fOSC
2.(U BRR+1)
U BRR = fOSC
2.BAU D
−1
// Variáveis Globais
unsigned int temp1,time_ms;
// Rotina de Inicializações
void inic(void){
DDRB=(0<<DDB7) | (0<<DDB6) | (1<<DDB5) | (0<<DDB4) | (0<<DDB3)
| (0<<DDB2) | (0<<DDB1) | (0<<DDB0);
PORTB=0x00;
// 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;
109
// 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<<RXC0) | (0<<TXC0) | (0<<UDRE0) | (0<<FE0) | (0<<DOR0)
| (0<<UPE0) | (0<<U2X0) | (0<<MPCM0);
UCSR0B=(0<<RXCIE0) | (0<<TXCIE0) | (0<<UDRIE0) | (0<<RXEN0) |
(1<<TXEN0) | (0<<UCSZ02) | (0<<RXB80) | (0<<TXB80);
UCSR0C=(0<<UMSEL01) | (0<<UMSEL00) | (0<<UPM01) | (0<<UPM00) |
(0<<USBS0) | (1<<UCSZ01) | (1<<UCSZ00) | (0<<UCPOL0);
UBRR0H=0x00;
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) | (0<<ADSC) | (0<<ADATE) | (0<<ADIF) |
(0<<ADIE) | (1<<ADPS2) | (0<<ADPS1) | (0<<ADPS0);
ADCSRB=(0<<ADTS2) | (0<<ADTS1) | (0<<ADTS0);
// Global enable interrupts
#asm("sei")
}
// Rotina Principal
void main(void){
inic();
time_ms=temp1=100;
while(1);
}
Memória EEPROM
• 1kB de capacidade com área separada da área de dados;
110
Ciclo de Leitura da EEPROM
1. Carregar os registros de Endereço da EEPROM: EEARL e
EEARH com o endereço fonte de leitura;
111
• Bit EERE : EEPROM Read Enable, deverá ser levado a 1,
após o endereço de leitura ter sido colocado nos Registros de
Endereço - EEARH/L.
112
• Bit EEMWE : Sigla para EEPROM Master Write, este bit
deverá ser setado, para permitir a escrita na EEPROM, sendo
automaticamente resetado após 4 ciclos de clock.
114
• O bit ACD de ACSR, se setado desabilita o Comparador Ana-
lógico, desconectando-o da fonte de alimentação, reduzindo
o consumo de energia]
115
• Bit ACO : Saída do Comparador Analógico, setado se a tensão
em AIN0>AIN1, resetado em contrário. ACO será atrasado
de 1 a 2 clocks.
116
Reg. B de Controle e de Status do Con-
versor Analógico p/ Digital - ADCSRB
ADCSRB
- ACME - - - ADTS2 ADTS1 ADTS0
117
Temporizador Watchdog - WDT
O WDT conta com um oscilador interno independente de 128kHz.
Produzirá um Reset caso uma instrução WDR não seja executada
antes do timeout do WDT.
WDTCSR
WDIF WDIE WDP3 WDCE WDE WDP2 WDP1 WDP0
118
• Bit WDCE: Watchdog Change Enable, quando setado
permite que o WDT possa ser desabilitado através do bit
WDE quando este for ser resetado.
119
RTC - DS1302
unsigned char ds1302 read(unsigned char addr);
120
Código em C editado no CodeVision:
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
121
lcd_puts(bcd2string(temp));
lcd_putchar('/');
temp=ds1302_read(0x89); // Leitura do Mês
lcd_puts(bcd2string(temp));
lcd_putchar('/');
temp=ds1302_read(0x8d); // Leitura do Ano
lcd_puts(bcd2string(temp));
lcd_gotoxy(0,1);
lcd_puts("Time:");
while(1){
lcd_gotoxy(5,1);
temp=ds1302_read(0x85); // Leitura das Horas
lcd_puts(bcd2string(temp));
lcd_putchar(':');
temp=ds1302_read(0x83); // Leitura dos minutos
lcd_puts(bcd2string(temp));
lcd_putchar(':');
temp=ds1302_read(0x81); // Leitura dos segundos
lcd_puts(bcd2string(temp));
delay_ms(1000);}
}
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);
}
Interface SPI
• Serial Peripheral Interface, concebida para comunicação com
outras CPUs ou periféricos dotados com esta interface;
• Interrupção de m de transmissão;
122
Interconexão Master e Slave
• Bit DORD : Setado faz com que o LSB seja enviado primeiro, se resetado
o MSB será enviado primeiro;
0 Subida Descida
1 Descida Subida
0 Sample Setup
1 Setup Sample
Frequencia de Operação
SPI2X SPR1 SPR0 SCK
0 0 0 fosc /4
0 0 1 fosc /16
0 1 0 fosc /64
0 1 1 fosc /128
1 0 0 fosc /2
1 0 1 fosc /8
1 1 0 fosc /32
1 1 1 fosc /64
• Bit SPIF : Setado indica que uma transferência serial de um byte foi com-
pletada, e uma solicitação de interrupção da SPI é gerada. Se o bit I em
SREG estiver setado a interrupção é antendida;
• Bit WCOL: Setado indica que uma escrita em SPDR foi realizada durante
uma transferência de dados pela interface SPI;