MICROCONTROLADORES - PIC 16F84/16F84A/16F628/16F628A

Documentos relacionados
Arquitetura de Computadores. Prof. João Bosco Jr.

1.1. Microprocessadores e microcontroladores Sistemas genéricos e sistemas dedicados. 2. Microcontrolador PIC:

Introdução ao PIC. Guilherme Luiz Moritz 1. 6 de novembro de DAELT - Universidade Tecnológica Federal do Paraná

Sistemas Microcontrolados. Período Aula 4. 1 Saulo O. D. Luiz

Introdução aos Microcontroladores PIC

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

ARQUITETURA DE PROCESSAMENTO

Curso de Microcontroladores PIC 16F84A

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

Eder Terceiro. Programação C com o PIC16F628a. Eder Terceiro. 31 de Outubro de 2016

PIC. PeripheralInterface Controller. Prof. EngºespLuiz Antonio Vargas Pinto Prof. Vargas

6. Estrutura do Programa em Assembly

Microcontrolador PIC 16F877

Curso PIC 1 Desbravando o PIC. Eng. Diego Camilo Fernandes Labtools Mosaico Didactic Division

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

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

Sistemas Microcontrolados

Microcontrolador PIC 16F877

PIC16F628a. Pinagem do PIC16F628a:

SEL0338 Tópicos Especiais em Sistemas Digitais

5. Conjunto de Instruções do MCU PIC

Microcontroladores PIC

Sistemas Digitais e Microcontrolados

INTRODUÇÃO: MICROCONTROLADORES

BANKSEL ADCON1 clrf ADCON1 bsf ADCON1,ADFM ; seta AD para VCC, GND e entradas analogicas, setando o bit ADFM configura como justificado a direita

Placa McLab1 Upgrade PIC16F84A p/ PIC16F62x

MICROCONTROLADORES PIC PRIMEIROS PASSOS

Sistemas Digitais e Microcontrolados

Sequencial Supermáquina (TEMPORIZAÇÃO SIMPLES)

Microcontroladores. Prof. Nivaldo T. Schiefler Jr. M.Eng Homepage:

Jadsonlee da Silva Sá

Arquitetura Von Neumann Dados e instruções são obtidos da mesma forma, simplificando o desenho do microprocessador;

Microprocessadores I ELE Aula 7 Conjunto de Instruções do Microprocessador 8085 Desvios

Índice. Dia 05 de fevereiro de Apresentação Dia 12 de fevereiro de

Prof. Adilson Gonzaga

Interrupção. Prof. Adilson Gonzaga

Manual do Usuário. McMaster Desenvolvimento de Sistemas com Microcontroladores PIC

OMPLAB é um programa para PC, que roda sobre a

Hardware Parte I. Fábio Rodrigues de la Rocha

01. Identifique o conjunto de portas de entrada A e o conjunto de portas B na figura abaixo.

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

DOUGLAS DAL POZZO DIEGO VITTI

Conjunto de Instruções e Modelos de Arquiteturas

LABORATÓRIO DE ARQUITETURA DE COMPUTADORES PREPARAÇÃO 03: INTERRUPÇÕES

PIC16F84 Profº MSc.Engº Getúlio Teruo Tateoki

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

Plano de Trabalho Docente 2017 Ensino Técnico

Índice. Dia 05 de fevereiro de Apresentação Dia 12 de fevereiro de

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

SEMINÁRIO ASSEMBLY: Arquitetura PIC

SSC510 Arquitetura de Computadores 1ª AULA

Construção de Robôs Jogadores de Futebol (2ª Parte)

2 - Considere a seguinte figura que representa uma parte dos componentes básicos de um microprocessador:

Estrutura Básica de um Computador

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

14/3/2016. Prof. Evandro L. L. Rodrigues

Cerne. Conhecimento para o Desenvolvimento. Cerne Tecnologia e Treinamento

Solução Lista de Exercícios Processadores

Aula 10 Microcontrolador Intel 8051 Parte 2

SEL-433 APLICAÇÕES DE MICROPROCESSADORES I

ELETRÔNICA DIGITAL II. AUTOR: ENG. ANTONIO CARLOS LEMOS JÚNIOR

Professor: Vlademir de Oliveira Disciplina: Microcontroladores e DSP. Memórias de Dados e de Programa

Circuito Eletrônico. Entendendo o circuito eletrônico na robótica. domingo, 28 de agosto de 11

ARQUITETURA E ORGANIZAÇÃO DE COMPUTADORES A UNIDADE LÓGICA ARITMÉTICA E AS INSTRUÇÕES EM LINGUAGEM DE MÁQUINA

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

OMicrocontrolador PIC16F877A implementa um conversor

Acetatos de apoio às aulas teóricas

UNIVERSIDADE FEDERAL DE SÃO JOÃO DEL-REI - UFSJ DEPARTAMENTO DE ENGENHARIA ELÉTRICA - DEPEL INTRODUÇÃO AOS MICROCONTROLADORES PIC

Microcontroladores. Rafael Silva de Lima

FACULDADE LEÃO SAMPAIO

Sistemas Microcontrolados

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

Conjunto de Instruções e Modelos de Arquiteturas

Microprocessadores. Cap. 4 Assembly

Programação Daniel Corteletti Aula 3 Parte III Página 1/7

PRÁTICAS. Microcontroladores: (LT36D) Prof: DaLuz. Práticas - 2º sem Microcontroladores LT36D - 26/04/ :56 1/16

Microcontrolador 8051

C:\seminario\guiao_aluno\trab6\trab6.asm

UNIVERSIDADE PAULISTA (UNIP) Curso de Engenharia Mecatrônica Disciplina: Microprocessadores e Microcontroladores (MM) LISTA III

Sumário. 1. Apresentação Hardware Microcontrolador PIC16F628A Displays de 7 segmentos Teclas...

MICROCONTROLADORES. PIC16F87x

MEC MINISTÉRIO DA EDUCAÇÃO SECRETARIA DE EDUCAÇÃO MÉDIA E TECNOLÓGICA CENTRO FEDERAL DE EDUCAÇÃO TECNOLÓGICA DO ESPÍRITO SANTO

V1 5V +V. (14)Vdd (6)RB0 PIC 16F628A. (16) Clk-out. C1 33pF. C2 33pF. Figura 1 Circuito pisca-pisca.

ARQUITETURA E ORGANIZAÇÃO DE COMPUTADORES A UNIDADE LÓGICA ARITMÉTICA E AS INSTRUÇÕES EM LINGUAGEM DE MÁQUINA

Copyright 2014 VW Soluções

ARQUITETURA E ORGANIZAÇÃO DE COMPUTADORES A UNIDADE LÓGICA ARITMÉTICA E AS INSTRUÇÕES EM LINGUAGEM DE MÁQUINA

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

Marcelo Fernandes Valter Rodrigues de Jesus Junior. Thermal Control

Introdução à Organização de Computadores. Aula 8

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

Laboratório de Microprocessadores e Microcontroladores

Sistemas Microcontrolados

Microcontroladores: Programação em C

Cerne. Conhecimento para o Desenvolvimento. Cerne Tecnologia e Treinamento. Apostila de BASIC para PIC16F628A

SEL 0415 INTROD. À ORGANIZAÇÃO DE COMPUTADORES

1. Microcontrolador PIC. 1.1 Introdução

Projeto Instrumentação Eletrônica Conversor A/D para Tensões 3φ

2. A influência do tamanho da palavra

Disciplina: Arquitetura de Computadores

Kit Clp Pic 40B Manual do usuário. Manual do usuário - Kit Clp Pic 40B v2.0. Copyright VW Soluções

Transcrição:

MICROCONTROLADORES - PIC 16F84/16F84A/16F628/16F628A Apresentação: Eng. Antonio Carlos Lemos Júnior acjunior@facthus.edu.br FACTHUS Uberaba 02/2008

Qual a diferença entre Microcontrolador e Microprocessador? Microcontrolador: É um componente eletrônico, dotado de uma inteligência programável internamente, utilizado no controle de processos lógicos. Possui internamente recursos como memória de programa (ROM/EEPROM), memória de dados (RAM), comunicação serial (USART) e temporizadores (TIMER S). Tudo isto em uma única pastilha. Microprocessador: É um componente eletrônico, dotado de uma inteligência não programável internamente. Depende de hardware externo tais como: memória RAM, ROM, EEPROM, USART. 2

Diagrama de Blocos do Microcontrolador e Microprocessador a) Microcontrolador b) Microprocessador 3

