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

Documentos relacionados
LT36D Microcontroladores Notas de Aula Aulas 1 e 2

LT36D Microcontroladores Notas de Aula Aula 5 e 6

LT36D Microcontroladores Notas de Aula Aulas 3 e 4

Sistema Digitais. Bacharelado de Informática UEM DIN - Prof. Elvio 2017

Sistemas Microprocessados

Sistemas Embarcados:

Jadsonlee da Silva Sá

Sistemas Microprocessados

Sistema Digitais. Bacharelado de Informática UEM DIN - Prof. Elvio 2016

Guia da Placa de desenvolvimento PD Mega16 N1

Programa Trainee 2012 Módulo 4 Microcontroladores AVR

Sistema Digitais. Bacharelado de Informática UEM DIN - Prof. Elvio v. 17a

Microcontrolador 8051

Plano de Aula. 1 o semestre. Aula número 010 Interrupções Internas Timers. Uso de interrupções internas produzidas pelos timers

Sistemas Embarcados:

Descrição dos pinos de entrada e saída e de funções especiais. Descrição dos modos de acesso: individual e por porto

Microcontrolador 8051:

Família de Microcontroladores AVR

Sistemas Microprocessados

07/06/2015. Outras características importantes em Microprocessadores/Microcontroladores SEL-433 APLICAÇÕES DE MICROPROCESSADORES I

Disciplina : Microcontroladores AVR

Prof. Adilson Gonzaga

Manual da Pinagem dos Microcontroladores BASIC Step 1 e M8 + Esquema de instalação do cabo

1.1 Noções básicas sobre interrupções em Microcontroladores

EPAC Microcontroladores Organização do curso 30/8/2007

Arquitetura do Microcontrolador Atmega 328

Interrupção. Prof. Adilson Gonzaga

Arquitetura e Organização de Computadores. Conjunto de Instruções da Arquitetura CompSim

Introdução ao Uso do LCD Inteligente (Versão Preliminar) Por Gilson Yukio Sato. Introdução

Sistema Digitais. Bacharelado de Informática UEM DIN - Prof. Elvio 2016

Introdução aos microcontroladores Microcontroladores e microprocessadores Tecnologia em Manutenção Industrial

Prof. Adilson Gonzaga

SICILIANO TECNOLOGIA

ARDUINO. Profº. Engº. Robson Dias Ramalho

Sistemas Embarcados:

1.2 Registradores relacionados as Interrupções. 3. TOSE Sentido da transição da borda do sinal aplicado am TMR0

Interrupções do Interrupções Gabriel Kovalhuk. UTFPR DAELN - Tecnologia em Mecatrônica Industrial

Sistemas Embarcados:

Suporta os microcontroladores: R. Leonardo da Vinci, Campinas/SP CEP F.: (19) Kit de Desenvolvimento ACEPIC 28

Aula 10 Microcontrolador Intel 8051 Parte 1

INTRODUÇÃO: MICROCONTROLADORES

O Pino P2.7 não está sendo usado e cada Display mostrará valores de 0 a 9.

PSI3441 Arquitetura de Sistemas Embarcados

Anatomia do Arduino Bootloader

UTFPR Departamento Acadêmico de Eletrônica Curso Técnico em Eletrônica Microcontroladores 1 - Prof. Cion nov/2010 (atualizado em jul 2015)

EL08D - MICROCONTROLADORES

Laboratório de Microprocessadores e Microcontroladores

Sistemas Digitais e Microcontrolados

ELE Microprocessadores I

Laboratório de Microprocessadores e Microcontroladores

Prof. Adilson Gonzaga

Objetivos MICROCONTROLADORES HARDWARE. Aula 03: Periféricos. Prof. Mauricio. MICRO I Prof. Mauricio 1. Arquitetura de um Microcontrolador

Microcontroladores 8051

Interrupção Externa. Capítulo 1. Noções básicas sobre interrupções em Microcontroladores PIC

Módulo de Cristal Líquido LCD

AULA 6 - INTRODUÇÃO AO ARDUINO Revisão de Eletrônica Digital e introdução aos Sistemas Computacionais.

Sistemas Microcontrolados

Controladores do IBM-PC. Gustavo G. Parma

Eletrônica Digital. Circuitos Lógicos Sequenciais PROF. EDUARDO G. BERTOGNA UTFPR / DAELN

SEL 0415 INTROD. À ORGANIZAÇÃO DE COMPUTADORES

Microcontroladores PIC16 - XM 116 -

Estrutura Básica de um Computador

KIT DIDÁTICO PIC-2377

Aplicações Avançadas de Microprocessadores. Professor: Marco Shawn Meireles Machado

Kit de desenvolvimento ACEPIC PRO V3.0

Família 8051 (introdução) 2011/1

Aula 4. Engenharia de Sistemas Embarcados. Prof. Abel Guilhermino Tópico: Arquitetura de um microcontrolador 8051

Projeto de Sistemas Embarcados

AAAA AAAA SEL Aplicação de Microprocessadores I. Aula 5 Temporização e Interrupção. Marcelo Andrade da Costa Vieira

Laboratório de Microprocessadores e Microcontroladores

Temporização Interrupções. Prof: Evandro L. L. Rodrigues. Rotinas de Atraso

Organização de Memórias

Comércio e Manutenção de Produtos Eletrônicos. Mapeamento de memória e conexões do Controlador CP-WS13/8DI8DO-WIFI/OEM. Versão 2.

LCDs Inteligentes. LCD Inteligente. Gabriel Kovalhuk DAELN / UTFPR

8051 Estudo de Caso. Prof. Carlos E. Capovilla - CECS/UFABC 1

of Arduino Slide: Bruno Aricó

9/3/2009. Aula 4. Engenharia de Sistemas Embarcados. Cenário: Sistema de Controle de LEDs

Curso de Microcontroladores PIC 16F84A

Portas de entrada e saída; Interrupções; Interrupções externas; Temporizadores Contadores; Interface Serial

Temporização da CPU SEL-433 APLICAÇÕES DE MICROPROCESSADORES I. Ciclos de Máquina. Ciclos de Máquina. Temporização Interrupções Rotinas de Atraso

CAPÍTULO 5. Interfaces I 2 C e SPI. Interface I 2 C. Interfaces e Periféricos 37

Tutorial Microcontroladores AVR Atmega8

PLATAFORMA PARA ESTUDO EM PROGRAMAÇÃO DE MICROCONTROLADORES FAMÍLIA 8051

Sistemas Digitais e Microcontrolados

Interface Serial. Prof. Adilson Gonzaga

PIC32 Uma Nova Tecnologia

