Escolar Documentos
Profissional Documentos
Cultura Documentos
GUIA DE ESTUDO
INTRODUÇÃO AOS
MICROCONTROLADORES
2022
INTRODUÇÃO AOS
MICROCONTROLADORES
MARINHA DO BRASIL
MÓDULO EE1019-0420
2022
FINALIDADE: DIDÁTICA
ATO DE APROVAÇÃO
Rio de Janeiro, RJ
Em,__de___________de 2022.
1.1. – Introdução....................................................................................................................1-2
1.2 – Família de microcontroladores......................................................................................1.2
1.3 – Funções internas comuns à maioria dos modelos de PIC.............................................1.9
1.4 – Arquitetura e instruções...............................................................................................1.13
INTRODUÇÃO
1 – PROPÓSITO.
Esta publicação foi elaborada para dar orientação sobre o Curso de Introdução aos
Microcontroladores e seus circuitos.
2 – DESCRIÇÃO.
Esta publicação está dividida em 7 (sete) Capítulos, a saber.
Capítulo 1 - Introdução aos microcontroladores; Capítulo 2 – Microcontrolador
Microchip PIC16F84; Capítulo 3 – Organização da memória do PIC16F84; Capítulo
4 – Portas de entrada e saída; Capítulo 5 – Estudo do Timer; Capítulo 6 – Instruções
do PIC16F84; Capítulo 7 – Introdução ao Arduino.
3 - AUTORIA E EDIÇÃO.
Esta publicação é de autoria do SO–RM1-ET/QTE – ALMEIDA e foi elaborada e
editada, no CENTRO DE INSTRUÇÃO ALMIRANTE ALEXANDRINO (CIAA).
4 - DIREITOS DE EDIÇÃO.
Reservados para o CENTRO DE INSTRUÇÃO ALMIRANTE ALEXANDRINO.
Proibida a reprodução total ou parcial, sob qualquer forma ou meio.
5 – CLASSIFICAÇÃO.
Esta publicação é classificada, de acordo com o EMA-411 (Manual de Publicações da
Marinha) em: Publicação da Marinha do Brasil, não controlada, ostensiva, didática e
manual
OSTENSIVO CIAA-117/092A
CAPÍTULO 1
1-1
OSTENSIVO 1° REVISÃO
OSTENSIVO CIAA-117/092A
desenvolvida pela CPU. As instruções que se seguem serão executadas de acordo com a
lógica do programa.
O Processador ou Microprocessador ou Unidade Central de Processamento (CPU) irá ler e
executar a tarefa referente ao código, a partir da primeira posição de memória seguindo a
sequência lógica do programa. A CPU gera todos os sinais de controle e trabalha em
conjunto uma Unidade Lógica e Aritmética (ULA).
A ULA é a parte mais importante de uma unidade de processamento, é neste setor que são
efetuadas as operações de cálculo. Na maioria das arquiteturas, as ULA são projetadas
com dois operadores, sendo um deles chamado de Acumulador (AC). Os resultados das
operações normalmente retornam ao Acumulador.
1-2
OSTENSIVO 1° REVISÃO
OSTENSIVO CIAA-117/092A
Todos os sinais digitais internos ou disponibilizados através dos pórticos utilizam vias
chamadas de barramento que são classificadas da seguinte forma:
De Endereços (Address Bus);
De Dados (Data Bus) e
De Controle (Control Bus).
O Barramento de Endereços carrega o endereço de memória que a CPU quer selecionar.
O Barramento de Dados envia ou recebe um dado correspondente ao endereço de
memória selecionado.
O Barramento de Controle organiza os blocos para que as operações ocorram.
O tempo que leva desde a leitura de uma instrução até a sua execução pela CPU depende
do Ciclo de Máquina. Então podemos definir que o Ciclo de Máquina é o período que um
processador leva para decodificar um código básico.
O código básico é uma instrução que requer a menor complexidade de hardware:
LEITURA, OPERAÇÃO BÁSICA e ENVIO.
O clock é o sinal que sincroniza todas as tarefas de um processador. A cada descida ou
subida de clock um conjunto de tarefas foi cumprido.
Em qualquer sistema computacional, todos os componentes físicos são chamados de
1-3
OSTENSIVO 1° REVISÃO
OSTENSIVO CIAA-117/092A
Figura 1.3
1-4
OSTENSIVO 1° REVISÃO
OSTENSIVO CIAA-117/092A
Para as Memórias de dados são usadas memórias voláteis, seu uso é restringido ao
armazenamento momentâneo de dados oriundos do processo natural do programa.
Tipos:
SRAM (Static RAM)
DRAM (Dynamic RAM)
A Memória de Programa uma vez gravada não perde mais a informação, por isso é
utilizada para guardar o programa (instruções) que define o funcionamento do Hardware
ou outros dados permanentes. O tipo de memória mais usada atualmente para Memória de
Programa é a EEPROM (Electrically Erasable Programmable Read-Only Memory).
O uso de memória RAM ao invés de ROM para o espaço da Memória de Dado é
justificado pela alta velocidade que as memórias RAM possuem, principalmente na
escrita. A operação natural de um microcontrolador exige constantes escritas e leituras na
Memória de Dados, enquanto na Memória de Programa são normalmente executadas
leituras sequenciais.
O Timer é um contador que tem a função básica de marcar tempos. Na utilização do
Timer é fundamental o programador saber o período do clock do sistema. É comum
durante a criação de um programa surgir à necessidade da marcação de um tempo para a
execução de uma determinada tarefa.
Os Pórticos de I/O são registradores com entrada e saída paralela que possuem a função
de trocar dados com os periféricos.
O Pórtico Serial USART é uma estrutura de hardware destinada a trocar dados do
microcontrolador com os periféricos. É chamada serial porque os dados em 8 bits são
enviados sob um protocolo (regra) e utilizam um único fio (um bit de cada vez). O
protocolo USART (Universal Assíncrono Recepção e Transmissão) é utilizado em toda
família AVR. Apesar de antigo, ainda é o protocolo assíncrono mais utilizado por
microcontroladores.
Existe um espaço da Memória de Dados que o programador do microcontrolador utiliza
para guardar ou ler dados que interagem diretamente com algum seguimento específico de
hardware podendo até alterar sua configuração, o próprio circuito do timer precisa de ler
alguns endereços específicos para operar no modo adequado a necessidade do
programador. Estes endereços são chamados de Registradores de Funções Especiais
1-5
OSTENSIVO 1° REVISÃO
OSTENSIVO CIAA-117/092A
1-6
OSTENSIVO 1° REVISÃO
OSTENSIVO CIAA-117/092A
1-7
OSTENSIVO 1° REVISÃO
OSTENSIVO CIAA-117/092A
1.3.3 – Barramentos.
É usado na interligação entre a CPU e outros blocos. Fisicamente corresponde a um grupo
de 8, 16 ou mais condutores. Existem os barramentos de dados e de endereços. O número
de linhas do barramento de dados depende da largura da palavra de dados e normalmente
se liga a todos os blocos dentro do micro. O número de linhas do barramento de endereço
depende da quantidade de memória que se deseja endereçar, normalmente, serve para
transmitir endereços da CPU para a memória.
1-8
OSTENSIVO 1° REVISÃO
OSTENSIVO CIAA-117/092A
A porta funciona como um local de memória armazenando o dado que chega ou o dado
que sai.
1.3.7 – Watchdog.
O watchdog é um recurso disponível no PIC que parte do princípio de que todo sistema é
passível de falha. Se todo sistema pode falhar, cabe ao mesmo ter recursos para que, em
ocorrendo uma falha, algo seja feito de modo a tornar o sistema novamente operacional.
No nosso computador, de um modo geral, existe um botão de reset que deve ser usado
sempre que o sistema travar por qualquer motivo, no entanto, este botão não existe no
micro.
1-9
OSTENSIVO 1° REVISÃO
OSTENSIVO CIAA-117/092A
1.3.9 – Programa.
Programação é o ato de escrever um programa.
Programa é um conjunto completo de instruções que descreve exatamente o que fazer a
cada passo de sua operação. Este conjunto de instruções é preparado por uma ou mais
pessoas, programadores, para cada tarefa que o computador deva fazer. Os programas são
colocados na memória na forma binária, tendo cada instrução um código único. O micro
toma estes códigos de instruções da memória um por vez e realiza a operação associada
ao código.
Programar um micro para que este execute uma tarefa inteligente, é criar uma sequência
de códigos, numa linguagem que o mesmo entenda, denominada linguagem de máquina.
O programador será a pessoa responsável pela associação desta sequência de códigos que
implemente aplicações, para que outros usuários possam utilizar.
A linguagem de programação compreende um conjunto de regras, símbolos e palavras
especiais, que resulta em um programa. Esta linguagem poderá ser denominada como
linguagem de alto nível ou de baixo nível. A linguagem de alto nível se aproxima mais do
1-10
OSTENSIVO 1° REVISÃO
OSTENSIVO CIAA-117/092A
pensamento humano, enquanto a linguagem de baixo nível está mais próxima do tipo de
dado manuseado pelo micro.
Essas linguagens possuem vantagens e desvantagens em suas aplicações. A linguagem de
alto nível, como C, Basic, Visual C, etc é composta por sentenças estruturadas e com
procedimentos e funções independentes, menores, que permitem subdividir um programa
longo em partes que facilitam a compreensão do mesmo. Estes procedimentos ou funções
poderão ser utilizados em outros programas a serem desenvolvidos. Entretanto, a tradução
do programa feito em linguagem de alto nível para o código de máquina a ser usado pelo
micro não é direta e necessita de um tradutor, denominado compilador, que irá gerar
longas sequências de código de máquina para o micro.
A linguagem de baixo nível permite o desenvolvimento de programas com códigos bem
próximos aos códigos de máquina, o que resulta na geração do código de máquina
normalmente mais compacta, ocupando uma menor área de memória, que será executado
em maior velocidade pelo micro. A tradução da linguagem de baixo nível para o código
de máquina será feita manualmente pelo programador ou através de um programa
denominado assemblador. A linguagem de baixo nível é denominada linguagem
Assembly.
A tarefa de programação pode ser executada em várias linguagens tais como o Assembler,
C e Basic que são as mais usadas. O Assembler pertence ao grupo das linguagens de
baixo nível que implicam em um trabalho de programação lento, no entanto, ocupam
menos espaço em memória e uma maior rapidez na sua execução. Programas na
linguagem C são mais fáceis de escrever e compreender, no entanto, são mais lentos na
execução que o Assembler. Basic é a mais fácil de todas para se aprender e suas
instruções são semelhantes à maneira de um ser humano se exprimir, mais similar à C, é
também de execução mais lenta.
Depois que o programa foi escrito é introduzido no micro que recebe alimentação a fim de
que possa trabalhar corretamente.
1-11
OSTENSIVO 1° REVISÃO
OSTENSIVO CIAA-117/092A
Para a família PIC usa-se o programa denominado MPLAB, que contém vários programas
integrados em um só.
1-12
OSTENSIVO 1° REVISÃO
OSTENSIVO CIAA-117/092A
1.11
1-13
OSTENSIVO 1° REVISÃO
OSTENSIVO CIAA-117/092A
A vantagem disto é que, enquanto uma instrução é processada, outra já pode estar
executando o seu ciclo de busca, carregando assim, a próxima instrução. Isto faz com que
seja necessária uma quantidade menor de ciclos de máquina para executar uma instrução.
Esta arquitetura permite o processamento, ao mesmo tempo, de um ciclo de busca e um
ciclo de execução. Assim, a cada ciclo de máquina existirá uma instrução pronta para ser
executada. Este sistema de busca/execução é conhecido como Segmentação ou Pipeline.
1-14
OSTENSIVO 1° REVISÃO
OSTENSIVO CIAA-117/092A
c) Comparação CISC/RISC.
I) O RISC possui menor quantidade de instruções que o CISC com a mesma
capacidade de processamento.
II) Instruções fáceis de serem memorizadas no RISC.
III) Os programas se tornam maiores no RISC, pois nem todas as instruções
disponíveis para o CISC estão disponíveis para o RISC.
IV) Instruções que faltam no RISC devem ser criadas pelo programador, via software,
que deve ter bastante experiência em termos de programação.
Obs: A arquitetura do PIC segue o modelo Harvard, onde a CPU usa barramentos
diferentes com as memórias de instruções (programa) e de dados, e se tem acesso
simultaneamente a estas duas memórias. Além de maior velocidade e usar um
número reduzidos de instruções (RISC) é possível usar instruções com mais de 8 bits.
Em geral, uma instrução é executada em um único ciclo de máquina (corresponde a 4
ciclos de clock). Usa a técnica de Segmentação ou Pipeline e instruções Ortogonais
(contêm a fonte e o destino dos dados)
1-15
OSTENSIVO 1° REVISÃO
OSTENSIVO CIAA-117/092A
verdade, o pequeno programa continua sendo necessário só que ele já está escrito
dentro do microprocessador e que executará a ação quando uma determinada instrução
for acionada. Estes programas são armazenados em uma área do microprocessador
chamada de Microcódigo.
Um novo processador fabricado possuirá um maior conjunto de instruções, maior área
de microcódigo e fisicamente serão maiores.
Quando uma instrução é dada ao microprocessador, seu decodificador de instruções
verifica, no conjunto de instruções, se ela é válida e assim, executa ou não o
subprograma referente à instrução dentro do microcódigo. Quanto maior o conjunto de
instruções, mais lento ficará o microprocessador na procura da validade e, portanto, na
execução efetiva da instrução. Isto vai de encontro ao que imaginamos que um
processador mais avançado será muito mais rápido.
Para compensar a demora real um dos recursos usados para aumentar o desempenho é
a técnica de Pipeline. Enquanto uma área dentro do microprocessador está terminando
de executar uma instrução, a outra já estará lendo e decodificando a próxima instrução,
pois a execução e a decodificação da instrução ocorrem em áreas distintas do
microprocessador.
Outras técnicas também usadas são o cachê de memória, integração de circuitos de
apoio dentro do microprocessador, arquitetura super escalar, previsão de desvio, etc.
O aumento cada vez maior do conjunto de instruções dos novos microprocessadores
necessita também de novos recursos para aumentar seu desempenho, além disso,
chegou-se à conclusão de que só 20% das instruções, no geral, são realmente usadas
pelos programadores.
Com isso, surgiu a ideia de construção de microprocessadores com um conjunto
reduzido de instruções (RISC) e ainda a eliminação do microcódigo.
Para que isso aconteça devemos lembrar que instruções CISC não são padronizadas.
Apesar de existir, por exemplo, instruções MOV diferentes, cada uma é decodificada
de modo diferente, interpretada pelo microcódigo de maneira diferente, demora tempos
diferentes dentro do microprocessador e requer uma quantidade de parâmetros que
variará conforme o tipo de instrução (exemplo, MOV AL, precisa de dados de 8 bits,
1-16
OSTENSIVO 1° REVISÃO
OSTENSIVO CIAA-117/092A
1-17
OSTENSIVO 1° REVISÃO
OSTENSIVO CIAA-117/092A
CAPÍTULO 2
VISÃO GERAL DO MICROCONTROLADOR MICROCHIP PIC16F84.
2.1 - INTRODUÇÃO.
O PIC16F84 da Microchip pertence ao tipo de processador RISC que é um processador
com instruções reduzidas e todas possuem o mesmo tempo de processamento, exceto
em instruções de salto. Este tipo de processador possui arquitetura Harvard o que
significa trabalhar com as memórias de programa e de dados de forma separadas.
2.2 – CARACTERÍSTICAS.
2.2.1 - As principais características deste microcontrolador são:
a) Processador com arquitetura Harvard e Instruções RISC avançada.
b) Jogo de 35 instruções com palavra de 14 bits. Todas elas executadas em um ciclo
de instrução exceto instruções de salto que demoram 2 ciclos.
c) Frequência externa máxima de 10 MHz. O PIC16F84A opera até 20Mhz
d) Ciclo de instrução de 400ns.
e) Memória Flash de programa com capacidade de 1K x 14.
f) Memória RAM de dados de 256 x 8 (136 x 8 para o programador).
g) Memória EEPROM de dados de 64 bytes (64 x 8).
h) Possui 4 fontes de interrupções internas e externas.
i) Pilha com 8 níveis.
j) Modos de endereçamento: direto, indireto e imediato.
k) Resets: Power-On Reset (POR), Power-up Timer (PWRT), Oscilador Start-upTimer
(OST) e Brown-out Reset (BOR)
l) Watchdog Timer (WDT) com seu próprio oscilador RC confiável.
m) Código de proteção programável.
n) Modo Sleep de baixo consumo.
o) Opções de seleção do oscilador.
p) Tecnologia CMOS de alta velocidade e baixo consumo para as memórias
Flash/EEPROM.
q) Larga faixa de voltagem de alimentação: 2V a 6,0V (típico 5V).
r) High Sink/Source current: 25mA.
2-1
OSTENSIVO 1° REVISÃO
OSTENSIVO CIAA-117/092A
256x8
2-2
OSTENSIVO 1° REVISÃO
OSTENSIVO CIAA-117/092A
2-3
OSTENSIVO 1° REVISÃO
OSTENSIVO CIAA-117/092A
2-4
OSTENSIVO 1° REVISÃO
OSTENSIVO CIAA-117/092A
2-5
OSTENSIVO 1° REVISÃO
OSTENSIVO CIAA-117/092A
Pino nº 1, RA2 Segundo pino do porto A. Não tem nenhuma função adicional.
Pino nº 2, RA3 Terceiro pino do porto A. Não tem nenhuma função adicional.
Pino nº 3, RA4 Quarto pino do porto A. O TOCK1 que funciona como entrada do
temporizador, também utiliza este pino.
Pino nº 4, MCLR Entrada de reset e entrada da tensão de programação do
microcontrolador
Pino nº 5, Vss massa da alimentação.
Pino nº 6, RB0, bit 0 do porto B. Tem uma função adicional que é a de entrada de
interrupção.
Pino nº 7, RB1 bit 1do porto B. Não tem nenhuma função adicional.
Pino nº 8, RB2 bit 2 do porto B. Não tem nenhuma função adicional.
Pino nº 9, RB3 bit 3 do porto B. Não tem nenhuma função adicional.
Pino nº 10, RB4 bit 4 do porto B. Não tem nenhuma função adicional.
Pino nº 11, RB5 bit 5 do porto B. Não tem nenhuma função adicional.
Pino nº 12, RB6 bit 6 do porto B. No modo de programa é a linha de clock
Pino nº 13, RB7 bit 7 do porto B. Linha de dados no modo de programa
Pino nº 14, Vdd Pólo positivo da tensão de alimentação.
Pino nº 15, OSC2 para ser ligado a um oscilador.
Pino nº 16, OSC1 para ser ligado a um oscilador.
Pino nº 17, RA0 bit 0 do porto A. Sem função adicional.
Pino nº 18, RA1 bit 1 do porto A. Sem função adicional
2-6
OSTENSIVO 1° REVISÃO
OSTENSIVO CIAA-117/092A
CAPÍTULO 3.
ORGANIZAÇÃO DA MEMÓRIA DO PIC.
3.1 – INTRODUÇÃO.
O PIC16F84 possui dois blocos de memórias separados (dados e programa), agrupados
em três tipos de memórias, que são:
a) Memória de Programa Flash – armazena o programa que se escreveu.
b) Memória de Dados:
I) RAM - parte é usada como registros SFR é parte é de dados como os registros GPR.
II) Memória de Dados EEPROM – armazena dados que não podem ser perdidos quando
o micro fica sem alimentação. Esta memória de dados possui capacidade de 64 x 8.
Obs: A memória EEPROM e os Registros de Uso Geral (GPR) na RAM, constituem o
bloco para dados.
3.2 - Organização da Memória de Programa (Flash).
A Memória de Programa é uma memória regravável eletronicamente do tipo Flash e
capacidade de 1K x 14 bits. Ela pode ser acessada por software, possibilitando que o
programa seja reescrito dinamicamente, ou ainda, que ela seja usada como expansão da
memória EEPROM de dados.
3.2.1 - Vetor de Reset.
Usa o primeiro endereço da Memória de programa (0x0000) que será executado após um
Start-up ou Reset.
3.2.2 - O Vetor de Interrupção.
Este micro possui 14 tipos de interrupções diferentes. Entretanto, quando qualquer uma
delas acontece (se habilitadas), o programa será desviado para o vetor de interrupção
endereço 0x0004.
3.2.3 - Mapa da Memória de Programa.
Para dispositivos com mais de 512 bytes de memória de programa usa-se um esquema
de páginas
O PIC16F84 tem dois blocos de memória separados, um para dados e o outro para o
programa. A memória EEPROM e os registos de uso genérico (GPR) na memória RAM
constituem o bloco para dados e a memória FLASH constitui o bloco de programa.
3-1
OSTENSIVO 1° REVISÃO
OSTENSIVO CIAA-117/092A
Memória de programa
A memória de programa é implementada usando tecnologia FLASH, o que torna
possível programar o microcontrolador muitas vezes antes de este ser instalado num
dispositivo, e, mesmo depois da sua instalação, podemos alterar o programa e
parâmetros contidos. O tamanho da memória de programa é de 1024 endereços de
palavras de 14 bits, destes, os endereços zero e quatro estão reservados respectivamente
para o reset e para o vector de interrupção.
Memória de dados
Registos SFR
3-2
OSTENSIVO 1° REVISÃO
OSTENSIVO CIAA-117/092A
Além da divisão em ‘comprimento’ entre registos SFR e GPR, o mapa de memória está
também dividido em ‘largura’ (ver mapa anterior) em duas áreas chamadas ‘bancos’. A
seleção de um dos bancos é feita por intermédio dos bits RP0 e RP1 do registo STATUS.
3-3
OSTENSIVO 1° REVISÃO
OSTENSIVO CIAA-117/092A
Exemplo:
bcf STATUS,RP0
A instrução BCF “limpa” o bit RP0 (RP0 = 0) do registo STATUS e, assim, coloca-nos
no banco0.
bsf STATUS,RP0
A instrução BSF põe a um, o bit RP0 (RP0 = 1) do registo STATUS e, assim, coloca-nos
no banco1.
3-4
OSTENSIVO 1° REVISÃO
OSTENSIVO CIAA-117/092A
Por exemplo, a instrução CLRF STATUS, teoricamente, deveria colocar a zero (0) todos
os bits do registro e setar o bit Z. No entanto, temos:
a) Zera os 3 bits MSB (seleção de banco de memória, bits IRP:RP1:RP0);
b) Os bits /TO e /PD são somente de leitura, não se alteram;
c) Bits DC e C não são alterados;
d) Bit Z é setado.
Isto deixa o registro de STATUS com o valor 000u u1uu (u = bits não afetados). É
recomendado que somente as instruções BCF, BSF, SWAPF e MOVWF sejam usadas
para alterar o registro de STATUS, porque estas instruções não afetam os bits Z, C e DC
3-7
OSTENSIVO 1° REVISÃO
OSTENSIVO CIAA-117/092A
do registro de STATUS a não ser que estas instruções sejam dirigidas a eles, como
abaixo:
BSF STATUS, C ; seta o bit C.
bit 7 IRP: Register Bank Select bit (Seleção do banco de memória de dados no
endereçamento indireto).
0 = Banco 0 e 1 (00h - FFh)
1 = Banco 2 e 3 (100h - 1FFh)
bit 6-5 RP1:RP0: Register Bank Select bits (Seleção do banco de memória de dados no
endereçamento direto)
00 = Banco 0 (00h - 7Fh)
01 = Banco 1 ( 80h - FFh)
10 = Banco 2 (100h -17Fh)
11 = Banco 3 (180h -1FFh)
bit 4 /T0: Time-out bit (estouro de contagem de tempo do WDT)
1 = Ocorreu Power-up ou foram executadas instruções CLRWDT ou
SLEEP.
0 = Ocorreu um estouro do Watchdog Timer e provocou um reset no
micro.
bit 3/PD: Power-down bit (desligamento ou Sleep – indica o estado do controle
de energia do micro).
1 = Ocorreu Power-up (só alimentação) ou foi executada a instrução
CLRWDT.
0 = Indica que a instrução SLEEP (baixo consumo) foi executada.
bit 2 Z: Zero Bit (Bit zero)
1 = Quando o resultado de uma operação lógica ou aritmética for zero (0).
0 = Quando o resultado de operação lógica ou aritmética não for zero (0).
3-8
OSTENSIVO 1° REVISÃO
OSTENSIVO CIAA-117/092A
SUBWF:
1 = Se não ocorrer empréstimo do 4º bit do LSB.
0 = Se ocorrer empréstimo do 4º bit do LSB.
bit 0 C: Carry/borrow bit (Transporte/empréstimo em instruções ADDWF, ADDLW,
SUBWF e SUBLW).
1 = Se ocorrer transporte no MSB.
0 = Se não ocorrer transporte no MSB.
ADDWF (C = 1, produz-se transporte no bit 7 e C = 0, não se produz
transporte).
SUBWF (C = 1, não ocorreu emprestimo no bit 7 e C = 0, ocorreu
emprestimo).
RRF/RLF (carrega bit C com LSB ou MSB respectivamente).
3-9
OSTENSIVO 1° REVISÃO
OSTENSIVO CIAA-117/092A
bit 7 RBPU: PORTB Pull-up Enable bit (Habilita o resistor de pull-up internos para a
PORTB)
1 = Resistores de pull-ups desabilitados
0 = Resistores de pull-ups habilitados para os pinos do PORTB configurados
como entrada.
bit 6 INTEDG: Interrupt Edge Select bit (Bit de seleção da borda que gera a interrupção
externa no RB0/INT)
1 = Interrupção ocorrerá na borda de subida no pino RB0/INT.
0 = Interrupção ocorrerá na borda de descida no pino RB0/INT.
bit 5 T0CS: TMR0 Clock Source Select bit (Bit de seleção de clock para TMR0 e que
determina se o Timer0 será um contador ou um temporizador).
1 = TMR0 funcionará como um contador e será incrementado externamente
pela mudança no pino RA4/T0CK1).
0 = TMR0 funcionará como um temporizador e será incrementado pelo
oscilador interno – CLKOUT = Fosc/4)
3 - 10
OSTENSIVO 1° REVISÃO
OSTENSIVO CIAA-117/092A
bit 4 T0SE: TMR0 Source Edge Select bit (Configuração da borda que incrementará o
TMR0, quando ajustado para um contador de eventos, no pino RA4/T0CKI, isto é,
T0CS = 1).
1 = É incrementado na transição de alto para baixo do pino RA4/T0CKI.
0 = É incrementado na transição de baixo para alto do pino RA4/T0CKI.
bit 3 PSA: Prescaler Assignment bit (Bit de atribuição do Prescaler)
1 = Prescaler é atribuido ao Watchdog.
0 = Prescaler é atribuído ao modulo Timer0 (TMR0)
bit 2-0 PS2:PS0: Prescaler Rate Select bits (Bits de seleção do fator de divisão do
prescaler)
O valor inicial da contagem pode ser ajustado diretamente no registro TMR0, e quando
estourar a contagem, isto é, passe de 255 para 0, irá acionar o flag T0IF (INTCON<2>).
Enquanto não houver estouro da contagem, o bit T0IF permanece apagado (0), se houver
estouro esse mesmo bit será setado e permanece assim até que seja zerado pelo usuário.
O estouro deste contador pode gerar uma interrupção no micro dependendo se o bit T0IE
(INTCON <5>) foi previamente setado.
Obs: Quando usando Low Voltage ICSP Programming (LVP) e pull-ups na PORTB
habilitados, o bit 3 no registro TRISB deve ser limpo para desabilitar o pull-up em RB3
e assegurar a operação adequada do dispositivo.
3.4.5 - PCL (endereços 02h, 82h) e PCLATH (endereços 0Ah, 8Ah).
outro registro PCLATH. Portanto, o registro PCLATH (bits 4:0) é um registro usado
para acesso aos 5 bits mais significativos do PC.
Com qualquer reset, os bits mais significativos serão apagados (zerados). O PCLATH
não é modificado por chamadas CALL, RETURN, etc.
Nas instruções CALL e GOTO, estas só fornecem 11 bits do endereço de salto (2K) e o
PCLATH fornece mais 2 bits (PCLATH <4:3>).
Quando se realiza uma chamada a uma sub-rotina (CALL) ou um salto (GOTO), o
usuário tem de proporcionar estes bits (PCLATH<4:3>).
Se for executado o retorno de uma instrução CALL ou interrupção, os 13 bits completos
do PC estão na Pilha (Stack). Por isso, não é necessário acionar os bits PCLATH<4:3>
para instruções de retorno, pois o endereço do retorno é fornecido pela Pilha.
c) A interação entre os registros PC, PCL, PCH e PCLATH pode ocorrer de quatro
formas distintas:
I) Execução de uma instrução que tem como destino o registro PCL.
Neste caso, o registro PC será carregado, em sua parte baixa com o valor escrito no
registro PCL e em sua parte alta (PCH) com os cinco bits menos significativos do
registro PCLATH.
3 - 13
OSTENSIVO 1° REVISÃO
OSTENSIVO CIAA-117/092A
II) Indireto, não tira o endereço do código da instrução, mas sim com a ajuda do bit IRP
(STATUS<7>) e do registro FSR. O local endereçado é acessado através do registro
INDF e coincide com o endereço contido em FSR.
3 - 14
OSTENSIVO 1° REVISÃO
OSTENSIVO CIAA-117/092A
3 - 15
OSTENSIVO 1° REVISÃO
OSTENSIVO CIAA-117/092A
3 - 16
OSTENSIVO 1° REVISÃO
OSTENSIVO CIAA-117/092A
PEIE- possui controle dos periféricos, pois quando em zero, não permite que os
periféricos possam ocasionar uma interrupção. Há bits que habilitam ou não certas
interrupções e bits que agem como bandeiras (flags) indicadoras de que um evento
ocorreu em algum terminal ou módulo.
bit 7 GIE: Global Interrupt Enable bit (Habilitação geral das interrupções – chave
geral).
1 = Habilita todas as interrupções para controle individual.
0 = Desabilita todas as interrupções.
bit 6 PEIE: Peripheral Interrupt Enable bit (Habilitação das interrupções de periféricos
– chave geral de periféricos).
1 = Habilita todas as interrupções de periféricos para controle individual.
0 = Desabilita todas as interrupções de periféricos.
bit 5 T0IE: TMR0 Overflow Interrupt Enable bit (Habilitação da interrupção de
estouro de TMR0 – chave individual).
1 = Habilita a interrupção do TMR0.
0 = Desabilita a interrupção do TMR0.
bit 4 INTE: RB0/INT External Interrupt Enable bit (Habilitação de entrada externa de
interrupção pino RB0/INT – chave individual).
1 = Habilita a interrupção externa no pino RB0/INT.
0 = Desabilita a interrupção externa.
bit 3 RBIE: RB Port Change Interrupt Enable bit (Habilitação da interrupção por
mudança de estado nos pinos RB4 a RB7 – chave individual).
1 = Habilita a interrupção por mudança de estado
0 = Desabilita a interrupção por mudança de estado.
bit 2 T0IF: TMR0 Overflow Interrupt Flag bit (Identificação de estouro ou
transbordamento do TMR0).
1 = Ocorreu transbordamento do TMR0 (este bit deve ser limpo por
software).
3 - 17
OSTENSIVO 1° REVISÃO
OSTENSIVO CIAA-117/092A
3 - 18
OSTENSIVO 1° REVISÃO
OSTENSIVO CIAA-117/092A
CAPÍTULO 4
PORTAS DE ENTRADA E SAÍDA.
4.1 – INTRODUÇÃO.
Alguns pinos das portas de entrada/saída são multiplexados com funções alternadas para
características de periféricos no dispositivo. Em geral, quando um periférico está
habilitado, este pino pode não ser usado como um pino de entrada/saída de uso geral.
a) O PIC16F84 possui suas portas divididas da seguinte forma:
I) Uma (1) porta de 5 I/O (PORTA).
III) Uma (1) porta de 8 I/O (PORTB).
4.2 - PORTA (endereço 05H) e Registro TRISA (endereço 85H).
A porta A (PORTA) é uma porta bidirecional de 6 bits. O registro de direção de dados
correspondente é o TRISA. Um bit do registro TRISA setado, fará com que o pino
correspondente da porta A seja uma entrada (o driver correspondente da saída fica no
estado de alta Z). Um bit do registro TRISA apagado (0), fará com que o pino
correspondente da porta A seja uma saída (coloca o conteúdo do latch de saída no pino
selecionado).
Lendo-se o registro PORTA, temos o estado dos pinos, visto que escrevendo-se na porta
A será escrito no latch da mesma. Todas as operações de escrita são do tipo leitura-
modificação-escrita. Portanto, a escrita na porta implica que os pinos são lidos,
modificados e escritos novamente no latch de dados da porta.
A leitura é feita diretamente no pino, enquanto a escrita passa por um Latch. Isto pode
ocasionar um atraso entre o comando de escrita e a efetiva alteração da saída. É por este
motivo que não é recomendável efetuar uma operação de leitura imediatamente após a
alteração de uma saída. O certo é aguardar pelo menos um ciclo de máquina entre as
duas operações. O latch possibilita também que uma operação de escrita seja executada
mesmo que o pino esteja configurado como entrada, através do registro TRISA. O latch
é alterado e, quando o estado do pino for modificado para saída, o valor atual do latch
lhe será imposto. A configuração da porta como saída ou entrada é feita pelo registro
TRISA, enquanto a operação de escrita ou leitura é executada pelo registro PORTA.
4-1
OSTENSIVO 1° REVISÃO
OSTENSIVO CIAA-117/092A
Como visto no bloco da porta A, cinco pinos são do tipo TTL enquanto um é do tipo
Schmitt Trigger. Quando estamos operando com um pino como entrada isto interfere
diretamente no nível de tensão interpretado pelo PIC.
Os pinos RA0 a RA3 e RA5 se ligam também ao Conversor A/D. “Analog Input Mode”
representa a seleção entre modo digital ou analógico para esses pinos (Registro
ADCON1). Estes pinos possuem níveis TTL de entrada e drivers de saída CMOS.
O pino RA4 é multiplexado com a entrada do clock do módulo Timer0 tornando-se o
pino RA4/T0CKI. Isto possibilita que um clock imposto a esse pino incremente
automaticamente o TMR0, independentemente do clock real da máquina. Outra
característica desta saída e não possuir o FET canal P, capaz de impor Vdd à saída,
ficando uma saída dreno aberto. Para liberar Vdd em RA4 é necessário um resistror de
pull-up externo.
O pino RA4/T0CKI é uma entrada Schmitt Trigger e uma saída dreno aberto (É útil para
aplicações que compartilham a mesma ligação no pino [porta]).
Outros pinos da porta A são multiplexados com entradas analógicas e entrada de
referência (Vref) analógica. A operação de cada pino é selecionada pelos bits de controle
no registro ADCON1 (A/D Control Register1).
Obs: Na energização (Power-on Reset), esses pinos são configurados como entradas
analógicas e em leitura são zero (0).
O Registro TRISA controla a direção dos pinos RA, mesmo que eles estejam sendo
usados como entradas analógicas.
O usuário precisa garantir que os bits do registro TRISA sejam mantidos setados,
quando usados como entradas analógicas.
Exemplo de inicialização da PORTA A.
bcf STATUS, RP0
bcf STATUS, RP1 ;banco0
clrf PORTA ;inicialização da porta A pela limpeza dos Latches de
saída
bsf STATUS, RP0 ;seleciona o Banco1
movlw 0x06 ;configura todos os pinos como entradas
movwf ADCON1 ;digitais
movlw 0xCF ;valor usado para inicializar a direção de dados
4-2
OSTENSIVO 1° REVISÃO
OSTENSIVO CIAA-117/092A
movwf TRISA ;coloca RA0 a RA3 como entradas e RA4 e RA5 como
;saídas, TRISA 6 e 7 são sempre lidos como zero (0).
Diagrama de bloco dos pinos RA0 a RA3 e Digrama de bloco do pino RA4/T0CKI.
RA5.
4.3 - PORTA B (endereços 06h e 106h) e Registro TRISB (endereços 86h e 186h).
4-3
OSTENSIVO 1° REVISÃO
OSTENSIVO CIAA-117/092A
4-4
OSTENSIVO 1° REVISÃO
OSTENSIVO CIAA-117/092A
Toda a porta B é entrada TTL, exceto o pino RB0 quando configurado para utilizar a
interrupção externa e os pinos RB3, RB6 e RB7 quando em modo de programação série
onde são do tipo ST.
Os pinos RB4 a RB7 são interligados à interrupção de mudança de estado quando
configurados como entradas e o pino RB0 é associado à interrupção externa, desde que
configurado como entrada. Habilitações e identificações encontram-se no registro
INTCON e a configuração da borda que gera a interrupção externa é feita pelo bit
INTEDG (OPTION_REG<6>).
Os pinos de entrada (RB7:RB4) são comparados com os valores antigos armazenados na
última leitura da porta B. As saídas diferentes passam por uma operação “OU” para
gerar a interrupção por mudança na porta B (RB Port Change Interrupt) mudando a
interrupção com o bit de flag RBIF (INTCON<0>).
Esta interrupção pode dispertar o MCU do estado de SLEEP. O usuário, no Serviço da
Rotina de Interrupção (Interrupt Service Routine) pode desabilitar a interrupção das
seguintes maneiras:
a) Qualquer leitura ou escrita na porta B. Isto acabará com qualquer condição de
diferença.
b) Zerar o bit de flag RBIF.
A característica interrupção mudança de estado junto com os Pull-ups configuráveis
por software em quarto desses pinos, permite fácil interligação com teclado e torna
possível o despertar pelo pressionamento da tecla.
RB0/INT é um pino de entrada de interrupção externa e é configurado usando o bit
4-5
OSTENSIVO 1° REVISÃO
OSTENSIVO CIAA-117/092A
;Lendo a porta B:
movf PORTB,W ;escreve o valor da PortaB em W
movwf DADO ;registro DADO recebe o registro PORTB
;Inicializando as variáveis:
clrf PORTA ;zero em todas as saídas da PortaA
clrf PORTB ;zero em todas as saídas da portaB
movlw .10
movwf Contador ;inicia contador com 10 decimal
;Escrevendo na porta
bsf STATUS,RP0 ;muda para o banco 1
bsf TRISB,0 ;transforma RB0 em entrada
bcfSTATUS,RP0 ;retorna ao banco0
. ;vários comandos
bsf PORTB,0 ;escreve ‘1’ no latch do RB0 (ainda é entrada)
bsf STATUS,RP0 ;muda para banco1
bcf TRISB,0 ;transforma RB0 em saída. Neste momento o pino
será inicializado
;em ‘1’ devido ao latch
bcfSTATUS,RP0 ;retorna ao banco0
Obs: Não se deve escrever na porta em um ciclo e efetuar a leitura no ciclo seguinte,
deve-se ter pelo menos 1 ciclo de máquina entre escrita e leitura. Neste caso, usa-se a
instrução NOP que demora 1 ciclo.
4-6
OSTENSIVO 1° REVISÃO
OSTENSIVO CIAA-117/087A
CAPÍTULO 5.
ESTUDO DO TIMER.
.
5.1 - Módulo TIMER0.
É um contador de 8 bits, cujo valor é armazenado no registro TMR0 (01h), pode ser lido
ou escrito, possibilitando a inicialização do contador com um valor diferente de zero, por
software.
O conteúdo deste registro é sucessivamente incrementado usando um clock que tanto
pode ser interno (Fosc/4) como externo (pino RA4/T0CK1). Pode usar um prescaler para
poder ampliar a contagem.
5.1.1 – O módulo possui as seguintes características:
a) Opera como Temporizador ou Contador de 8 bits
b) Pode ser lido ou escrito
c) Prescaler de 8 bits programável por software
d) Seleção de clock interno (Fosc/4) ou externo (pino RA4/T0CK1)
e) Interrupção por estouro ou transbordamento (overflow) quando a contagem
passar de FFh para 00h (255 para 0), se habilitada.
f) Seleção da borda de subida ou descida para o clock externo
a) Modo Temporizador
5-1
OSTENSIVO 1° REVISÃO
OSTENSIVO CIAA-117/087A
5-2
OSTENSIVO 1° REVISÃO
OSTENSIVO CIAA-117/087A
5-3
OSTENSIVO 1° REVISÃO
OSTENSIVO CIAA-117/087A
5.1.6 - Prescaler.
O prescaler nada mais é do que um contador/divisor programável que é utilizado para
dividir a frequência do sinal de clock aplicado ao Timer0 por um fator conhecido.
Existe somente um prescaler, o qual é compartilhado entre o modulo Timer0 ou o
Watchdog Timer (WDT). É um contador de 8 bits que não pode ser lido ou escrito e
seu fator de divisão é feito pelos bits PS2:PS0 (OPTION_REG<2:0>). É sincronizado
com clocks internos, e por isso podem ocorrer atrasos de até dois ciclos de clock até o
incremento do contador TMR0. Quando o prescaler for atribuído ao modulo Timer0
significa que o Watchdog Timer não poderá usá-lo, e vice-versa. O bit PSA
(OPTION_REG<3>), determina para quem o prescaler é atribuído, isto é, Timer0 ou
Watchdog.
Quando atribuído ao modulo Timer0, todas as instruções escritas no registro TMR0
(ex: clrf TMR0, movwf TMR0, bsf TMR0, etc.) limpam (zeram) o conteúdo do
contador do divisor (prescaler) e não o fator de divisão. Quando atribuído ao WDT, o
contador só pode ser apagado com a instrução CLRWDT. Esta instrução apaga o
prescaler e o Watchdog Timer.
Durante a execução de um programa é possível passar o prescaler do Tmer0 para o
Watchdog e vice-versa, porém o conteúdo será apagado na transferência.
Obs: Escrevendo no TMR0, quando o prescaler estiver atribuído ao Timer0, zera o
contador do prescaler, mas não mudará a atribuição do prescaler.
bit 5 T0CS: TMR0 Clock Source Select bit (Bit de seleção de clock para TMR0 e que
determina se o Timer0 será um contador ou um temporizador).
1 = TMR0 funcionará como um contador e será incrementado
externamente pela mudança no pino RA4/T0CK1).
0 = TMR0 funcionará como um temporizador e será incrementado pelo
oscilador interno (CLKOUT).
5-4
OSTENSIVO 1° REVISÃO
OSTENSIVO CIAA-117/087A
bit 4 T0SE: TMR0 Source Edge Select bit (Configuração da borda que incrementará o
TMR0, quando ajustado para um contador de eventos, no pino
RA4/T0CKI, isto é, T0CS = 1).
1 = É incrementado na transição de alto para baixo do pino RA4/T0CKI.
0 = É incrementado na transição de baixo para alto do pino RA4/T0CKI.
bit 3 PSA: Prescaler Assignment bit (Bit de atribuição do Prescaler)
1 = Prescaler é atribuido ao Watchdog.
0 = Prescaler é atribuído ao modulo Timer0 (TMR0)
bit 2-0 PS2:PS0: Prescaler Rate Select bits (Bits de seleção do fator de divisão do prescaler)
PS2-PS1-PS0 TMR0 WDT
5-5
OSTENSIVO 1° REVISÃO
OSTENSIVO CIAA-117/087A
significa que para cada 8 eventos que se sucedam só aumentará uma contagem no
registro TMR0 (o valor máximo de contagem será 8x256 = 2048 eventos). O bit PSA
(OPTION_REG<3>), define se o prescaler funciona com o Watchdog ou com o
Timer0. Observamos que a única maneira de incrementar o TMR0 com uma relação de
1:1 é aplicar o prescaler ao WDT.
5-6
OSTENSIVO 1° REVISÃO
OSTENSIVO CIAA-117/092A
CAPÍTULO 6
INSTRUÇÕES DO PIC16F84
6.1 – INTRODUÇÃO.
Cada instrução de PIC16F84 é uma palavra de 14 bits, dividida em um OPCODE que
especifica o tipo da instrução e um ou mais operandos que posteriormente especificam a
operação da instrução. O conjunto de instruções do PIC16F84 é mostrado na Figura 6.3
que lista Operações orientadas a byte, orientadas a bit, e de Literal e de controle. A Figura
6.1 mostra as descrições do Campo do opcode.
6.1.1 - Para instruções orientadas a Byte, f representa um designador do registro de
arquivo e d representa um designador do destino. O designador do registro de arquivo
especifica qual registro de arquivo será usado pela instrução. O designador do destino
especifica onde o resultado da operação deve ser colocado. Se d for 0 ou W, o resultado é
colocado no registro W. Se d for 1 ou F, o resultado está colocado no registro de arquivo
especificado na instrução.
6.1.2 - Para instruções orientadas a bit, b representa o bit designador do campo que
seleciona o número do bit afetado pela operação, enquanto f representa o endereço do
arquivo no qual o bit ficado localizado.
6.1.3 - Para literal e operações de controle, k representa uma constante de 8 ou 11 bits
ou um valor literal.
Figura 6.1
6-1
OSTENSIVO 1° REVISÃO
OSTENSIVO CIAA-117/092A
Campo Descrição
F Endereço do arquivo do registro f especificado (0x00 a 0x7F)
W Registro de trabalho (acumulador)
B Bit de endereço dentro dos 8 bits do arquivo de registro f
K Campo literal, dado constante ou etiqueta
X Irrelevante (0 ou 1), o assembler gera um código com x = 0. É recomendado
para compatibilidade com todas as ferramentas de software da Microchip.
D Seleção de destino; d = 0 ou W: armazena o resultado em W
d = 1 ou F: armazena o resultado no arquivo de registro f
PC Contador de programa
TO Time-out bit
PD Power-down bit
Label Nome da etiqueta
TOS Topo da pilha
PCLAT Latch de maior peso do PC
H
GIE Bit de habilitação global de interrupções
WDT Temporizador/contador Watchdog
→ Atribuído a
<> Bit (s) de um registro
( ) Conteúdo
[ ] Opcional
6-2
OSTENSIVO 1° REVISÃO
OSTENSIVO CIAA-117/092A
6-3
OSTENSIVO 1° REVISÃO
OSTENSIVO CIAA-117/092A
INSTRUÇÕES QUE UTILIZAM BITS E SÃO ORIENTADAS A BIT (b é o bit afetado pela instrução)
Nota 1: Quando um registo do I/O for modificado em função de si mesmo (exemplo, MOVF PORTB, 1), o valor
usado será o valor presente nos próprios pinos. Por exemplo, se o latch de dados for ‘1’ para um pino configurado
como entrada e for mudado para baixo por um dispositivo externo, o dado será escrito novamente com um zero (0).
2: Se esta instrução for executada no registro TMR0 (e, onde aplicável, d = 1), o preescaler será apagado se
designado ao módulo do Timer0.
3: Se o PC for modificado ou um teste condicional for verdadeiro, a instrução requer dois ciclos. O segundo
ciclo é executado como um NOP.
4: Mnemônico = Nome da instrução e Operando = Argumento
6-4
OSTENSIVO 1° REVISÃO
OSTENSIVO CIAA-117/092A
5: Instruções de controle, são: NOP, CALL, CLRWDT, GOTO, RETFIE, RETLW, RETURN e SLEEP.
6-5
OSTENSIVO 1° REVISÃO
OSTENSIVO CIAA-117/092A
6.2.2 - Para a base numérica podemos usar qualquer uma delas desde que esteja de
acordo com as regras estabelecidas.
a) Para hexadecimal: 0xXX ou H’XX’
b) Para binário: B’XXXXXXXX’
c) Para decimal: D’XX’ ou .XX
6-6
OSTENSIVO 1° REVISÃO
OSTENSIVO CIAA-117/092A
Obs2: Em algumas instruções podemos usar o número ou o nome do bit. Ex: BCF
STATUS,0 ou BCF STATUS,Z (zera o bit Z ou bit 0).
6.2.4 - Instruções de Desvios.
Dentre as instruções do PIC, algumas são consideradas de desvio. Instruções de desvio
são usadas para desviar o fluxo do programa para outro endereço.
a) Podem ser classificadas em:
6-7
OSTENSIVO 1° REVISÃO
OSTENSIVO CIAA-117/092A
f) Teste: Quando queremos testar um bit para saber se ele é 0 ou 1. T no nome da instrução.
g) Skip: Usado para criar um desvio, pulando a próxima linha. S no nome da instrução.
h) Set: Setar um bit. S no nome da instrução.
i) Clear: Limpar um bit (zerar). C no nome da instrução.
j) Zero: Algumas instruções podem gerar desvios se o resultado da operação for zero, neste
caso, usa-se Z para indicar tal condição.
6-8
OSTENSIVO 1° REVISÃO
OSTENSIVO CIAA-117/092A
6-9
OSTENSIVO 1° REVISÃO
OSTENSIVO CIAA-117/092A
6 - 10
OSTENSIVO 1° REVISÃO
OSTENSIVO CIAA-117/092A
6 - 11
OSTENSIVO 1° REVISÃO
OSTENSIVO CIAA-117/092A
ANDLW Operação “E” entre uma literal ANDWF Operação “E” entre W e f.
e W.
Sintaxe: [label] ANDLW k Sintaxe: [label] ANDWF f,d
Descrição: Executa um “E” lógico entre o Descrição: Executa um “E” lógico entre o
valor da constante passado no argumento k e valor de W e o valor do registro f. O resultado
o valor de W. O resultado é armazenado em é armazenado no lugar definido por d.
W. Limites: 0 ≤ f ≤ 127 d = 0 (W) ou d = 1
Limites: 0 ≤ k ≤ 255 (f)
Operação: (W) AND (k) → (W) Operação: (W) AND (f) → (d)
Status afetados: Z Status afetados: Z
Código: 11 1001 kkkk kkkk Código: 00 0101 dfff ffff
Palavra: 1 Palavra: 1
Ciclo: 1 Ciclo: 1
Exemplo: ANDLW 0x0F Exemplo: ANDWF FSR,W
Antes da instrução: W = 0x95 Antes da instrução: W = 0x77 e FSR = 0xFF
Após a instrução: W = 0x05 e Z Após a instrução: W = 0x77; FSR = 0xFF e
=0 Z=0
6 - 12
OSTENSIVO 1° REVISÃO
OSTENSIVO CIAA-117/092A
XORLW Operação “OU exclusivo” entre XORWF Operação “OU exclusivo” entre
k e W. W e f.
Sintaxe: [label] XORLW k Sintaxe: [label] XORWF f,d
Descrição: Executa um “OU” exclusivo Descrição: Executa um “OU” lógico
lógico entre o valor da constante passado no exclusivo entre o valor de W e o valor do
argumento k e o valor de W. O resultado é registro f. O resultado é armazenado no lugar
armazenado em W. definido por d.
Limites: 0 ≤ k ≤ 255 Limites: 0 ≤ f ≤ 127 d = 0 (W) ou d =
Operação: (W) XOR (k) → (W) 1 (f)
Status afetados: Z Operação: (W) XOR (f) → (d)
Código: 11 1010 kkkk kkkk Status afetados: Z
Palavra: 1 Código: 00 0110 dfff ffff
Ciclo: 1 Palavra: 1
Exemplo: XORLW 0x12 Ciclo: 1
Antes da instrução: W = 0x04 Exemplo: XORWF REG,F
Após a instrução: W = 0x16 e Z = Antes da instrução: W = 0x22 e REG = 0x22
0 Após a instrução: W = 0x22, REG = 0x00 e
Z=1
BCF Limpa (clear) um bit do registro f. BTFSC Testa o bit de f, pula se zero.
Sintaxe: [label] BCF f,b Sintaxe: [label] BTFSC f,b
Descrição: Põe a 0 (zero) o bit b do registro Descrição: Se o bit d do registro f for 1, então
f. a próxima linha será executada. Caso seja 0, a
Limites: 0 ≤ f ≤ 127 0 ≤ b ≤ 7 próxima linha será pulada. Neste caso, a
Operação: 0 → (f,b) instrução leva 2 ciclos. É um desvio
Status afetados: nemhum condicional.
Código: 01 00bb bfff ffff Limites: 0 ≤ f ≤ 127 0≤ b≤7
Palavra: 1 Operação: pula se (f,b) = 0
Ciclo: 1 Status afetados: nenhum
Exemplo: BCF STATUS,0 ou BCF Código: 01 10bb bfff ffff
STATUS,C Palavra: 1
Antes da instrução: STATUS = Ciclo: 1 ou 2
B‘11111111’ Exemplo: BTFSC STATUS,2
Após a instrução: STATUS = CLRW
B’1111111 0’ ADDLW 0x02
Obs: Apesar da instrução não afetar Antes da instrução: PC = Linha 1 e STATUS
indiretamente nenum dos flags, neste caso, = 0x18
foi determinado que ela alterasse o flag de Após a instrução: Se bit2 = 0, pula para a
carry do registro de Status (C = 0). instrução ADDLW 0x02, caso seja = 1,
CLRW.
6 - 13
OSTENSIVO 1° REVISÃO
OSTENSIVO CIAA-117/092A
6 - 14
OSTENSIVO 1° REVISÃO
OSTENSIVO CIAA-117/092A
6 - 15
OSTENSIVO 1° REVISÃO
OSTENSIVO CIAA-117/092A
6 - 16
OSTENSIVO 1° REVISÃO
OSTENSIVO CIAA-117/092A
RLF Desloca f um bit para a esquerda. RRF Desloca f um bit para a direita.
6 - 17
OSTENSIVO 1° REVISÃO
OSTENSIVO CIAA-117/092A
6 - 18
OSTENSIVO 1° REVISÃO
OSTENSIVO CIAA-117/092A
0 W=?
6 - 19
OSTENSIVO 1° REVISÃO
OSTENSIVO CIAA-117/092A
“uns” diz-se que está escrito em “linguagem máquina”. O processo de comunicação entre o
homem e o microcontrolador fisicamente, “Programa” representa um ficheiro num disco de
computador (ou na memória se estivermos a ler de um microcontrolador) e é escrito de acordo
com as regras do assembly ou qualquer outra linguagem de programação de microcontroladores.
O homem pode entender a linguagem assembly já que ela é constituída por símbolos alfabéticos
e palavras. Ao escrever um programa, certas regras devem ser seguidas para alcançar o efeito
desejado. Um Tradutor interpreta cada instrução escrita em linguagem assembly como uma série
de zeros e uns com significado para a lógica interna do microcontrolador.
Consideremos, por exemplo, a instrução “RETURN” que um microcontrolador utiliza para
regressar de um subprograma. Quando o assembler a traduz, nós obtemos uma série de uns e
zeros correspondentes a 14 bits que o microcontrolador sabe como interpretar. Exemplo:
RETURN 00 0000 0000 1000. Analogamente ao exemplo anterior, cada instrução assembly é
interpretada na série de zeros e uns correspondentes.
6 - 20
OSTENSIVO 1° REVISÃO
OSTENSIVO CIAA-117/092A
uma ramificação de um programa (tal como Goto....), o programa pode ainda conter uma
condição que deve ser satisfeita, para que uma instrução Goto seja executada. É importante que
um rótulo (label) seja iniciado com uma letra do alfabeto ou com um traço baixo “_”. O
comprimento de um rótulo pode ir até 32 caracteres. É também importante que o rótulo comece
na primeira coluna.
Instruções - As instruções são específicas para cada microcontrolador, assim, se quisermos
utilizar a linguagem assembly temos que estudar as instruções desse microcontrolador. O modo
como se escreve uma instrução é designado por "sintaxe". No exemplo que se segue, é possível
reconhecer erros de escrita, dado que as instruções movlp e gotto não existem no
microcontrolador PIC16F84.
Operandos - Operandos são os elementos da instrução necessários para que a instrução possa
ser executada. Normalmente são registros, variáveis e constantes. As constantes são designadas
por “literais”. A palavra literal significa “número”.
Comentários - Comentário é um texto que o programador escreve no programa a fim de tornar
este mais claro e legível. Ele é colocado logo a seguir a uma instrução e deve começar com um
ponto e vírgula ";".
Diretivas - Uma diretiva é parecida com uma instrução, mas ao contrário desta, é independente
do tipo de microcontrolador e é uma característica inerente à própria linguagem assembly.
As diretivas servem-se de variáveis ou registros para satisfazer determinados propósitos. Por
exemplo, NIVEL, pode ser uma designação para uma variável localizada no endereço 0Dh da
memória RAM.
Deste modo, a variável que reside nesse endereço, pode ser acedida pela palavra NIVEL. É
muito mais fácil a um programador recordar a palavra NIVEL, que lembra que o endereço 0Dh
contém informação sobre o nível Exemplo de como se escreve um programa.
O exemplo que se segue, mostra como um programa simples pode ser escrito em linguagem
assembly, respeitando regras básicas. Quando se escreve um programa, além das regras
fundamentais, existem princípios que, embora não obrigatórios é conveniente, serem seguidos.
Um deles, é escrever no seu início, o nome do programa, aquilo que o programa faz, a versão
deste, a data em que foi escrito, tipo de microcontrolador para o qual foi escrito e o nome do
programador.
6 - 21
OSTENSIVO 1° REVISÃO
OSTENSIVO CIAA-117/092A
1 INCLUDE “P16C84.inc”
2 LIST P=P16C84
6 ORG 0X00
7 INICIO movlw 03
8 movwf DADO1
9 movf DADO2,0
10 movf DADO3,1
6 - 22
OSTENSIVO 1° REVISÃO
OSTENSIVO CIAA-117/092A
a) Linhas contendo palavras reservadas denominadas diretivas que não são instruções para
o micro mas sim definições de tarefas interpretadas pelo assemblador.
b) Linhas contendo as instruções executadas pelo micro e por palavras definidas pelo
programador que apontarão posições de memória ou registros e/ou posições de endereços
de saltos dos programas. Estas palavras visam melhorar o entendimento do programa.
Deste modo, no exemplo anterior, numeramos as linhas de programação para facilitar a
explicação do mesmo. Assim temos:
Linha 1: contém a diretiva INCLUDE destinada a incluir definições específicas do micro
usado, que auxiliam o programador.
Linha 2: contép0m a diretiva LIST que possibilita a geração de um arquivo de extensão
.LIST, para impressão e arquivamento de relatório. Nem todos os programas precisam
desta diretiva.
Linhas em branco podem ser incluídas para possibilitar uma melhor visualização dos
passos do programa.
Linhas 3, 4 e 5: possuem a diretiva EQU destinada a atribuir ou substituir um valor de
expressão por um nome. O nome DADO1 recebe o valor 20H significando que se for
desejado movimentar um certo valor para a posição de endereço 20H, este endereço poderá
ser referido pelo nome DADO1.
Linha 6: possui a diretiva ORG que define onde será armazenado, na memória de
programa, a próxima instrução do programa.
Linha 7: inicia o programa, o valor 03 será movido para w.
Linha 8: o conteúdo do registro w será movido para o endereço correspondente a DADO1
(20H).
Linha 9: o conteúdo do registro fonte correspondente a DADO2 (21H) será movido para o
destino apontado por zero (0), que será o registro w.
Linha 10: o conteúdo do registro fonte correspondente a DADO3 (22H) será movido para o
destino apontado por um (1), que será o próprio DADO3.
Obs: O PIC possui três instruções de movimento de dados, que permitirão mover um valor
para o registro w, mover um valor do registro w para um registro da memória de dados e
mover um valor de um registro da memória de dados para o registro w.
Linha 11: termina o programa através da diretiva END.
6 - 23
OSTENSIVO 1° REVISÃO
OSTENSIVO CIAA-117/092A
Parte1: o programa deverá começar pelas diretivas iniciais que darão ordens para o
assemble executar tarefas durante a tradução do programa fonte para o programa
hexadecimal (.HEX), ou linguagem de máquina.
Parte2: definimos nomes para referenciar registros e valores. Assim, no corpo do
programa serão utilizados os nomes ao invés de números, melhorando o entendimento.
Parte3: em configurações devem ser inicializados os registros que serão usados no
programa e também o uso da diretiva ORG, para definir as partes das regiões de memória
ocupadas pelo programa.
6 - 24
OSTENSIVO 1° REVISÃO
OSTENSIVO CIAA-117/092A
Parte4: o corpo principal do programa deve ser implementado e identificado por uma
etiqueta que permita utilizá-lo ou realizar saltos cíclicos durante a execução do programa.
Esta etiqueta nem sempre será obrigatória, porém é uma boa forma de programar.
Parte5: após o programa principal deverão aparecer as subrotinas necessárias para o
programa, que deverão ser encerradas pela instrução return ou retlw.
Parte6: para melhor organização do programa, a subrotina de manuseio de interrupção
deve ser deixada por último e finalizada pela instrução retfie.
Parte7: finaliza o programa com a diretiva END.
Nem todas as partes são obrigatórias ou existirão em um programa. Um programa não
necessita da diretiva LIST, não necessitaria de atribuições de variáveis, porque as
instruções poderiam trabalhar diretamente com os valores de endereços. Se não for usado a
diretiva ORG o programa será iniciado no endereço 00H e também não haverá a
necessidade de empregar subrotinas. Porém, neste caso, o entendimento do programa será
dificultado. Obrigatoriamente haverá a necessidade de terminar o programa com a diretiva
END.
Os programas fonte podem ser escritos em qualquer editor de texto, desde que seja no
formato ASCII. O software MPLAB contém o seu próprio editor de texto.
Com relação a sintaxe do programa, algumas perguntas podem ser feitas:
a) por que algumas palavras são colocadas na primeira coluna e outras não?
b) a escrita em maiúsculo ou minúsculo é obrigatória?
c) em que coluna deve ser colocado um mnemônico? As respostas são conseguidas
através do entendimento de como o assemblador interpretará o arquivo texto fonte e o
transformará no arquivo hexadecimal (.HEX).
Cada dado de todas as linhas do arquivo texto será interpretado como sendo uma etiqueta
(label), um mnemônico, um operando ou um comentário.
Assim estes dados deverão cumprir normas de escrita e normas de posição relativa na linha
ou posição em relação a outro dado. Como regra geral cada dado não deverá exceder 255
caracteres em uma mesma linha.
As etiquetas deverão iniciar na primeira coluna e podem ser seguidas por dois pontos (:),
espaços em branco, tabuladores ou mudança de linha. Contendo até 32 carcteres
6 - 25
OSTENSIVO 1° REVISÃO
OSTENSIVO CIAA-117/092A
alfanuméricos, desde que o primeiro carácter não seja um número, nem uma interrogação.
Porém elas são diferentes se escritas com letras maiúsculas ou minúsculas.
Os mnemônicos, as diretivas e as chamadas macros devem começar pelo menos na
segunda coluna. Se o mnemônico vier após uma etiqueta, deverá existir entre ambos dois
pontos (:), espaços ou tabuladores. Indistintamente podem ser escritos em maiúsculo ou
minúsculo.
Os operandos devem estar separados dos mnemônicos por um ou mais espaços ou por
tabuladores. Se a instrução tiver mais de um operando, a mesma deve estar separada por
vírgula.
Os comentários serão todos os caracteres que estiverem após um ponto e vírgula (;) e até o
final da linha. Se um comentário ocupar mais de uma linha, deverá ser colocado um ponto
e vírgula em cada linha.
O não cumprimento destas regras ocasionarão erros avisados pelo assemblador.
Apesar destas regras permitirem uma boa flexibilidade para o arquivo texto, devem ser
seguidas algumas orientações que melhoram o entendimento e a organização do programa.
São elas:
a) as diretivas e os nomes de variáveis costumam ser escritos em maiúsculo. Se isto não for
feito não haverá problema, porém, deste modo, torna-se fácil diferenciá-los dos
mnemônicos. Não é permitido escrever as variáveis ora de uma forma, ora de outra, pois o
assemblador é sensível a maiúsculo e minúsculo.
b) os mnemônicos devem ser escritos em minúsculo para diferenciar das variáveis e não
tornar o texto cansativo para leitura.
c) os programas devem ser tabulados e alinhados para identificar rapidamente as estruturas
do programa. Linhas em branco, entre partes da estrutura, auxiliam esta identificação.
d) Para posterior modificação ou análise, deve-se colocar o máximo de comentários em um
programa.
6 - 26
OSTENSIVO 1° REVISÃO
OSTENSIVO CIAA-117/092A
6 - 28
OSTENSIVO 1° REVISÃO
OSTENSIVO CIAA-117/092A
Parte Experimental
A Microchip disponibiliza ferramentas para desenvolvimento de aplicações para seus
microcontroladores PIC. Dentre estas ferramentas podemos citar o MPLAB e o PICShell. O
MPLAB é um IDE que fornece uma integração entre editor de texto, compiladores e
microcontroladores.
OBS: Normalmente, os grupos de instruções muito usados são ligados numa única unidade que
pode ser facilmente invocada por diversas vezes num programa, uma unidade desse tipo chama-
se genericamente Macro e, normalmente, essa unidade é designada por um nome especifico
facilmente compreensível. Com a sua utilização, a seleção entre os dois bancos torna-se mais
clara e o próprio programa fica mais legível.
BANK0 macro
bcf STATUS, RP0 ; Selecionar o banco 0 da memória
Endm
BANK1 macro
bsf STATUS, RP0 ; Selecionar o banco 1 da memória
Endm
6 - 29
OSTENSIVO 1° REVISÃO
OSTENSIVO CIAA-117/092A
MOVLW 0x38
ADDLW0xDC
2) Em um PIC16F84, foi conectado um led no pino RB3. Sabendo-se que o led acende com nível
lógico baixo e sabendo-se que o registro TRISB = A3h e o PORTB = E4h. Pergunta-se: O led
estará acesso ou apagado? Justifique:
3) Qual o tempo de retardo (Delay) de um programa do PIC16F84 se o timer0 tiver valor inicial
de 0Ah e o prescaler estiver setado com um fator de divisão de 1:128?
4) Se o clock externo de um PIC qualquer for de 2Mhz, informe o tempo que o pulso leva para
chegar ao TMR0 :
5) Qual o tempo que o TMR0 leva para transbordar se for carregado com 1Ah e o clock interno
for de 1 microsegundo com o prescaler desabilitado?
6) O que o fabricante fez para permitir a migração de um modelo PIC para outro sem a
necessidade de grandes alterações?
6 - 30
OSTENSIVO 1° REVISÃO
OSTENSIVO CIAA-117/092A
10) Escreva um programa em linguagem Assembly que leia o pino RB0 ligado a chave S1 tipo
push-botton acionada em nível lógico 0(zero), conforme diagrama esquemático. Caso a chave
S1 seja pressionada, o programa fará com que o led conectado ao pino RB7 fique piscando num
intervalo de 1segundo toda vez que a chave S1 estiver sendo pressionada.
Observe o diagrama esquemático, para sanar qualquer dúvida, depois execute este programa nas
aulas práticas no laboratório.
Diagrama Esquemático:
11) Escreva um programa em linguagem Assembly que irá ler os pinos RA3 e RA2 ligados a
chave T1 e T2 (chaves do tipo push-boton acionada em nível lógico 0(zero)). Caso a chave T1
6 - 31
OSTENSIVO 1° REVISÃO
OSTENSIVO CIAA-117/092A
seja pressionada, o programa fará com que o led fique piscando com intervalos de
aproximadamente 500ms. O led somente deixará de piscar, quando a chave T2 for pressionada.
12) Implementação de
Programa.
Escreva um programa em linguagem
Assembly que irá ler o pino RA4 ligado a chave T1(push-boton acionada em nível lógico
0(zero)). Caso esta chave seja pressionada pela primeira vez, o programa fará os leds ficarem
piscando com intervalos de aproximadamente 250ms. Os leds somente deixarão de piscar,
quando a chave T1 for pressionada pela segunda vez e assim sucessivamente.
6 - 32
OSTENSIVO 1° REVISÃO
OSTENSIVO CIAA-117/092A
CAPÍTULO 7
INTRODUÇÃO AO ARDUÍNO
7.1- Introdução
Na década de 90 surgem novas versões da arquitetura Harvard, uma dessas que
também se popularizou foi desenvolvida pela ATMEL com o nome AVR, e é uma
das primeiras famílias de microcontroladores a usar Memória de Programa do tipo
Flash. O AVR foi desenvolvido em uma House ASIC (Application Specific
Integrated Circuit) na Trondheim, Noruega, onde os dois fundadores da ATMEL
trabalhavam. O nome AVR não é uma sigla e também não é declarado pela ATMEL
o que representa.
O sistema Arduino é um conjunto de software e hardware estruturado em torno dos
microcontroladores do fabricante ATMEL.
Arduino Mega2560
7-1
OSTENSIVO 1° REVISÃO
OSTENSIVO CIAA-117/092A
Softwares escritos usando Arduino são chamados de sketches e tem o mesmo efeito de um
código fonte. Os Sketches são as escritas no editor de texto e são salvos com a extensão do
arquivo “nome do arquivo.ino”. O console exibe saída de texto pelo ambiente Arduino,
incluindo mensagens de erro e outras informações, no canto direito inferior da janela exibe o
atual diretório e porta serial.
computador (PC).
7-2
OSTENSIVO 1° REVISÃO
OSTENSIVO CIAA-117/092A
Os comandos adicionais são encontrados dentro dos cinco menus: Arquivo, Editar,
Sketch, Ferramentas, Ajuda.
Editar
Copiar para o Fórum
Copia o código do seu esboço para o clipboard em um formato adequado para a
postagem no fórum, preencha com coloração de sintaxe.
Copiar como HTML
Copia o código do seu esboço para a área de transferência como HTML, apropriado
para inclusão em páginas da web.
Sketch
Verificar/Compilar - Verifica o seu esboço para erros.
Exibir pastas dos Sketch. - Abre a pasta esboço Sketch.
Adicionar Arquivo... - Adiciona um arquivo de origem para o desenho. O novo
arquivo será exibido em uma nova aba na janela de desenho. Os arquivos podem ser
removidos do esboço usando o menu tab.
Importar Biblioteca - Adiciona uma biblioteca para o seu esboço, inserindo
#include no início do seu código. Além disso, com a versão 1.0.5 e posterior do IDE,
você pode importar uma biblioteca de um arquivo “nome do arquivo.Zip”.
Ferramentas
Auto Formatação - Isto formata o código facilmente. Pode recuá-lo para para
abertura e fechamento de linha de chaves e que também para as instruções dentro de
chaves fiquem mais recuadas.
Arquivar o Sketch - Cria um arquivo formato zip do esboço atual. O arquivo é
colocado no mesmo diretório do esboço.
Placa - Selecione a placa que você está usando.
Port - Este menu contém todos os dispositivos seriais (real ou virtual) em sua
máquina. Deve atualizar automaticamente cada vez que você abrir o menu de
ferramentas de nível superior.
7-3
OSTENSIVO 1° REVISÃO
OSTENSIVO CIAA-117/092A
Arquivo
Sketchbook - O ambiente Arduino usa o conceito de um caderno de desenho: um
local padrão para armazenar seus programas (ou desenhos). Os esboços em seu
caderno podem ser abertos a partir de Arquivo>Sketchbook menu ou no botão Open na
barra de ferramentas. A primeira vez que você executar o software Arduino, ele criará
automaticamente um diretório para o seu Sketchbook. Você pode visualizar ou alterar a
localização do local do sketchbook na janela Preferências.
Carregar - Antes de carregar o seu código, você precisa selecionar os itens corretos.
No Windows, a porta é provavelmente a COM1 ou COM2 (para uma placa serial) e
COM4 ou superior (para uma placa USB). Para descobrir a porta basta olhar para o
dispositivo serial USB na seção portas do Gerenciador de Dispositivos do Windows.
Preferências - Entre outras opções o item Preferências serve para mudar o idioma
manualmente. Selecione o seu idioma preferido no menu e reinicie o software para usar
o idioma selecionado. Se o seu idioma preferido não é suportado, a IDE usará o Inglês.
Placas Arduino atuais irão reiniciar automaticamente antes de iniciar o carregamento.
Com placas mais antigas que carecem de auto-reset, você precisa pressionar o botão de
reset na placa antes de iniciar um carregamento.
7-4
OSTENSIVO 1° REVISÃO
OSTENSIVO CIAA-117/092A
Na maioria das placas, você vai ver os LEDs RX e TX piscarem enquanto o código é
carregado. O ambiente Arduino irá exibir uma mensagem quando o carregamento
estiver completo, ou mostrar um erro.
Quando você carrega um código, você está usando o bootloader que é um pequeno
programa carregado no microcontrolador antes do seu código. Ele permite que você
faça o upload de código sem usar qualquer hardware adicional. O bootloader é ativo
durante alguns segundos quando a placa é reinicializada, então ele recebe qualquer
código que está sendo enviado ao microcontrolador. O bootloader vai piscar o on-
board (pino 13) LED quando ele começa.
Ao iniciar o Arduino, a janela de edição de códigos apresenta duas funções padrões.
Elas servem para orientar o programador nos primeiros passos de sua programação.
Em linguagem “C” é necessário a criação de uma estrutura (função) com o nome
“main” que deverá ser preparada pelo compilador na primeira execução de programa.
No caso da IDE arduino a criação da estrutura “main” se torna transparente aos olhos
do programador, neste sistema, um conjunto de softwares (linker) farão a montagem do
código mantendo todas as regras impostas ao padrão da linguagem.
A estrutura “loop” é padrão para todos os códigos fonte do Arduino e despensa a
necessidade do programador prover artifícios cíclicos para a montagem do código
principal. Já a estrutura “setup” tem o objetivo de acumular todos os códigos que
deverão ser executados uma única vês e no momento da inicialização do hardware.
O compilador GCC é um compilador C++ por trás de um editor de códigos que inclui,
entre outras facilidades, as funções loop e setup para dinamizar a rotina de montagem
dos códigos. Estas regras que foram incluídas no sistema arduino alteram a
originalidade da linguagem C++ e com isso o nome da linguagem.
A linguagem Arduino é baseada em programação open-source para microcontroladores
e está programação foi titulada como “Wiring”. O Wiring permite escrever software
multiplataforma para controlar dispositivos conectados a uma ampla gama de placas
arduino e criar todos os tipos de codificações criativas, objetos interativos, espaços ou
experiências físicas.
7-5
OSTENSIVO 1° REVISÃO
OSTENSIVO CIAA-117/092A
7-6
OSTENSIVO 1° REVISÃO
OSTENSIVO CIAA-117/092A
7-7
OSTENSIVO 1° REVISÃO
OSTENSIVO CIAA-117/092A
-CARACTERÍSTICAS:
• Microcontrolador: ATmega328
• Tensão de operação: 5V
• Tensão recomendada (entrada): 7-12V
• Limite da tensão de entrada: 6-20V
• Pinos digitais: 14 (seis pinos com saída PWM)
• Entrada analógica: 6 pinos
• Corrente contínua por pino de entrada e saída: 40 mA
• Corrente para o pino de 3.3 V: 50 mA
• Quantidade de memória FLASH: 32 KB (ATmega328) onde
0.5 KB usado para o bootloader
• Quantidade de memória SRAM: 2 KB (ATmega328)
• Quantidade de memória EEPROM: 1 KB (ATmega328)
• Velocidade de clock (cristal): 16 MHz
7-8
OSTENSIVO 1° REVISÃO
OSTENSIVO CIAA-117/092A
O Arduino UNO pode ser alimentado pela porta USB ou por uma entrada do tipo “Power
Jack” (com o positivo ao centro) através de uma fonte externa DC.
A recomendação é que a fonte externa seja de 7 V a 12 V e pode ser ligada diretamente no
conector de fonte ou nos pinos Vin e Gnd.
3,3 V. - Fornece tensão de 3,3V. para alimentação de shield e módulos externos. Corrente
máxima de 50 mA.
VIN - pino para alimentar a placa através de shield ou bateria externa. Quando a placa é
alimentada através do conector Jack, a tensão da fonte estará nesse pino.
7-9
OSTENSIVO 1° REVISÃO
OSTENSIVO CIAA-117/092A
Conforme já mencionado, o Arduino UNO, possui 14 portas digitais e 6 portas analógicas (que
também podem ser utilizadas como portas digitais).
Os conversores analógicos-digitais (ADC) do Arduino são de 10 bits.
Os valores lidos numa porta analógica variam de 0 a 1023 (10 bits), onde 0 representa 0V e
1023 representa 5V.
Portas digitais
As portas digitais trabalham com valores bem definidos, ou seja, no caso do Arduino esses
valores são 0V e 5V.
0V indica a ausência de um sinal e 5V indica a presença de um sinal.
Para escrever numa porta digital basta utilizar a função digitalWrite (pin, estado).
Para ler um valor numa porta digital basta utilizar a função digitalRead (pin).
Portas Analógicas
As portas analógicas são utilizadas para entrada de dados.
O Arduino UNO possui 6 (seis) portas analógicas.
As portas analógicas no Arduino UNO são identificadas como A0, A1, A2, A3, A4 e A5.
Estas portas também podem ser identificadas por 14 (A0), 15 (A1), 16 (A2), 17 (A3), 18 (A4)
e 19 (A5).
Por padrão todas as portas analógicas são definidas como entrada de dados, desta forma não é
necessário fazer esta definição na função setup ( ).
Os valores lidos numa porta analógica variam de 0V a 5V.
Para ler um valor numa porta analógica basta utilizar a função analogRead(pin).
O que é PWM?
PWM, do inglês Pulse Width Modulation, é uma técnica utilizada por sistemas digitais para
variação do valor médio de uma forma de onda periódica. A técnica consiste em manter a
7 - 10
OSTENSIVO 1° REVISÃO
OSTENSIVO CIAA-117/092A
frequência de uma onda quadrada fixa e variar o tempo que o sinal fica em nível lógico alto.
Esse tempo é chamado de duty cycle, ou seja, o ciclo ativo da forma de onda. No gráfico ao
lado são exibidas algumas modulações PWM.
7 - 11
OSTENSIVO 1° REVISÃO
OSTENSIVO CIAA-117/092A
O 2º passo consiste em descompactar o ficheiro “.ZIP” para uma pasta à sua escolha.
O 3º passo consiste em ligar a placa Arduino ao computador através do cabo USB e instalar os
drivers FTDI, para permitir uma conversão de USB para série.
O 4º passo consiste em configurar a porta série a ser utilizada e qual o tipo de modelo
Arduino, que nos encontramos a utilizar. Para tal, necessitamos de abrir o Software de
desenvolvimento e escolher na barra de separadores a opção “Tools”.
7 - 12
OSTENSIVO 1° REVISÃO
OSTENSIVO CIAA-117/092A
Programando no Arduino
Exemplo (1) – Saída Digital
/*
-----------------------------------
1º Exercício
-----------------------------------
Ligar e desligar um LED por um segundo
*/
//------------------------------------
//Função principal
//------------------------------------
void setup() // Executa-se quando o arduino é ligado
{
pinMode(13,OUTPUT); // Inicializa o pin 13 como uma saída
}
//------------------------------------
//Função repetitiva
//------------------------------------
void loop( ) // Esta função executa-se o instante todo
// quando está ligado o Arduino
{
digitalWrite(13,HIGH); // Liga o LED
delay(1000); // Temporiza um segundo
digitalWrite(13,LOW); // Desliga o LED
delay(1000); // Temporiza um segundo
}
7 - 13
OSTENSIVO 1° REVISÃO
OSTENSIVO CIAA-117/092A
Ela é mais uma placa da plataforma Arduino que possui recursos bem interessantes para
prototipagem e projetos mais elaborados. Baseada no microcontrolador ATmega2560, possui
54 pinos de entradas e saídas digitais onde 15 destes podem ser utilizados como saídas PWM.
Possui 16 entradas analógicas, 4 portas de comunicação serial. Além da quantidade de pinos,
ela conta com maior quantidade de memória que Arduino UNO, sendo uma ótima opção para
projetos que necessitem de muitos pinos de entradas e saídas além de memória de programa
com maior capacidade. A seguir serão apresentadas as suas características construtivas,
passando pelos principais recursos que essa placa apresenta.
A alimentação da placa Arduino Mega, como ocorre na Arduino UNO pode ser feita tanto pela
USB, como por uma alimentação externa. A seguir são apresentados os conectores para
alimentação:
Como na placa Arduino UNO, a alimentação externa é feita através do conector Jack com
positivo no centro, onde o valor de tensão da fonte externa deve estar entre os limites 6V. a
20V., porém se alimentada com uma tensão abaixo de 7V., a tensão de funcionamento da
7 - 14
OSTENSIVO 1° REVISÃO
OSTENSIVO CIAA-117/092A
placa, que no Arduino MEGA 2560 é de 5V, pode ficar instável e quando alimentada com
tensão acima de 12V, o regulador de tensão da placa pode sobreaquecer e danificar a placa.
Dessa forma, é recomendado para tensões de fonte externa valores de 7V. a 12V.
Quando o cabo USB é plugado a um PC, por exemplo, a tensão não precisa ser estabilizada
pelo regulador de tensão, dessa forma a placa é alimentada diretamente pela USB. O circuito
da USB apresenta alguns componentes que protegem a porta USB do computador em caso de
alguma anormalidade.
Nele existe um fusível resetável (F1) de 500 mA. impede que a porta USB do computador
queime, caso ocorra algum problema de projeto ou uma falha no circuito e ultrapasse a
corrente de 500 mA. quando a placa estiver conectada ao PC. O ferrite L1 foi incluído no
circuito para que ruídos da USB externa não entrem no circuito da placa Arduino através do
terra.
Além dos recursos apresentados anteriormente a placa conta com um circuito para comutar a
alimentação automaticamente entre a tensão da USB e a tensão da fonte externa. Caso haja
uma tensão no conector DC e a USB é conectada, a tensão de 5V será proveniente da fonte
externa e USB servirá apenas para comunicação com o PC.
Na placa um regulador de 3,3V. (U2- LP2985). Este componente é responsável por fornecer
uma tensão contínua de 3,3V para alimentação de circuitos ou shields que necessitem desse
valor de tensão. Deve-se ficar atento ao limite máximo valor de corrente que este regulador
pode fornecer, que no caso é de 50 mA.
7 - 15
OSTENSIVO 1° REVISÃO
OSTENSIVO CIAA-117/092A
IOREF - Fornece uma tensão de referência para que shields possam selecionar o tipo de
interface apropriada, dessa forma shields que funcionam com a placas Arduino que são
alimentadas com 3,3V. podem se adaptar para ser utilizados em 5V. e vice-versa.
RESET - pino conectado a pino de RESET do microcontrolador. Pode ser utilizado para um
reset externo da placa Arduino.
3,3 V - Fornece tensão de 3,3V. para alimentação de shield e módulos externos. Corrente
máxima de 50 mA.
VIN - pino para alimentar a placa através de shield ou bateria externa. Quando a placa é
alimentada através do conector Jack a tensão da fonte estará nesse pino
EXEMPLO: Se a placa for alimentada com 12V, nesse pino Vin terá 12V.
Comunicação USB
7 - 16
OSTENSIVO 1° REVISÃO
OSTENSIVO CIAA-117/092A
Nesse microcontrolador também estão conectados dois leds (TX, RX), controlados pelo
software do microcontrolador, que indicam o envio e recepção de dados da placa para o
computador. Ele possui um cristal externo de 16 MHz. É interessante notar a conexão entre
este microcontrolador com o ATMEL ATMEGA2560 onde é feita pelo canal serial desses
microcontroladores. Outro ponto interessante que facilita o uso da placa Arduino é a conexão
do pino 13 do ATMEGA16U2 ao circuito de RESET do ATMEGA2560, possibilitando a
entrada no modo bootloader automaticamente quando é pressionado o botão Upload na IDE.
Essa característica não acontecia nas primeiras placas Arduino onde era necessário pressionar
o botão de RESET antes de fazer o Upload na IDE.
7 - 17
OSTENSIVO 1° REVISÃO
OSTENSIVO CIAA-117/092A
Segue abaixo uma imagem deste microcontrolador com encapsulamento TQFP, o mesmo
utilizado na placa Arduino Mega 2560:
A placa Arduino MEGA 2560 possui 54 pinos de entradas e saídas digitais que podem ser
utilizadas como entrada ou saída conforme a necessidade de seu projeto, através das
funções pinMode(), digitalWrite(), e digitalRead(). Os pinos operam com tensão de 5V e
podem fornecer ou drenar até 40 mA. Cada pino possui resistor de pull-up interno que pode
ser habilitado por software ( INPUT_PULLUP). Alguns desses pinos possuem funções
especiais como exibido a seguir:
Interrupções externas - 2 (interrupt 0), 3 (interrupt 1), 18 (interrupt 5), 19 (interrupt 4),
20 (interrupt 3), and 21 (interrupt 2). Estes pinos podem ser configurados para disparo
da interupção tanto na borda de subida ou descida, ou em niveis lógicos alto ou baixo,
7 - 18
OSTENSIVO 1° REVISÃO
OSTENSIVO CIAA-117/092A
A Arduino Mega2560 possui 16 entradas analógicas (pinos A0 a A15), onde pode ser feita a
conversão com uma resolução de 10 bits, ou seja, o valor será convertido entre 0 e 1023. Por
padrão a tensão de referência é conectada a 5V. Porém é possível mudar o valor de referência
através do pino AREF e a função analogReference().
Características físicas
A placa Arduino MEGA 2560 possui dimensões relativamente pequenas para as quantidades
de pinos disponíveis. Possui dimensões de 4”X 2,1” (10cm x 5,5cm). A imagem a seguir dá
uma ideia da dimensão desta placa:
7 - 19
OSTENSIVO 1° REVISÃO
OSTENSIVO CIAA-117/092A
Shields
É possível agregar novas funcionalidades a uma placa do Arduino.
As extensões das placas do Arduino são chamadas de shields.
Existem shields para as mais diversas funcionalidades, por exemplo:
Comunicação ethernet
Comunicação wifi
Comunicação bluethooth
Ponte H
Banco de relês
Ethernet Shield
Adicionar uma biblioteca
Possivelmente algum dia vai precisar de adicionar uma biblioteca para trabalhar com algum
sensor ou outro componente no Arduino. Existem diversas bibliotecas disponíveis na internet,
que pode baixar e utilizar. Entretanto tem que adicioná-las ao seu IDE para que o mesmo
7 - 20
OSTENSIVO 1° REVISÃO
OSTENSIVO CIAA-117/092A
reconheça os comandos que está a utilizar. Para mostrar como proceder, vamos adicionar a
biblioteca MsTimer2.h como exemplo. Podemos baixá-la na página do Arduino
(http://arduino.cc/playground/Main/MsTimer2). Feito isso, descompacte o arquivo.zip que foi
baixado. Agora vá até à pasta onde “instalou” o seu IDE para o Arduino e procure pela pasta
libraries. Dentro deste diretório copie a pasta que foi extraída anteriormente.
Por fim, vamos verificar se a biblioteca foi mesmo detectada pelo IDE. Vá a Files > Examples
e verifique se a biblioteca que acabamos de adicionar está ali. Se sim, a instalação ocorreu
bem e já pode começar a utilizar a sua nova biblioteca. Agora é só “chamá-la” no seu
código,que neste caso ficaria: #include <MsTimer2.h>.
Especificações Rápidas
Tensão: 4,5-5,5V
Corrente: <40mA
Interface digital: nível 5V TTL para
interface UART e GPIO
Interface analógica: conector de microfone
de canal mono de 3,5 mm + interface de pino de
microfone
Tamanho: 31 mm x 50 mm
7 - 21
OSTENSIVO 1° REVISÃO
OSTENSIVO CIAA-117/092A
Habilitar / Este pino é usado para alternar entre o Modo de Dados (definido como
chave -1 baixo) e o modo de comando AT (definido como alto). Por padrão,
está no modo de dados
1 TX- 4 - Transmite dados seriais. Tudo o que for recebido via Bluetooth será
Transmissor fornecido por este pino como dados seriais.
Botão - 8 Usado para controlar o pino Chave / Habilitar para alternar entre
Dados e Modo de comando
7 - 22
OSTENSIVO 1° REVISÃO
OSTENSIVO CIAA-117/092A
O HC-05 é um módulo que pode adicionar funcionalidade sem fio bidirecional (full-
duplex). Você pode usar este módulo para se comunicar entre dois microcontroladores como o
Arduino ou se comunicar com qualquer dispositivo com funcionalidade Bluetooth, como um
telefone ou laptop. O módulo se comunica com a ajuda do USART a uma taxa de transmissão
de 9600, portanto, é fácil fazer a interface com qualquer microcontrolador que suporte
USART. Também podemos configurar os valores padrão do módulo usando o modo de
7 - 23
OSTENSIVO 1° REVISÃO
OSTENSIVO CIAA-117/092A
comando. Portanto, ele é um módulo sem fio que pode transferir dados do seu computador ou
telefone celular para o microcontrolador ou vice-versa.. No entanto, não espere que este
módulo transfira multimídia, como fotos ou músicas
O HC-05 possui dois modos de operação, um é o modo Dados, no qual pode enviar e receber
dados de outros dispositivos Bluetooth, e o outro é o modo Comando AT, onde as
configurações padrão do dispositivo podem ser alteradas. Podemos operar o dispositivo em
qualquer um desses dois modos usando o pino-chave, conforme explicado na descrição do
pino.
É muito fácil emparelhar o módulo HC-05 com microcontroladores porque ele opera usando o
protocolo de porta serial (SPP). Basta alimentar o módulo com + 5V e conectar o pino Rx do
módulo ao Tx do MCU e o pino Tx do módulo ao Rx do MCU como mostrado na figura
abaixo
Durante a inicialização, o pino da chave pode ser aterrado para entrar no modo de comando; se
for deixado livre, ele entrará por padrão no modo de dados. Assim que o módulo for ligado,
você deve ser capaz de descobrir o dispositivo Bluetooth como “HC-05” e conectar-se a ele
usando a senha padrão 1234 e começar a se comunicar com ele.
Formulários
4. Aplicativos do consumidor
6. Domóti
7 - 24
OSTENSIVO 1° REVISÃO
OSTENSIVO CIAA-117/092A
Dedique um tempo para analisar o programa Blink a fim de entender a estrutura básica dos
programas escritos para o Arduino. Considere a Figura 13. Os textos explicativos numerados
mostrados na figura correspondem à seguinte lista.
1. Comentário de várias linhas. Comentários são importantes para documentar seu código.
Tudo o que você escreve entre esses símbolos não serão compilados e nem mesmo visto pelo
Arduino. Comentários de várias linhas começam com / * e terminam com */ . Comentários de
várias linhas são geralmente usados quando você tem muito a dizer (como a descrição do
programa).
2. Comentário de uma única linha. Quando você colocar // em qualquer linha, o compilador
ignora todo o texto após esse símbolo na mesma linha. Isso é ótimo para a anotação de linhas
específicas de código ou para desativar uma determinada linha código que você acredita que
pode estar causando problemas.
4. void setup () é uma das duas funções que devem ser incluídos em todo programa Arduino.
Uma função é um trecho de código que faz uma tarefa específica. O código dentro das chaves
da função setup () é executado uma vez no início do programa. Isso é útil para configurações
que você só faz uma vez, como configurar a direção de pinos, inicializar interfaces de
comunicação e assim por diante.
Figura 13
7 - 25
OSTENSIVO 1° REVISÃO
OSTENSIVO CIAA-117/092A
Para configurar sua direção, use o comando pinMode(). Esse comando usa dois argumentos.
Um argumento fornece informações aos comandos sobre como estes devem funcionar.
Argumentos são colocados dentro dos parênteses que se seguem a um comando. O primeiro
argumento para pinMode determina o pino que está tendo sua direção configurada. Como você
configurou a variável led no início do programa, você está dizendo ao comando que quer
configurar a direção do pino 13. O segundo argumento configura a direção do pino: INPUT ou
OUTPUT. Os pinos são entradas por padrão e, portanto, você precisa configurá-los
explicitamente como saídas se quiser que eles funcionem como saídas. Como você quer
acender um LED, o pino de led deve ser configurado como uma saída (corrente está fluindo a
partir do pino de E/S). Note que você tem de fazer isso apenas uma vez. O pino funcionará
então como uma saída para o resto do programa, ou até que você o modifique para uma
entrada.
10. Novamente, atrasamos por 1 segundo para manter o LED no estado desligado antes de o
loop se repetir e mudar para o estado ligado de novo.
Isso é tudo que há para saber sobre esse código. Não se deixe intimidar, se você não entender
completamente todo código ainda. À medida que mais exemplos são juntados nos próximos
capítulos, você vai se tornar cada vez mais proficiente em compreender o fluxo do programa, e
escrever seu próprio código.
7 - 26
OSTENSIVO 1° REVISÃO
OSTENSIVO CIAA-117/092A
// Exemplo (2)
Na função void Setup(), é preciso configurar qual pino será usado como saída e qual será
usado como entrada. Depois de configurar os pinos, para acioná-los basta chamar a função
digitalWrite(pino,HIGH).
Na função void Loop(), fizemos um if no qual a função digitalRead é usada para saber se o
pushButton está acionado ou não. Caso ele esteja acionado, nós acendemos o Led, caso ele
esteja desligado, nós desligamos o led.
void setup() {
void loop() {
7 - 27
OSTENSIVO 1° REVISÃO
OSTENSIVO CIAA-117/092A
ANEXO A
BIBLIOGRAFIA
A–1
OSTENSIVO 1° REVISÃO