Para que servem os Microcontroladores? São utilizados em controle de processos controlando periféricos tais como: led s, botões, display de sete segmentos, display de cristal liquido (LCD), resistências, relês, sensores diversos (pressão, temperatura, etc.) 4

Arquitetura HARVARD e Filosofia RISC Os microcontroladores PIC apresentam arquitetura interna tipo HARVARD enquanto que grande parte dos outros microcontroladores apresentam arquitetura do tipo VONNEUMANN. Na arquitetura tipo VON-NEUMANN existe apenas um barramento(bus 8 Bits) tanto para dados quanto para instruções. Na arquitetura HARVARD existem dois barramentos internos. Um para dados (BUS 8 Bits) e outro para instruções (BUS 12, 14 ou 16 Bits) Devido o barramento de instrução ser maior do que 8 Bits este inclui o dado e o local onde ele vai atuar. Desta maneira sobrando apenas em média 35 instruções (RISC). 5

Estrutura interna PIC-16F84/F84A 6

Estrutura interna PIC-16F628/F628A 7

Ciclos de Máquina O clock interno de um microcontrolador é divido por quatro. Portanto um clock externo de 4 Mhz será de 1 Mhz internamente e por isso cada ciclo de máquina dura 1 μs. Portanto teremos quatro fases Q1, Q2, Q3 e Q4. No primeiro ciclo ocorre automaticamente o incremento do contador de programa. No quarto ciclo ocorre a busca na memória da próxima instrução sendo armazenada no registrador de instruções. A execução da instrução ocorre nos ciclos de Q1 até Q4. 8

Introdução ás Memórias A memória de programa dos PICs 16F84/F84A/F628/F628A são do tipo Flash. Este tipo de memória permite que o microcontrolador seja regravado. Vetor de RESET Primeiro endereço de memória que será executado quando o PIC começar a rodar (Após alimentação ou RESET). O endereço é na forma hexadecimal 0x00. Vetor de INTERRUPÇÃO As rotinas de interrupção são armazenadas juntamente com o resto do programa. No entanto existe um endereço para tratamento destas. O endereço é na forma hexadecimal 0x04. 9

Introdução ás Memórias Pilha (Stack) Local totalmente separado da memória de programação, em que serão armazenados os endereços de retorno quando utilizarmos instruções de chamadas de rotinas. O tamanho da pilha varia de acordo com o modelo de PIC e isto irá determinar a quantidade de rotinas que poderão ser chamadas ao mesmo tempo. 10

Introdução ás Memórias Memória de Dados Memória RAM utilizada para guardar todas as variáveis e registradores utilizados nos programas. Armazena dados de 8 bits e é volátil, ou seja, quando o PIC é desligado os dados contidos nesta memória serão perdidos. São agrupadas em bancos de memórias: BANK0, BANK1... Ainda podemos dividí-las em dois grupos: Registradores especiais e Registradores de uso geral. 11

Introdução ás Memórias Registradores Especiais Os registradores especiais (SFR s) são utilizados pelo processador para execução do programa e processamento na Unidade Lógica Aritmética (ULA). Ocupam espaço na RAM e podem ser acessados como se fossem variáveis. Podem ser lidos ou escritos tanto pelo usuário quanto pelo HARDWARE. Registradores de Uso Geral Área destinada ao armazenamento de variáveis criadas pelo usuário. 12

Introdução ás Memórias EEPROM Encontrada em alguns modelos de PIC está memória ao contrário da memória RAM não perde a informação mesmo que o PIC seja desligado. Este tipo de memória é ideal para armazenar senhas ou qualquer outro tipo de dado que deva ser utilizado no momento em que o PIC seja ligado. Nos modelos de PIC que não possuam memória EEPROM interna podese acrescentar uma memória EEPROM externa. 13

Introdução ás Interrupções O que são e como funcionam? São ações tratadas imediatamente pelo hardware. Desta maneira tornandoas muito rápidas. Servem para interromper imediatamente o programa e atendê-lo em outras tarefas que sejam de importâncias imediata. Após o tratamento da interrupção o programa voltará ao ponto onde estava quando a interrupção ocorreu. Interrupções existentes no PIC As interrupções do PIC são: estouro de tempo, externa, mudança de estado, fim da escrita na EEPROM, USART etc... 14

Introdução ás Interrupções Interrupção por estouro de tempo Normalmente utilizada para contagem de tempo. Toda vez que o contador passar da contagem 255 (8 bits TIMER0) ocorrerá esta interrupção e o contador será zerado e iniciado nova contagem. Interrupção externa Esta interrupção é gerada por um sinal externo ligado ao pino RB0. Pode ser utilizada para realizar sincronismo entre periféricos, comunicação entre micros, reconhecimento de botão ou outro sinal sistema. Interrupção por mudança de estado Esta interrupção está relacionada diretamente às portas RB4, RB5, RB6 e RB7. Este tipo de interrupção pode ser utilizado para sincronizar o PIC com a rede elétrica. 15

Introdução ás Interrupções Interrupção por fim de escrita na EEPROM Serve para informar quando a escrita na memória EEPROM já terminou. Isto deve-se ao fato de que a memória EEPROM é lenta para ser escrita desta maneira utilizamos esta interrupção para não termos que ficar aguardando a escrita da EEPROM. Interrupção por USART Utilizado para informar quando os dados estão prontos para enviar e quando os dados chegaram ao PIC. Também conhecida como comunicação serial. 16

O PIC 16F84/F84A Microcontrolador de 18 pinos 13 portas configuráveis como entrada ou saída 4 interrupções (TMR0, Externa, Mudança de estado e EEPROM) 1 Temporizador (8 Bits) Memória tipo FLASH Memória tipo EEPROM Via de programação com 14 bits Apenas 35 instruções 17

O PIC 16F628/F628A Microcontrolador de 18 pinos 16 portas configuráveis como entrada ou saída 10 Interrupções (TMR0, TMR1, TMR2, Externa, Mudança de estado, EEPROM, USART Transmissão e Recepção, Comparador, e Captura) 3 Temporizador (TMR0 de 8 Bits, TMR1 de 16 Bits, TMR2 de 8 Bits) 2 comparadores analógicos Memória tipo FLASH Memória tipo EEPROM Via de programação com 14 bits Apenas 35 instruções USART Transmissão serial 18

Nomenclaturas Utilizadas 2 Conjuntos de portas: PORTA: RA0, RA1, RA2, RA3, RA4 p/ 16F84/84A mais RA5, RA6 e RA7 p/ 16F628/628A. PORTB: RB0, RB1, RB2, RB3, RB4, RB5, RB6 e RB7 O pino RA4 pode ser utilizado para incrementar o TMR0 O pino RB0 pode ser utilizado para gerar uma interrupção externa Os pinos RB4, RB5, RB6 e RB7 são utilizados para gerar interrupções de mudança de estado. Os pinos VDD (+5V) e VSS (GND) são os pinos de alimentação. O oscilador externo deve ser ligado em OSC1 e OSC2 O pino /MCLR dever ser deixado em nível alto para que o PIC possa prosseguir o seu funcionamento. 19

Memória de Programa a) PIC16F84/F84A b) PIC16F628/F628A 20

Memória de Dados 16F84/F84A 21

Memória de Dados 16F628/F628A 22

Registradores 16F84/F84A 23

Registradores 16F628/F628A 24

Registradores 16F628/F628A 25

Registradores 16F628/F628A 26

Registradores 16F628/F628A 27

Conhecendo os Registradores Registrador STATUS Este registrador serve para mostrar o estado da ULA. IRP: Seletor de banco de memória para endereçamento indireto: 0 = Banco 0 e 1 (00 h FF h) 1 = Banco 2 e 3 (100 h 1FF h) Nos PIC s 16F84/F84A é mantido sempre em zero. RP1 e RP0: Seletor de banco de memória usado para endereçamento direto: 00 = Banco 0 (00 h 7F h) 01 = Banco 1 (80 h FF h) 10 = Banco 2 (100 h 17F h) 11 = Banco 3 (180 h 1FF h) 28

Conhecendo os Registradores Registrador STATUS Este registrador serve para mostrar o estado da ULA. /TO: Indicação de Time-Out 0 = Indica que ocorreu um estouro de Watch Dog (WDT) 1 = Indica que ocorreu um power-up ou foram executadas as intruções CLRWDT ou SLEEP /PD: Indicação de Power-Down 0 = Indica que a instrução SLEEP foi executada. 1 = Indica que ocorreu um power-up ou foi executada a instrução CLRWDT Z: Indicação de Zero 0 = Indicando que o resultado da última operação (lógica ou aritmética) não foi zero 1 = Indica que a última operação (lógica ou aritmética) resultou em zero. 29