C:\Users\House\Desktop\fluxo.c 1: /****************************************************************************** 2: * Objetivo: Este projeto visa

Prof. Dr. Rafael Traldi Moura Escola Politécnica da Universidade de São Paulo Departamento de Engenharia Mecatrônica e de Sistemas Mecânicos

Introdução à Plataforma ARDUINO

Revisão da Linguagem C Prof. Evandro L. L. Rodrigues

Período Saulo O. D. Luiz

8051 PROGRAMAÇÃO EM C

29/03/2017. Temporização da CPU SEL-433 APLICAÇÕES DE MICROPROCESSADORES I. Ciclos de Máquina. Ciclos de Máquina

Introdução ao Microcontrolador PIC

Registros do 16F628A. Prof. Luiz Antonio Vargas Pinto Prof. Vargas

RTC Real Time Counter e Pinos do JM60

Interrupções 8051 Porta Serial

Transcrição:

1 Microcontroladores AVR Baseado no ATmega328 Prof. Eduardo G. Bertogna DAELN/UTFPR

2 Sistema Microprocessado Mínimo Microprocessador; Circuito de Clock; Circuito de Reset; Circuito de Seleção; Memória de Programa - Somente de Leitura, não-volátil; Memória de Dados - Leitura e Escrita, volátil Portas de Entrada e Saída; Fonte de Alimentação.

3 Visão Geral da Família AVR Desenvolvido em 1996, no Instituto de Ciência 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 nível garantindo assim o paralelismo; Conjunto de 133 instruções, 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 máximo de 32 MHz: 1MIPS por MHz, 10x mais rápido que os microcontroladores de arquitetura CISC; Memória Flash ISP, 10.000 ciclos de escrita/apagamento; Tensões de alimentação em alguns elementos entre 1,8V e 5,5V, e possibilidade de operação em baixo consumo; Eciência na geração de código, tanto em C como em assembly, comparável ao CISC; Grande suporte de hardware e software para o desenvolvimento, muitos destes de natureza livre e aberta.

4 Elementos da Família AVR tinyavr megaavr XmegaAVR Battery Management Automotive AVR Família AVR - tinyavr e megaavr tinyavr - Entre 6 e 20 pinos de E/S linhas, pequena área de memória Flash (1kB ou 2kB), poucos periféricos internos, ideal para aplicações de baixa complexidade, e baixo custo. megaavr -Entre 8kB e 256kB de memória Flash, entre 23 e 54 pinos de E/S, inúmeros periféricos internos: Canais de ADC, Canais de PWM, Comparador Analógico, Canais TWI/I2C, UART e SPI, ideal para as aplicações de média complexidade.

Componentes das Sub-Famílias tinyavr, e megaavr Modelo* tiny11 tiny12 tiny13 tiny15 tiny26 tiny28 tiny2313 mega8 mega8515 mega8535 mega16 mega162 mega32 mega64 mega128 mega48 mega88 mega168 mega256 Características Principais 1kB Flash, 1 T/C de 8bits, 6 Pinos de E/S. Idem ao tiny11, com 64B de EEPROM. Idem ao tiny12, com 64B de SRAM, e 4 ADC's. Idem ao tiny12, com 4 ADC's. 2kB Flash, 128B EEPROM, 128B SRAM, 2 T/C 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, porém 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

6 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 registros sendo função da seleção de periféricos escolhidos, bastando inserir os trechos de código que o completam.

AVR Studio 4 e Atmel Studio 7 - desenvolvimento 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. 7

Núcleo da Arquitetura AVR RISC 8

9 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

Arquitetura Interna do ATmega328 10

11 Pinagem do ATmega328 (DIP-28) Descrição dos Pinos do ATmega328 Vcc - Tensão de Alimentação de 1,8 a 5,5V GND - Referência. AVcc - Entrada da Tensão 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 Tensão de Referência do Conversor A/D

12 PORTAS B, C e D (PCINT0...PCINT22) - Todos os 23 pins de E/S das Portas B, C e D possuem a função alternativa de ativar uma interrupção na mudança de estado do respectivo pino, servindo assim como uma interrupção externa. PORTB (PB0...PB7) - Porta de 8 bits bidirecional de E/S. Cada pino desta porta possui uma função alternativa, ver tabela abaixo. Pinos Funções Alternativas PB0 CLK0 Saída de clock dividido ICP1 Entrada de Captura do T/C1 PB1 OC1A Saída Comparação A do T/C1 PB2 OC1B Saída Comparação B do T/C1 SS Seleção Master/Slave da SPI PB3 OC2A Entr. Inv. do Comp. Analógico MOSI Saída Output/Slave da SPI PB4 MISO Saída Input/Slave da SPI PB5 SCK Entrada de Clock da SPI PB6 XTAL1 Entrada Clock Externo 1 TOSC1 Entrada Clock T/C2 qdo Osc. RC PB7 XTAL2 Entrada Clock Externo 2 TOSC2 Entrada Clock T/C2 qdo Osc. RC

13 PORTC (PC0...PC6) - Porta de 7 bits bidirecional de E/S. Cada pino desta porta possui uma função alternativa, ver tabela a seguir. Pinos Funções Alternativas PC0...PC5 ADC0...ADC5 Entradas conversores A/D PC4 SDA Entrada/Saída de Dados da I2C PC5 SCL Entrada/Saída 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 função alternativa, ver tabela a seguir. Pinos Funções Alternativas PD0 RXD Entrada de Recepção Serial PD1 TXD Saída de Transmissão Serial PD2 INT0 Entrada Interrupção Externa INT0 PD3 INT1 Entrada Interrupção Externa INT1 OC2B Saída de Comparação B do T/C2 PD4 T0 Entrada Contagem do T/C0 XCK Entrada/Saída Clock Externo da USART PD5 T1 Entrada Contagem do T/C1 OC0B Saída de Comparação B do T/C0 PD6 AIN0 Entrada Positiva Comparador Analógico OC0A Saída de Comparação A do T/C0 PD7 AIN1 Entrada Negativa Comparador Analógico

14 Placas da Família Arduino AVR Pinagem do ATmega328p em relação Placa Arduino Uno/Nano Aduino - Pino ATmega328p Aduino - Pino ATmega328p D0 PD0 D8 PB0 D1 PD1 D9 PB1 D2 PD2 D10 PB2 D3 PD3 D11 PB3 D4 PD4 D12 PB4 D5 PD5 D13 PB5 D6 PD6 A0..A5 PC0...PC5 D7 PD7 VIN ARef

15 Placa Atmel Xplained328 Gravadores ISP

Sistema de Clock do ATmega328 Seleciona a fonte primária de clock de 5 fontes: Cristal Externo, Osc. RC Interno e Clock Externo. Fornece os sinais de clock derivados da fonte primária; 16

17 Sinais de clock derivados da fonte primária: Clk CPU Clk IO Clk Flash Clk ADC Clk ASY Núcleo AVR e RAM Módulo de E/S, T/C's, Canal SPI, e UART; Memória Flash, ativado junto c/ clock da CPU; Conversor A/D; T/C2 clock assíncrono Arbitra a ativação dos sinais de clock, acima, não necessariamente ativos simultaneamente, em razão dos modos de baixo consumo. Fontes de Sinal de Clock São 5 diferentes possibilidades para a fonte de geração de sinal de clock, listadas a seguir: Cristal/Ressonador Cerâmico Externo; Cristal de Baixa Freqüência Externo; Fonte de Clock Externa; Oscilador RC Interno de 128 khz; Oscilador RC Interno Calibrado.

18 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: CKSEL3...0 Fonte de Clock Selecionada 1111-1000 Cristal Externo Baixa Potência 0111-0110 Cristal Externo Excursão Completa 0101-0100 Cristal Externo de Baixa Frequência 0011 Oscilador RC Interno de 128 khz 0010 Oscilador RC Interno Calibrado 0000 Clock Externo Seleção default de fábrica é p/ Oscilador RC interno Obs: Maior atraso de inicialização (start-up time), possibilita usar qualquer métodos de gravação ISP disponível. Fontes Externas de Clock Cristal Quartz Oscilador - Figura (a) Pinos XTAL1/XTAL2: Entrada/Saída do amplicador inversor usado como oscilador interno. O cristal oscilador e dois capacitores, ou um ressonador cerâmico devem ser conectados conforme a gura (a). Fonte de Clock Externa - Figura (b) Pino XTAL1: Entrada de fonte de clock externa; Pino XTAL2: Não conectado, conforme gura (b).

19 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; Por default 8 MHz a 25ºC e Vcc=3V ±10%, ou calibrado pelo usuário de 7,3 a 8,1 MHz ±1%; Precisão é dependente de temperatura e tensão de alimentação; Registro de Calibração OSCCAL permite ajustar a calibração do oscilador RC Interno, no Reset um valor associado ao byte de assinatura é carregado neste registro. Start-up do Oscilador Interno Calibrado Os tempos de inicialização do Oscilador RC Interno, é feita através dos fuse-bits SUT1 e SUT0: Start-up Time para Oscilador Interno (Vcc=5V) SUT0 Start-Up Time Adicional Recomen- SUT1 após Power-Down após Reset* dação 00 6 Clocks 14 Clks BOD Habilit. 01 6 Clocks 14 Clk + 4,1 ms Fonte Rápida 10 6 Clocks 14 Clk + 65 ms Fonte Lenta 11 Reservado

20 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; Após sua ativação, um atraso de tempo, Start-Up Time, é gerado conforme seleção dos fuse-bits CKSEL3...CKSEL0; A execução do programa inicia no endereço RESET, e uma instrução de desvio desvia a execução p/ a rotina principal. Modo de operação do Circ. de Reset, depende dos bits de controle: WDRF, BORF, EXTRF, e PORF, do Reg. MCUSR.

21 Fontes de Ativação do Reset Sinal de Ativação Externo: sinal de nível lógico baixo por mais de 50ns no pino de RESET; Power-On Reset: tensão Vcc abaixo da tensão limite de Power-On Reset (Power-On Threshold) - V P OT, tipicamente entre 1,4V e 2,3V; Watchdog Timer Reset: período programado no Temporizador Watchdog expira antes da instrução WDR ser executada, com o WDT habilitado; Brown-Out Reset: tensão Vcc abaixo de um valor limite, (Brown-Out Threshold) V BOT, c/ o detector de Brown-Out (BOD) habilitado pelo fuse bit BODEN. V BOT é selecionada pelo fuse-bit BODLEVEL: Programado - V BOT = 4, 0V Desprogramado, V BOT = 2, 7V. Por default BODEN estará desprogramado Bits BODSE e BODS no registro MCUCR permite desligar o circuito de BOD em modo Sleep.

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

23 Registro de Controle da CPU - MCUCR MCUCR - BODS BODSE PUD - - IVSEL IVCE Bit IVSEL: Interrupt Vector Selection, setado move os vetores de interrupção p/ o início do setor de boot; Bit IVCE: Interrupt Vector Change Enable, setado habilita a função do bit IVSEL. Resetado por hardware 4 ciclos de clock após 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 detecção de Brown-out durante estado Sleep; Bit BODS: Deve ser setado para desligar o circuito de detecção de Brown-out durante estado alguns modos Sleep;

Modos de Baixo Consumo - Sleep Modes O modo de baixo consumo é ativado se o bit de Habilitação do Modo Sleep, SE=1 (registro SMCR), e uma instrução SLEEP for executada. 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 funcionando; - Retorno do Power-Down através de uma interrupção destes circuitos, 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 mantém funcionando; - Somente possível de ser usado com Cristal/Ressonador externo. Modo Standyby Extendido - Idêntico ao modo Power-Save, exceto que o oscilador externo se mantém funcionando. - Somente possível de ser usado com Cristal/Ressonador externo. 24

25 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 disponíveis após a execução da instrução SLEEP. Bits SM0...SM2: Modos Sleep, seleciona um dos 5 modos de operação sleep conforme tabela abaixo. Modos de Baixo Consumo SM2 SM1 SM0 Modo 0 0 0 Modo Idle 0 0 1 Redução de ruído do ADC 0 1 0 Modo Power-down 0 1 1 Modo Power-save 1 0 0 Reservado 1 0 1 Reservado 1 1 0 Modo Standby 1 1 1 Modo Standby extendido

26 Registro de Status da CPU - SREG SREG I T H S V N Z C Flag T: Bit de alocação temporária usado p/ teste em bits, através das instruções BLD e BST; Flag H: Half-Carry, vai-um do nibble inferior p/ o superior; Flag S: Indica o resultado: N V Flag V : Overow, indica se o byte sinalizado em complemento de 2, está na faixa de -127 a 128; Flag N: Resultado negativo em operação aritmética/lógica; Flag Z: Resultado zero em operação aritmética/lógica; Flag C: Ocorrência de vai-um, em uma operação aritmética/- lógica. Bit I: Setado p/ que qualquer fonte de interrupção possa ter efeito. Exemplo de declaração em C no WinAVR para habilitar e desabilitar interrupções: #i n c l u d e <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 */ c l i ( ) ;... / * H a b i l i t a i n t e r r u p ç õ e s */ s e i ( ) ;

