Sumário · Web viewA atividade prática supervisionada elaborada para o curso de Engenharia de...
Transcript of Sumário · Web viewA atividade prática supervisionada elaborada para o curso de Engenharia de...
Universidade do Grande ABC
Carlos Antônio Ra:29292629 Claudio Roberto Calheiro Ra : 29293270
Leandro Franzo Ra: 30025287 Cristiano Cícero DA Silva RA:30024566
Danilo Tiburcio Dias RA:30023035
ATPS – Atividades Práticas Supervisionadas
Microprocessadores e Microcontroladores
Santo André
de 2012
Universidade do Grande ABC
Carlos Antônio Ra:29292629
Claudio Roberto Calheiro Ra : 29293270
Leandro Franzo Ra: 30025287
Cristiano Cícero DA Silva RA:30024566
Danilo Tiburcio Dias RA:30023035Autores:
ATPS – Atividades Práticas Supervisionadas
Trabalho apresentado pelos alunos do curso de
Engenharia de Controle e Automação –, para a
disciplina de Microcontroladores e
Microprocessadores.
Professor orientador Vlamir Belfante.
Santo André
de 20122
Índice
1 - Introdução - Descrição do Trabalho .......................................................................... 5
2 – Algoritmo ................................................................................................................... 6
3 - Fluxograma ................................................................................................................. 7
4 - Linguagem de Programação ....................................................................................... 8
5 - Processador ................................................................................................................. 8
6 - Editor e Compilador ................................................................................................... 9
7 - Versões para Otimização ............................................................................................ 9
8 - Programa / Software ................................................................................................... 9
9 - Hardware ..................................................................................................................... 16
9.1 - Diagrama em Blocos ................................................................................................ 16
9.2 - Fotografias ............................................................................................................... 14
10 - Anexos ...................................................................................................................... 25
10.1 - Set Instruções ......................................................................................................... 60
10.2 - Programa Exemplo................................................................................................ 65
11 - Bibliografia................................................................................................................ 66
1 - Introdução - Descrição do Trabalho
3
A atividade prática supervisionada elaborada para o curso de Engenharia de Controle e
Automação, com relação à disciplina Microcontroladores e Microprocessadores propõem que
desenvolvamos um programa para controle de acesso com senha. Para tanto devemos utilizar
um microcontrolador para, mediante um uso correto de uma senha, liberar esse acesso; de
maneira mais prática, podemos compreender esse controle de acesso como os utilizados em
catracas, portas e acessos que exigem que o usuário digite a senha correta para ter o acesso
liberado.
Foram definidos alguns parâmetros para a execução deste trabalho:
- A senha deve ter no mínimo três dígitos e no máximo seis;
- O sistema terá apenas uma senha válida, não lê código de barras ou sensor biométrico e
armazena apenas uma senha na memória.
Desenvolvemos um programa que simula este controle de acesso onde, uma vez pressionado
os botões corretos o microcontrolador aciona alguns leds simulando a abertura de uma porta.
Aprimoramos este programa ao longo das aulas para melhorar a interface entre usuário e
programa. Além de utilizarmos os leds para simular a liberação do controle de acesso,
utilizamos o display disponível no kit para fazer essa interface. Por exemplo, para solicitar a
senha ao usuário a mensagem "Uni ABC - SENHA?" fica ativa até que usuário digite sua
senha. E, após a digitação dos quatro dígitos, o microcontrolador faz a comparação com a
senha previamente definida e exibe as seguintes informações para o usuário:
"SENHA INCORRETA" caso os quatro dígitos digitados não sejam idênticos aos da senha
previamente armazenada ou,
"SENHA CORRETA" caso os quatro dígitos digitados sejam iguais ao da senha previamente
armazenada. Neste caso os leds também acendem simulando a liberação do acesso.
2 - Algoritmo
4
Um algoritmo é uma sequência infinita de instruções bem definidas e não ambíguas,
cada uma das quais pode ser executada mecanicamente num período de tempo finito e com
uma quantidade de esforço finita.O conceito de algoritmo é frequentemente ilustrado pelo
exemplo de uma receita culinária, embora muitos algoritmos sejam mais complexos. Eles
podem repetir passos (fazer iterações) ou necessitar de decisões (tais como comparações
ou lógica) até que a tarefa seja completada. Um algoritmo corretamente executado não irá
resolver um problema se estiver implementado incorretamente ou se não for apropriado ao
problema.
Um algoritmo não representa, necessariamente, um programa de computador, e sim os
passos necessários para realizar uma tarefa. Sua implementação pode ser feita por
um computador, por outro tipo de autômato ou mesmo por um ser humano. Diferentes
algoritmos podem realizar a mesma tarefa usando um conjunto diferenciado de instruções em
mais ou menos tempo, espaço ou esforço do que outros. Tal diferença pode ser reflexo
da complexidade computacional aplicada, que depende de estruturas de dados adequadas ao
algoritmo. Por exemplo, um algoritmo para se vestir pode especificar que você vista primeiro
as meias e os sapatos antes de vestir a calça enquanto outro algoritmo especifica que você
deve primeiro vestir a calça e depois as meias e os sapatos. Fica claro que o primeiro
algoritmo é mais difícil de executar que o segundo apesar de ambos levarem ao mesmo
resultado.
Abaixo segue um algoritmo de exemplo para que seja realizada a soma de dois números
inteiros inseridos pelo usuário.
Algoritmo "SomaDeDoisValores";
Variável:
SOMA,A,B:inteiro;
Ìnicio
Escreva("Digite um numero"); Leia(A);
Escreva("digite
outro numero"); Leia(B);
SOMA←A+B;
Escreva(SOMA);
Fim
5
03 – Fluxograma
6
4 - Linguagem de Programação
Foram apresentadas as seguintes linguagens de programação para que executássemos este
trabalho: linguagem C e Assembly.
Fizemos a opção de trabalhar em linguagem C. uma vez que já tivemos a oportunidade de
trabalhar com essa linguagem nas disciplinas de ‘Programação de Computadores’ e ‘Lógica
de Programação e Algoritmos’. Também fizemos essa escolha, por apresentar uma linguagem
mais fácil em comparação com o Assembly, que possui uma quantidade maior de comandos
que, por sua vez, exige que os conheçamos para elaborarmos o programa.
5 - Processador
Vamos utilizar o processador PIC16F628A neste trabalho.
Este é um microprocessador fabricado pela Microchip Technology com as seguintes
características:
- composto de 18 pinos;
- possui somente 35 instruções no seu microcódigo;
- sinal de clock de frequência até 20 MHz;
- memória de programa do tipo Flash de 2048 words (1word=32 bits);
- 224 bytes de memória RAM para dados;
- 128 bytes de memória EEPROM para dados;
- instruções de 14 bits com 200ns de tempo de execução;
- dados de 8 bits por endereço de memória;
- 15 registradores especiais;
- pinos os quais podem ser configurados como entrada e/ou saída;
- outras características especiais como programação in-circuit serial, proteção por código,
watchdog timer (temporizador cão de guarda), módulo CCP, comparador interno, USART,
entre outras.
6 - Editor e Compilador
7
Utilizaremos o Mikro C for PIC como editor, conforme necessidade do processador em
questão. Também se faz necessário o uso do compilador MPLAB para trabalhar com o
processador 16F682A.
7 - Versões para Otimização
Conforme orientação do professor, alteramos a nomenclatura de alguns comandos
inicialmente em inglês para o português. É uma medida para facilitar a compreensão e assim
otimizar a programação.
8 - Programa / Software
/*
Engenharia de Controle e Automação 7NA - UniABC
Programa para a ATPS de Microcontroladores.
*/
// Declaração dos terminais do display LCD16x2
sbit LCD_RS at P3_6_bit;
sbit LCD_EN at P3_7_bit;
sbit LCD_D4 at P1_4_bit;
sbit LCD_D5 at P1_5_bit;
sbit LCD_D6 at P1_6_bit;
sbit LCD_D7 at P1_7_bit;
// Declaração das variáveis
char txt1[] = "Uni ABC - SENHA?";
char txt2[] = "SENHA INCORRETA";
char txt3[] = "SENHA CORRETA";
char txt4[] = "*";
int tempo=0;
// Declaração da senha de usuário
// Senha do Usuário 1
int A1=1;
8
int A2=2;
int A3=3;
int A4=4;
// Declaração das variáveis de comparação
int C1=0;
int C2=0;
int C3=0;
int C4=0;
// Limpar display LCD e variáveis de comparação
void limpar()
{
Lcd_Cmd(_LCD_CLEAR); // Limpa o display LCD
Lcd_Out(1,1,txt1); // Escreve o texto Uni ABC - Senha?
C1=0; C2=0; C3=0; C4=0; // Limpa variáveis de comparação
tempo=0;
P2=0xFF; // Apaga Leds
}
// Rotina principal
voidmain(){
P2=0xFF; // Apaga Leds ao iniciar a MCU
C1=0;C2=0;C3=0;C4=0;
Lcd_Init(); // Inicializa o display Lcd
Lcd_Cmd(_LCD_CLEAR); // Limpa o display LCD
//Lcd_Cmd(_LCD_CURSOR_OFF); // Desliga o Cursor do display LCD
Lcd_Out(1,1,txt1); // Escreve o texto Uni Abc - Senha?
while (1)
{
9
for (tempo=0; tempo<=1000; tempo++) // Tempo para digitar a senha
{
// Armazena o primeiro digito
//Delay_ms(5);
if ((P0!=0xFF)&&(P0!=0x7F)&&(P0!
=0xBF)&&(C1==0)&&(C2==0)&&(C3==0)&&(C4==0))
{
if (P0==0xFE){ C1=1; }
if (P0==0xFD){ C1=2; }
if (P0==0xFB){ C1=3; }
if (P0==0xF7){ C1=4; }
if (P0==0xEF){ C1=5; }
if (P0==0xDF){ C1=6; }
Lcd_Out(2,7,txt4); // Escreve o caracter *
while (P0!=0xFF){ }
Delay_ms(5);
}
// Armazena o segundo dígito
//Delay_ms(5);
if ((P0!=0xFF)&&(P0!=0x7F)&&(P0!=0xBF)&&(C1!
=0)&&(C2==0)&&(C3==0)&&(C4==0))
{
if (P0==0xFE){ C2=1; }
if (P0==0xFD){ C2=2; }
if (P0==0xFB){ C2=3; }
if (P0==0xF7){ C2=4; }
if (P0==0xEF){ C2=5; }
10
if (P0==0xDF){ C2=6; }
Lcd_Out(2,8,txt4); // Escreve o caracter *
while (P0!=0xFF){}
Delay_ms(5);
}
// Armazena o terceiro digito
//Delay_ms(5);
if ((P0!=0xFF)&&(P0!=0x7F)&&(P0!=0xBF)&&(C1!=0)&&(C2!
=0)&&(C3==0)&&(C4==0))
{
if (P0==0xFE){ C3=1; }
if (P0==0xFD){ C3=2; }
if (P0==0xFB){ C3=3; }
if (P0==0xF7){ C3=4; }
if (P0==0xEF){ C3=5; }
if (P0==0xDF){ C3=6; }
Lcd_Out(2,9,txt4); // Escreve o caracter "*"
while (P0!=0xFF){}
Delay_ms(5);
}
// Armazena o quarto digito
//Delay_ms(5);
if ((P0!=0xFF)&&(P0!=0x7F)&&(P0!=0xBF)&&(C1!=0)&&(C2!=0)&&(C3!
=0)&&(C4==0))
{
if (P0==0xFE){ C4=1; }
if (P0==0xFD){ C4=2; }
11
if (P0==0xFB){ C4=3; }
if (P0==0xF7){ C4=4; }
if (P0==0xEF){ C4=5; }
if (P0==0xDF){ C4=6; }
Lcd_Out(2,10,txt4); // Escreve o caracter "*"
while (P0!=0xFF){}
Delay_ms(5);
}
// Tecla ENTER pressionada
// Verifica se a senha esta correta
if ((P0!=0xFF)&&(P0==0xBF)&&(A1==C1)&&(A2==C2)&&(A3==C3)&&(A4==C4))
{
Lcd_Out(2,3,txt3); // Escreve o texto senha correta
for (tempo=0; tempo<=24; tempo++)
{
P2=~P2;
Delay_ms(250);
}
limpar();
}
// Verifica se a senha esta incorreta
if ((P0!=0xFF)&&(P0==0xBF)&&((A1!=C1)||(A2!=C2)||(A3!=C3)||(A4!=C4)))
{
Lcd_Out(2,1,txt2); // Escreve o texto senha incorreta
Delay_ms(3000);
limpar();
}
12
// Tecla CLEAR pressionada
if ((P0!=0xFF)&&(P0==0x7F))
{
limpar();
}
Delay_ms(10); // Delay x o tempo do for = tempo p/ digitar
}
limpar();
}
}
9 – Hardware
Segue abaixo o diagrama de blocos e imagens do circuito utilizado neste trabalho.
13
09.1Diagramaem Blocos0011
14
9.2-Fotografias
9.2.1 Descrição da Placa Smartlab
9.2.1.1 Resistores de Pull-Down
Usados para garantir nível lógico zero nas entradas do PIC quando as chaves estiverem
abertas.
São resistores usados no projeto de circuitos lógicos eletrônicos para garantir que entradas
para sistemas lógicos se ajustem em níveis lógicos esperados se dispositivos externos são
desconectados.
15
9.2.1.2 Relê
Usado para acionamento de cargas externas.
Um relé é um interruptor acionado eletricamente. A movimentação física deste "interruptor"
ocorre quando a corrente elétrica percorre as espiras da bobina do relé, criando assim
um campo magnético que por sua vez atrai a alavanca responsável pela mudança do estado
dos contatos. O relé é um dispositivo eletromecânico ou não, com inúmeras aplicações
possíveis em comutação de contatos elétricos. Servindo para ligar ou desligar dispositivos. É
normal o relé estar ligado a dois circuitos elétricos. No caso do Relé eletromecânico, a
comutação é realizada alimentando-se a bobina do mesmo. Quando uma corrente originada no
primeiro circuito passa pela bobina, um campo eletromagnético é gerado, acionando o relé e
possibilitando o funcionamento do segundo circuito. Sendo assim, uma das aplicabilidades do
relé é utilizar-se de baixas correntes para o comando no primeiro circuito, protegendo o
operador das possíveis altas correntes que irão circular no segundo circuito (contatos).
A mudança de estado dos contatos de um relé ocorre apenas quando há presença de tensão na
bobina que leva os contatos a movimentarem-se para a posição normal fechado (NF) ou
normal abertos (NA) quando esta tensão é retirada - este princípio aplica-se para relés tudo ou
nada.
9.2.1.5 Display de 7 segmentos
Permite a visualização de mensagens.
Um display de sete segmentos, é um tipo de display (mostrador) barato usado como
alternativa a displays de matriz de pontos mais complexos e dispendiosos. Displays de sete
segmentos são comumente usados em eletrônica como forma de exibir uma informação
alfanumérica (binário, octadecimal, decimal ou hexadecimal) que possa ser prontamente
16
compreendida pelo usuário sobre as operações internas de um dispositivo. Seu uso é
corriqueiro por se tratar de uma opção barata, funcional e de fácil configuração.
9.2.1.6 Controlador Pic16 F 628ª
Este componente faz todo o controle da placa.
9.2.1.7 Transistores
Servem para fazer o chaveamento dos displays. O Pic aciona um display de cada vez através
do PORTB usado como barramento de dados. Como a freqüência de chaveamento é alta, nos
parece que estão sendo acionados ao mesmo tempo. No caso do nosso programa, usamos um
tempo de 10 milissegundos para esse chaveamento.
O transistor é um componente eletrônico que começou a popularizar-se na década de 1950,
tendo sido o principal responsável pela revolução da eletrônica na década de 1960. São
utilizados principalmente como amplificadores e interruptores de sinais elétricos. O termo
vem de transfer resistor (resistor/resistência de transferência), como era conhecido pelos seus
inventores.
O processo de transferência de resistência, no caso de um circuito analógico, significa que
a impedância característica do componente varia para cima ou para baixo da polarização pré-
estabelecida. Graças a esta função, a corrente elétrica que passa entre coletor e emissor do
transistor varia dentro de determinados parâmetros pré-estabelecidos pelo projetista
do circuito eletrônico. Esta variação é feita através da variação de corrente num dos terminais
chamados base, o que, consequentemente, ocasiona o processo de amplificação de sinal.
17
Entende-se por "amplificar" o procedimento de tornar um sinal elétrico mais fraco num mais
forte. Um sinal elétrico de baixa intensidade, como os sinais gerados por um microfone, é
injetado num circuito eletrônico (transistorizado por exemplo), cuja função principal é
transformar este sinal fraco gerado pelo microfone em sinais elétricos com as mesmas
características, mas com potência suficiente para excitar os alto-falantes. A este processo todo
dá-se o nome de ganho de sinal.
Introdução ao microcontrolador PIC:Portas de E/S
18
Objetivos Apresentar a estrutura de um microcontrolador PIC;
Apresentar o conjunto de instruções do microcontrolador PIC;
Compreender como os registradores de configuração afetam o funcionamento do
microcontrolar PIC;
INTRODUÇÃO
O PIC pertence a uma classe de microcontroladores de 8 bits, com uma arquitetura RISC. Os blocos básicos de uma estrutura genérica do PIC são:
MEMÓRIA DE PROGRAMA (FLASH): Para armazenar as rotinas de programa. Como a memória FLASH pode ser programada e limpa mais que uma vez. ela torna-se adequada para o desenvolvimento de dispositivos.
EEPROM: Memória dos dados que necessitam ser mantidos quando a alimentação é desligada.
RAM: Memória de dados usada por um programa, durante a sua execução.Na RAM, são guardados todos os resultados intermédios ou dados temporários durante a execução do programa e que não são cruciais para o dispositivo, depois de ocorrer uma falha na alimentação.
PORTAS DE E/S: São ligações físicas entre o microcontrolador e o mundo exterior.
CONTADOR/TEMPORIZADOR: São registros de 8 bits no interior do microcontrolador que trabalham independentemente do programa. No fim de cada conjunto de quatro ciclos de relógio do oscilador, ele incrementa o valor armazenado.
UNIDADE DE PROCESSAMENTO CENTRAL: Faz a conexão com todos os outros blocos do microcontrolador. Ele coordena o trabalho dos outros blocos durante a execução do programa.
19
PORTA A PORTA B
Esquema de um microcontrolador PIC com duas portas de E/S
Arquiteturas Harvard versus Von Neumann
A diferença principal entre microcontroladores e microprocessadores é a sua funcionalidade. Para que um microprocessador possa ser usado, outros componentes devem ser adicionados ao circuito, tais como, memória e componentes para receber e enviar dados. O microcontrolador foi projetado para ter tudo em só dispositivo, podendo operar sem outros componentes externos.
Outro aspecto que pode diferenciar microcontroladores e microprocessadores é a sua arquitetura. Os microcontroladores PIC apresentam uma arquitetura Harvard, onde a
20
memória de dados está separada da memória de programa. Assim, é possível um acesso concorrente as duas memórias e assim, obter uma maior velocidade de funcionamento. A separação da memória de dados da memória de programa, faz com que as instruções possam ser representadas por palavras de mais que 8 bits. O PIC16F877, usa 14 bits para cada instrução, o que permite que todas as instruções ocupem uma só palavra de instrução. É também típico da arquitetura Harvard ter um conjunto reduzido de instruções, geralmente executadas em apenas um ciclo de máquina. No caso do PIC 16F877 este conjunto é formado por apenas 35 instruções. Esta característica lhe rende também a designação de dispositivo RISC (Reduced Instruction Set Computer). Todas as instruções são executadas num único ciclo de máquina, exceto no caso de instruções de salto e de ramificação.
Estrutura do PIC 16F877
Memória flash para instruções (program memory) com 14 bits/palavra (cada instrução do PIC16F8X tem 14 bits!);
8K x 14 bits de memória flash;
368 x 8 bits de4 memória RAM;
256 x 8 bits de memória EEPROM;
Pilha implementada por hardware com 8 níveis (até 8 chamadas de rotinas aninhadas)
5 Portas de E/S;
14 fontes de interrupção (internas e externas);
Dois módulos de Captura/Comparação/PWM;
Conversor A/D de 10 bits com entradas multiplexadas;
Porta serial síncrona com SPI (máster mode) e I2C (master/slave);
USART/SCI;
Porta paralela com 8 bits de dados e sinais de controle externos (RD, WR e CS);
Timer/Counter programável e um Watchdog Timer embutidos, este com seu próprio oscilador, para aplicações de Tempo Real críticas;
Recursos de hardware para proteção de código, modo de operação com baixo consumo de energia (sleep), programação "in-circuit", alta corrente de saída para LEDs (25 mA), power-on-reset, power-up timer, etc
21
Relógio / Ciclo de instrução
O relógio (clock), que determina a freqüência de operação do PIC é dividido internamente em quatro fases, Q1, Q2, Q3 e Q4 que não se sobrepõem. Estas quatro fases compõem um ciclo de instrução (também chamado ciclo de máquina), durante o qual uma instrução é executada.A execução de uma instrução, é antecedida pela extração da instrução que está na linha seguinte. O código da instrução é extraído da memória de programa em Q1 e é escrito no registro de instrução em Q4. A decodificação e execução dessa mesma instrução, fazem-se entre as fases Q1 e Q4 seguintes. No diagrama abaixo, pode-se observar a relação entre o ciclo de instrução e o clock do oscilador (OSC1) assim como as fases Q1-Q4.O contador de programa (ProgramCounter ou PC) guarda o endereço da próxima instrução a ser executada.
Cada ciclo de instrução inclui as fases Q1, Q2, Q3 e Q4. A extração do código de uma instrução da memória de programa, é feita num ciclo de instrução, enquanto que a sua decodificação e execução, são feitos no ciclo de instrução seguinte. Contudo, devido à sobreposição – pipelining (o microcontrolador ao mesmo tempo em que executa uma instrução extrai simultaneamente da memória o código da instrução seguinte), pode-se considerar que, para efeitos práticos, cada instrução demora um ciclo de instrução para ser executada. No entanto, se a instrução provocar uma mudança no conteúdo do contador de programa (PC), ou seja, se o PC não tiver que apontar para o endereço seguinte na memória de programa, mas sim para outro (como no caso de saltos ou de chamadas de subrotinas), então deverá considerar-se que a execução desta instrução demora dois ciclos. Isto acontece, porque a instrução vai ter que ser processada de novo, mas, desta vez, a partir do endereço correto. O ciclo de chamada começa na fase Q1, escrevendo a instrução no registro de instrução (InstructionRegister – IR). A decodificação e execução continuam nas fases Q2, Q3 e Q4 do clock.
22
Fluxograma das Instruções no Pipeline
TCY0: É lido da memória o código da instrução MOVLW 55h;
TCY1: É executada a instrução MOVLW 55h e é lida da memória a instrução MOVWF PORTB;TCY2: Éexecutada a instrução MOVWF PORTB e lida a instrução CALL SUB_1;TCY3: É executada a chamada (call) de um subprograma CALL SUB_1 e é lida a instrução BSF PORTA,BIT3. Como esta instrução não é a próxima instrução a ser executada (primeira instrução do subprograma SUB_1), a leitura de uma instrução tem que ser feita de novo. Este é um exemplo de uma instrução que precisa de mais que um ciclo.TCY4: este ciclo de instrução é totalmente usado para ler a primeira instrução do subprograma no endereço SUB_1;
TCY5: É executada a primeira instrução do subprograma SUB_1 e lida a instrução seguinte.
Unidade Central de Processamento
A unidade central de processamento (CPU) é o cérebro do microcontrolador. Essa parte é responsável por extrair a instrução da memória de programa, decodificar essa instrução e executá-la.
23
Direto
Registros
Registro
Registro
Indireto
Esquema da unidade central de processamento – CPU
A principal função da unidade central de processamento é a de decodificar as instruções do programa. A cada uma das instruções do conjunto do microcontrolador, corresponde um conjunto de ações para a implementação da instrução. Estas ações podem envolver transferências de dados de um local de memória para outro, de um local de memória para as portas, e diversos cálculos.
Unidade Lógica e Aritmética (ULA)
A ULA do PIC possui 8 bits de largura e um único acumulador denominado w (“workingregister”). Ela faz operações aritméticas de soma e subtração (em 2- complemento) e operações lógicas como rotate, and, or, xoretc.
Nas operações lógicas e aritméticas com 2 operandos, o acumulador w é sempre um dos operandos e qualquer um dos 80 registradores f pode ser o 2º operando (ou uma constante de 8 bits ou literal, codificada na própria instrução).
Instruções lógico/aritméticas com um só operando (por exemploinc, dec, clr, com, bit set, etc) tomam como operando ou o acumulador w ou um registrador f.
As instruções lógicas e aritméticas podem atualizar os bits Z (zero) ,C (carry) e DC (digitcarry) do registrador de estado (f = 03).
Uma característica interessante das instruções com dois operandos envolvendo w e um registrador f é que um bit na instrução permite escolher se o resultado vai para o acumulador w (bit= 0) ou para o registrador f (bit = 1), permitindo algumas operações pouco convencionais como: f - w => w.
24
Nos mnemônicos das instruções do PIC o destino do resultado é designado genericamente pela letra d e especificamente pelas letras f ou w (é conveniente, portanto, definir nos programas em assembler duas constantes w e f com as diretivas: w equ0 e f equ 1). Por exemplo: a instrução movf f, w move o conteúdo de um registrador genérico f para o acumulador w, a instrução movwf f move o conteúdo do acumulador w para um registrador genérico f e a instrução movlw k move uma constante k para w.
Obs: Existem dois paradigmas largamente utilizados para codificação simbólica de instruções com dois operandos: o paradigma da Intel, onde uma instrução genérica do tipo:
opr dest, source significa: dest <= destoprsource
(interprete o símbolo <= como "recebe" e opr como a operação feita pela instrução)
e o paradigma do minicomputador PDP11 e seus seguidores como os microprocessadores Motorola MCHC11 e MC68000, onde uma instrução do tipo:
oprsource, dest significa: sourceoprdest =>dest
( interprete o símbolo => como "vai para" )
O PIC 16F8X adota o paradigma do PDP11, porém de forma não ortogonal como pode ser notado claramente nas 3 instruções vistas anteriormente.
Unidade lógica-aritmética
Diagrama de blocos do PIC 16F877
25
26
Registradores “f” especiais (SFR - Special File Registers)
Os registradores f de número 0 a 0xb são especiais, mas podem ser (na sua maioria) lidos/alterados por qualquer instrução envolvendo um registrador f. Alguns refletem o estado da CPU e são particularmente importantes para o programador assembler:
Registrador STATUS
Bit 0 C (Carry) Transporte: Este bit é afetado pelas operações de adição, subtração e deslocamento. É setado (assume o valor 1), quando na subtração X – Y, X é menor que Y e é resetado (assume o valor 0), quando na subtração X-Y, X é maior que Y.
1= Ocorreu um transporte no bit mais significativo
0= Não ocorreu transporte no bit mais significativo
O bit C é afetado pelas instruções ADDWF, ADDLW, SUBLW e SUBWF.
Bit 1 DC (DigitCarry) Transporte de dígito: Este bit é afetado pelas operações de adição e subtração. Ao contrário do anterior, DC assinala um transporte do bit 3 para o bit 4 do resultado. Este bit recebe o valor ‘1’, quando na subtração X – Y, X é menor que Y e recebe o valor ‘0’, quando na subtração X-Y, X é maior que Y.
1= Ocorreu um transporte no quarto bit mais significativo
0= Não ocorreu transporte nesse bit
O bit DC é afetado pelas instruções ADDWF, ADDLW, SUBLW e SUBWF.
Bit 2 Z (bit Zero) Indicação de resultado igual a zero: Este bit recebe o valor ‘1’ quando o resultado da operação lógica ou aritmética executada é igual a 0.
1= resultado igual a zero
0= resultado diferente de zero
27
Bit 3PD (Bit de queda de tensão – Power Down): Este bit recebe ‘1’ quando o microcontrolador é alimentado e começa a trabalhar, depois de um reset normal e depois da execução da instrução CLRWDT. A instrução SLEEP põe este bit em ‘0’ ou seja, quando o microcontrolador entra no regime de baixo consumo / pouco trabalho. Este bit pode também ser setado (assume o valor 1), no caso de ocorrer um impulso no pino RB0/INT, uma variação nos quatro bits mais significativos da porta B, ou quando é concluída uma operação de escrita na DATA EEPROM ou ainda pelo watchdog.
1 = depois de ter sido ligada a alimentação
0 = depois da execução de uma instrução SLEEP
Bit 4TO (Time-out - transbordo do Watchdog): Este bit recebe ‘1’, depois da alimentação ser ligada e depois da execução das instruções CLRWDT e SLEEP. O bit recebe ‘0’ quando o watchdog consegue chegar ao fim da sua contagem (overflow = transbordar), o que indica que qualquer coisa não esteve bem.
1 = não ocorreu transbordo
0 = ocorreu transbordo
bits 5 e 6RP1:RP0 (bits de seleção de banco de registros): Estes dois bits são a parte mais significativa do endereço utilizado para endereçamento direto. Como as instruções que endereçam diretamente a memória dispõem somente de sete bits, é preciso mais um ou dois bits para poder endereçar todos os registros (memória RAM) do PIC16F8X.
11 = banco de registros 3
10 = banco de registros 2
01 = banco de registros 1
00 = banco de registros 0
Bit 7 IRP (Bit de seleção de banco de registros):Este bit é utilizado no endereçamento indireto da RAM interna, como oitavo bit 1 = bancos 2 e 3 0 = bancos 0 e 1 (endereços de 00h a FFh)
O registro de estado (STATUS), contém o estado da ALU (C, DC, Z), estado de RESET (TO, PD) e os bits para seleção do banco de memória (IRP, RP1, RP0). Considerando que a seleção do banco de memória é controlada através deste registro, ele tem que estar presente em todos os bancos.
28
Registrador OPTION
Bits 0 a 2 PS0, PS1, PS2 (bits de seleção do divisor Prescaler): Estes três bits definem o fator de divisão do prescaler.
Bit 3 PSA (Bit de Atribuição do Prescaler): Bit que atribui o prescaler ao TMR0 ou ao watchdog.1 = prescaler atribuído ao watchdog
0 = prescaler atribuído ao temporizador TMR0
Bit 4 T0SE (bit de seleção de borda ativa em TMR0): Se for permitido aplicar impulsos em TMR0, a partir do pino RA4/TOCK1, este bit determina se os impulsos ativos são os impulsos ascendentes ou os impulsos descendentes.
1 = Borda descendente
0 = Borda ascendente
Bit 5 TOCS (bit de seleção de fonte de clock em TMR0): Este pino escolhe a fonte de impulsos que vai ser ligada ao temporizador. Esta fonte pode ser o clock do microcontrolador (freqüência de clock a dividir por 4) ou impulsos externos no pino RA4/TOCKI.1 = impulsos externos
0 = ¼ do clock interno
29
Bit 6 INDEDG (bit de seleção de borda de interrupção): Se esta interrupção estiver habilitada, é possível definir a borda que vai ativar a interrupção no pino RB0/INT.1 = borda ascendente
0 = borda descendente
Bit 7 RBPU (Habilitação dos resistores de pull-up nos bits da porta B): Este bit introduz ou retira as resistências internas de pull-up da porta B.
1 = resistências de “pull-up” desligadas
0 = resistências de “pull-up” ligadas
Organização da Memória
O PIC16F877 tem dois blocos de memória separados, um para dados e o outro para o programa. A memória EEPROM e os registros de uso genérico (GPR) na memória RAM constituem o bloco para dados e a memória FLASH constitui o bloco de programa.
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 se obter a versão definitiva do programa. No PIC 16F877 o tamanho da memória de programa é de 8192 endereços de palavras de 14 bits, destes, os endereços zero e quatro estão reservados respectivamente para o reset e para o vetor de interrupção.
Memória de dados
A memória de dados compreende memória EEPROM e memória RAM. A memória EEPROM consiste em 256 posições para palavras de oito bits. A memória EEPROM não faz parte diretamente do espaço de memória mas é acessada indiretamente através dos registros EEADR e EEDATA. Como a memória EEPROM serve em geral para armazenar dados que devem ser mantidos mesmo após o desligamento do sistema onde o microcontrolador está inserido, existe um procedimento específico para escrever na EEPROM que tem que ser seguido de modo a evitar uma escrita acidental. A memória RAM para dados, ocupa um espaço no mapa de memória que varia de acordo com o banco de memória usado, conforme indicado na tabela abaixo
Banco Faixa de endereços da RAM
30
0 0x20 a 0x7F
1 0xA0 a 0xEF
2 0x110 a 0x16F
3 0x190 a 0x1F0
Os locais da memória RAM são também chamados registros GPR (General Purpose Registers = Registros de uso geral). Os registros GPR podem ser acessados sem referenciar o banco de memória em que o mesmo se encontra.
Registros SFR
Os registros que ocupam 12 primeiras localizações nos bancos 0 a 4 são registros especiais e têm a ver com a manipulação de certos blocos do microcontrolador. Estes registros são os SFR (Special Function Registers ou Registros de Funções Especiais).
31
Mapa de Registros do PIC 16F877
32
Contador de Programa
O contador de programa (PC = Program Counter), é um registro de 13 bits que contém o endereço da instrução que vai ser executada.
PilhaO PIC16F877 tem uma pilha (stack) de 13 bits e 8 níveis de profundidade, o que corresponde a 8 locais de memória com 13 bits de largura. O seu papel básico é guardar o valor do contador de programa quando ocorre um salto do programa principal para o endereço de um subprograma a ser executado. Depois de ter executado o subprograma, para que o microcontrolador possa continuar com o programa principal a partir do ponto em que o deixou, ele tem que buscar na pilha esse endereço e carregá-lo no contador de programa. Quando ocorre o desvio de um programa para um subprograma, o conteúdo do contador de programa é salvo na da pilha (um exemplo disto é a instrução CALL). Quando são executadas instruções tais como RETURN, RETLW ou RETFIE no fim de um subprograma, o contador de programa é retirado da pilha, de modo que o programa possa continuar a partir do ponto em que a seqüência foi interrompida. Estas operações de colocar e extrair da pilha o contador de programa, são designadas por PUSH (colocar na pilha) e POP (retirar da pilha), estes dois nomes provêm de instruções com estas designações, existentes em alguns microcontroladores de maior porte.
Programação no Sistema
Para programar a memória de programa, o microcontrolador tem que entrar num modo especial de funcionamento no qual o pino MCLR é posto a 13,5V e a voltagem da alimentação Vdd deve permanecer estável entre 4,5V e 5,5V. A memória de programa pode ser programada em série, usando dois pinos ‘data/clock’ que devem ser previamente separados do dispositivo em que o microcontrolador está inserido, de modo que não possam ocorrer erros durante a programação.
Modos de endereçamento
Os locais da memória RAM podem ser acessados direta ou indiretamente.
Endereçamento Direto
O endereçamento direto é feito através de um endereço de 9 bits. Este endereço é obtido juntando aos sete bits do endereço direto de uma instrução, mais dois bits (RP1 e RP0) do registro STATUS, como pode ser visto na figura que se segue. Qualquer acesso aos registros especiais (SFR), pode ser um exemplo de endereçamento direto.
33
Bsf STATUS, RP0 :banco 0
movlw 0xFF :w = 0xFF
movwf TRISA :o endereço do registro TRISA é retirado do código da instrução movwf TRISA
Seleção de Banco
Seleção de Registro
Registro
Endereçamento Direto
Endereçamento Indireto
O endereçamento indireto, não retira um endereço do código da instrução. O endereço é obtido com a ajuda do bit IRP do registro STATUS e do registro FSR. O local endereçado é acessado através do registro INDF e coincide com o endereço contido em FSR (qualquer instrução que use INDF como registro, na realidade acessa os dados apontados pelo registro FSR). Por exemplo, considere que o registro de uso genérico de endereço 0Fh contém o valor 20. Escrevendo o valor 0Fh no registro FSR, obtém-se um ponteiro para o registro 0Fh e, ao ler o registro INDF, obtém-se o valor 20, o que significa que foi lido o conteúdo do registro 0Fh, sem o mencionar explicitamente (mas através de FSR e INDF).
34
Registro FSR
Registro
Seleção de Banco
Seleção de Registro
Endereçamento Indireto
Interrupções
As interrupções são um mecanismo que o microcontrolador possui e que torna possível responder a alguns eventos no momento em que eles ocorrem. Geralmente, cada interrupção muda a direção de execução do programa, suspendendo a sua execução, enquanto o microcontrolador executa um subprograma que é a rotina de atendimento de interrupção. Depois deste subprograma ter sido executado, o microcontrolador continua com o programa principal, a partir do local em que o tinha abandonado.
Programa sendoexecutado
Interrupção externa e seqüência de desvios para atendimento da interrupção e retorno ao programa principal.
35
O registro que controla as interrupções é chamado INTCON e tem o endereço 0Bh. O papel do INTCON é permitir ou impedir as interrupções e, mesmo no caso de elas não serem permitidas, ele registra os pedidos de interrupção, mudando o valor de alguns dos seus bits.
Registrador INTCON
Bit 0 RBIF (flag que indica variação na porta B): Bit que informa que houve mudança nos níveis lógicos nos pinos 4, 5, 6 e 7 da porta B.
1= pelo menos um destes pinos mudou de nível lógico
0= não ocorreu nenhuma variação nestes pinos
Bit 1 INTF (flag de interrupção externa INT): Ocorrência de uma interrupção externa 1= ocorreu uma interrupção externa
0= não ocorreu uma interrupção externa
Se uma transição ascendente ou descendente for detectada no pino RB0/INT, o bit INTF ajustado para ‘1’ (o tipo de sensibilidade, ascendente ou descendente é definida através do bit INTEDG do registro OPTION). O subprograma de atendimento desta interrupção, deveresetar este bit, afim de que a próxima interrupção possa ser detectada.
Bit 2 TOIF (Flag de interrupção por transbordo de TMR0): O contador TMR0, transbordou.1= o contador mudou a contagem de FFh para 00h
0= o contador não transbordou
Para que esta interrupção seja detectada, o programa deve resetar este bit.
Bit 3 RBIE (bit de habilitação de interrupção por variação na porta B): Habilitação da interrupção por variação dos níveis lógicos nos pinos 4, 5, 6 e 7 da porta B.
36
1= habilita a interrupção por variação dos níveis lógicos
0= inibe a interrupção por variação dos níveis lógicos
A interrupção só pode ocorrer se RBIE e RBIF estiverem simultaneamente em ‘1’ lógico.
Bit 4 INTE (bit de habilitação da interrupção externa INT): Bit que habilita uma interrupção externa no bit RB0/INT.
1= interrupção externa habilitada
0= interrupção externa desabilitada
A interrupção só pode ocorrer se INTE e INTF estiverem simultaneamente em‘1’ lógico.
Bit 5 TOIE (bit de habilitação de interrupção por transbordo de TMR0): Bit que habilita a interrupção por transbordo do contador TMR0.
1= interrupção habilitada
0= interrupção desabilitada
A interrupção só pode ocorrer se TOIE e TOIF estiverem simultaneamente em ‘1’ lógico.
Bit 6 PEIE (bit de habilitação de interrupção dos periféricos): Bit que habilita as interrupções geradas pelos periféricos.
1= habilita todas as interrupções dos periféricos
0= desabilita todas as interrupções dos periféricos
Se EEIE e EEIF (que pertence ao registro EECON1) estiverem simultaneamente em ‘1’, a interrupção pode ocorrer.
Bit 7 GIE (bit de habilitação global de interrupção): Bit que habilita ou desabilita todas as interrupções. 1= todas as interrupções são permitidas
0= todas as interrupções impedidas
37
De um modo geral, cada fonte de interrupção tem dois bits associados. Um habilita a interrupção e o outro assinala quando a interrupção ocorre. Existe um bit comum a todas as interrupções chamado GIE que pode ser usado para desabilitar ou habilitar todas as interrupções, simultaneamente. Este bit é muito útil quando se está escrevendo um programa porque permite que todas as interrupções sejam impedidas durante um período de tempo, de tal maneira que a execução de uma parte crítica do programa não possa ser interrompida. Quando a instrução que faz GIE= 0 é executada (GIE= 0 impede todas as interrupções), todos os pedidos de interrupção pendentes, serão ignorados.
Memória de dados EEPROM
O PIC16F877 tem 256 bytes de localizações de memória EEPROM, correspondentes aos endereços de 00h a FFh e onde podemos ler e escrever. A característica mais importante desta memória é de não perder o seu conteúdo quando a alimentação é desligada. Na prática, isso significa que os dados escritos permanecem no microcontrolador, mesmo quando a alimentação é desligada. Sem alimentação, estes dados permanecem no microcontrolador durante mais de 40 anos (especificações do fabricante do microcontrolador PIC), além disso, esta memória suporta até 10000 operações de escrita.
A memória EEPROM é colocada num espaço de memória especial e pode ser acessada através dos registros especiais:
EEDATA (endereço 10Ch): Contém o byte menos significativo do dado de 14 bits a ser lido/escrito na EEPROM;
EEDATAH (endereço 10Eh): Contém o byte mais significativo do dado de 14 bits a ser lido/escrito na EEPROM;
EEADR (endereço 10Dh): Contém o byte menos significativo do endereço de 13 bits da posição de memória da EEPROM a ser lida/escrita;
EEADRH (endereço 10Fh): Contém o byte mais significativo do endereço de 13 bits da posição de memória da EEPROM a ser lida/escrita;
EECON1 (endereço 18Ch): Registrador de controle de acesso a memória EEPROM;
EECON2 (endereço 18Dh): Este registro não existe fisicamente e serve para proteger a EEPROM de uma escrita acidental.
38
O registro EECON1 ocupa o endereço 18Ch e é um registro de controle com cinco bits implementados.Os bits 4, 5 e 6 não são usados e, se forem lidos, são sempre iguais a zero.
Os bits do registro EECON1, devem ser interpretados do modo que se segue.
Bit 0 RD (bit de controle de leitura): Ao setar este bit (Bit 0 = 1), tem início a transferência do dado do endereço definido em EEADRH:EEADR para o registro EEDATAH:EEDATA. Como o tempo não é essencial, tanto na leitura como na escrita, o dado de EEDATAH: EEDATA pode já ser usado na instrução seguinte.
1 = inicia a leitura
0 = não inicia a leitura
Este bit é resetado, (Bit 0 = 0) por hardware uma vez que a escrita tenha terminado.
Bit 1 WR (bit de controle de escrita): Ao setar este bit ( Bit 1 = 1), tem início a escrita do dado a partir do registro EEDATAH:EEDATA para o endereço especificado no registro EEADRH:EEADR.
1 = inicia a escrita
0 = não inicia a escrita
Este bit é resetado, (Bit 1 = 0) por hardware uma vez que a escrita tenha terminado.
Bit 2 WREN (bit de habilitação de escrita na EEPROM): Permite a escrita na EEPROM.Se este bit não estiver em um lógico, o microcontrolador não permite a escrita na EEPROM.
1 = a escrita é permitida
0 = não se pode escrever
39
Bit 3 WRERR (Erro de escrita na EEPROM): Erro durante a escrita na EEPROMEste bit é setado (Bit 3 = 1) quando a escrita na EEPROM for interrompida por um sinal de reset ou por um transbordo no temporizador do watchdog (no caso deste estar ativo).
1 = ocorreu um erro
0 = não houve erros
Bit 7 EEPGD (Bit que indica acesso a memória de programa (FLASH) ou a memória de dados EEPROM)
1 = Acesso a memória de programa (FLASH)
0 = Acesso a memória de dados (EEPROM)
Portas de E/S
Alguns pinos das portas de E/S são multiplexados com uma função alternativa de um periférico do microcontrolador. Em geral, quando o periférico é habilitado este pino não pode ser utilizado como um pino de E/S de propósito geral.
Porta A e o registrador TRISA
A porta A é uma porta de E/S bidirecional de 6 bits de largura. A direção que os pinos assumem (entrada ou saída) é determinada pelos bits do registrador TRISA, setando um bit de TRISA, faz com que o correspondente pino da porta funcione como entrada. Resetando o bit, o respectivo pino funciona como saída. Uma operação de leitura da porta, lê o valor dos pinos, enquanto em uma escrita o dado é copiado para o “latch” da porta.
O pino RA4 é multiplexado com a entrada de clock do módulo Timer0 (pino RA4/T0CKI). Outros pinos da porta A são multiplexados com entradas analógicas e entradas analógicas VREF. A operação de cada pino é selecionada setando/resetando os bits de controle no registradorADCON1 (A/D Control Register1). O registrador TRISA controla a direção dos pinos da porta A mesmo quando eles são usados como entradas analógicas, neste caso os respectivos bits do TRISA devem estar setados.
EXEMPLO: Inicialização da porta A
40
BCF STATUS, RP0 ;
BCF STATUS, RP1 ; Bank0
CLRF PORTA ;Initialize PORTA byclearing output data latches
BSF STATUS, RP0 ;Select Bank 1
MOVLW 0x06 ; Configure all pins
MOVWF ADCON1 ; as digital inputs
MOVLW 0xCF ; Valueusedtoinitialize data direction
MOVWF TRISA ; Set RA<3:0> as inputs; RA<5:4> as outputs; TRISA<7:6> are always; read as ’0’.
Tabela: Funções dos pinos da porta A
Resumo dos registradores associados a porta A
Porta B e o registrador TRISB
A porta B é uma porta de E/S bidirecional de 8 bits de largura. A direção que os pinos assumem (entrada ou saída) é determinada pelos bits do registrador TRISB, setando um bit de TRISB, faz com que o correspondente pino da porta funcione como entrada. Resetando o bit, o respectivo pino funciona como saída. Uma operação de leitura da porta, lê o valor dos pinos, enquanto em uma escrita o dado é copiado para o “latch” da porta.
41
Três pinos da porta B são multiplexados com a função de Programação em Baixa Tensão (RB3/PGM, RB6/PGC e RB7/PGD). Cada pino da porta B pode ser ajustado para funcionar com um resistor de pull-up. O bit RBPU (OPTION_REG<7>) controla esta configuração, quando resetado ativa os resistores de pull-up.
Os pinos de RB7 a RB4 podem gerar interrupções quando configurados como pinos de entrada. Os valores dos pinos são comparados com o valor da última leitura destes pinos, gravada no latch. As diferenças dos quatro pinos passa por uma operação lógica OU, para gerar a interrupção “RB PortChange” e ajustar o respectivo bit de flag RBIF (Bit 0 do registrador INTCON). RB0/INT pode ser configurado também como um pino de interrupção. A borda que identifica a interrupção é configurada a partir do bit INTEDG (bit 6) do registrador OPTION.
Tabela: Funções dos pinos da porta B
Resumo dos registradores associados a porta B
42
Porta C e o registrador TRISC
A porta C é uma porta de E/S bidirecional de 8 bits de largura. A direção que os pinos assumem (entrada ou saída) é determinada pelos bits do registrador TRISC, setando um bit de TRISC faz com que o correspondente pino da porta funcione como entrada. Resetando o bit, o respectivo pino funciona como saída. Uma operação de leitura da porta, lê o valor dos pinos, enquanto em uma escrita o dado é copiado para o “latch” da porta.
Quando funções de periféricos forem habilitadas, deve ser observado se não há uma sobreposição de configurações,já que alguns periféricos sobrepõem sua configuração originalmente definida no registrador TRISC.
Tabela: Funções dos pinos da porta C
Resumo dos registradores associados a porta C
Porta D e o registrador TRISD
43
A porta D é uma porta de E/S bidirecional de 8 bits de largura. A direção que os pinos assumem (entrada ou saída) é determinada pelos bits do registrador TRISD, setando um bit de TRISD faz com que o correspondente pino da porta funcione como entrada. Resetando o bit, o respectivo pino funciona como saída. Uma operação de leitura da porta, lê o valor dos pinos, enquanto em uma escrita o dado é copiado para o “latch” da porta.
A porta D pode ser configurada como uma porta paralela de 8 bits, setando o bit de controle
PSPMODE (bit 4) do registrador TRISE. Nesse modo, os buffers de entrada são TTL.
Tabela: Funções dos pinos da porta D
Resumo dos registradores associados a porta D
A porta E tem três pinos, RE0/RD/AN5, RE1/WR/AN6 e RE2/CS/AN7, que são individualmente configurados como entrada ou como saída. A porta de E torna-se entrada de controle para a porta paralela (porta D), quando o bitPSPMODE (bit 4 de TRISE) é setado. Nesse modo, os bits de 2 a 0 de TRISE devem estar setados para configurar os respectivos pinos da porta E como entradas digitais e os bits PCFG3:PCFG0 do registrador ADCON1 deve estar ajustados para configurar RE2:RE0 como E/S digital.
44
Os pinos da porta E são multiplexados com entradas analógicas. Quando selecionados como uma entrada analógica, leituras desses pinos retornam 0. O TRISE controla a direção dos pinos RE mesmo quando eles estão sendo usados como entradas analógicas (deve ser garantido que os pinos estão configurados como entradas pelo TRISE, quando os mesmos funcionam como entradas analógicas ).
Função dos bits do registrador TRISE (Endereço 89h)
45
Tabela: Funções dos pinos da porta E
Resumo dos registradores associados a porta E
Características especiais da CPU
O PIC16F877 possui um conjunto de características que permite customizar a sua operação sem a necessidade de componentes externos. São elas:
Seleção de Oscilador
Seleção do modo de Reset
o Power-on Reset (POR)
o Power-up Timer (PWRT)
o OscillatorStart-up Timer (OST)
o Brown-out Reset (BOR)
Interrupções46
Watchdog Timer (WDT)
SLEEP
Proteção de código
ID locations
Programação serial In-Circuit
Programação serial In-Circuit em baixa tensão
In-CircuitDebugger
O WatchDog timer pode ser desligado apenas ajustando alguns bits de configuração. O mesmo possui o próprio oscilador. Há dois Timers que geram os atrasos necessários quando o microcontrolador é ativado, o OST (OscilatorStart-up Timer), que mantém o PIC em RESST até o oscilador a cristal estabilizar e o PWRT (Power-up Timer), que gera um atraso fixo de 72 ms quando o PIC é energizado (mantém o PIC em RESET enquanto a tensão da fonte estabiliza).
O modo SLEEP foi desenvolvido para oferecer um consume muito baixo quando o PIC está no modo “power-down”. A saída do modo SLEEP pode ocorrer por reset externo, “Watchdog Timer Wake-up” ou através de uma interrupção.
Diferentes opções de osciladores são disponibilizadas, para permitir uma perfeita adequação do PIC ao sistema. A opção RC diminui custos, enquanto a opção LC economiza energia. Um conjunto de bits de configuração são usados para selecionar as opções.
Bits de configuração
Os bits de configuração são mapeados na memória de programa, no endereço 2007h. O endereço 2007h está dentro do espaço de memória de programa do usuário (pertence ao espaço de memória especial de teste e configuração – 2000h a 3FFFh), que pode ser acessado apenas durante a programação.
Palavra de configuração
47
Tipos de osciladores
O PIC 16F87X pode ser operado em quatro modos distintos de oscilação. O usuário pode programar um dos modos abaixo a partir dos bits (FOSC1 and FOSC0):
LP Low Power Crystal
XT Crystal/Resonator
HS High Speed Crystal/Resonator
RC Resistor/Capacitor
48
Nos modos XT, LP ou HS,um cristal deve ser conectado aos pinos OSC1/CLKIN e OSC2/CLKOUT para estabelecer a oscilação. Quando nos modos XT, LP ou HS, o dispositivo pode ter um fonte externa de clock para acionar o pino OSC1/CLKIN.
Para aplicações insensíveis a variações de tempo, a opção RC apresenta baixo custo de implementação, no entanto, a freqüência do oscilador variará em função de variações da tensão da fonte e dos valores de R e C
Reset
The PIC16F87X pode operar com vários tipos de reset:
Power-on Reset (POR)
MCLR reset during normal operation
MCLR reset during SLEEP
WDT Reset (during normal operation)
WDT Wake-up (during SLEEP)
Brown-out Reset (BOR)
Alguns registradores não são afetados em algumas condições de reset, Neste caso o status desses registradores é desconhecido no POR e não são alterados pelos outros modos de reset. Muitos outros registradores são ajustados para um estado de “reset” no POR, no MCLR e WDT reset, no NCLR durante o SLEEP e no BOR. Eles são afetados pro um WDT Wake-up, que é visto como um reinício de uma operação normal. Os bits TO e PD são setados ou resetados em diferentes situações de reset como indicado na tabela abaixo. Esses bits são usados para determinar o modo de reset.
Bits de status e seu significado 49
Power-On Reset (POR)
Um Power-on Reset pulso é gerado internamente ao chip quando uma subida de VDD é detectada (na faixa de 1,2V – 1,7V).
Power-up Timer (PWRT)
O Power-up Timer fornece um time-out nominal fixo de 72 ms na energização do PIC, após um POR. O chip é mantido em reset enquanto PWRT está ativo. O atraso gerado pelo PWRT’s time, permite o VDD atingir um nível aceitável de tensão para operação. Um bit de configuração é provido para permitir habilitar/desabilitar o PWRT.
Oscillator Start-up Timer (OST)
O OscillatorStart-up Timer (OST) fornece 1024 ciclos de oscilação de atraso (da entrada OSC1) ao fim do atraso do PWRT. Isso garante que o circuito de oscilação a cristal atingiu a sua estabilidade. O OST time-out é invocado apenas nos modos XT, LP e HS e apenas no Power-on Reset ou wake-up de SLEEP.
Brown-Out Reset (BOR)
O bit de configuração, BODEN, pode habilitar ou desabilitar o circuito Brown-out Reset. Se VDD cai abaixo de VBOR (parâmetro D005, aproximadamente4V) por mais do que TBOR (parâmetro #35, aproximadamente 100mS), a situação de brown-out resetará o PIC. If VDD cai abaixo de VBOR por menos que TBOR, um reset não poderá ocorrer.
Uma vez que o brown-out ocorra, o dispositivo permanecerá em brown-out reset até VDD subir acima deVBOR. O power-up timer então mantém o dispositivo em reset por TPWRT (parâmetro #33, aproximadamente 72mS). Se VDD deve cair abaixo de VBOR durante TPWRT, o processo de brown-out reset reinicia quando VDD sobe acima de VBOR com o
50
power-up timer reset. O power-up timer está sempre habilitado quando o circuito de brown-out reset está habilitado, independente do estado do bit de configuração PWRT
A tabela abaixo mostra a condição de reset para os registradores de STATUS, PCON e PC .
51
As tabelas abaixo mostram as condições de reset para todos os outros registradores.
52
53
Power Control/Status Register (PCON)
O registrador Power Control/Status, PCON, tem até dois bits, dependendo do dispositivo. O Bit0 é o bit de Brown-out Reset Status, BOR. O bit BOR é desconhecido no Power-on Reset. Ele deve ser setado pelo usuário e checado em subseqüentes resets para ver se o bit BOR está apagando, indicando que um BOR ocorreu. O bit BOR é um bit "don’tcare" e é necessário predizer se a circuitaria do Brown-out Reset está desabilitada (apagando o bit BODEN na palavra de configuração).
O bit 1 é o POR (Power-on Reset Status bit). Ele é apagado no Power-on Reset e não é afetado. O usuário deve setar este bit após um Power-on Reset.
Referências
1 – Microcontrolador PIC 16F8X - Resumo da Arquitetura, ,MC404B - Nov 2001 - Prof. Célio Guimarães.
2 – PIC16F87X Datasheet – Microchip Technology Incorporated. USA. Nov 1999.
3 - MicrocontroladoresPIC – mikroElektronika , 2003
54
PREPARAÇÃO1. Quantos ciclos de clock no total são gastos para realizar a busca e execução de uma
instrução no PIC?
2. Descreva a condição indicada por cada Flag (bits de 0 a 4) do registrador de “STATUS” do PIC.
3. Identifique os bits do registrador “OPTION” que configuram o preescalonador do clock que alimenta o TIMER0 ou WatchDog.
4. Identifique a faixa de endereços de cada bloco de memória de dados (memória RAM) do PIC.
5. O que deve ser feito para programar o pino de uma porta de I/O como:
a) Entrada digital;
b) Saída digital.
6. Quais os pinos da porta B podem gerar interrupções?
7. Indique em que condição ocorre o “Power-on-Reset” e o “Brown-Out-Reset”.
8. Explique que operação é realizada pelas instruções C para PIC abaixo:
OUTPUT_HIGH (PIN);
OUTPUT_LOW (PIN);
OUTPUT_BIT (PIN, VALUE);
OUTPUT_X (VALUE) (X=A, B, C,...);
9. Explique que operação é realizada pelas instruções C para PIC abaixo:
INPUT (PIN);
INPUT_X ( ), (X=A, B, C,...);
10. Explique que operação é realizada pelas instruções C para PIC abaixo:
DELAY_MS(VALOR);
DELAY_US(VALOR);
55
11. Explique que operação é realizada pelas instruções C para PIC abaixo:
SET_TRIS_x (VALOR) (x=a,b,c,d ou e, representa uma porta de I/O)
12. Elabore uma rotina em C que ao pressionar um botão, acenda um LED da placa de experimentos do PIC e ao apertar um segundo botão, apague o respectivo LED. Considere como pinos de entrada para leitura dos botões os pinos A3 e A4 da porta A. Considere como saída para acender o LED o pino B0 da porta B.
13. Elabore uma rotina em C que incremente um contador (variável do tipo int, 8 bits) a cada 0,1s (use a instrução delay_ms para gerar o atraso de 0,1s) e o escreva na porta D do PIC quando for pressionado um botão (use o código do item 12).
14. Elabore uma rotina em C que calcule o complemento de 2 do valor de 8 bits gerado pelo contador da rotina acima. Esse valor é selecionado a aplicar um sinal 0 (zero) a entrada B0 (conecte um botão ao pino B0 do PIC). Ao pressionar o botão o valor selecionado deve ser apresentado através de LED’s usando os 8 bits da porta D e 1 (um) segundo depois, deve ser apresentado o complemento de 2 do número, usando também a porta D como saída de dados.
9.2.1.8 Buzzer
Usado para geração de sinais sonoros.
O buzzer é um componente composto de duas camadas de metal e uma camada interna de
cristal piezoeléctrico. Ao ser alimentado com uma fonte de sinal, vibra na mesma frequência
recebida, funcionando como uma sirene ou alto-falante.Existem várias versões e tamanhos.
56
Sua vantagem em relação a alto-falantes comuns é que consome pouca energia em relação à
potência sonora, sendo facilmente alimentado com pequenas baterias.
Principais entradas para o Pic.
9.2.1.10 Jumper
Para seleção de Leds ou displays.
Jumper é uma ligação móvel entre dois pontos de um circuito eletrônico. É, geralmente, uma
pequena peça plástica isolante que contém uma peça metálica em seu interior, responsável
pela condução de eletricidade. Em circuitos impressos (PCB em inglês) são responsáveis por
desviar, ligar ou desligar o fluxo elétrico permitindo configurações específicas por meio físico
do hardware em questão. Em discos rígidos (HD) eles configuram o modo como a placa-
mãe reconhece o disco rígido no sistema. Podendo configurá-los como "master" ou "slave",
ou mesmo pode limitá-los a 32GiB de capacidade.
Também denomina-se "Jumper" a um segmento de fio condutor soldado diretamente às ilhas
de uma placa de circuito impresso com a função de interligar dois pontos do circuito.
9.2.1.11 Resistores
Para controle da corrente dos Leds
Um resistor é um dispositivo elétrico muito utilizado em eletrônica, ora com a finalidade de
transformar energia elétrica em energia térmica por meio do efeito joule, ora com a finalidade
de limitar a corrente elétrica em um circuito.
Resistores são componentes que têm por finalidade oferecer uma oposição à passagem
de corrente elétrica, através de seu material. A essa oposição damos o nome de resistência
elétrica, que possui como unidade o ohm. Causam uma queda de tensão em alguma parte de
um circuito elétrico, porém jamais causam quedas de corrente elétrica. Isso significa que a
corrente elétrica que entra em um terminal do resistor será exatamente a mesma que sai pelo
57
outro terminal, porém há uma queda de tensão. Utilizando-se disso, é possível usar os
resistores para controlar a corrente elétrica sobre os componentes desejados.
Um resistor ideal é um componente com uma resistência elétrica que permanece constante
independentemente da tensão ou corrente elétrica que circular pelo dispositivo.
Os resistores podem ser fixos ou variáveis. Neste caso são chamados
de potenciômetros ou reostatos. O valor nominal é alterado ao girar um eixo ou deslizar uma
alavanca.
O valor de um resistor de carbono pode ser facilmente identificado de acordo com as cores
que apresenta na cápsula que envolve o material resistivo, ou então usando um ohmímetro.
Alguns resistores são longos e finos, com o material resistivo colocado ao centro, e um
terminal de metal ligado em cada extremidade. Este tipo de encapsulamento é chamado de
encapsulamento axial. A fotografia a direita mostra os resistores em uma tira geralmente
usados para a pré-formatação dos terminais. Resistores usados em computadores e outros
dispositivos são tipicamente muito menores, freqüentemente são utilizadas tecnologia de
montagem superficial (Surface-mounttechnology), ou SMT, esse tipo de resistor não tem
"perna" de metal (terminal). Resistores de maiores potências são produzidos mais robustos
para dissipar calor de maneira mais eficiente, mas eles seguem basicamente a mesma
estrutura.
9.2.1.12 Interface para gravação do Pic
Conectado a um computador através de cabo USB, permite a transferência e gravação de
programas para a memória do controlador.
58
9.2.1.13 Cristal e capacitores cerâmicos
Usados para geração de clock para o controlador de gravação.
Capacitor é um componente que armazena energia num campo elétrico, acumulando um
desequilíbrio interno de carga elétrica.
9.2.1.14 Controlador
Usado para efetuar a gravação do Pic.
59
10 - Anexos
10.1 - Set Instruções
Cada instrução do PIC16F628A tem o tamanho de 14 bits, onde alguns destes bits são usados
para especificar o OPCODE (nome dado ao "comando" assembly), e de zero até dois
operandos. Por conveniência, a ultima categoria foi dividida em literal e controle.
O formato das instruções pode variar de acordo com o tipo, abaixo o formato da instrução do
PIC para cada tipo. A figura abaixo mostra os formatos de instrução do PIC16F628A.
As tabelas seguintes apresentam todas as instruções do PIC16F628A, com os seus respectivos
operandos.
60
Orientadas a bit00011
Orientadas a byte
61
De controle (quando efetuam desvios gastam 2 ciclos)
62
Operações com literais
63
Legenda:
X = não importa o valor do bit
k = o bit pertence a um literal
f = O bit pertence a um endereço de registrador
d = onde o resultado será armazenado W(d=0) ou F(d=1)
64
10.2 - Programa Exemplo
Este programa foi inicialmente desenvolvido e serviu de modelo para o programa
aperfeiçoado neste trabalho no item 8 – Programa / Software.
/*Programa para a ATPS de Microcontroladores.
Este programa simula um controlador de acesso, onde ao se pressionar os botões corretos, o
microcontrolador aciona leds simulando a abertura de uma porta.*/
voidmain()
{
CMCON=0x07; // CONFIGURA I/Os DIGITAIS
TRISA=0xFF; // CONFIGURA TODO O PORT A COMO ENTRADA
TRISB=0x00; // CONFIGURA TODO O PORT B COMO SAÍDA
PORTB=0; // INICIA O PORT B DESLIGADO
while(1)
{
if(PORTA.RA4&&PORTA.RA1==1) // TESTA A SENHA
{
PORTB.RB6=1; // ACENDE O LED VERDE 3
PORTB.RB0=1; // ACENDE O LED VERDE 8
PORTB.RB7=0; // APAGA O LED VERMELHO 1
PORTB.RB2=0; // APAGA O LED VERMELHO 6
} // FECHA A INSTRUÇÃO if
else
{
PORTB.RB7=1; // ACENDE O LED VERMELHO 1
PORTB.RB2=1; // ACENDE O LED VERMELHO 6
PORTB.RB0=0; // APAGA O LED VERDE 8
PORTB.RB6=0; // APAGA O LED VERDE 3
65
} // FECHA A INSTRUÇÃO else
} // FECHA A INSTRUÇÃO while
} // FECHA INSTRUÇÃO voidm
11. Bibliografia
http://pt.wikipedia.org/wiki/Rel%C3%A9
http://www.trajanocamargo.com.br/arquivos/eletroeletronica/
apostila_Microcontroladores_PIC16F84_PIC16F6288.pdf
http://www.cp.utfpr.edu.br/chiesse/Sistemas_Digitais/PIC16f628a.pdf
http://pt.wikipedia.org/wiki/Resistores_pull-up
http://pt.wikipedia.org/wiki/Diodo_emissor_de_luz
http://www.arnerobotics.com.br/eletronica/Microcontrolador_PIC_teoria_2.htm
http://pt.wikipedia.org/wiki/Display_de_sete_segmentos
http://pt.wikipedia.org/wiki/Trans%C3%ADstor
http://en.wikipedia.org/wiki/Buzzer
http://pt.wikipedia.org/wiki/Jumper
http://pt.wikipedia.org/wiki/Capacitor
66