Conhecendo os Registradores Registrador STATUS Este registrador serve para mostrar o estado da ULA. DC: Digit Carry/Borrow 0 = A última operação da ULA não ocasionou um estou de digito. 1 = A última operação da ULA ocasionou um estouro (carry) entre o bit 3 e 4, isto é o resultado ultrapassou os 4 bits menos significativos. Utilizando quando se trabalha com números de 4 bits. C: Carry/Borrow 0 = A última operação da ULA não ocasionou um estouro (carry). 1 = A última operação da ULA ocasionou um estouro (carry) no bit mais significativo, isto é, o resultado ultrapassou os 8 bits disponíveis. 30

Conhecendo os Registradores Registrador OPTION Acessado como OPTION_REG Este registrador serve para configuração opções de funcionamento do microcontrolador /RBPU: Habilitação dos pull-ups internos do PORTB 0 = Pull-ups habilitados para todos os pinos do PORTB configurados para entrada. 1 = Pull-ups desabilitados. INTEDG: Configuração da borda que gerará a interrupção externa no RB0 0 = A interrupção ocorrerá na borda de descida. 1 = A interrupção ocorrerá na borda de subida. T0CS: Configuração do incremento para o TMR0 0 = TMR0 será incrementado internamente pelo clock da máquina. 1 = TMR0 será incrementado externamente pela mudança no pino RA4/T0CKI. 31

Conhecendo os Registradores Registrador OPTION Acessado como OPTION_REG Este registrador serve para configuração opções de funcionamento do microcontrolador T0SE: Configuração da borda que incrementará o TMR0 no pino RA4/T0CKI, quando T0CS = 1 0 = O incremento ocorrerá na borda de subida. 1 = O incremento ocorrerá na borda de descida. PSA: Configuração de aplicação do prescaler: 0 = O prescaler será aplicado ao TMR0. 1 = O prescaler será aplicado ao WDT. 32

Conhecendo os Registradores Registrador OPTION Acessado como OPTION_REG Este registrador serve para configuração opções de funcionamento do microcontrolador PS2, PS1 e PS0 Configuração de valor de prescaler: Bits 2, 1, 0 000 001 010 011 100 101 110 111 TMR0 1:2 1:4 1:8 1:16 1:32 1:64 1:128 1:256 WDT 1:1 1:2 1:4 1:8 1:16 1:32 1:64 1:128 33

Conhecendo os Registradores Registrador INTCON Este registrador serve para configurar e identificar as interrupções. GIE: Habilitação geral das interrupções (Chave Geral) 0 = Nenhuma interrupção será tratada. 1 = As interrupções habilitadas serão tratadas individualmente. EEIE: Habilitação da interrupção de final de escrita na EEPROM 0 = A interrupção não será tratada. 1 = A interrupção será tratada. T0IE: Habilitação da interrupção de estouro do TMR0 0 = A interrupção não será tratada. 1 = A interrupção será tratada. INTE: Habilitação da interrupção externa no pino RB0 0 = A interrupção não será tratada 1 = A interrupção será tratada 34

Conhecendo os Registradores Registrador INTCON Este registrador serve para configurar e identificar as interrupções. RBIE: Habilitação da interrupção por mudança de estado nos pinos RB4 a RB7 0 = A interrupção não será tratada. 1 = A interrupção será tratada. T0IF: Identificação da interrupção de estouro do TMR0 0 = Esta interrupção não ocorreu. 1 = Esta interrupção ocorreu. INTF: Identificação da interrupção externa no pino RB0 0 = Esta interrupção não ocorreu. 1 = Esta interrupção ocorreu. RBIF: Identificação da interrupção por mudança de estado nos pinos RB4 a RB7 0 = Esta interrupção não ocorreu. 1 = Esta interrupção ocorreu. 35

Conhecendo os Registradores Registrador TRISA e TRISB Estes registradores servem para configurar o PORTA e o PORTB como entrada ou saída PIC16F84/F84A PIC16F628/F628A Quando os bits estiverem setados com o valor 1 o pino da porta comportará como uma entrada (1 INPUT) e quando estiver setado o valor 0 o pino da porta comportará como saída (0 - OUTPUT) 36

Conhecendo os Registradores Registrador PORTA e PORTB Estes registradores servem para acessar as portas A e B PIC16F84/F84A PIC16F628/F628A Os pic s 16F84/F84A possuem a porta A e B. Na porta A somente 5 pinos estão disponíveis. Na porta B estão disponíveis os 8 pinos. Os pic s 16F628/F628A possuem a porta A e B. Na porta A estão disponíveis os 8 pinos assim como na porta B estão disponíveis os 8 pinos. 37

Conhecendo os Registradores Registrador TMR0, TMR1 e TMR2 Estes registradores servem para fazer contagem PIC16F84/F84A PIC16F628/F628A Os pic s 16F84/84A possuem somente 1 contador. Este contador é de 8 bits, ou seja, pode contar até 255. Este contador pode ser incrementado automaticamente ou a partir da mudança no pino RA4. Os pic s 16F628/F628A possuem três contadores: TMR0, TMR1, TMR2. Os contadores são de: 8, 16 e 8 bits respectivamente. O contador TMR1 pode contar até 65535. 38

Conhecendo os Registradores Registrador WDT Watchdog Timer Este registrador serve para ressetar o PIC caso este trave. O pic possui um RC interno somente para a operação do WDT. Seu tempo de incremento é automático e constante. O seu tempo padrão de estouro é de 18 ms O programador só pode zerá-lo utilizando o comando CLRWDT. Caso o WDT não for zerado e este estourar o PIC será resetado. Pode ser desligado, porém não pode ser ligado em tempo de execução 39

Conhecendo os Registradores PRESCALER É um divisor configurável que aplica-se tanto no WDT ou no TMR0. É configurado através do registrador OPTION através dos bits PS2, PS1 e PS0 O bit PSA do registrador OPTION é utilizado para indicar em quem será aplicado o divisor: WDT ou TMR0 Um exemplo prático: Caso utilizemos um clock externo de 4 Mhz internamente o clock é de 1 Mhz e terá instruções sendo rodadas a cada 1 μs. Desta forma se aplicarmos um divisor 1:4 o TMR0 será incrementado a cada 4 ciclos de máquina desta forma o seu estouro deixa de ocorrer em 256 μs e passa a ocorrer a cada 1024 μs. A mesma análise pode ser aplicada ao WDT. Caso seja aplicada um divisor de 1:4 ele deixa de estourar em 18 ms e passa a estourar em 72 ms O prescaler deve ser aplicado ao WDT para que o TMR0 utilize o divisor em 1:1 40

Conhecendo os Registradores EEPROM - EEADR Registrador onde será especificado o endereço fazer a leitura ou escrita na EEPROM. EEPROM - EEDATA Este registrador possui duas funções: Na operação de escrita ele guarda o dado a ser gravado na EEPROM. Na operação de leitura ele guarda o dado lido da EEPROM. Para os PICs 16F628/F628A estes registradores são acessados pelos endereços: EEADR = 9B h e o EEDATA = 9A h. 41

Conhecendo os Registradores EECONS EECON1 e EECON2 São os registradores utilizados para configurar a EEPROM EECON1 Este registrador é responsável pela leitura e escrita na EEPROM Para os PICs 16F628/F628A este registrador é acessado pelo endereço: EEADR = 9B h e o EEDATA = 9C h. O bit EEIF é acessado no registrador PIE1 para verificar o fim de escrita na EEPROM. EEIF: Identificação de final da escrita na EEPROM 0 = Esta interrupção não ocorreu 1 = Esta interrupção ocorreu 42

Conhecendo os Registradores WRERR: Identificação de erro durante a escrita na EEPROM 0 = Não ocorreu erro, a escrita ocorreu sem problemas 1 = Um erro ocorreu por uma escrita não terminada. WREM: Habilitação de escrita na EEPROM (Bit de segurança) 0 = Não disponibilizar escrita na EEPROM 1 = Disponibilizar escrita na EEPROM WR: Ciclo de escrita na EEPROM 0 = Este bit só pode ser zerado pelo hardware, quando o ciclo de escrita termina. 1 = Inicia o ciclo de escrita. RD: Ciclo de escrita da EEPROM: 0 = Este bit só pode ser zerado pelo hardware, quando o ciclo de leitura termina. 1 = Inicia ciclo de leitura. 43

Resumo das Condições Após Reset 44