27 Stack Pointer - SPH/SPL Pilha: região da SRAM onde endereços de retorno de rotinas/rotinas de interrupção são guardados pela CPU qdo ocorre uma chamada de rotina/ou atendimento de um pedido de interrupção. Ao término da execução da rotina/rotina de interrupção, o endereço de retorno é buscado na pilha, e o programa retorna a execução do ponto onde estava antes da chamada de rotina/atendimento da interrupção. No ATmega328 o SP é designado por: SPH e SPL, e que respectivamente guardam o byte superior e o byte inferior do endereço da pilha. SPL/SPH devem ser sempre inicializados no início do programa principal, sempre que subrotinas e/ou interrupções são usadas A inicialização deverá conter um endereço acima de 0060H, que é o limite inferior da SRAM interna. Como prática comum o limite superior da SRAM é utilizado, uma vez que o endereço será decrementado em operações de escrita na pilha.

28 Organização de Memória do ATmega328 Memória SRAM A área de memória 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 não se entrelaça com a área de SRAM que começa no endereço 001FH. R26 a R31, proporcionam aos pares ponteiros para acesso indireto à memória de dados, sendo denominados de registros X, Y, e Z.

29 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. Programa Boot Loader, alocado na Seção de Boot, possibilita carga/descarga de código, por qualquer meio ou protocolo de comunicação disponível. Capacidade de autoprogração, atualização de aplicações, e até mesmo atuar na área do Boot Loader, modicando-se a si próprio, ou mesmo se apagando, caso não seja mais necessário.

