Upload
trannga
View
260
Download
10
Embed Size (px)
Citation preview
MICROCONTROLADORES - PIC16F84/16F84A/16F628/16F628A
Apresentação:
Eng. Antonio Carlos Lemos Jú[email protected]
FACTHUSUberaba 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
3
a) Microcontrolador b) Microprocessador
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 VON-NEUMANN. ● 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
8
● 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.
Introdução ás Memórias
9
● 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.
Introdução ás Memórias
10
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.
Introdução ás Memórias
11
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.
Introdução ás Memórias
12
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.
Introdução ás Memórias
13
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 pode-se acrescentar uma memória EEPROM externa.
Introdução ás Interrupções
14
O que são e como funcionam ?
● São ações tratadas imediatamente pelo hardware. Desta maneira tornando-as 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 ...
Introdução ás Interrupções
15
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.
Introdução ás Interrupções
16
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.
O PIC 16F84/F84A
17
● 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
O PIC 16F628/F628A
18
● 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
Nomenclaturas Utilizadas
19
● 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.
Memória de Programa
20a) PIC16F84/F84A b) PIC16F628/F628A
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
28
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)
Conhecendo os Registradores
29
Registrador STATUS
● Este registrador serve para mostrar o estado da ULA.
/TO: Indicação de Time-Out0 = 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-Down0 = 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 Zero0 = Indicando que o resultado da última operação (lógica ou aritmética)
não foi zero1 = Indica que a última operação (lógica ou aritmética) resultou em zero.
Conhecendo os Registradores
30
Registrador STATUS
● Este registrador serve para mostrar o estado da ULA.
DC: Digit Carry/Borrow0 = 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/Borrow0 = 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.
Conhecendo os Registradores
31
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 PORTB0 = 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 RB00 = A interrupção ocorrerá na borda de descida.1 = A interrupção ocorrerá na borda de subida.
T0CS: Configuração do incremento para o TMR00 = TMR0 será incrementado internamente pelo clock da máquina.1 = TMR0 será incrementado externamente pela mudança no pino RA4/T0CKI.
Conhecendo os Registradores
32
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.
Conhecendo os Registradores
33
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 TMR0 WDT000 1:2 1:1001 1:4 1:2010 1:8 1:4011 1:16 1:8100 1:32 1:16101 1:64 1:32110 1:128 1:64111 1:256 1:128
Conhecendo os Registradores
34
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 EEPROM0 = A interrupção não será tratada.1 = A interrupção será tratada.
T0IE: Habilitação da interrupção de estouro do TMR00 = A interrupção não será tratada.1 = A interrupção será tratada.
INTE: Habilitação da interrupção externa no pino RB00 = A interrupção não será tratada1 = A interrupção será tratada
Conhecendo os Registradores
35
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 RB70 = A interrupção não será tratada.1 = A interrupção será tratada.
T0IF: Identificação da interrupção de estouro do TMR00 = Esta interrupção não ocorreu.1 = Esta interrupção ocorreu.
INTF: Identificação da interrupção externa no pino RB00 = 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 RB70 = Esta interrupção não ocorreu.1 = Esta interrupção ocorreu.
Conhecendo os Registradores
36
Registrador TRISA e TRISB
● Estes registradores servem para configurar o PORTA e o PORTB como entrada ou saída
● 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)
PIC16F84/F84A
PIC16F628/F628A
Conhecendo os Registradores
37
Registrador PORTA e PORTB
● Estes registradores servem para acessar as portas A e B
● 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.
PIC16F84/F84A
PIC16F628/F628A
Conhecendo os Registradores
38
Registrador TMR0, TMR1 e TMR2
● Estes registradores servem para fazer contagem
● 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.
PIC16F84/F84A
PIC16F628/F628A
Conhecendo os Registradores
39
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
Conhecendo os Registradores
40
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
Conhecendo os Registradores
41
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.
Conhecendo os Registradores
42
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 EEPROM0 = Esta interrupção não ocorreu1 = Esta interrupção ocorreu
Conhecendo os Registradores
43
● WRERR: Identificação de erro durante a escrita na EEPROM0 = Não ocorreu erro, a escrita ocorreu sem problemas1 = 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 EEPROM1 = Disponibilizar escrita na EEPROM
● WR: Ciclo de escrita na EEPROM0 = 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.
Resumo das Condições Após Reset
44
Conhecendo o Set de Instruções
45
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.
Conhecendo o Set de Instruções
46
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: SomaAND: Lógica “E”CLR: Limpar, zerar(Clear)COM: ComplementoDEC: 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.
Conhecendo o Set de Instruções
47
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).
Resumo das Instruções
48
Considerações do Hardware
49
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.
Considerações do Hardware
50
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 vezesmenor que OSC1.
Considerações do Hardware
51
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:
Considerações do Hardware
52
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.
Considerações do Hardware
53
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).
Programando o PIC
54
● 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
Programando o PIC
55
● As constantes e definições são declararadas da seguinte maneira:
nome_da_variável EQU endereço_de_memória
ou
nome_da_constate EQU valor_da_constante
Para informarmos um número para o assembler do PIC usamos as seguintes nomenclaturas:
Decimal: D'número' ou .númeroHexadecimal: H'número' ou 0XnúmeroBinário: B'número'ASCII: A'caracter'
Programando o PIC
56
Alguns exemplos de declaração:
STATUS EQU H'0003'FSR EQU H'0004'PORTA EQU H'0005'PORTB EQU 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
Estruturação do Programa
57
; 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áveisCBLOCK 0X0C ; Endereço inicial da memória de usuário
W_TEMP ; Registradores temporários para usar junto às interrupçõesSTATUS_TEMPFLAG; Novas variáveis
ENDC
; Definição de flags internos, constantes #DEFINE ESTOURO_TEMPO FLAG,0TEMPO_LED EQU .30
Estruturação do Programa
58
; 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 RESETORG 0X00 ; Endereço inicial de processamento GOTO CONFIGURACAO
; Inicio das interrupções – O primeiro procedimento é salvar o acumulador W e o registrador STATUS.ORG 0X04MOVWF W_TEMPSWAPF STATUS, WMOVWF 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,WMOVWF STATUSSWAPF W_TEMP, F
Estruturação do Programa
59
SWAPF W_TEMP,WRETIFIE
; Início das rotinas e sub-rotinasSUB-ROTINA1
; CORPO DA ROTINA
RETURN
; Início da configuraçãoCONFIGURACAO
BANK1 ; Altera para banco 1 de memóriaMOVLW B'00000000'MOVWF TRISA ; Define as entradas e saídas da porta AMOVLW B'00000000'MOVWF TRISB ; Define as entradas e saídas da porta BMOVLW '10000100'MOVWF OPTION_REG ; Define as opções de operaçãoMOVLW '00000000'MOVWF INTCON ; Define as opções de interrupçãoBANK0 ; Retorna ao banco principal de memória
; Inicialização das variáveis
Estruturação do Programa
60
; Rotina PrincipalINICIO
; Corpo da rotina principalGOTO INICIO; Fim do Programa
END
Diretriz ORGUtilizada para indicar a posição da memória de início do programa e de
início do tratamento de interrupção.
Diretriz ENDUtilizada para indicar o final do programa
Diretriz CBLOCK e ENDCUtilizada 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
Trabalhando com Memória
61
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 BANK0 BCF STATUS, RP0#DEFINE BANK1 BSF STATUS, RP0
Lidando com Dados:
Basicamente os comandos utilizados no PIC para manipulação de dados são os seguintes:
MOVLW k Move um literal para o registrador W (Acumulador)MOVWF f Move o valor de work (W) para um registrador (F)MOVF 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.
Trabalhando com Memória
62
Existem também os comandos CLRF CLRW que são usados da seguinte maneira:
CLRF f Limpa o registrador CLRW 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.
Vetor de Reset
63
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 0x00GOTO INICIO
INICIOBANK1MOVLW B'00000000'MOVWF TRISBMOVLW B'00000001'MOVWF TRISABANK0
Inicializando Variáveis
64
É muito importante que as variáveis sejam inicializadas, mesmo que o seu valor seja igualado a zero(0).
;--------------------------------------------;- Inicialização das variáveis;--------------------------------------------CLRF PORTACLRF PORTBMOVLW .10MOVWF CONTADOR
Trabalhando com Rotinas
65
No PIC existem dois tipos de rotinas: rotinas de desvios e rotinas de chamadas. As rotinas de desvio são feitas utilizando o comando GOTO 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.
Trabalhando com Rotinas
66
Rotinas de Desvio
As rotinas de desvio são utilizadas para realizar desvios dentro do programa. A sintaxe do comando segui abaixo:
GOTO nome ; onde nome é o identificador do local onde se deseja pular
O identificador deve estar na primeira coluna do programa como segue abaixo:
INICIOMOVLW .20MOVWF TRISB
MODIFICAMOVLW .10MOVWF TRISAGOTO INICIO
Trabalhando com Rotinas
67
Rotinas de Desvio
Além disto existe a possibilidade de pularmos algumas linha utilizando o comando GOTO.
A sintaxe do comando segue abaixo:
GOTO $+3 ;Pula três linha para baixoGOTO $-2 ;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.
Trabalhando com Rotinas
68
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.
Tomando Decisões e Fazendo Desvios
69
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 ;em que f é o registrador e b o bit a ser testadoLinha1 ;passa por esta linha se o bit testado for 1Linha2 ;pula para esta linha se o bit testado for 0
BTFSS f,b ;em que f é o registrador e b o bit a ser testadoLinha1 ;passa por esta linha se o bit testado for 0Linha2 ;pula para esta linha se o bit testado for 1
Tomando Decisões e Fazendo Desvios
70
Além das portas, registrador, flags pode-se utilizar a diretiva DEFINE para substituir diretamente um bit, como segue abaixo:
#DEFINE BOTAO PORTA,0 ;Define o botão no pino RA0;0-> Liberado;1->Pressionado
BTFSS BOTAO ;O botão está pressionadoGOTO BT_LIB ;Não, vai tratar botão liberadoGOTO BT_PRES ;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 f,b ;em que f é o registrador e b é o bit que será setadoBCF f,b ;em que f é o registrador e b é o bit que será ressetado
Trabalhando com as Portas
71
É 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 ;Move o conteúdo do portb para o acumuladorMOVWF DADOS ;Escreve o valor do acumulador para o registrador
;DADOS
Trabalhando com as Portas
72
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 ;Muda para banco 1BSF TRISB,0 ;Transforma RB0 em entradaBANK0 ;Retorna para banco 0
;Outros comandos
BSF PORTB,0 ;Escreve 1 no Latch do RB0 (Que ainda é entrada)BANK1 ;Muda para banco 1BCF TRISB,0 ;Transforma RB0 em saída. Neste momento o pino
;será inicializado em 1 devido ao LatchBANK0 ;retorna para banco 0
Trabalhando com as Portas
73
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 .10 ;Escreve 10 em WMOVWF PORTB ;Transfere o valor de W (10) para o PORTBNOP ;Perde um ciclo de máquina sem fazer nadaMOVF PORTB,W ;Lê o valor do PORTB e coloca em WMOVWF DADO ;Transfere o valor de W (PORTB) para DADO
PRIMEIRO PROGRAMABOTÃO E LED
74
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.
PRIMEIRO PROGRAMABOTÃO E LED - FLUXOGRAMA
75
PRIMEIRO PROGRAMABOTÃO E LED
76
;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 BANK0 BCF STATUS,RP0#DEFINE BANK1 BSF STATUS,RP0
CBLOCK 0X0CW_TEMPSTATUS_TEMP
ENDC
#DEFINE BOTAO PORTA,2#DEFINE LED PORTB,0
ORG 0X00GOTO INICIOORG 0X04RETFIE
INICIOBANK1MOVLW B'00000100'MOVWF TRISAMOVLW B'00000000'MOVWF TRISB
PRIMEIRO PROGRAMABOTÃO E LED
77
MOVLW B'10000000'MOVWF OPTION_REGMOVLW B'00000000'MOVWF INTCON
BANK0CLRF PORTACLRF PORTB
MAINBTFSS BOTAOGOTO BOTAO_LIBGOTO BOTAO_PRES
BOTAO_LIBBCF LEDGOTO MAIN
BOTAO_PRESBSF LEDGOTO MAIN
END
FAZENDO OPERAÇÕES ARITMÉTICAS BÁSICAS
78
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 f,d ; em que f é o registrador e d o destino onde será guardado o resultado ; da conta (f + 1 -> d).
INCFZ f,d ; em que f é o registrador e d o destino onde será guardado o resultado ; da conta (f + 1 -> d).
ADDWF f,d ; em que f é o registrador e d o destino onde será guardado o resultado; da conta (f + k -> d).
ADDLW k ; em que k é o número que será somado ao W o resultado é mantido ; em W (W + k -> W).
FAZENDO OPERAÇÕES ARITMÉTICAS BÁSICAS
79
Exemplo da utilização das instruções:
INCF
CLRF CONTA ; zera o contadorLOOP
CALL BIP ; chama a rotina BIP que emitirá um SOMINCF CONTA,F ; incrementa o contador (CONTA = CONTA + 1)BTFSS CONTA,3 ; testa o BIT número 3 do contador. Quando este BIT for
; igual a 1, significa que contador = 8.GOTO LOOP ; contador ainda não é 8, retorna para LOOP.
END ; contador igual 8, acabou o exemplo.
FAZENDO OPERAÇÕES ARITMÉTICAS BÁSICAS
80
Exemplo da utilização das instruções:
INCFSZ
MOVLW .246 ; move 246 para o acumuladorMOVWF CONTA ; inicia o contador com 246 (256 - 10).
LOOPCALL BIP ; chama a rotina BIP que emitirá um som.INCFSZ CONTA,F ; incrementa o contador (CONTA = CONTA + 1).
; resultado = 0 (estourou?).GOTO LOOP ; não, retorna para LOOP pois não passou 10 vezes.
END ; sim, acabou o exemplo pois já passou 10 vezes.
FAZENDO OPERAÇÕES ARITMÉTICAS BÁSICAS
81
Exemplo da utilização das instruções:
ADD
MOVLW .10MOVWF NUM_1 ; inicia NUM_1 com valor 10MOLW .20MOVWF NUM_2 ; inicia NUM_1 com valor 20CLRF RESULTADO ; inicia RESULTADO com zero
SOMA1 ; resposta = NUM_1 + 5MOVF NUM_1,W ; coloca o NUM_1 dentro do acumulador(W)ADDLW .5 ; soma 5 ao acumulador (W)MOVWF RESULTADO ; coloca a resposta em resultado
SOMA2 ; resposta = NUM_1 + NUM_2MOVF NUM_1,W ; coloca o valor NUM_1 no acumulador (W) ADDWF NUM_2,W ; soma o valor NUM_2 ao acumulador(W) e guarda o
; resultado no acumuladorMOVWF RESULTADO ; coloca o valor da resposta no RESULTADO
END ; término do programa.
FAZENDO OPERAÇÕES ARITMÉTICAS BÁSICAS
82
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:
CLRF BYTE_BAIXO ;Inicia BYTE_BAIXO com zeroCLRF BYTE_ALTO ;Inicia BYTE_ALTO com zero
MOVF NUM_1,W ;Move NUM_1 para dentro do acumuladorADDWF NUM_2,W ;Soma NUM_2 com o NUM_1 que está no acumuladorBTFSC STATUS,C ;Verifica se houve um estouro?INCF BYTE_ALTO ;Se sim incrementa o BYTE_ALTO
MOVWF BYTE_BAIXO ;Move o acumulador para o BYTE_BAIXOADDWF NUM_3,W ;Soma NUM_3 ao acumulador
BTFSC STATUS,C ;Verifica se houve estouro?INCF BYTE_ALTO,F ;Se sim incrementa o BYTE_ALTO
MOVWF BYTE_BAIXO ;Move o acumulador para o BYTE_BAIXOEND
FAZENDO OPERAÇÕES ARITMÉTICAS BÁSICAS
83
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).
FAZENDO OPERAÇÕES ARITMÉTICAS BÁSICAS
84
UTILIZANDO A INSTRUÇÃO DECFSZ
MOVLW .10 ; Inicia o contador com 10MOVWF CONTA ; Move o valor 10 para a variável CONTA
LOOP
CALL BIP ; Chama rotina de emissão de somDECFSZ CONTA,F ; Decrementa a variável conta (CONTA = CONTA -1)
; Resultado é igual a zero (Acabou ?)GOTO LOOP ; Não, continua até zerar
END ; Sim, termina o programa
FAZENDO OPERAÇÕES ARITMÉTICAS BÁSICAS
85
UTILIZANDO A SUBWF SUBLW
MOVLW .10MOVWF NUM_1 ; Inicia NUM_1 com 10MOVLW .20MOVWF NUM_2 ; Inicia NUM_2 com 20CLRF RESULTADO ; Inicia RESULTADO com zero
SUB1MOVF NUM_1,W ; Move o valor de NUM_1 para o acumuladorSUBLW .30 ; Subtrai de 30 o valor de WMOVWF RESULTADO ; Guarda a resposta em RESULTADO
SUB2MOVF NUM_1,W ; Move o valor de NUM_1 para WSUBWF NUM_2,W ; Subtrai de NUM_2 o valor de WMOVWF RESULTADO
END
FAZENDO OPERAÇÕES ARITMÉTICAS BÁSICAS
86
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.
FAZENDO OPERAÇÕES ARITMÉTICAS BÁSICAS
87
Supondo dois números NUM_1 e NUM_2
CLRF RESP ; Limpa registrador RESPSUB1 ; Subtrai NUM_2 – NUM_1 = RESP
MOVF NUM_1,W ; Move NUM_1 para WSUBWF NUM_2,W ; Subtrai NUM_2 - WBTFSS STATUS,C ; Testa carry. Resultado negativo?GOTO TRATA_NE ; Sim, pula para tratar número negativo
; Não, resultado positivo ou zeroMOVWF RESP ; Move diretamente para RESPBCF NEG ; Limpa flag de número negativoGOTO FIM ; Finaliza
TRATA_NEG ; Como resultado foi negativo, então RESP = 256 - W; Como o número máximo para 8 bits é 255, então; 256 -> 0
SUBLW.0 ; 0 - WMOVWF RESP ; Coloca o resultado em RESPBSF NEG ; Seta o flag de número negativo
END ; Fim do programa
FAZENDO OPERAÇÕES ARITMÉTICAS BÁSICAS
88
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.
COMPARA1MOVF NUM_1,WSUBWF NUM_2,W
BTFSS STATUS,CGOTO RESP1GOTO RESP2END
FAZENDO OPERAÇÕES ARITMÉTICAS BÁSICAS
89
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 FBYTE INICIAL => 01011011
REGISTRADOR FBYTE FINAL => 10110111
Deslocamento de apenas um bit.
FAZENDO OPERAÇÕES ARITMÉTICAS BÁSICAS
90
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 BYTE_BAIXO ; Limpa o registrador BYTE_BAIXOCLRF BYTE_ALTO ; Limpa o registrador BYTE_ALTO
MULT ; NUM_1 X NUM_2MOVWF NUM_2,W ; Move o valor de NUM_2 para WADDWF BYTE_BAIXO,F ; Soma NUM_2 ao valor já existenteBTFSC STATUS,C ; Houve estouro?INCF BYTE_ALTO,F ; Sim, incrementa o BYTE_ALTO
; NãoDECFSZ NUM_1,F ; Decrementa NUM_1. Acabou?GOTO MULT ; Não, continua somando
; Sim, soma sucessiva terminadaEND
FAZENDO OPERAÇÕES ARITMÉTICAS BÁSICAS
91
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 FBYTE INICIAL => 01011011
REGISTRADOR FBYTE FINAL => 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.
DIV4BCF STATUS,C ; Limpa o carryRRF NUM_1,F ; Divide por 2 (NUM_1 = NUM_1 / 2)RRF NUM_1,F ; Divide por 2 (Num_1 = Num_1 / 4)END
SEGUNDO PROGRAMACONTADOR SIMPLIFICADO
92
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.
SEGUNDO PROGRAMA - CONTADORCRESCENTE-DECRESCENTE - FLUXOGRAMA
93
SEGUNDO PROGRAMA - CONTADORCRESCENTE-DECRESCENTE - PROGRAMA
94
;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 BANK0 BCF STATUS,RP0#DEFINE BANK1 BSF STATUS,RP0
CBLOCKW_TEMPSTATUS_TEMPCONTATORFLAGSFILTRO
ENDC
#DEFINE SENTIDO FLAGS,0#DEFINE BOTAO PORTA,2
MIN EQU .10MAX EQU .30T_FILTRO EQU .230
ORG 0X00GOTO INICIO
SEGUNDO PROGRAMA - CONTADORCRESCENTE-DECRESCENTE - PROGRAMA
95
ORG 0X04RETFIE
INICIOBANK1MOVLW B'00000100'MOVWF TRISA
MOVLW B''00000000'MOVWF TRISBMOVLW B'10000000'MOVWF OPTION_REG
MOVLW B'00000000'MOVWF INTCONBANK0
CLRF PORTACLRF PORTBMOVLW MINMOVWF CONTADOR
MAINMOVLW T_FILTROMOVWF FILTRO
CHEGA_BTBTFSC BOTAOMOVWF MAIN
SEGUNDO PROGRAMA - CONTADORCRESCENTE-DECRESCENTE - PROGRAMA
96
DECFSZ FILTRO,FGOTO CHECA_BT
TRATA_BTBTFSS SENTIDOGOTO SOMA
SUBTRAIDECFCONTADOR,FMOVLW MINSUBWF CONTADOR,WBTFSC STATUS,CGOTO ATUALIZAINCF CONTADOR,FBCF SENTIDOGOTO MAIN
SOMAINCF CONTADOR,FMOVLW MAXSUBWF CONTADOR,WBTFSS STATUS,CGOTO ATUALIZABSF SENTIDOGOTO MAIN
ATUALIZAMOVF CONTADOR,WMOVWF PORTB
SEGUNDO PROGRAMA - CONTADORCRESCENTE-DECRESCENTE - PROGRAMA
97
BTFSC BOTAOGOTO $-1GOTO MAIINEND
TRABALHANDO DIRETAMENTE COM BYTES
98
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.
TRABALHANDO DIRETAMENTE COM BYTES
99
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.
ByteByte 0 0 1 0 1 1 1 0 0 0 1 0 1 1 1 0Complemento 1 1 0 1 0 0 0 1Complemento 1 1 0 1 0 0 0 1
TRABALHANDO DIRETAMENTE COM BYTES
100
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.
CONTANDO TEMPO E CRIANDO DELAYS
101
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
CONTANDO TEMPO E CRIANDO DELAYS
102
Exemplo de contagem:
DELAYCLRF TMR0
DL_1MOVLW .250SUBWF TMR0,WBTFSS STATUS,CGOTO DL_1RETURN
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: GOTO, CALL, BTFSS, BTFSC, DECFSZ e INCFSZ podem durar 2 cilcos de máquinas
Rotina para 1 ms:
DELAYMOVLW .250MOVWF TEMP1
DL_1NOPDECFSZ TEMP1,FGOTO DL_1RETURN
OBS.: 2 NOPs seguidos podem ser substituidos pro GOTO $+1, que também perde 2 ciclos.
TERCEIRO PROGRAMA – PISCA – PISCA
103
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.
TERCEIRO PROGRAMA – PISCA – PISCA (FLUXOGRAMA)
104
TERCEIRO PROGRAMA – PISCA – PISCA
105
;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 BANK0 BCF STATUS,RP0#DEFINE BANK1 BSF STATUS,RP0
CBLOCK 0X0CW_TEMPSTATUS_TEMPCONTADORFILTROTEMPO1TEMPO2TEMPO3
ENC
MIN EQU .10MAX EQU .240STEP EQU .5MULTIPLOEQU .5
; a; *********; f * * b; * g *; *********; e* * c; * *; *********; d
TERCEIRO PROGRAMA – PISCA – PISCA
106
DISPLAY EQU B'10101011' ; LETRA H
#DEFINE BT1 PORTA,1#DEFINE BT2 PORTA,2
ORG 0X00GOTO INICIOORG 0X04RETFIE
DELAYMOVWF TEMPO2
DL1MOVLW .200MOVWF TEMPO1
DL2NOPNOPDECFSZ TEMPO1,FGOTO DL2
DECFSZ TEMPO2,FGOTO DL1
RETURN
TERCEIRO PROGRAMA – PISCA – PISCA
107
INICIOBANK1MOVLW B'00000110'MOVWF TRISAMOVLW B'00000000'MOVWF TRISBMOVLW B'10000000'MOVWF OPTION_REG
MOVLW B'00000000'MOVWF INTCONBANK0CLRF PORTAMOVLW DISPLAYMOVWF PORTBMOVLW MINMOVWF CONTADOR
MAINMOVLW MULTIPLOMOVWF TEMPO3
MAIN1MOVF CONTADOR,WCALL DELAYBTFSS BT1GOTO INCREMENTABTFSS BT2GOTO DECREMENTADECFSZ TEMPO3,FGOTO MAIN1MOVLW DISPLAY
TERCEIRO PROGRAMA – PISCA – PISCA
108
XORWF PORTB,FGOTO MAIN
DECREMENTAMOVLW STEPSUBWF CONTADOR,FMOVLW MINSUBWF CONTATOR,WBTFSC STATUS,CGOTO MAINMOVLW MINMOVWF CONTADORBTFSS BT2GOTO $-1GOTO MAIN
INCREMENTAMOVLW STEPADDWF CONTATOR,FMOVLW MAXSUBWF CONTADOR,WBTFSS STATUS,CGOTO MAINMOVLW MAXMOVWF CONTADORBTFSS BT1GOTO $-1GOTO MAINEND
USANDO O PCL PARA ESCOLHER ENTREVÁRIAS ROTINAS
109
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_TECLAMOVLW B'00000111'ANDWF TECLA,WADDWF PCL,FGOTO SEM_TECLAGOTO TECLA1GOTO TECLA2GOTO TECLA3GOTO TECLA4GOTO TECLA5GOTO TECLA6GOTO ERRO
PROGRAMA 4 – CONTADOR MELHORADO
110
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.
PROGRAMA 4 – CONTADOR MELHORADO (FLUXOGRAMA)
111
PROGRAMA 4 – CONTADOR MELHORADO (FLUXOGRAMA)
112
PROGRAMA 4 – CONTADOR MELHORADO
113
;Programa.........: Contador Melhorado;Objetivo..........: O software destina-se a mostrar uma contagem hexadecimal em um display de 7 segmentos
#INCLUDE <PIC16F84.INC>
#DEFINE BANK0 BCF STATUS,RP0#DEFINE BANK1 BSF STATUS,RP1
CBLOCK 0X0CW_TEMPSTATUS_TEMPCONTADORFLAGSFILTRO1FILTRO2
ENDC
#DEFINE ST_BT1 FLAGS,0#DEFINE ST_BT2 FLAGS,1
MIN EQU .0MAX EQU .15T_FILTRO EQU .255
#DEFINE BOTAO1, PORTA,1#DEFINE BOTAO2, PORTA,2
PROGRAMA 4 – CONTADOR MELHORADO
114
ORG 0X00GOTO INICIOORG 0X04RETFIE
; a; *********; f * * b; * g *; *********; e* * c; * *; *********; d
CONVERTEMOVF CONTADOR,WANDLW 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'
PROGRAMA 4 – CONTADOR MELHORADO
115
RETLW B'11100011'RETLW B'11000110'RETLW B'11101001'RETLW B'11000111'RETLW B'10000111'
INICIOBANK1MOVLW B'00000110'MOVWF TRISAMOVLW B'00000000'MOVWF TRISBMOVLW B'10000000'MOVWF OPTION_REGMOVLW B'00000000'MOVWF INTCONBANK0
CLRF PORTACLRF PORTBCLRF FLAGSMOVLW MINMOVWF CONTADORGOTO ATUALIZA
MAINMOVLW T_FILTROMOVWF FILTRO1MOVWF FILTRO2
PROGRAMA 4 – CONTADOR MELHORADO
116
CHECA_BT1BTFSC BOTAO1GOTO BT1_LIBDECFSZ FILTRO1,FGOTO CHECA_BT1BTFSS ST_BT1GOTO DECGOTO CHECA_BT2
BT1_LIBBCF ST_BT1
CHECA_BT2BTFSC BOTAO2GOTO BT2_LIBDECFSZ FILTRO2,FGOTO CHECA_BT2BTFSS ST_BT2GOTO INCGOTO MAIN
BT2_LIBBCF ST_BT2GOTO MAIN
DECBSF ST_BT1MOVF CONTADOR,WXORLW MIN
PROGRAMA 4 – CONTADOR MELHORADO
117
BTFSC STATUS,ZGOTO MAINDECFCONTADOR,FGOTO ATUALIZA
INCBSF ST_BT2MOVF CONTADOR,WXORLW MAX
BTFSC STATUS,ZGOTO MAININCF CONTADOR,FGOTO ATUALIZA
ATUALIZACALL CONVERTEMOVWF PORTBGOTO MAINEND
EXPLORANDO AS INTERRUPÇÕES
118
O PIC possui algumas interrupções que são extremamente necessárias quando não queremos utilizar certos artifícios que param a execução do programa . Estas interrupções são usadas para contar tempo, informar o final de escrita na EEPROM, mudança de estado dos pinos por exemplo do PORTB entre outras.
LIGANDO AS CHAVES CORRETAS:
Primeiramente devemos habilitar o PIC para que o mesmo possa tratar tais interrupções. Basicamente temos duas chaves que devemos ficar atentos: A chave individual e a chave global.
Individual: São as chaves (BITS) que habilitam ou desabilitam cada interrupção individualmente.
Global: É a chave (BIT) responsável em habilitar ou desabilitar todas as interrupções de uma só vez.
OBS.; Para podermos tratar um interrupção primeira a chave individual referente a ela deverá estar ligada assim como a chave global.
ESTRUTURA BÁSICA DA INTERRUPÇÃO:
Quando ocorre um interrupção o hardware do PIC desvia o programa automaticamente para o endereço 0x04. A partir deste momento podemos inserir os códigos de programas que trataram cada interrupção individualmente. A rotina de interrupção acaba quando o programa chega ao mnemônico RETFIE.
Exemplo:
ORG 0X04MOVWF W_TEMPSWAPF STATUS,WMOVWF STATUS_TEMP
AQUI FICAM OS CÓDIGO DE PROGRAMA
SAI_INTERRUPCAOSWAPF STATUS_TEMP,WMOVWF STATUSSWAPF W_TEMP,FSWAPF W_TEMP,W
RETFIE
CHECANDO QUE INTERRUPÇÃO OCORREU
119
Agora com o conhecimento básico da estrutura do tratamento das interrupções como fazer para verificar qual interrupção ocorreu? Abaixo segue algoritmo executado pelo hardware do PIC quando uma interrupção ocorre.
TRATANDO A INTERRUPÇÃO DE TIMER
120
ROTINA DE INTERRUPÇÃO
TESTE1BTFSS INTCON,T0IF ;FOI INTERRUPÇÃO DE TIMERGOTO SAI_INT ; NÃO, FINALIZABCF INTCON,T0IF ;LIMPA FLAG DE INTERRUPÇÃODECFSZ TEMPO1,F ;DECREMENTA TEMPO, ACABOU?GOTO SAI_INT ;NÃO, SAI DA INTERRUPÇÃOBTFSS LED ;LED, ESTÁ ACESO?GOTO LED_ON ;NÃO, ENTÃO ACENDE
LED_OFFBCF LED ;APAGA LEDGOTO FIM_TMR0 ;VAI PARA FIM DA INTERRUPÇÃO
LED_ONBSF LED ;ACENDE O LED
FIM_TMR0MOVLW .100MOVWF TEMPO1 ;REINICIA BASE DE TEMPOGOTO SAI_INT ;FINALIZA A INTERRUPÇÃO
TRATANDO A INTERRUPÇÃO EXTERNA
121
A interrupção externa é uma das mais usadas. Ela é empregada na recepção de dados, sinais que precisam ser tratados imediatamente, sincronismo e muito mais. A interrupção pode ser tratada na borda de descida ou na borda de subida. Para configurarmos isto usamos o registrador OPTION e setar o bit INTEDG. 1 = Subida, 0 = Descida. Para habilitarmos a chave individual INTCON,INTIE deverá estar setada com nível 1. Para verificarmos se a interrupção ocorreu devemos utilizar o bit INTF do registrador INTCON.
TRATANDO A INTERRUPÇÃO DE MUDANÇA DE ESTADO
Esta interrupção deve ser usada em sinais que devem ser tratados tanto na subida como na descida. Um sincronismo com a rede elétrica é um bom exemplo. Para habilitarmos setamos 1 no bit INTCON,RBIE. Para sabermos se a interrupção ocorreu devemos verificar o bit INTCON,RBIF
PROGRAMA 5 – TIMER SIMPLIFICADO
122
O seguinte exemplo é um temporizador usando a interrupção de estouro de tempo. O valor será decrementado a cada segundo da variável V_INICIO até zero. Um botão é usado para iniciar o timer e outro para pará-lo. Enquanto o timer estiver funcionanod o led deverá permanecer ligado. A base do prescaler (1:64), na inicialização do TMR0(256-125) e um contador auxiliar (TEMP1) que é inicializado com 125. A interrupção ocorrerá a cada 8 ms (64 us x 125). O contador auxiliar multiplicará este tempo por 125, resultando em 1 segundo (8 ms x 125 = 1s).
PROGRAMA 5 – TIMER SIMPLIFICADO (FLUXOGRAMA)
123
PROGRAMA 5 – TIMER SIMPLIFICADO (FLUXOGRAMA)
124
PROGRAMA 5 – TIMER SIMPLIFICADO (FLUXOGRAMA)
125
PROGRAMA 5 – TIMER SIMPLIFICADO
126
;Programa.........: Timer Simplificado;Objetivo..........: O software destina-se a contar tempo e mostrar a contagem em um display de 7 segmentos
#INCLUDE <P16F84.INC>
#DEFINE BANK0 BCF STATUS,RP0#DEFINE BANK0 BSF STATUS,RP1
CBLOCK 0X0CW_TEMPSTATUS_TEMPTEMPOFLAGSTEMP1TEMP2FILTRO1FILTRO2
ENDC
#DEFINE F_FIM FLAGS,0#DEFINE ST_BT1 FLAGS,1#DEFINE ST_BT2 FLAGS,2
V_INICIO EQU .9T_FILTRO EQU .255
#DEFINE BOTAO1 PORTA,1#DEFINE BOTAO2 PORTA,2
#DEFINE LED PORTA,3
PROGRAMA 5 – TIMER SIMPLIFICADO
127
ORG 0X00GOTO INICIO
ORG 0X04
MOVWF W_TE,MPSWAPF STATUS,WMOVWF STATUS_TEMP
BTFSS INTCON,T0IFGOTO SAI_INT
BCF INTCON,T0IFMOVLW (.256-,125)MOVWF TMR0DECFSZ TEMP1,FGOTO SAI_INT
MOVLW .125MOVWF TEMP1BTFSC F_FIMGOTO SAI_INT
BSF F_FIM
SAI_INTSWAPF STATUS_TEMP,WMOVWF STATUSSWAPF W_TEMP,FSWAPF W_TEMP,WRETFIE
PROGRAMA 5 – TIMER SIMPLIFICADO
128
; a; *********; f * * b; * g *; *********; e* * c; * *; *********; d
CONVERTEMOVF TEMPO,WANDLW 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'RETLW B'11100011'RETLW B'11000110'RETLW B'11101001'RETLW B'11000111'RETLW B'10000111'
PROGRAMA 5 – TIMER SIMPLIFICADO
129
ATUALIZACALL CONVERTEMOVWF PORTBRETURN
DESL_TIMERBCF INTCON,GIEBCF LEDRETURN
LIGA_TIMERBTFSC INTCON,GIERETURNBCF INTCON,T0IFMOVLW .256-,125MOVWF TMR0MOVLW ,125MOVWF TEMP1BSF INTCON,GIEBSF LEDRETURN
INICIOBANK1MOVLW B'00000110'MOVWF TRISA
MOVLW B'00000000'MOVWF TRISB
MOVLW B'10000101'MOVWF OPTION_REG
PROGRAMA 5 – TIMER SIMPLIFICADO
130
MOVLW B'00100000'MOVWF INTCON
BANK0
CLRF PORTACLRF PORTBCLRF FLAGSMOVLW V_INICIOMOVWF TEMPOCALL ATUALIZA
MAINBTFSC F_FIMCALL DESL_TIMERCALL ATUALIZAMOVLW T_FILTROMOVWF FILTRO1MOVWF FILTRO2
CHECA_BT1BTFSC BOTAO1GOTO BT1_LIB
DECFSZ FILTRO1,F
GOTO CHECA_BT1
BTFSS ST_BT1GOTO ACAO_BT1GOTO CHECA_BT2
PROGRAMA 5 – TIMER SIMPLIFICADO
131
BT1_LIBBCF ST_BT1
CHECA_BT2BTFSC BOTAO2GOTO BT2_LIB
DECFSZ FILTRO2,F
GOTO CHECA_BT2
BTFSS ST_BT2GOTO ACAO_BT2GOTO MAIN
ACAO_BT1BSF ST_BT1CALL LIGA_TIMERGOTO MAIN
ACAO_BT2BSF ST_BT2CALL DESL_TIMERGOTO MAINEND
UTILIZANDO A EEPROM
132
O PIC 16F84/84A/628/628A possui uma EEPROM interna. A quantidade desta memória varia de modelo para modelo. Esta memória é muito importante quando necessitamos de armazenar dados que não podem ser perdidos mesmo com o desligamento do sistema.
ESCREVENDO NA EEPROM
A escrita da EEPROM é mais complexa que a leitura. Isto deve-se ao fato da proteção em que esta está submetida. Isto torna o sistema muito mais robusto e seguro.
Procedimento para a escrita na EEPROM:
● O Endereço para a escrita deve ser colocado em EEADR. Como existem 64 bytes disponíveis, esse endereço deve estar entre 0 e 63.● O dado a ser gravado deve ser colocado na EEDATA. Só podemos escrever um byte de cada vez.● As interrupções devem ser desligadas para evitarmos conflitos.● A escrita deve ser habilitada por meio do bit EECON1,WREN(1).● O registrador EECON2 deve ser carregado com os valores 0x55 e 0xAA, seqüencialmente Este procedimento é obrigatório e utilizado para a proteção da escrita.● A escrita deve ser iniciada setando o bit EECON1,WR(1) e limpando o bit EECON1,WREN(0).● As interrupções podem ser novamente ligadas.● A operação de escrita é um pouco demorada, e ela só terá terminado quando o bit EECON1,WR tiver sido limpo automaticamente pelo HARDWARE.
UTILIZANDO A EEPROM
133
Por isso, normalmente ficamos esperando que isso aconteça. No caso de não podermos ficar esperando pelo fim de escrita, podemos ligar a interrupção de escrita na EEPROM por meio do bit INTCON,EEIE, e esperamos que ela aconteça para considerarmos finalizada a escrita.● Caso algum erro ocorra durante a operação de escrita, o bit EECON1,WRERR será setado (1). No caso de sucesso na operação, esse bit será mantido em zero(0).
ROTINA DE ESCRITA NA EEPROM;
ESCR_E2PROMMOVWF EEDATABCF INTCON,GIEBANK1BSF EECON1,WRENMOVLW 0X55MOVWF EECON2MOVLW 0XAAMOVWF EECON2BSF EECON1,WRBCF EECON1,WRENBTFSC EECON 1,WERRGOTO ESCR_E2PROM+1BTFSC EECON1,WRGOTO $-3BANK0BSF INTCON,GIERETURN
OBS.: A rotina acima não é perfeita, pois se ocorrer um erro, o sistema tenta escrever o dado novamente, mas não limita o número de tentativas e isto pode travar o sistema caso um erro grave ocorra na escrita da memória
TRATANDO INTERRUPÇÃO FINAL DE ESCRITA NA EEPROM
134
Esta interrupção é utilizada em sistemas que não podem ficar parados esperando o final da escrita na EEPROM.
Para ativar esta interrupção o bit INTCON,EEIE deve estar setado em nível lógico alto.
Para verificar se a interrupção ocorreu devemos utilizar o bit EECON1,EEIF
LENDO DA EEPROM
135
Após a escrita da EEPROM o normal é que queiramos ler a informação que outrora fora escrita. O procedimento é mais simples do que a escrita.
O roteiro para leitura segue abaixo:
● O endereço para leitura deve ser colocado em EEADR. Como existem 64 bytes disponíveis, este endereço deve estar entre 0 e 63.● A leitura deve ser ligada por meio do bit EECON1,RD (1). A leitura terminará quando este bit voltar automaticamente para zero, o que acontece quase que imediatamente.● O dado lido será colocado em EEDATA.
Segue abaixo a rotina:
LE_E3PROMBANK1BSF EECON1,RDBANK0MOVF EEDATA,WRETURN
PROGRAMA 6 – CONTADOR FINAL
136
O contador final consiste em armazenar o valor atual na memória EEPROM. Caso ocorra uma queda de energia o valor não será perdido.
PROGRAMA 6 – CONTADOR FINAL (FLUXOGRAMA)
137
PROGRAMA 6 – CONTADOR FINAL (FLUXOGRAMA)
138
PROGRAMA 6 – CONTADOR FINAL
139
;Programa.........: Contador Final;Objetivo..........: O software em questão destina-se a fazer uma contagem e armazená-la na EEPROM desta maneira caso haja uma queda de energia a contagem não será perdida.
#INCLUDE <P16F84.INC>
#DEFINE BANK0 BCF STATUS,RP0#DEFINE BANK0 BSF STATUS,RP1
CBLOCK 0X0CW_TEMPSTATUS_TEMPCONTADORFLAGSFILTRO1FILTRO2
ENDC
#DEFINE ST_BT1 FLAGS,0#DEFINE ST_BT2 FLAGS,1
MIN EQU .0MAX EQU .15T_FILTRO EQU .255POS_MEM EQU .0
#DEFINE BOTAO1 PORTA,1#DEFINE BOTAO2 PORTA,2
ORG H'2100'+POS_MEM
PROGRAMA 6 – CONTADOR FINAL
140
DE .5
ORG 0X00GOTO INICIO
ORG 0X04RETFIE
CONVERTEMOVF TEMPO,WANDLW 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'RETLW B'11100011'RETLW B'11000110'RETLW B'11101001'RETLW B'11000111'RETLW B'10000111'
PROGRAMA 6 – CONTADOR FINAL
141
LE_E2PROMBANK1BSF EECON1,RDBANK0MOVF EEDATA,WRETURN
ESCR_E2PROMMOVWF EEDATABCF INTCON,GIEBANK1BSF EECON1,WRENMOVLW 0X55MOVWF EECON2MOVLW 0XAAMOVWF EECON2BSF EECON1,WRBCF EECON1,WRENBTFSC EECON1,WRGOTO $-1BANK0BSF INTCON,GIERETURN
LE_CONTAMOVLW POS_MEMMOVWF EEADRCALL LE_E2PROMMOVWF CONTADORRETURN
PROGRAMA 6 – CONTADOR FINAL
142
ESCR_CONTAMOVLW POS_MEMMOVWF EEADRMOVF CONTADOR,WCALL ESCR_E2PROMRETURN
INICIOBANK1MOVLW B'00000110'MOVWF TRISA
MOVLW B'00000000'MOVWF TRISBMOVLW B'10000000'MOVWF OPTION_REG
MOVLW B'00000000'MOVWF INTCONBANK0
CLRF PORTACLRF PORTBCLRF FLAGSCALL LE_CONTA
GOTO ATUALIZA
MAINMOVLW T_FILTROMOVWF FILTRO1MOVWF FILTRO2
PROGRAMA 6 – CONTADOR FINAL
143
CHECA_BT1BTFSC BOTAO1GOTO BT1_LIBDECFSZ FILTRO1,FGOTO CHECA_BT1BTFSS ST_BT1GOTO DECGOTO CHECA_BT2
BT1_LIBBCF ST_BT1
CHECA_BT2BTFSC BOTAO2GOTO BT2_LIBDECFSZ FILTRO2,FGOTO CHECA_BT2BTFSS ST_BT2GOTO INCGOTO MAIN
BT2_LIBBCF ST_BT2GOTO MAIN
DECBSF ST_BT1MOVF CONTADOR,WXORLW MIN
PROGRAMA 6 – CONTADOR FINAL
144
BTFSC STATUS,ZGOTO MAINDECFCONTADOR,FCALL ESCR_CONTAGOTO ATUALIZA
INCBSF ST_BT2MOVF CONTADOR,WXORLW MAXBTFSC STATUS,ZGOTO MAININCF CONTADOR,FCALL ESCR_CONTA
ATUALIZACALL CONVERTEMOVWF PORTBGOTO MAINEND
BIBLIOGRAFIA:
● Data Sheets: www.microchip.com (16F84/F84A/F628/F628A)
● Desbravando o PIC – Baseado no Microcontrolador PIC16F84 – David José de Souza – Ed. Érica 4ª Edição - 2001
● Programação em C – Baseado nos compiladores CCS – Fábio Pereira – Ed. Érica 1ª Edição - 2003
145