Conhecendo o Set de Instruções Work: Registrador temporário para operações da ULA. Conhecido no Assembler do PIC como W. File: Referência a um registrador. Será adotado a letra F para sua representação. Literal: Um número qualquer que pode ser escrito na forma decimal, binário ou hexadecimal. Utiliza-se a letra L para representação de instruções e a letra k para seus argumentos. Destino: Local onde deve ser armazenado o resultado da operação. São possíveis dois locais para serem guardados os resultados: O próprio registrador passado como argumento ou no registrado W. Bit: Refere-se a um bit específico de um Byte. Utiliza-se a letra B para sua representação nos nomes de instruções e a letra b para seus argumentos. Skip: Significa pulo, é utilizado para criar desvios pulando a próxima linha. 45

Conhecendo o Set de Instruções Set: Refere-se ao ato de setar um bit, ou seja, torná-lo igual a 1 (um). Clear: Refere-se ao ato de ressetar um bit, ou seja, torná-lo igual a 0 (zero). Zero: Algumas instruções podem gerar desvio caso o resultado da operação seja igual a zero. ADD: Soma AND: Lógica E CLR: Limpar, zerar(clear) COM: Complemento DEC: Decremento de uma unidade. INC: Incremento de uma unidade. IOR: Lógica OU. MOV: Mover, transferir para algum lugar. RL: Rotacionar 1 bit para a esquerda. RR: Rotacionar 1 bit para a direita. 46

Conhecendo o Set de Instruções SUB: Subtração. SWAP: Inversão entre as partes alta e baixa de um registrador. XOR: Lógica Ou exclusivo. Construção dos nomes das Instruções: Os nomes das instruções são feitas fazendo a junção dos termos vistos anteriormente. Por exemplo: Realizar a função de decrementar um registrador F. Decrementar (DEC) um registrador(f) = DECF A partir do nome de uma instrução saber o que será feito: DECFSZ = Decrementa (DEC) um registrador (F) pula (S) se o resultado for zero (Z). 47

Resumo das Instruções 48

Considerações do Hardware Alimentação: O pic deve ser alimentado com uma fonte bem estabilizada, ou seja, que não tenha tantos ruídos e nem ripples. O GND deve ser ligado ao pino 5 enquanto que o o VCC deve ser ligado ao pino 14. A tensão nominal do PIC é de 5 VCC. Recomenda-se a ligação de um capacitor cerâmico de desacoplamento entre os estes pinos no valor de 100 pf a 100 nf. Osciladores externos: Basicamente existem quatro tipos de osciladores: RC, RESSOADOR, CRISTAL e Híbrido ou Circuitos de Oscilação. 49

Considerações do Hardware RC: Este tipo de oscilador é o mais simples e portanto o menos preciso, variando muito com a tolerância dos componentes e a temperatura. Neste caso somente será utilizado o pic OSC1. Se verificarmos o pino OSC2 terá freqüência quatro vezes menor que OSC1. 50

Considerações do Hardware RESSOADOR: O ressoador cerâmico é outra opção. É bem mais estável que o RC porém não é tão barato quanto o anterior. Existe dois tipos de ressoadores, com 3 e 2 pinos, que devem ser montados conforme o esquema: 51

Considerações do Hardware CRISTAIS: Os cristais são os osciladores mais precisos porém os mais caros. Deve ser utilizado sempre que a precisão do sistema for requerida. 52

Considerações do Hardware HÍBRIDO OU CIRCUITOS DE OSCILAÇÃO: Podem ser utilizados cristais híbridos ou circuitos próprios para oscilação os quais devem ser ligados diretamente ao pino OSC1, como no esquema mostrado para o RC. POWER-ON RESET (POR) BÁSICO: Além da alimentação e do oscilador, o PIC precisa de um POR. O sistema básico para isto é a ligação do VCC diretamente ao pino 4 (/MCLR). 53

Programando o PIC Antes de começar a programar o PIC devemos ter em mente a organização do programa. Isto facilitará futuras revisões ou alterações no mesmo. A utilização de comentário é outro ponto forte na ajuda de possíveis reestruturações. Deve ser feita ao mesmo tempo em que for sendo feita a programação Os comentários são feitos utilizando um ; antes das frases que serão comentadas. Caso necessite de dar espaços entre código e variáveis utilize tabulação (TAB). Ex.: ; Isto é um comentário MOVLW B'00000000' ; Move o número binário para o ; acumulador 54

Programando o PIC As constantes e definições são declararadas da seguinte maneira: nome_da_variável EQU endereço_de_memória EQU valor_da_constante ou nome_da_constate Para informarmos um número para o assembler do PIC usamos as seguintes nomenclaturas: Decimal: Hexadecimal: Binário: ASCII: D'número' ou H'número' ou B'número' A'caracter'.número 0Xnúmero 55

Programando o PIC Alguns exemplos de declaração: STATUS FSR PORTA PORTB EQU EQU EQU EQU H'0003' H'0004' H'0005' H'0006' Além do EQU existe a diretriz #DEFINE que é muito mais poderosa pois ela é utilizada para substituir uma expressão inteira. EX.: #DEFINE LED PORTB,1 56

Estruturação do Programa ; Programa...: ACILED ; Programador.: Eng. Antonio Carlos Lemos Júnior ; Versão...: 1.0 ; Objetivo...: O programa em questão deverá acionar um LED toda vez que o pino RB1 estiver em alto. ; Arquivos e definições #INCLUDE <P16F84.INC> ; Página de memória ; Definição de comandos de usuário para alterar página de memória #DEFINE BANK0 BCF STATUS,RP0 ; Seta banco zero de memória #DEFINE BANK1 BSF STATUS,RP0 ; Seta banco um de memória ; Definição de variáveis CBLOCK 0X0C ; Endereço inicial da memória de usuário W_TEMP ; Registradores temporários para usar junto às interrupções STATUS_TEMP FLAG ; Novas variáveis ENDC ; Definição de flags internos, constantes #DEFINE ESTOURO_TEMPO FLAG,0 TEMPO_LED EQU.30 57

Estruturação do Programa ; Definição das entradas #DEFINE ACENDE_APAGA_LED PORTB,0 ; 0 => O LED não será acesso ; 1=> O LED será acesso ; Definição das saídas #DEFINE LED PORTB,1 ; 0 => O LED ficará apagado ; 1 => O LED ficará acesso ; Vetor de RESET ORG 0X00 CONFIGURACAO ; Endereço inicial de processamento ; Inicio das interrupções O primeiro procedimento é salvar o acumulador W e o registrador STATUS. ORG 0X04 W_TEMP SWAPF STATUS, W STATUS_TEMP ; Comando de verificação de qual interrupção foi acionada ; Saída das interrupções Os valores de W e STATUS devem ser recuperados. SAI_INTERRUPCAO SWAPF STATUS_TEMP,W STATUS SWAPF W_TEMP, F 58

Estruturação do Programa SWAPF RETIFIE W_TEMP,W ; Início das rotinas e sub-rotinas SUB-ROTINA1 ; CORPO DA ROTINA RETURN ; Início da configuração CONFIGURACAO BANK1 MOVLW B'00000000' TRISA MOVLW B'00000000' TRISB MOVLW '10000100' OPTION_REG MOVLW '00000000' INTCON BANK0 ; Altera para banco 1 de memória ; Define as entradas e saídas da porta A ; Define as entradas e saídas da porta B ; Define as opções de operação ; Define as opções de interrupção ; Retorna ao banco principal de memória ; Inicialização das variáveis 59

Estruturação do Programa ; Rotina Principal INICIO ; Corpo da rotina principal INICIO ; Fim do Programa END Diretriz ORG Utilizada para indicar a posição da memória de início do programa e de início do tratamento de interrupção. Diretriz END Utilizada para indicar o final do programa Diretriz CBLOCK e ENDC Utilizada para reservar espaço para as variáveis de forma seqüencial no mapa de memória. O endereço inicial para os PICs 16F84/84A/628/628A são 0x0C 60

Trabalhando com Memória Conhecendo os Bancos de Memória (BANK0 e BANK1): Para trabalharmos com os bancos de memória devemos setar ou ressetar os bits RP0 e RP1 do registrador STATUS. Lembrando que para o PIC 16F84 só é necessário alterar o bit RP0. Ex.: #DEFINE #DEFINE BANK0 BANK1 BCF BSF STATUS, RP0 STATUS, RP0 Lidando com Dados: Basicamente os comandos utilizados no PIC para manipulação de dados são os seguintes: MOVLW MOVF k Move um literal para o registrador W (Acumulador) f Move o valor de work (W) para um registrador (F) f,d Move o valor de um registro (F) para um local de destino (F ou W) Para guardarmos um número em uma posição de memória primeiramente movemos para o registrador W e depois para a posição de memória desejada. 61