30 Registros de E/S do ATmega328 Recursos Siglas Nome do Registro de E/S Sinalizadores SREG Status Register Stack Pointer SPH/SPL Stack Pointer Fonte de Reset MCUSR MCU Status Reg Brown-out MCUCR MCU Control Reg Clock do Sist. CLKPR Clock Prescaler Reg EIRCRA Ext. Interr. Control Reg A Interrupções Ext. EIMSK Ext. Interr. Mask Reg EIFR Ext. Interr. Flag Reg Interrupções TIFR0/1/2 T/Cs Interrupt Flag Regs dos Temp./Cont. TIMSK0/1/2 T/C Interr. Mask T/C0, 1 e 2 Temp./Cont.0 TCCR0A/TCCR0B T/C0 Control Register A e B T/C0 (8 bits) TCNT0 T/C0 Counter Register OCR0A/OCR0B T/C0 Output Comp. Reg A/B TCCR1A/B/C T/C1Control Reg. A/B/C Temp./Cont.1 TCNT1H/L T/C1 Reg. High/Low T/C1 (16 bits) OCR1A/B H/L Output Compare 1A/1B H/L ICR1H/L Input Capture 1 H/L TCCR2A/B T/C2 Control Reg. A/B Temp./Cont.2 TCNT2 T/C2 Reg. High/Low T/C2 (8 bits) OCR2A/B Output Compare 2A/1B ASSR Asyncronous Status Reg GTCCR General T/C Control Reg EEARH/EEARL EEPROM Address Registers EEPROM EEDR EEPROM Data Register EECR EEPROM Control Register SPCR SPI Control Register Canal SPI SPSR SPI Status Register SPDR SPI Data Register

31 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 UBRRnH/UBRRnL UART Control Register 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 TWBR TWCR ADC Multiplexer Selection Reg TWI Baud Rate Register TWI Control Register Canais TWI TWSR TWI Status Register Portas de E/S TWDR TWAR TWAMR PORTB PORTC PORTD DDRB TWI Data Register TWI Address Register TWI Address Mask Register Port B/C/D Data Regs B, C, e D DDRC Data Direction Registers DDRD PINB PINC PIND Input Pin Address Registers

32 Portas de Entrada e Saída São 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/Saída Digital de uso geral. Estas portas de E/S tem resistores de pull-up internos selecionáveis individualmente. Buers de saída podem de drenar até 40 ma. Os pinos contam ainda com diodos de proteção para Vcc e GND.

33 Registros Associados às Portas de E/S Registros de Direção de Dados - DDRB, DDRC, DDRD Registros de Dados - PORTB, PORTC, PORTD Pinos de Entrada das Portas - PINB, PINC, PIND Porta Sigla Nome/Função PORTB Dados Porta B B DDRB Direção de Dados B PINB Entrada do Pino B PORTC Dados Porta C C DDRC Direção de Dados C PINC Entrada do Pino C PORTD Dados Porta D D DDRD Direção de Dados D PIND Entrada do Pino D Registros de Direção de Dados (DDRX, X=B,C,D) DDXn=1 => PORTXn será congurado como Saída. DDXn=0 => PORTXn será congurado como Entrada. PUD=0 => PORTXn terá o resistor de pull-up conectado

34 Modos de Operação dos Pinos das Portas DDRXn PORTXn PUD Pull-UP Descrição da Operação (DDRX) (PORTX) Interno 0 0 x OFF Entrada em Alta Impedância 0 1 0 ON Entrada fornecendo corrente em 0 0 1 1 OFF Entrada em Alta Impedância 1 0 x OFF Saída drenando corrente 1 1 x OFF Saída fornecendo corrente PORTX e DDRX são do tipo R/W, enquanto os PINX são somente de leitura por serem registros de entrada de dados. Pino congurado como entrada - DDRXn=0, com PORTXn=1, terá seu pul-up ativado, desde que PUD=0 em MCUCR (default de PUD após o Reset - Pull-ups ativos). Se o bit PUD=1 (Pull-UP Disable de MCUCR), todos os resistores de Pull-Up serão desabilitados mesmo que DDRXn=0 e PORTXn=1. O pull-up também será desconectado ao se resetar o bit PORTXn quando entrada, ou congurar este pino como saída. Na condição de Reset, os pinos estarão em tri-state (pull-ups desativados), mesmo sem pulso de clock ativo. Logo após o Reset os pull-ups são reconectados por default (PUD=1). Entradas de pinos não usados não devem ser conectados a Vcc ou GND para evitar corrente excessiva se congurados acidentalmente como saída, para garantir isso os pull-ups devem ser deixados em ON (PUD=1).

35 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. #include <avr/io.h> // Arq. header p/ família AVR #define RELE_1 0 //Pino conectado ao relê 1 #define RELE_2 1 //Pino conectado ao relê 2 unsigned char i; // ou, ainda: uint8_t i; 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); // Leitura dos Pinos da Porta B i = PINB; // Leva pino PB0 para nível lógico 0 PORTB &= ~(1<<RELE_1); // Leva pino PB1 para nível lógico 1 PORTB = (1<<RELE_2); } return 0;