Trabalhando com Memória Existem também os comandos CLRF CLRW que são usados da seguinte maneira: CLRF CLRW f Limpa o registrador Limpa o acumulador, mais afeta o registrador STATUS Pode-se limpar o acumulador sem afetar o registrador STATUS a maneira para se fazer isso é: MOVLW 0x00 Limpa o acumulador sem afetar o STATUS. 62

Vetor de Reset Toda vez que o PIC é iniciado ou resetado este é o endereço inicial de programa. Este endereço é 0x00. Este endereço pode mudar em dispositivos mais antigos. A diretriz que identifica o vetor de reset é a seguinte: ORG 0x00 INICIO INICIO BANK1 MOVLW B'00000000' TRISB MOVLW B'00000001' TRISA BANK0 63

Inicializando Variáveis É muito importante que as variáveis sejam inicializadas, mesmo que o seu valor seja igualado a zero(0). ;-------------------------------------------;- Inicialização das variáveis ;-------------------------------------------CLRF PORTA CLRF PORTB MOVLW.10 CONTADOR 64

Trabalhando com Rotinas No PIC existem dois tipos de rotinas: rotinas de desvios e rotinas de chamadas. As rotinas de desvio são feitas utilizando o comando juntamente com um label que identificará para onde o programa deverá ser desviado. As rotinas de chamadas são acessadas através do comando CALL. Ao charmar este comando o endereço do programa PC+1 é guardado na pilha STACK, para que o sistema possa retornar a ele mais tarde utilizando o comando RETURN. 65

Trabalhando com Rotinas Rotinas de Desvio As rotinas de desvio são utilizadas para realizar desvios dentro do programa. A sintaxe do comando segui abaixo: nome ; onde nome é o identificador do local onde se deseja pular O identificador deve estar na primeira coluna do programa como segue abaixo: INICIO MOVLW.20 TRISB MODIFICA MOVLW.10 TRISA INICIO 66

Trabalhando com Rotinas Rotinas de Desvio Além disto existe a possibilidade de pularmos algumas linha utilizando o comando. A sintaxe do comando segue abaixo: $+3 $-2 ;Pula três linha para baixo ;Pula duas linhas para cima OBS.: Não utilizar o comando para pulos muito grandes. Rotinas de Chamada As rotinas de chamadas são simplesmente funções que devem ser executadas várias vezes dentro do programa. Desta maneira quando criamos uma função iremos economizar espaço em memória, pois guardamos apenas uma vez aquela rotina. 67

Trabalhando com Rotinas Rotinas de chamada A sintaxe do comando segue abaixo: CALL funcao ;onde nome é a identificação da rotina Quando chamamos uma função o endereço de programa posterior a linha onde a função foi chamada é guardada na pilha STACK. Devemos ficar atentos a quantidade de endereços, no STACK é de apenas 8 para os PIC's 16F84/84A, 16F628/628A. Portanto esta função deve ser utilizada com o devido cuidado. As sintaxes de retorno são: RETURN ;finaliza a rotina voltando ao último endereço da pilha. RETLW k ;finaliza a rotina voltando ao último endereço da pilha com o ;valor k (literal) em W. 68

Tomando Decisões e Fazendo Desvios A filosofia RISC tem a vantagem de ter poucas instruções a serem guardadas no entanto esta vantagem torna-se uma desvantagem principalmente quando é necessária algum comando que não esteja no set de instruções do ASSEMBLER do PIC. Desta maneira torna-se necessária a elaboração de alguns comandos utilizando os comandos básicos. Testando BITS e FLAGS (BTFSC e BTFSS) Os comandos utilizados para testar bits de portas ou de flags são: BTFSS e BTFSC. A sintaxe do comando segue abaixo: BTFSC f,b Linha1 Linha2 ;em que f é o registrador e b o bit a ser testado ;passa por esta linha se o bit testado for 1 ;pula para esta linha se o bit testado for 0 BTFSS f,b Linha1 Linha2 ;em que f é o registrador e b o bit a ser testado ;passa por esta linha se o bit testado for 0 ;pula para esta linha se o bit testado for 1 69

Tomando Decisões e Fazendo Desvios Além das portas, registrador, flags pode-se utilizar a diretiva DEFINE para substituir diretamente um bit, como segue abaixo: #DEFINE BOTAO BTFSS BOTAO BT_LIB BT_PRES PORTA,0 ;Define o botão no pino RA0 ;0-> Liberado ;1->Pressionado ;O botão está pressionado ;Não, vai tratar botão liberado ;Sim, vai trata botão pressionado Mudando BITS e FLAGS (BSF e BCF) As instruções BSF e BCF são utilizadas para alterar o valor de um bit. A sintaxe de comando segue abaixo: BSF BCF f,b ;em que f é o registrador e b é o bit que será setado f,b ;em que f é o registrador e b é o bit que será ressetado 70

Trabalhando com as Portas É através das portas que iremos ser informados ou iremos informar as condições de trabalho do microcontrolador. Desta maneira a leitura e a escrita nas portas torna-se fundamental. Lendo uma Porta Caso tenhamos ligado um barramento de dados paralelo a porta B do microcontrolador e queiramos fazer a leitura completa dos dados que chegam a esta porta devemos proceder da seguinte maneira: MOVF PORTB,W DADOS ;Move o conteúdo do portb para o acumulador ;Escreve o valor do acumulador para o registrador ;DADOS 71

Trabalhando com as Portas Escrevendo em uma Porta Da mesma forma que a leitura a escrita é um processo fundamental no trabalho com o PIC. É através da escrita que podemos comunicar com o mundo exterior. A escrita é feita utilizando a seguinte sintaxe: BANK1 BSF BANK0 ;Muda para banco 1 TRISB,0 ;Transforma RB0 em entrada ;Retorna para banco 0 ;Outros comandos BSF BANK1 BCF BANK0 PORTB,0 ;Escreve 1 no Latch do RB0 (Que ainda é entrada) ;Muda para banco 1 TRISB,0 ;Transforma RB0 em saída. Neste momento o pino ;será inicializado em 1 devido ao Latch ;retorna para banco 0 72

Trabalhando com as Portas Escrevendo em uma Porta Devido a esta estrutura interna não é recomendado a escrita e posteriormente a leitura em instruções seguintes. Desta maneira utiliza-se a instrução NOP. A instrução NOP desperdiça um ciclo de máquina sem fazer nada. A sintaxe utilizando o NOP fica da seguinte maneira: MOVLW NOP MOVF.10 PORTB PORTB,W DADO ;Escreve 10 em W ;Transfere o valor de W (10) para o PORTB ;Perde um ciclo de máquina sem fazer nada ;Lê o valor do PORTB e coloca em W ;Transfere o valor de W (PORTB) para DADO 73

PRIMEIRO PROGRAMA BOTÃO E LED O hardware proposta acima deve funcionar da seguinte maneira: O led será usado para representar o estado do botão, isto é, aceso para botão pressionado e apagado para o botão liberado. 74

PRIMEIRO PROGRAMA BOTÃO E LED - FLUXOGRAMA 75

PRIMEIRO PROGRAMA BOTÃO E LED ;Programa...: Aciona_LED ;Objetivo...: O software em questão será utilizado para demonstrar se um botão está ou não pressionado. #INCLUDE <P16F84.INC> #DEFINE #DEFINE BANK0 BANK1 BCF STATUS,RP0 BSF STATUS,RP0 CBLOCK 0X0C W_TEMP STATUS_TEMP ENDC #DEFINE #DEFINE BOTAO LED ORG ORG RETFIE INICIO BANK1 MOVLW MOVLW PORTA,2 PORTB,0 0X00 INICIO 0X04 B'00000100' TRISA B'00000000' TRISB 76

PRIMEIRO PROGRAMA BOTÃO E LED MOVLW MOVLW B'10000000' OPTION_REG B'00000000' INTCON BANK0 CLRF CLRF PORTA PORTB MAIN BTFSS BOTAO_LIB BCF BOTAO_PRES BSF END BOTAO BOTAO_LIB BOTAO_PRES LED MAIN LED MAIN 77

FAZENDO OPERAÇÕES ARITMÉTICAS BÁSICAS Todos os programas implementados microcontroladores necessitam de algum tipo de conta para que sua lógica funcione adequadamente. O PIC 16F84/84A/628/628A não tem instruções com pontos fortes em matemática. No entanto veremos que ele possui os recursos necessários para que possamos implementar nossas próprias funções para cálculo bem mais avançados. SOMANDO (INCF, INCFSZ, ADDWF e ADDLW) O PIC possui dois grupos de instruções para operação de adição sendo um usado para adições unitárias e o outro para adições diversas. Dentro desses grupos, possuímos as instruções que seguem abaixo: INCF INCFZ ADDWF ADDLW f,d ; em que f é o registrador e d o destino onde será guardado o resultado ; da conta (f + 1 -> d). f,d ; em que f é o registrador e d o destino onde será guardado o resultado ; da conta (f + 1 -> d). f,d ; em que f é o registrador e d o destino onde será guardado o resultado ; da conta (f + k -> d). k ; em que k é o número que será somado ao W o resultado é mantido ; em W (W + k -> W). 78

FAZENDO OPERAÇÕES ARITMÉTICAS BÁSICAS Exemplo da utilização das instruções: INCF CLRF LOOP CALL INCF BTFSS CONTA ; zera o contador BIP ; chama a rotina BIP que emitirá um SOM CONTA,F ; incrementa o contador (CONTA = CONTA + 1) CONTA,3 ; testa o BIT número 3 do contador. Quando este BIT for ; igual a 1, significa que contador = 8. LOOP ; contador ainda não é 8, retorna para LOOP. END ; contador igual 8, acabou o exemplo. 79

FAZENDO OPERAÇÕES ARITMÉTICAS BÁSICAS Exemplo da utilização das instruções: INCFSZ MOVLW LOOP CALL INCFSZ END.246 CONTA ; move 246 para o acumulador ; inicia o contador com 246 (256-10). BIP ; chama a rotina BIP que emitirá um som. CONTA,F ; incrementa o contador (CONTA = CONTA + 1). ; resultado = 0 (estourou?). LOOP ; não, retorna para LOOP pois não passou 10 vezes. ; sim, acabou o exemplo pois já passou 10 vezes. 80

FAZENDO OPERAÇÕES ARITMÉTICAS BÁSICAS Exemplo da utilização das instruções: ADD MOVLW MOLW CLRF SOMA1 MOVF ADDLW SOMA2 MOVF ADDWF END.10 NUM_1 ; inicia NUM_1 com valor 10.20 NUM_2 ; inicia NUM_1 com valor 20 RESULTADO ; inicia RESULTADO com zero ; resposta = NUM_1 + 5 NUM_1,W ; coloca o NUM_1 dentro do acumulador(w).5 ; soma 5 ao acumulador (W) RESULTADO ; coloca a resposta em resultado ; resposta = NUM_1 + NUM_2 NUM_1,W ; coloca o valor NUM_1 no acumulador (W) NUM_2,W ; soma o valor NUM_2 ao acumulador(w) e guarda o ; resultado no acumulador RESULTADO ; coloca o valor da resposta no RESULTADO ; término do programa. 81

FAZENDO OPERAÇÕES ARITMÉTICAS BÁSICAS As instruções anteriores afetam diretamente os flags relacionados a ULA. Os flags são: STATUS: C, DC e Z. Se desejarmos somar dois números quaisquer de 8 bits necessitaríamos de pelo menos 10 bits para guardarmos estes valores. Para sabermos que o resultado da soma necessita de pelo menos 10 bits utilizamos o bit de CARRY (STATUS, C) para verificarmos esta necessidade. O exemplo abaixo mostra a soma de três números guardando a resposta em dois bytes. Suponha que NUM_1, NUM_2 e NUM_3 tenha valores quaisquer: END CLRF CLRF BYTE_BAIXO ;Inicia BYTE_BAIXO com zero BYTE_ALTO ;Inicia BYTE_ALTO com zero MOVF ADDWF BTFSC INCF NUM_1,W NUM_2,W STATUS,C BYTE_ALTO ADDWF BYTE_BAIXO ;Move o acumulador para o BYTE_BAIXO NUM_3,W ;Soma NUM_3 ao acumulador BTFSC INCF STATUS,C ;Verifica se houve estouro? BYTE_ALTO,F ;Se sim incrementa o BYTE_ALTO BYTE_BAIXO ;Move o acumulador para o BYTE_BAIXO ;Move NUM_1 para dentro do acumulador ;Soma NUM_2 com o NUM_1 que está no acumulador ;Verifica se houve um estouro? ;Se sim incrementa o BYTE_ALTO 82

FAZENDO OPERAÇÕES ARITMÉTICAS BÁSICAS SUBTRAINDO (DECF, DECFSZ, SUBWF e SUBLW) As instruções de subtração do PIC seguem a mesma idéia das instruções de adição. DECF f,d ; em que f é o registrador e d o destino onde será guardado o resultado da ; conta (f 1 -> d). DECFSZ f,d ; em que f é o registrador e d o destino onde será guardado o resultado ; da conta (f - 1 -> d). SUBWF f,d ; em que f é o registrador e d o destino onde será guardado o resultado ; da conta (f - k -> d). SUBLW k ; em que k é o número que será somado ao W o resultado é mantido ; em W (k - W -> W). 83

FAZENDO OPERAÇÕES ARITMÉTICAS BÁSICAS UTILIZANDO A INSTRUÇÃO DECFSZ MOVLW.10 CONTA ; Inicia o contador com 10 ; Move o valor 10 para a variável CONTA LOOP CALL DECFSZ END BIP ; Chama rotina de emissão de som CONTA,F ; Decrementa a variável conta (CONTA = CONTA -1) ; Resultado é igual a zero (Acabou?) LOOP ; Não, continua até zerar ; Sim, termina o programa 84

FAZENDO OPERAÇÕES ARITMÉTICAS BÁSICAS UTILIZANDO A SUBWF SUBLW MOVLW MOVLW CLRF SUB1 MOVF SUBLW SUB2 MOVF SUBWF END.10 NUM_1 ; Inicia NUM_1 com 10.20 NUM_2 ; Inicia NUM_2 com 20 RESULTADO ; Inicia RESULTADO com zero NUM_1,W ; Move o valor de NUM_1 para o acumulador.30 ; Subtrai de 30 o valor de W RESULTADO ; Guarda a resposta em RESULTADO NUM_1,W ; Move o valor de NUM_1 para W NUM_2,W ; Subtrai de NUM_2 o valor de W RESULTADO 85

FAZENDO OPERAÇÕES ARITMÉTICAS BÁSICAS Diferentemente da adição a ordem da subtração afeta diretamente o resultado. Em somas o resultado pode ser zero ou positivo. Na subtração ele pode ser zero, positivo ou negativo. Por meio da análise do flag de carry podemos concluir qual o resultado correto da subtração: Negativo: Sempre que o resultado da subtração for um número negativo, o carry será zero (0). Neste caso, o valor da resposta não será diretamente o número negativo, e sim sua diferença para 256. Positivo: Sempre que o resultado for positivo o carry será 1 Zero: Sempre que o resultado for zero, o carry será 1. 86

FAZENDO OPERAÇÕES ARITMÉTICAS BÁSICAS Supondo dois números NUM_1 e NUM_2 CLRF SUB1 MOVF SUBWF BTFSS BCF RESP NUM_1,W NUM_2,W STATUS,C TRATA_NE RESP NEG FIM TRATA_NEG SUBLW.0 BSF END RESP NEG ; Limpa registrador RESP ; Subtrai NUM_2 NUM_1 = RESP ; Move NUM_1 para W ; Subtrai NUM_2 - W ; Testa carry. Resultado negativo? ; Sim, pula para tratar número negativo ; Não, resultado positivo ou zero ; Move diretamente para RESP ; Limpa flag de número negativo ; Finaliza ; Como resultado foi negativo, então RESP = 256 - W ; Como o número máximo para 8 bits é 255, então ; 256 -> 0 ;0-W ; Coloca o resultado em RESP ; Seta o flag de número negativo ; Fim do programa 87

FAZENDO OPERAÇÕES ARITMÉTICAS BÁSICAS AS COMPARAÇÕES MAIOR QUE, MENOR QUE E IGUAL As instruções SUB afetam diretamente o flag de carry, e desta forma podemos verificar se um número é positivo, negativo ou zero. Partindo deste principio podemos identificar também se um número é maior, menor ou igual a outro. COMPARA1 MOVF SUBWF BTFSS END NUM_1,W NUM_2,W STATUS,C RESP1 RESP2 88

FAZENDO OPERAÇÕES ARITMÉTICAS BÁSICAS MULTIPLICANDO A instrução RLF, (Rotate Left File) é utilizada para fazer multiplicação utilizando potência de 2, ou seja somente podemos multiplicar o número por 2. REGISTRADOR F BYTE INICIAL => 01011011 BYTE FINAL => REGISTRADOR F 10110111 Deslocamento de apenas um bit. 89