36 Sintaxe para Setar, Resetar, Complementar e Testar bits em registros Setando-se um bit de um registro: Aplicar a operação OR do registro alvo com uma máscara 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 deslocamentos à esquerda correspondente à posição 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 máscara MSK como operando da direita do OR, aplica-se este ao registro alvo: DDRB = (1<<DDB2); Resetando-se um bit de um registro: Aplicar a operação AND, ao invés de OR, do registro alvo com uma máscara de bits montada como explicado acima, porém complementada pelo operador de complementação 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 máscara MSK como operando da direita do AND, aplica-se este ao registro alvo: DDRB &=~(1<<DDB2);

37 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 registro DDRB: DDRB = (1<<DDB3) (1<<DDB2); Resetando-se um bit de um registro: Aplicar a operação AND do registro alvo com o complemento dos múltiplos ORs das várias máscaras 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: Aplicar a operação XOR do registro alvo com a máscara de bits correspondente ao bit que se deseja complementar. Exemplo de como se complementar o bits 2 (PORTB2) do registro PORTB: PORTB ^= (1<<PORTB2); Testando-se um bit de um registro: Aplica-se a operação AND do registro com a máscara de bits montada com o operador de deslocamento à esquerda como descrito antes. Exemplo de como se testar o bit 2 do port B: PINB & (1<<PIN2);

38 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)) #define ClrBit_Reg(Reg,Bit) (Reg&=~(1<<Bit)) #define CplBit_Reg(Reg,Bit) (Reg^=(1<<Bit)) #define TstBit_Reg(Reg,Bit) (Reg&(1<<Bit)) #define _BV(Bit) (1<<Bit) Controle de uxo usando teste de bit Espera que bit de um registro seja Setado ou Resetado: #define TstBit_Reg(Reg,Bit) (Reg&(1<<Bit))... while(tstbit_reg(pinb,0)==0);... // Loop é executado enquanto PB0=0 while(tstbit_reg(pinb,0)==1);... // Loop é executado enquanto PB0=1 Executa se bit de registro está Setado ou Resetado: #define TstBit_Reg(Reg,Bit) (Reg&(1<<Bit))... if(tstbit_reg(pinb,0)==0){ // Se PB0=0 executa o bloco entre { }...... } if(tstbit_reg(pinb,0)==1){ // Se PB0=1 executa o bloco entre { }... }

Exemplo 1: Uso das macros para testar bits. PD0=0 o pino PB5=0, se PD0=1 pino PB5=1. Enquanto pino #include <io.h> #include <delay.h> #define SetBit_Reg(Reg,Bit) (Reg =(1<<Bit)) #define ClrBit_Reg(Reg,Bit) (Reg&=~(1<<Bit)) #define CplBit_Reg(Reg,Bit) (Reg^=(1<<Bit)) #define TstBit_Reg(Reg,Bit) (Reg&(1<<Bit)) 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 } } Exemplo 2: pisca LED em PB5 a cada 1,0 segundo usando a função delay ms(nr ms) da biblioteca delay.h. #include <io.h> #include <delay.h> #define SetBit_Reg(Reg,Bit) (Reg =(1<<Bit)) #define ClrBit_Reg(Reg,Bit) (Reg&=~(1<<Bit)) #define CplBit_Reg(Reg,Bit) (Reg^=(1<<Bit)) 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

41 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> #define SetBit_Reg(Reg,Bit) (Reg =(1<<Bit)) #define ClrBit_Reg(Reg,Bit) (Reg&=~(1<<Bit)) #define CplBit_Reg(Reg,Bit) (Reg^=(1<<Bit)) #define TstBit_Reg(Reg,Bit) (Reg&(1<<Bit)) 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 }

42 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

43 Interrupções no ATmega328 (cont.) 26 fontes de interrupção, bit de Seleção de Vetores de Interrupção - IVSEL=1: vetores de interrup. no setor de programa; 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). INT0 e INT1 podem ser ativadas por nível zero, mudança de estado, na borda de descida e subida, e PCINT0...23 quando ocorre uma mudança de estado. A seleção do modo de ativação de INT0 e INT1 é feita através do Reg. EICRA: bits ISC00/ISC01, para INT0; ISC11/ISC10, para INT1 Habilitadas/Mascaradas através dos bits INT0 e INT1 do Registro de Máscara de Interrupções - EIMSK, se o bit I do SREG=1 PCINT0...23 tem a seleção de ativação feita através do bit de controle PCIE0...2, do Registro PCICR. Quando a interrupção externa é atendida, o programa desvia p/ o vetor de interrupção correspondente, o bit I é resetado, assim como o respectivo bit dos registros EIFR e PCIFR. Pode-se deslocar os Vetores de Interrupção do inicio da memória Flash, p/ o inicio do setor de boot, através dos bits IVSEL e IVCE. Isso só será possível se o bit IVCE=1.

44 Reg. de Máscara de Interrup. Externa - EIMSK EIMSK INT1 INT0 Bits INT0, INT1: Setado habilita a interrupção externa correspondente, desde que o bit I do SREG esteja setado; Reg. de Controle de Interrup. Ext. A - EICRA Modo de Ativação das Interrupções Externas por nível, 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 ativação das interrupções externas INT0, e INT1, por nível, borda de descida, ou de subida. ISC01/ISC11 ISC00/ISC10 Ativação de INT0/INT1 0 0 Nível zero em INTn 0 1 Mudança de estado em INTn 1 0 Borda de descida em INTn 1 1 Borda de subida em INTn

45 Reg. de Sinalização de Interrup. Externa - EIFR EIFR INTF1 INTF0 Bits INTF0, INTF1: Interrupt Flag Bits 0 e 1, ou Sinalizadores de Interrupção, qdo o pino INT0 ou INT1 é ativado, o ag correspondente é setado, sendo resetado por hardware no atendimento da interrupção. Reg. de Controle de Interrupção da Mudança de Estado de Pino - PCICR PCICR PCIE2 PCIE1 PCIE0 Bits PCIE0, PCIE1 e PCIE2: Setados, desde que o bit I do SREG também esteja setado, habilitam as interrupçóes externas correspondentes aos pinos PCI0...7, PCI8...14 e PCI16...23, respectivamente, quando estes pinos mudam de estado. A máscara de interrupção por mudança de estado é feita no registro PCMSK0, PCMSK1 e PCMSK2, para os pinos: PCI0...7, PCI8...14 e PCI16...23, respectivamente.