FAZENDO OPERAÇÕES ARITMÉTICAS BÁSICAS MULTIPLICANDO E se quisermos multiplicarmos fatores que sejam diferentes das potências de 2? Para isto devemos utilizar o método de somas sucessivas. CLRF CLRF MULT ADDWF BTFSC INCF DECFSZ BYTE_BAIXO BYTE_ALTO NUM_2,W BYTE_BAIXO,F STATUS,C BYTE_ALTO,F NUM_1,F MULT ; Limpa o registrador BYTE_BAIXO ; Limpa o registrador BYTE_ALTO ; NUM_1 X NUM_2 ; Move o valor de NUM_2 para W ; Soma NUM_2 ao valor já existente ; Houve estouro? ; Sim, incrementa o BYTE_ALTO ; Não ; Decrementa NUM_1. Acabou? ; Não, continua somando ; Sim, soma sucessiva terminada END 90

FAZENDO OPERAÇÕES ARITMÉTICAS BÁSICAS DIVIDINDO A instrução RRF, (Rotate Right File) é utilizada para fazer divisão utilizando potência de 2, ou seja somente podemos dividir o número por 2. REGISTRADOR F BYTE INICIAL => 01011011 BYTE FINAL => REGISTRADOR F 10101101 Deslocamento de apenas um bit. No caso da divisão, a parte inteira caberá em um único registrador de 8 bits, mas o resto da divisão poderá ser perdido por meio de carry. DIV4 BCF RRF RRF END STATUS,C ; Limpa o carry NUM_1,F ; Divide por 2 (NUM_1 = NUM_1 / 2) NUM_1,F ; Divide por 2 (Num_1 = Num_1 / 4) 91

SEGUNDO PROGRAMA CONTADOR SIMPLIFICADO O código que se segue é um contador simplificado onde a contagem deve ser feita de um valor mínimo até um valor máximo. Estes valores são duas constantes (MIN e MAX) as quais são utilizadas para fazermos a checagem dos valores. Será necessário a utilização das técnicas de comparação para verificarmos se chegamos ao valor máximo. Além disso utilizaremos um filtro para fazer a análise quando o botão foi pressionado. A constante chama-se T_FILTRO e é ajustada para verificar a quantidade de vezes em que o botão ficou pressionado. Quando a contagem chegar ao valor máximo devemos fazer a contagem regressiva até chegar ao valor mínimo. O pino RA2 é responsável em fazer o incremento ou decremento do contador. Além disto a contagem depende de um flag dentro do sistema que diz se estamos subtraindo ou somando. 92

SEGUNDO PROGRAMA - CONTADOR CRESCENTE-DECRESCENTE - FLUXOGRAMA 93

SEGUNDO PROGRAMA - CONTADOR CRESCENTE-DECRESCENTE - PROGRAMA ;Programa...: Contador Crescente Decrescente ;Objetivo...: O software em questão será utilizado para fazer um contador que conte até um valor máximo e decremente este valor até um valor mínimo quando este chegar ao valor máximo. O funcionamento depende de RA2 e do flag de sentido. #INCLUDE <P16F84.INC> #DEFINE #DEFINE BANK0 BANK1 BCF STATUS,RP0 BSF STATUS,RP0 CBLOCK W_TEMP STATUS_TEMP CONTATOR FLAGS FILTRO ENDC #DEFINE #DEFINE SENTIDO FLAGS,0 BOTAO PORTA,2 MIN EQU.10 MAX EQU.30 T_FILTRO EQU.230 ORG 0X00 INICIO 94

SEGUNDO PROGRAMA - CONTADOR CRESCENTE-DECRESCENTE - PROGRAMA ORG RETFIE INICIO BANK1 MOVLW 0X04 B'00000100' TRISA MOVLW MOVLW B''00000000' TRISB B'10000000' OPTION_REG MOVLW BANK0 B'00000000' INTCON CLRF CLRF MOVLW PORTA PORTB MIN CONTADOR MAIN MOVLW T_FILTRO FILTRO CHEGA_BT BTFSC BOTAO MAIN 95

SEGUNDO PROGRAMA - CONTADOR CRESCENTE-DECRESCENTE - PROGRAMA DECFSZ TRATA_BT BTFSS FILTRO,F CHECA_BT SENTIDO SOMA SUBTRAI DECFCONTADOR,F MOVLW MIN SUBWF CONTADOR,W BTFSC STATUS,C ATUALIZA INCF CONTADOR,F BCF SENTIDO MAIN SOMA INCF MOVLW SUBWF BTFSS BSF CONTADOR,F MAX CONTADOR,W STATUS,C ATUALIZA SENTIDO MAIN ATUALIZA MOVF CONTADOR,W PORTB 96

SEGUNDO PROGRAMA - CONTADOR CRESCENTE-DECRESCENTE - PROGRAMA BTFSC END BOTAO $-1 MAIIN 97

TRABALHANDO DIRETAMENTE COM BYTES AND (ANDWF e ANDLW) A operação AND é uma operação lógica entre dois bytes. Cada bit da seqüência de um número é comparado a seqüência de bits do segundo. Esta operação ira resultar em um terceiro byte contendo a operação lógica AND entre os dois primeiros. ANDWF e ANDLW A operação ANDWF faz uma operação AND entre o acumulador (W) e o registrador informado. ANDWF f,d ; f é o registrador e d é o destino onde será guardado o resultado da operação A operação ANDLW faz uma operação AND entre o literal (L) e o acumulador (W). ANDLW K ; K é um número literal e o resultado é guardado no prório acumulador. OR (IORWF e IORLW) A operação OR é uma operação lógica entre dois bytes. Cada bit da seqüência de um número é comparado a seqüência de bits do segundo. Esta operação ira resultar em um terceiro byte contendo a operação lógica OR entre os dois primeiros. IORWF e IORLW A operação IORWF faz uma operação OR entre o acumulador (W) e o registrador informado. IORWF f,d ; f é o registrador e d é o destino onde será guardado o resultado da operação A operação IORLW faz uma operação OR entre o literal (L) e o acumulador (W). ANDLW K ; K é um número literal e o resultado é guardado no prório acumulador. 98

TRABALHANDO DIRETAMENTE COM BYTES XOR (XORWF e XORLW) A operação XOR é uma operação lógica entre dois bytes. Cada bit da seqüência de um número é comparado a seqüência de bits do segundo. Esta operação ira resultar em um terceiro byte contendo a operação lógica EXCLUSIVE OR entre os dois primeiros. XORWF e XORLW A operação XORWF faz uma operação OU EXCLUSIVO entre o acumulador (W) e o registrador informado. XORWF f,d ; f é o registrador e d é o destino onde será guardado o resultado da operação A operação XORLW faz uma operação OU EXCLUSIVO entre o literal (L) e o acumulador (W). XORLW K ; K é um número literal e o resultado é guardado no prório acumulador. OBS.: XOR é muito utilizado na verificação de mudança de um BYTE. Verificando a o resultado da operação de subtração entre o registrador e ele mesmo através do registrador STATUS, Z. COMPLEMENTO (COMF) COMPF f,d faz o complemento do registrador f e guarda o resultado no registrador d. Byte 0 0 Complemento 1 1 1 0 0 1 1 0 1 1 0 0 0 1 99

TRABALHANDO DIRETAMENTE COM BYTES INVERSÃO (SWAPF) A operação SWAPF serve para inverter o nibble superior com o nibble inferior de um byte.operação XOR é uma operação lógica entre dois bytes. Cada bit da seqüência de um número é comparado a seqüência de bits do segundo. Esta operação ira resultar em um terceiro byte contendo a operação lógica EXCLUSIVE OR entre os dois primeiros. 100

CONTANDO TEMPO E CRIANDO DELAYS A contagem de tempo em um microcontrolador é muito preciso. Logicamente esta precisão irá depender da precisão do oscilador. Com esta precisão torna-se fácil mensurar o tempo que determinadas tarefas levam para serem executadas ao mesmo tempo em que se pode determinar o tempo em que um tarefa deve permanecer em execução. O tempo no PIC pode ser contado basicamente de três formas: Contando os ciclos de máquina por meio de loops Contando os ciclos de máquina por intermédio do contador timer 0 (TMR0); ou Contando pulsos externos por meio da entrada T0CLK e do TMR0 As duas primeiras são mais utilizadas e dependem exclusivamente do sistema de oscilação. A terceira depende de estímulos externos e pode ser facilmente utilizada para medir tempo com base na rede de 60 Hz. UTILIZANDO O TIMER PARA MARCAR TEMPO: Para configurarmos o TMR0 primeiramente precisamos saber qual é a freqüência do oscilador. Para nosso exemplo vamos adotar a freqüência de 4 MHz. O ciclo de máquina do PIC é quatro vezes menor do que a freqüência do oscilador. Neste caso nossa freqüência interna é de 1 MHz e o tempo é 1/f ou seja 1 us. Para nosso exemplo vamos supor que queiramos um tempo de 1 ms. Para isso usaremos o TMR0 e o Prescaler na configuração de 1:4. A conta a ser feita segue abaixo: Tempo de ciclo (1 us) x prescaler(4) x TMR0 (250) = 1 ms 101

CONTANDO TEMPO E CRIANDO DELAYS Exemplo de contagem: DELAY CLRF DL_1 MOVLW SUBWF BTFSS RETURN TMR0.250 TMR0,W STATUS,C DL_1 A rotina acima funciona porém a sua precisão ainda não é das melhores uma vez que a comparação é feita na forma de igualdade de estouro. Isto ocorre porque o TMR0 pode ser incrementado em qualquer uma destas linhas e a precisão acaba. UTILIZANDO REGISTROS TEMPORÁRIOS PARA CRIAR DELAYS: Podemos criar estruturas para contagem de tempo utilizando registradores temporários. Desta maneira podemos liberar o TMR0 e o prescaler. A idéia básica é criar contadores dentro de outros contadores para contar corretamente a quantidade de ciclos de máquinas e conseqüentemente o tempo. OBS.: Instruções tais como:, CALL, BTFSS, BTFSC, DECFSZ e INCFSZ podem durar 2 cilcos de máquinas Rotina para 1 ms: DELAY MOVLW.250 TEMP1 DL_1 NOP DECFSZ TEMP1,F DL_1 RETURN OBS.: 2 NOPs seguidos podem ser substituidos pro $+1, que também perde 2 ciclos. 102

TERCEIRO PROGRAMA PISCA PISCA Neste exemplo será usado delays e inversão de estados utilizando a operação XOR. Será utilizado uma constante chamada DISPLAY para fazer a inversão. Os botões 1 e 2 (RA1 e RA2) serão utilizados para alterar o valor da variável CONTADOR, mudando com isso a freqüência do pisca pisca. As constantes MIN e MAX determinam o limite para o contador e conseqüentemente a freqüência. 103

TERCEIRO PROGRAMA PISCA PISCA (FLUXOGRAMA) 104

TERCEIRO PROGRAMA PISCA PISCA ;Programa...: Pisca - Pisca ;Objetivo...: O software destina-se a piscar 5 leds formando a letra H em um displasy de 7 segmentos formados por leds #INCLUDE <PIC16F84.INC> #DEFINE #DEFINE BANK0 BANK1 BCF STATUS,RP0 BSF STATUS,RP0 CBLOCK 0X0C W_TEMP STATUS_TEMP CONTADOR FILTRO TEMPO1 TEMPO2 TEMPO3 ENC MIN MAX STEP MULTIPLOEQU ; ; ; ; ; ; ; ; ; a ********* f* *b * g * ********* e* *c * * ********* d EQU.10 EQU.240 EQU.5.5 105

TERCEIRO PROGRAMA PISCA PISCA DISPLAY EQU B'10101011' ; LETRA H #DEFINE #DEFINE BT1 PORTA,1 BT2 PORTA,2 ORG ORG RETFIE DELAY DL1 MOVLW DL2 NOP NOP DECFSZ DECFSZ RETURN 0X00 INICIO 0X04 TEMPO2.200 TEMPO1 TEMPO1,F DL2 TEMPO2,F DL1 106

TERCEIRO PROGRAMA PISCA PISCA INICIO BANK1 MOVLW MOVLW MOVLW MOVLW BANK0 CLRF MOVLW MOVLW B'00000110' TRISA B'00000000' TRISB B'10000000' OPTION_REG B'00000000' INTCON PORTA DISPLAY PORTB MIN CONTADOR MAIN MOVLW MULTIPLO TEMPO3 MAIN1 MOVF CALL BTFSS BTFSS DECFSZ MOVLW CONTADOR,W DELAY BT1 INCREMENTA BT2 DECREMENTA TEMPO3,F MAIN1 DISPLAY 107

TERCEIRO PROGRAMA PISCA PISCA XORWF DECREMENTA MOVLW SUBWF MOVLW SUBWF BTFSC MOVLW BTFSS INCREMENTA MOVLW ADDWF MOVLW SUBWF BTFSS MOVLW BTFSS END PORTB,F MAIN STEP CONTADOR,F MIN CONTATOR,W STATUS,C MAIN MIN CONTADOR BT2 $-1 MAIN STEP CONTATOR,F MAX CONTADOR,W STATUS,C MAIN MAX CONTADOR BT1 $-1 MAIN 108

USANDO O PCL PARA ESCOLHER ENTRE VÁRIAS ROTINAS O PCL é um registrador de uso especial (SFR) que contém o endereço da memória de programa que será executado em seguida. Podemos utilizá-lo para retornar diferentes valores ou mesmo executar diferentes funções: Um exemplo clássico seria o tratamento de funções que seriam executadas dependendo de um tecla específica. Imaginemos um teclado com 6 teclas com funções específicas. O número do botão pressionado é colocado na variável TECLA. TRATA_TECLA MOVLW ANDWF ADDWF B'00000111' TECLA,W PCL,F SEM_TECLA TECLA1 TECLA2 TECLA3 TECLA4 TECLA5 TECLA6 ERRO 109

PROGRAMA 4 CONTADOR MELHORADO Este exemplo é um aperfeiçoamento do exemplo 2. Será utilizado dois botões para fazer o incremento e outro o decremento unitariamente. Outra diferença é que agora será mostrado no display o valor em hexadecimal e não mais em leds. 110

PROGRAMA 4 CONTADOR MELHORADO (FLUXOGRAMA) 111

PROGRAMA 4 CONTADOR MELHORADO (FLUXOGRAMA) 112

PROGRAMA 4 CONTADOR MELHORADO ;Programa...: Contador Melhorado ;Objetivo...: O software destina-se a mostrar uma contagem hexadecimal em um display de 7 segmentos #INCLUDE <PIC16F84.INC> #DEFINE #DEFINE BANK0 BANK1 BCF STATUS,RP0 BSF STATUS,RP1 CBLOCK 0X0C W_TEMP STATUS_TEMP CONTADOR FLAGS FILTRO1 FILTRO2 ENDC #DEFINE #DEFINE ST_BT1 ST_BT2 FLAGS,0 FLAGS,1 MIN EQU.0 MAX EQU.15 T_FILTRO EQU.255 #DEFINE #DEFINE BOTAO1, PORTA,1 BOTAO2, PORTA,2 113

PROGRAMA 4 CONTADOR MELHORADO ORG ORG RETFIE ; ; ; ; ; ; ; ; ; 0X00 INICIO 0X04 a ********* f* *b * g * ********* e* *c * * ********* d CONVERTE MOVF CONTADOR,W ANDLW B'00001111' ADDWF PCL,F ; B'EDC.BAFG' RETLW B'11101110' RETLW B'00101000' RETLW B'11001101' RETLW B'01101101' RETLW B'00101011' RETLW B'01100111' RETLW B'11100111' RETLW B'00101100' RETLW B'11101111' RETLW B'01101111' RETLW B'10101111' 114

PROGRAMA 4 CONTADOR MELHORADO RETLW RETLW RETLW RETLW RETLW INICIO BANK1 MOVLW MOVLW MOVLW MOVLW BANK0 CLRF CLRF CLRF MOVLW MAIN MOVLW B'11100011' B'11000110' B'11101001' B'11000111' B'10000111' B'00000110' TRISA B'00000000' TRISB B'10000000' OPTION_REG B'00000000' INTCON PORTA PORTB FLAGS MIN CONTADOR ATUALIZA T_FILTRO FILTRO1 FILTRO2 115

PROGRAMA 4 CONTADOR MELHORADO CHECA_BT1 BTFSC DECFSZ BTFSS BOTAO1 BT1_LIB FILTRO1,F CHECA_BT1 ST_BT1 DEC CHECA_BT2 BT1_LIB BCF ST_BT1 CHECA_BT2 BTFSC DECFSZ BTFSS BOTAO2 BT2_LIB FILTRO2,F CHECA_BT2 ST_BT2 INC MAIN BT2_LIB BCF ST_BT2 MAIN DEC BSF MOVF XORLW ST_BT1 CONTADOR,W MIN 116