46 Exemplo de uso das interrupções externas Controle da temperatura de um forno Sensores de temperatura ligados aos pinos de interrupção INT0 e INT1. Sensor de 120 C provoca interrupção INT0 e sensor de 100 C provoca a interrupção INT1. Quando o sensor associado ao pino INT0 é ativado, na borda de descida, então a temperatura do forno ultrapassou 120ºC, e o forno deve ser desligado, uma vez que a temperatura atingiu o seu valor máximo. Quando o sensor associado ao pino INT1 é ativado, na borda de descida, indicando que a temperatura do forno está abaixo de 100ºC, o forno deve ser ligado, por estar abaixo da temperatura limite inferior.

47 Código em C editado no CodeVision: #include <mega328p.h> #define ACIONADOR PORTB.0 // Definições de registros void inicializa(void); // Protótipo da função void main(void) { inicializa(); ACIONADOR=1; if(intf0==1) ACIONADOR=0; while (1); } // Inicializa periféricos // Inicia ligando o forno // Desliga forno se T>120 C // Espera ativação de sensores // Rotina de Interrupção Externa 0 ativada pelo sensor de 120 C interrupt [EXT_INT0] void ext_int0_isr(void) { ACIONADOR=0; // Desliga forno sensor 120 C ativo } // Rotina de Interrupção Externa 1 ativada pelo sensor de 100 C interrupt [EXT_INT1] void ext_int1_isr(void) { ACIONADOR=1; // Liga forno sensor 100 C ativo } 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") }

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: Habilitação (EN) - Ativo na borda de descida; Seleção de escrita ou leitura (RW) - 0: WR; 1: RD; Seleção de reg. de comando ou de dado (RS) - 0: cmd; 1: dado; Estes sinais de controle devem seguir uma temporização especíca. A pinagem de um LCD padrão Hitachi é apresentada na tabela, a seguir: Pino Sigla Função 1 GND Terra 2 Vcc Alimentação de +5V 3 Pot Terminal central do trimpot 4 RS Register Select - Seleção de Registro 5 RW Read/Write - Sinal de Leitura e Escrita 6 EN Enable - Sinal de Habilitação 7 D0 Sinal de dados D0 (LSB) 8 D1 Sinal de dados D1 9 D2 Sinal de dados D2 10 D3 Sinal de dados D3 11 D4 Sinal de dados D4 12 D5 Sinal de dados D5 13 D6 Sinal de dados D6 14 D7 Sinal de dados D7 (MSB) 48

49 Funções 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 posição 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 memória Flash; void lcd putse(char eeprom *str) - Escreve no LCD string de caracteres localizada na memória EEPROM; unsigned char lcd read byte(unsigned char addr) - Lê da memória de caracteres; void lcd write byte(unsigned char addr, unsigned char data) - Escreve na memória 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 operação do LCD: interface em 4.

Interface com LCD em 4 Bits no Codevision A mensagem que será apresentada é a clássica mensagem ALO MUNDO na 1ª linha e HELLO WORLD! na 2ª linha. Exemplo de código em C: /******************************************************* Chip: ATmega328P Clock: 16,000000 MHz *******************************************************/ #include <mega328p.h> #include <alcd.h> // Protótipo da função 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: 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. No exemplo a seguir, novamente a mensagem que será apresentada é a clássica mensagem ALO MUNDO na 1ª linha e HELLO WORLD! na 2ª linha. Exemplo de código em C: /******************************************************* Chip: ATmega328P Clock: 16,000000 MHz *******************************************************/ #include <mega328p.h> #include "shift_reg.h" unsigned char msg1[]={"hello World"}; unsigned char msg2[]={"alo Mundo"}; 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

52 Código do arquivo de cabeçalho shift reg.h: #include <io.h> #include <delay.h> // Definições p/ o Shift Register #define SHT_REG PORTC // Porta usada pelo 74164 #define DBIT PORTC0 // Pino de dados do 74164 #define CLK PORTC1 // Pino de clock do 74164 #define DBIT_HI SHT_REG = (1<<DBIT) // Macro seta bit de dado #define DBIT_LO SHT_REG &= ~(1<<DBIT) // Macro reseta bit de dado #define CLK_HI SHT_REG = (1<<CLK) // Macro seta bit de clock #define CLK_LO SHT_REG &=~ (1<<CLK) // Macro reseta bit de clock // Pinos conectados ao LCD #define CNTR PORTC #define RS PORTC2 #define EN PORTC3 #define EN_HI CNTR = (1<<EN) #define EN_LOW CNTR &=~(1<<EN) #define RS_CMD CNTR &=~(1<<RS) #define RS_DAT CNTR = (1<<RS) // Parâmetros de configuração do LCD #define CONFIG_LCD 0x38 #define LCD_ON 0x0E #define ENTRY 0x06 #define CLR_LCD 0x01 #define HOME 0x02 #define LIN1 0xC0 #define DISP_ON 0x0C #define DISP_OFF 0x08 // Função para deslocamento de bits via 74HC164 para envio ao LCD void shift_reg(unsigned char dado){ unsigned char i; CLK_HI; for(i=0;i<8;i++){ if((dado & 0x80)==0x80) DBIT_HI; else DBIT_LO; CLK_LO; CLK_HI; dado=dado<<1;} } // Função de envio de comando ao LCD void lcd164_cmd(unsigned char dado){

EN_HI; RS_CMD; shift_reg(dado); EN_LOW; delay_ms(5); } // Função de envio das palavras de controle ao LCD para sua inicia- // lização para funcionar em 8 bits void lcd164_inic(void){ DDRC =(1<<DDC3) (1<<DDC4) (1<<DDC5); DDRB =(1<<DDB2); PORTC=0; EN_LOW; RS_CMD; CLK_HI; lcd164_cmd(config_lcd); lcd164_cmd(config_lcd); lcd164_cmd(lcd_on); lcd164_cmd(entry); lcd164_cmd(clr_lcd); } // Função para limpar o LCD void lcd164_clear(){ EN_HI; RS_CMD; shift_reg(clr_lcd); EN_LOW; delay_ms(5); } // Função para posicionar cursor do LCD em certa posição void lcd164_gotoxy(unsigned char col,unsigned char lin){ unsigned char base,dado; if(lin==0 lin==1){ switch(lin){ case 0: base=0x80; break; case 1: base=0xc0; break; default: base=0;}} else return; if(col>15) return; EN_HI; RS_CMD; dado=base+col;

shift_reg(dado); EN_LOW; delay_ms(5); } // Função de escrita de caracter no LCD void lcd164_putchar(unsigned char dado){ EN_HI; RS_DAT; shift_reg(dado); EN_LOW; delay_ms(5); } // Função de escrita de string no LCD void lcd164_puts(unsigned char *s){ unsigned char i; for(i=0;s[i]!='\0';i++) lcd164_putchar(s[i]); } Interface com Teclado Matricial Uma varredura deve ocorrer escrevendo zero em uma das 3 colunas e então lendo-se o que há nas 4 linhas para vericar a linha/coluna ativa.

A mensagem Pressione tecla é apresentada na 1ª caracter da tecla na linha 2ª linha. linha e o #include <mega328p.h> #include <delay.h> #include <alcd.h> #define COL1 PORTD4 #define COL2 PORTD5 #define COL3 PORTD6 #define C1L1 0b11101110 #define C1L2 0b11101101 #define C1L3 0b11101011 #define C1L4 0b11100111 #define C2L1 0b11011110 #define C2L2 0b11011101 #define C2L3 0b11011011 #define C2L4 0b11010111 #define C3L1 0b10111110 #define C3L2 0b10111101 #define C3L3 0b10111011 #define C3L4 0b10110111 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 print(unsigned char tecla) { lcd_putchar(tecla); while((pind & 0x0F)!=0x0F); } 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 }

53 Interrupções dos Temporizadores/Contadores Interrupção por Overow: Quando o Registro de Contagem do T/C atinge o máximo valor de contagem; Interrupção por Comparação de Valores: Quando uma comparação entre o Registro de Contagem e o de Comparação, resulta verdadeiro; Interrupção por Captura de Valores: Quando o pino de Captura ICP é ativado, o valor de contagem corrente no Registro de Contagem, é capturado. Interrupção 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, alcança o valor máximo/mínimo 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 à ocorrência do overow na contagem do T/C0, T/C1 ou T/C2, repectivamente. A interrupção deve ser habilitada setandos-se os bits: TOIE0, TOIE1 ou TOIE2 => T/C0, T/C1 ou T/C2 Registros TIMSK0, TMSK1 ou TMSK2, respectivamente; E bit de Habilitação Global de Interrupções, I=1.

54 Interrupção por Comparação de Valores Ocorre quando os conteúdos do Reg. de Saída de Comparação e do Registro de Contagem de um T/C se igualam: T/C Reg. Comparação Reg. de Contagem 0 OCR0A/OCR0B TCNT0 1 OCR1A(H/L)/OCR1B(H/L) TCNT1(H/L) 2 OCR2A/OCR2B TCNT2 As interrupções são individualmente habilitadas setando-se os respectivos bits de habilitação de cada T/C, de acordo com a tabela a seguir, devendo-se ainda, setar o bit I em SREG. T/C Bit Reg. de Máscara de Interrupção 0 OCIE0A/OCIE0B TIMSK0 1 OCIE1A/OCIE1B TIMSK1 2 OCIE2A/OCIE2B TIMSK2

O ags: OCF0A ou OCF0B do registro TIFR0, sinalizam a ocorrência da igualdade na comparação do T/C0 O ags: OCF1A ou OCF1B do registro TIFR1, sinalizam a ocorrência da igualdade na comparação do T/C1 O ags: OCF2A ou OCF2B do registro TIFR2, sinalizam a ocorrência da igualdade na comparação do T/C2 Interrupção 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 saída do comparador analógico como sinal de disparo para a captura. Em resposta, o ag ICF1 é setado, e caso a interrupção por captura esteja habilitada (bit TICIE1=1 em TIMSK, e I =1 em MCUCR), o programa desviará para o vetor de interrupção localizado em 0003.

55 Reg. de Máscara de Interrup. dos T/C's TIMSK0 OCIE0B OCIE0A TOIE0 TIMSK1 ICIE1 OCIE1B OCIE1A TOIE1 TIMSK2 OCIE2B OCIE2A TOIE0 Bits TOIE0, TOIE1 e TOIE2: Timer Overow Interrupt Enable dos T/C0, T/C1 e T/C2, setado habilita a interrupção do T/C correspondente por Overow na Contagem, desde que o bit I também esteja setado; Bits OCIE0A/B, OCIE1A/1B e OCIE2A/2B: Output Compare Interrupt Enable A e B dos T/C0, T/C1 e T/C2, setado habilita a interrupção do T/C correspondente, por Comparação de Valores A ou B, respectivamente, desde que o bit I também esteja setado; Bit ICIE1: Input Capture Interrupt Enable do T/C1, setado habilita a interrupção do T/C1 por Captura de Valores, desde que o bit I também esteja setado

56 Reg. de Sinaliz. de Interrup. dos T/C's TIFR0 OCF0B OCF0A TOV0 TIFR1 ICF1 OCF1B OCF1A TOV1 TIFR2 OCF2B OCF2A TOV2 Bit 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 interrupção; Bits 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 Comparação de Valores A ou B do respectivo T/C, quando verdadeira. Resetado por hardware no atendimento da interrupção; Bit ICF1: Input Capture Interrupt Flag do T/C1, setado na captura de valores via pino ICP. Resetado por hardware no atendimento da interrupção;

Temporizadores/Contadores - T/C's - T/C0 de 8 bits. - T/C2 de 8 bits. - T/C1 de 16 bits. Temporizador de Pré-Divisão de 10 bits Circuito comum aos 2 T/C's que faz a pré-divisão 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 não passam pelo bloco de pré-divisão, portanto a ação do Prescaler Timer se restringe a operação dos T/C's no modo temporizador. Obs2: Os bits de controle de Seleção de Clock: CS00:2 e CS10:2, são os responsáveis pela seleção da fonte do sinal de clock que será efetivamente enviado a cada T/C. 57

58 Temporizador/Contador 0 de 8 Bits Características Principais do T/C0: Temporizador/Contador de Eventos Bidirecional de 8 bits; Pré-Divisão (Prescaler) do clock da CPU de 10 bits; Unidade de Comparação de Valores c/ Recarga Automática; Gerador de Frequências; Saída PWM c/ Resolução de 8 bits; Duas fontes de interrupção: Overow e Comparação

Arquitetura Interna do T/C0 59

60 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 interrupção por Overow será requisitada, se previamente habilitada. T/C0 como Temporizador ou Contador Se a origem do sinal de clock é o Temporizador de Pre-Divisão, a operação do T/C0 será como Temporizador; Se a origem deste sinal de clock é o pino T0, a operação será como Contador de Eventos; A seleção do modo de operação, é feita através dos bits: CS02, CS01, e CS00, do Registro de Controle do T/C0 - TCCR0.

61 Modos de Operação do T/C0 Após selecionar a operação 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, através dos bits de Seleção de Modo de Geração de Onda: WGM02, WGM01 e WGM00: Modo Normal: Contagem crescente até valor máximo (255), sem recarga automática; Modo CTC: Sigla de Clear Timer on Compare Match, onde a contagem crescente em TCNT0 ocorre até a comparação c/ o Reg. de Comparação - OCR0, resultar verdadeiro, quando TCNT0 é zerado, e o pino OC0 será setado, resetado, ou complementado, dependendo da programação efetuada previamente nos bits COM01/COM00; Modo PWM Rápido: Geração de sinal PWM no pino OC0, c/ frequências de PWM cerca de duas vezes mais altas, que no PWM Corrigido em Fase; PWM Corrigido em Fase: Geração de sinal PWM no pino OC0, onde se obtém um sinal PWM com fase corrigida, apesar de resultar em frequências menores que o modo anterior.

62

63 Registro de Controle do T/C0 - TCCR0A TCCR0A COM0A1 COM0A0 COM0B1 COM0B0 - - WGM01 WGM00 Bits COM0A1, COM0A0: Compare Output Mode, ou Modo de Saída de Comparação, seleciona o modo como o pino de saída OC0A se comportará. Modo de Ativação da Saida OC0A COM0A1 COM0A0 Modo Normal (WGM02...0=000) 0 0 OC0A Desconectado. 0 1 OC0A Muda de Estado na Comparação. 1 0 Reseta OC0A na Comparação. 1 1 Seta OC0A na Comparação. COM0A1 COM0A0 Modo PWM Rápido (WGM02...0=011) 0 0 OC0A Desconectado. 0 1 Reservado. 1 0 OC0A=0 na Comparação, 1 no valor MÁX. 1 1 OC0A=1 na Comparação, 0 no valor MÁX. COM0A1 COM0A0 PWM Fase Corrig. (WGM02...0=001) 0 0 OC0A Desconectado. 0 1 Reservado. 1 0 OC0A=0 na Comparação em contagem crescente, OC0A=1 na contagem decres. 1 1 OC0A=1 na Comparação em contagem crescente, OC0A=0 na contagem decres.

64 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á. Modo de Ativação da Saida OC0B COM0B1 COM0B0 Modo Normal (WGM02...0=000) 0 0 OC0B Desconectado. 0 1 OC0B Muda de Estado na Comparação. 1 0 Reseta OC0B na Comparação. 1 1 Seta OC0B na Comparação. COM0B1 COM0B0 Modo PWM Rápido (WGM02...0=011) 0 0 OC0B Desconectado. 0 1 Reservado. 1 0 OC0B=0 na Comparação, 1 no valor MÁX. 1 1 OC0B=1 na Comparação, 0 no valor MÁX. COM0B1 COM0B0 PWM Fase Corrig. (WGM02...0=001) 0 0 OC0B Desconectado. 0 1 Reservado. 1 0 OC0B=0 na Comparação em contagem crescente, OC0=1 na contagem decres. 1 1 OC0B=1 na Comparação em contagem crescente, OC0B=0 na contagem decres.

Registro de Controle do T/C0 - TCCR0B TCCR0B FOC0A FOC0B WGM01 CS02 CS01 CS00 Bits CS02, CS01, CS00: Bits Clock Selection, selecionam a operação do T/C0, como Temporizador ou Contador de Eventos, o fator de prescaler (se no modo Temporizador), e o modo Contador de Eventos, a ativação do sinal T0 na borda de descida ou subida: CS02 CS01 CS00 Clock do Contador 0 0 0 Para a contagem do T/C0 0 0 1 Clock proveniente do clock da CPU 0 1 0 Clock = clock da CPU/8 0 1 1 Clock = clock da CPU/64 1 0 0 Clock = clock da CPU/256 1 0 1 Clock = clock da CPU/1024 1 1 0 Clock = T0 na borda de descida 1 1 1 Clock = T0 na borda de subida Bits WGM01, WGM00: Bits Wave Form Generator Mode, selecionam o modo de operação: Normal, PWM Rápido, PWM Corrigido em Fase, e CTC. WGM02..1 Modo TOP OCRx Update 0 0 0 Normal (00->FF) 0xFF Imed. 0 0 1 PWM Corr. Fase 0xFF TOP 0 1 0 CTC OCRA Imed. 0 1 1 PWM Rápido 0xFF BOTTOM 1 0 0 Reservado - - 1 0 1 PWM Corr. Fase OCRA TOP 1 1 0 Reservado - - 1 1 1 PWM Rápido OCRA BOTTOM 65

Bits FOC0A/B: Force Output Compare, quando setado, força a saída de comparação OC0 a produzir uma mudança, de acordo com o comportamento selecionado nos bits COM01, COM00, porém somente nos modos não PWM (bit WGM00=0). 66

67 Operação do T/C0 no Modo Normal - Timer Over- ow Seleção operação modo normal em TCCR0A: Bits WGM01/WGM00=00; Seleção do clock de contagem em TCCR0B: Bits CS00/CS01/ CS02=00; Contagem em TCNT0 de modo crescente, por Over- ow 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; Interrupção habilitada através do bit TOIE0 (Timer Overow Interrupt Enable), do Reg. TIMSK0; Desvio para o endeerço 0007 se o bit I=1 (Habilitação Global de Interrupções) e TOIE0=1. Quando da execução da rotina de interrupção o ag TOV0 é automaticamente resetado.

68 Exemplo: Piscando um Led a cada 1,0s via T/C0 Usando o T/C0, c/ clock de contagem: f clk /1024, p/ um cristal de 16,0MHz, o período de contagem do T/C0 caria: T clk = 0, 0625us.1024 = 64us Inicializando-se TCNT0 c/ 100, após 156 pulsos de contagem de 64us, TCNT0=255, e um pedido de interrupção do T/C0 por Overow na Contagem é gerado, isso após um tempo de: T=0,009984s = (156x64us) 10ms. A interrupção do T/C0, tendo sido habilitada através do registro TIMSK0, o programa desviará para o vetor de interrupção do T/C0, no endereço 0x010. Para se chegar a 1,0 segundo, bastará repetir 100 vezes a interrupção do T/C0, ou seja: T 10ms.100 = 1000ms = 1s. Após 100 repetições, um registro de contagem foi de 100 até 0, podendo-se mudar o estado do pino PB5 fazendo o LED piscar. Deve-se então, reiniciar o registro de contagem em 100, para repetir o processo ciclicamente.