Este documento apresenta exemplos de programas em assembly para PIC16F877 utilizando as diretivas e instruções básicas. Os programas demonstram operações como definição de constantes, posicionamento inicial, escrita em SRAM, operações aritméticas e lógicas.
DeClara n.º 75 Abril 2024 - O Jornal digital do Agrupamento de Escolas Clara ...
Exemplos de operações PIC
1. 09/05/2016
1
109/05/2016
Parte 6
EXEMPLOS
209/05/2016
1. MPLAB® SIM
2. DISPLAY DE 7 SEGMENTOS
3. TECLADO
4. PWM
5. ENTRADA ANALÓGICA
MPLAB® SIM1
309/05/2016
MPLAB® SIM
MPLAB® SIM1
409/05/2016
1 – Programa vazio
end
----------------------------------------------------------------------
Debug build of project `E:Documentosmarco2.mcp' started.
Language tool versions: MPASMWIN.exe v5.44, mplink.exe v4.42, mplib.exe v4.42
Preprocessor symbol `__DEBUG' is defined.
Fri May 11 15:17:13 2012
----------------------------------------------------------------------
Make: The target "E:Documentosmarco2.o" is out of date.
Executing: "C:Program FilesMicrochipMPASM SuiteMPASMWIN.exe" /q /p16F877 "marco2.asm"
/l"marco2.lst" /e"marco2.err" /d__DEBUG=1
Make: The target "E:Documentosmarco2.cof" is out of date.
Executing: "C:Program FilesMicrochipMPASM Suitemplink.exe" /p16F877 "marco2.o" /u_DEBUG
/z__MPLAB_BUILD=1 /z__MPLAB_DEBUG=1 /o"marco2.cof" /M"marco2.map" /W /x
MPLINK 4.42, Linker
Device Database Version 1.7
Copyright (c) 1998-2011 Microchip Technology Inc.
Errors : 0
----------------------------------------------------------------------
Debug build of project `E:Documentosmarco2.mcp' succeeded.
Language tool versions: MPASMWIN.exe v5.44, mplink.exe v4.42, mplib.exe v4.42
Preprocessor symbol `__DEBUG' is defined.
Fri May 11 15:17:19 2012
----------------------------------------------------------------------
BUILD SUCCEEDED
MPLAB® SIM1
509/05/2016
2 – Programa vazio com comentário
; Programa 2 – Vazio
end ;fim
• Este programa emprega um comentário
e uma diretiva, respectivamente.
• Nenhuma instrução é usada.
• É gerado um código assembly vazio.
• É recomendado que a primeira linha do
código assembly seja um comentário
explicativo do programa.
MPLAB® SIM1
609/05/2016
3 – Definição da PIC®
; Programa 3 - Arquivo de inclusão
#include <p16f877.inc> ;definição da PIC
end ;fim
• Este programa emprega um
comentário e duas diretivas,
respectivamente.
• É gerado um código assembly vazio.
• Se o arquivo de definição da PIC® não
for incluído, somente os mnemônicos
de instrução poderão ser usados.
2. 09/05/2016
2
MPLAB® SIM1
709/05/2016
4 – Definição de constante
; Programa 4 - Definição de constante
#include <p16f877.inc> ;definição da PIC
constant marqualrélio = 0x20 ;definição da constante
end ;fim
• Este programa emprega um comentário e
quatro diretivas, respectivamente.
• É gerado um código assembly vazio.
• Constantes podem ser definidas.
• Constantes não aparecem no código montado.
• O nome deve possuir, apenas, uma palavra.
• Acentos são permitidos.
• O primeiro algarismo não pode ser numérico.
MPLAB® SIM1
809/05/2016
Constantes
Significado Tamanho Máximo
Destiny 1 bit 0x1
Bit 3 bits 0x7
File 7 bits 0x7f
Literal 8 bits 0xff
Program Address 11 bits 0x7ff
MPLAB® SIM1
909/05/2016
Constantes do tipo File
• Como, no código assembly, file possui,apenas, sete
bits, seu nome aparece sempre no banco 0, mesmo
que se refira a um registrador de outro banco.
• Se o endereço escolhido corresponde a um SFR, o
nome da constante não aparece na lista.
MPLAB® SIM1
1009/05/2016
5 – Definição da posição inicial do programa
; Programa 5 - Definição da posição inicial do programa
#include <p16f877.inc> ;definição da PIC
org 0x5 ;posição inicial (13-bit)
constant marqualrélio = 0x0a ;definição da constante
end ;fim
• Este programa emprega um comentário e
cinco diretivas, respectivamente.
• É gerado um código assembly vazio.
• A posição inicial padrão é 0x0.
• A diretiva ORG recebe um número de 13 bits.
• A rigor, a diretiva deveria ser 0x0005.
MPLAB® SIM1
1109/05/2016
6 – Realização de uma escrita direta na SRAM
; Programa 6 - Gravação de registrador
#include <p16f877.inc> ;definição da PIC
org 0xfff ;posição inicial
MOVLW 0xaa ;W = 0xaa
MOVWF 0x2a ;SRAM(0x2a) = W
end ;fim
MPLAB® SIM1
1209/05/2016
7 – Efeito do valor inicial do acumulador
; Programa 7 - Efeito do valor inicial do acumulador
#include <p16f877.inc> ;definição da PIC
org 0x5 ;posição inicial
CLRW ;limpa o acumulador
ADDLW 0xaa ;W = 0xaa + W
MOVWF 0x2a ;SRAM(0x2a) = W
end ;fim
0005 0103 CLRW
0006 3EAA ADDLW 0xAA
0007 00AA MOVWF 0x2A
Program Memory
Address Opcode Disassembly
027 0x00
028 0x00
029 0x00
02A 0xAA
02B 0x00
02C 0x00
02D 0x00
File Registers
Address Hex
3. 09/05/2016
3
MPLAB® SIM1
1309/05/2016
Limpeza do acumulador
• Ao ligar o chip, o valor do acumulador é zero e, a
princípio, a limpeza do acumulador não seria necessária.
• A não limpeza do acumulador, porém, provoca erros,
devido a dois motivos:
1. Na segunda vez em que o programa for executado, o
acumulador contém o resultado prévio obtido na
execução anterior.
2. Mesmo na primeira execução, as cinco primeiras
linhas do programa, em branco (0x3fff), realizam,
cada uma delas, uma subtração unitária no
acumulador, de modo que, quando a adição é
executada, o valor do acumulador não seria zero.
MPLAB® SIM1
1409/05/2016
8 – Realização de uma adição com label
; Programa 8 - Realização de uma adição com label
#include <p16f877.inc> ;definição da PIC
org 0x5 ;posição inicial
constant marqualrélio = 0xaa ;dado
constant ondecadê = 0x2a ;endereço
CLRW ;limpa o acumulador
ADDLW marqualrélio ;W = marqualrélio + W
MOVWF ondecadê ;SRAM(ondecadê) = W
end ;fim
0005 0103 CLRW
0006 3EAA ADDLW 0xAA
0007 00AA MOVWF 0x2A
027 0x00
028 0x00
029 0x00
02A 0xAA
02B 0x00
02C 0x00
02D 0x00
MPLAB® SIM1
; Programa 9 – Realização de uma cópia direta
#include <p16f877.inc> ;definição da PIC
org 0x5 ;posição inicial
MOVLW 0xaa ;W = 0xaa
MOVWF 0x2a ;SRAM(0x2a) = W
MOVLW 0xaa-1 ;W = 0xa9
MOVWF 0x2a+1 ;SRAM(0x2b) = W
end ;fim
1509/05/2016
9 – Realização de uma cópia direta
0005 30AA MOVLW 0xAA
0006 00AA MOVWF 0x2A
0007 30AB MOVLW 0xA9
0008 00AB MOVWF 0x2B
027 0x00
028 0x00
029 0x00
02A 0xAA
02B 0xA9
02C 0x00
02D 0x00
• Aqui, a cópia direta significa que
foram usados os valores numéricos.
MPLAB® SIM1
; Programa 10 – Realização de uma cópia indireta
#include <p16f877.inc> ;definição da PIC
org 0x5 ;posição inicial
constant marqualrélio = 0xaa ;dado
constant ondecadê = 0x2a ;endereço
MOVLW marqualrélio ;W = marqualrélio
MOVWF ondecadê ;SRAM(ondecadê) = W
MOVLW marqualrélio-1 ;W = marqualrélio-1
MOVWF ondecadê+1 ;SRAM(ondecadê+1) = W
end ;fim
1609/05/2016
10 – Realização de uma cópia indireta
0005 30AA MOVLW 0xAA
0006 00AA MOVWF 0x2A
0007 30AB MOVLW 0xA9
0008 00AB MOVWF 0x2B
027 0x00
028 0x00
029 0x00
02A 0xAA
02B 0xA9
02C 0x00
02D 0x00
• Aqui, a cópia indireta significa
que foram usados rótulos.
MPLAB® SIM1
1709/05/2016
11 – Realização de um incremento
; Programa 11 – Realização de um incremento
#include <p16f877.inc> ;definição da PIC
org 0x5 ;posição inicial
constant marqualrélio = 0xaa ;dado
constant ondecadê = 0x2a ;endereço
MOVLW marqualrélio ;W = marqualrélio
MOVWF ondecadê ;SRAM(ondecadê) = W
INCF ondecadê,0 ;W = marqualrélio + 1
MOVWF ondecadê+1 ;SRAM(ondecadê+1) = W
end ;fim
0005 30AA MOVLW 0xAA
0006 00AA MOVWF 0x2A
0007 0A2A INCF 0x2A, 0x0
0008 00AB MOVWF 0x2B
027 0x00
028 0x00
029 0x00
02A 0xAA
02B 0xAB
02C 0x00
02D 0x00
MPLAB® SIM1
; Programa 12 – Operações aritméticas
#include <p16f877.inc> ;definição da PIC
org 0x5 ;posição inicial
constant marqualrélio = 0x45 ;dado 1
constant operador = 0xae ;dado 2
constant ondecadê = 0x2a ;endereço
MOVLW marqualrélio ;W = marqualrélio
MOVWF ondecadê ;SRAM(ondecadê) = W
MOVLW marqualrélio ;W = marqualrélio*
ADDLW operador ;W = operador ADD marqualrélio
MOVWF ondecadê+1 ;SRAM(ondecadê+1) = W
MOVLW marqualrélio ;W = marqualrélio
SUBLW operador ;W = operador SUB marqualrélio
MOVWF ondecadê+2 ;SRAM(ondecadê+2) = W
MOVLW marqualrélio ;W = marqualrélio
MOVWF ondecadê+3 ;SRAM(ondecadê+3) = W
INCF ondecadê+3,1 ;SRAM(ondecadê+3) = SRAM(ondecadê+3) + 1
MOVLW marqualrélio ;W = marqualrélio
MOVWF ondecadê+4 ;SRAM(ondecadê+4) = W
DECF ondecadê+4,1 ;SRAM(ondecadê+4) = SRAM(ondecadê+4) – 1
end ;fim
1809/05/2016
12 – Operações aritméticas
Cópia
Adição
Subtração
Incremento
Decremento
*Esta linha pode serremovida.
8. 09/05/2016
8
MPLAB® SIM1
4309/05/2016
Endereçamento por 7 ou 9 bits
• O opcode, o código de máquina e o código
disassembly usam 7 bits para endereço na SRAM.
• O MPLAB aceita um endereçamento de 9 bits,
eliminando automaticamente os dois bits mais
significativos.
• Aparece uma mensagem de aviso dizendo que o
registrador não se encontra no banco 0, indicando
que o endereço deve conter 7 bits.
• Este aviso indica que o MPLAB realizou
alterações no programa.
MPLAB® SIM1
4409/05/2016
Message[302] ...endereçamento.ASM 14 : Register in operand not in bank 0. Ensure that bank bits are correct.
Message[302] ...endereçamento.ASM 19 : Register in operand not in bank 0. Ensure that bank bits are correct.
Message[302] ...endereçamento.ASM 24 : Register in operand not in bank 0. Ensure that bank bits are correct.
• O programa contém erros, mas o MPLAB realiza as
correções automaticamente durante a montagem.
• Tais erros não serão admitidos nas avaliações.
Linha 14: MOVWF 0x0a0 ;SRAM(0x0A0) = W
Linha 19: MOVWF 0x120 ;SRAM(0x120) = W
Linha 24: MOVWF 0x1a0 ;SRAM(0x1A0) = W
Exemplo anterior, com endereçamento de 9 bits
0005 3045 MOVLW 0x45
0006 1303 BCF 0x03, 0x6
0007 1283 BCF 0x03, 0x5
0008 00A0 MOVWF 0x20
0009 1303 BCF 0x03, 0x6
000A 1683 BSF 0x03, 0x5
000B 00A0 MOVWF 0x20
000C 1703 BSF 0x03, 0x6
000D 1283 BCF 0x03, 0x5
000E 00A0 MOVWF 0x20
000F 1703 BSF 0x03, 0x6
0010 1683 BSF 0x03, 0x5
0011 00A0 MOVWF 0x20
MPLAB® SIM1
4509/05/2016
; Programa 27 – Endereçamento indireto da SRAM
#include <p16f877.inc> ;definição da PIC
org 0x5 ;posição inicial
MOVLW 0x20 ;W = 0x20 Banco 0
MOVWF FSR ;SRAM(FSR) = W
MOVLW 0xaa ;W = 0xAA
MOVWF INDF ;SRAM(0x20) = W
MOVLW 0xa0 ;W = 0xA0 Banco 1
MOVWF FSR ;SRAM(FSR) = W
MOVLW 0xaa ;W = 0xAA
MOVWF INDF ;SRAM(0xA0) = W
end ;fim
27 – Endereçamento indireto da SRAM
0005 3020 MOVLW 0x20
0006 0084 MOVWF 0x04
0007 30AA MOVLW 0xAA
0008 0080 MOVWF 0x00
0009 30A0 MOVLW 0xA0
000A 0084 MOVWF 0x04
000B 30AA MOVLW 0xAA
000C 0080 MOVWF 0x00
MPLAB® SIM1
4609/05/2016
; Programa 28 – Endereçamento indireto da SRAM e IRP
#include <p16f877.inc> ;definição da PIC
org 0x5 ;posição inicial
BCF STATUS,IRP ;STATUS(IRP) = 0
MOVLW 0x20 ;W = 0x20
MOVWF FSR ;SRAM(FSR) = W
MOVLW 0xbb ;W = 0xBB
MOVWF INDF ;SRAM(INDF) = W
BSF STATUS,IRP ;STATUS(IRP) = 0
MOVLW 0x20 ;W = 0x20
MOVWF FSR ;SRAM(FSR) = W
MOVLW 0xbb ;W = 0xBB
MOVWF INDF ;SRAM(INDF) = W
end ;fim
28 – Endereçamento indireto da SRAM e IRP
0005 1383 BCF 0x03, 0x7
0006 3020 MOVLW 0x20
0007 0084 MOVWF 0x04
0008 30BB MOVLW 0xBB
0009 0080 MOVWF 0x00
000A 1783 BSF 0x03, 0x7
000B 3020 MOVLW 0x20
000C 0084 MOVWF 0x04
000D 30BB MOVLW 0xBB
000E 0080 MOVWF 0x00
MPLAB® SIM1
4709/05/2016
Endereçamento indireto da SRAM
IRP FSR
MPLAB® SIM1
4809/05/2016
Endereçamento indireto da SRAM
• O endereçamento indireto permite que o
programa decida qual o endereço a ser acessado.
• Com endereçamento direto, não é possível
interpretar o conteúdo de um registrador como o
endereço de outro registrador.
• Com endereçamento indireto, o conteúdo de um
registrador pode ser copiado para FSR, que é
usado como o endereço de 8 bits para outro
registrador.
9. 09/05/2016
9
MPLAB® SIM1
4909/05/2016
; Programa 29 – Endereço e dado indiretos
#include <p16f877.inc> ;definição da PIC
org 0x5 ;posição inicial
constant ondecadê1 = 0x20;endereço que contém o endereço
constant ondecadê2 = 0x21;endereço que contém o dado
BCF STATUS,IRP ;STATUS(IRP) = 0
MOVF ondecadê1,W ;W = SRAM(ondecadê1)
MOVWF FSR ;SRAM(FSR) = W
MOVF ondecadê2,W ;W = SRAM(ondecadê2)
MOVWF INDF ;SRAM(INDF) = W
end ;fim
29 – Endereço e dado indiretos
Digitar
0005 1383 BCF 0x03, 0x7
0006 0820 MOVF 0x20, 0x0
0007 0084 MOVWF 0x04
0008 0821 MOVF 0x21, 0x0
0009 0080 MOVWF 0x00
020 0x25
021 0xAA
MPLAB® SIM1
0000 01A0 CLRF 0x20
0001 0820 MOVF 0x20, 0x0
0002 00A1 MOVWF 0x21
0003 1520 BSF 0x20, 0x2
0004 0820 MOVF 0x20, 0x0
0005 00A2 MOVWF 0x22
0006 281F GOTO 0x00A
0007 17A0 BSF 0x20, 0x7
0008 0820 MOVF 0x20, 0x0
0009 00A3 MOVWF 0x23
000A 3FFF
000B 3FFF
000C 3FFF
000D 3FFF
000E 3FFF
000F 3FFF
0010 3FFF
5009/05/2016
30 – GOTO com argumento numérico
; Programa 30 - GOTO com argumento numérico
#include <p16f877.inc> ;definição da PIC
constant ondecadê = 0x20 ;endereço
CLRF ondecadê ;não importa
MOVF ondecadê,0 ;não importa
MOVWF ondecadê+1 ;não importa
BSF ondecadê,2 ;não importa
MOVF ondecadê,0 ;não importa
MOVWF ondecadê+2 ;não importa
GOTO 0x00a ;11 bits
BSF ondecadê,7 ;não importa
MOVF ondecadê,0 ;não importa
MOVWF ondecadê+3 ;não importa
end ;fim
Pulado
Pulado
020 0x04
021 0x00
022 0x05
023 0x00
• Experimente usar, como argumento do GOTO, um
valor inferior ao do endereço da instrução GOTO.
MPLAB® SIM1
5109/05/2016
GOTO
• É útil usar a função step into.
• Isso permite observar a ação do desvio.
• No status bar, é possível conferir o
valor do program counter.
• O botão reset permite retornar ao início
do programa.
MPLAB® SIM1
5209/05/2016
31 – GOTO com argumento simbólico
; Programa 31 - GOTO com argumento simbólico
#include <p16f877.inc> ;definição da PIC
constant ondecadê = 0x20 ;endereço SRAM
constant ondegoto = 0x00a;endereço FLASH; 11 bits
CLRF ondecadê
MOVF ondecadê,0
MOVWF ondecadê+1
BSF ondecadê,0
MOVF ondecadê,0
MOVWF ondecadê+2
GOTO ondegoto ;11 bits
BSF ondecadê,1
MOVF ondecadê,0
MOVWF ondecadê+3
end ;fim
0000 01A0 CLRF 0x20
0001 0820 MOVF 0x20, 0x0
0002 00A1 MOVWF 0x21
0003 1520 BSF 0x20, 0x2
0004 0820 MOVF 0x20, 0x0
0005 00A2 MOVWF 0x22
0006 281F GOTO 0x00A
0007 17A0 BSF 0x20, 0x7
0008 0820 MOVF 0x20, 0x0
0009 00A3 MOVWF 0x23
000A 3FFF
000B 3FFF
000C 3FFF
000D 3FFF
000E 3FFF
000F 3FFF
0010 3FFF
MPLAB® SIM1
0000 01A0 CLRF 0x20
0001 0820 MOVF 0x20, 0x0
0002 00A1 MOVWF 0x21
0003 1420 BSF 0x20, 0x0
0004 0820 MOVF 0x20, 0x0
0005 00A2 MOVWF 0x22
0006 14A0 BSF 0x20, 0x1
0007 0820 MOVF 0x20, 0x0
0008 00A3 MOVWF 0x23
0009 281C GOTO 0x00D
000A 1520 BSF 0x20, 0x2
000B 0820 MOVF 0x20, 0x0
000C 00A4 MOVWF 0x24
000D 15A0 BSF 0x20, 0x3
000E 0820 MOVF 0x20, 0x0
000F 00A5 MOVWF 0x25
0010 1620 BSF 0x20, 0x4
0011 0820 MOVF 0x20, 0x0
0012 00A6 MOVWF 0x26
0013 17A0 BSF 0x20, 0x7
0014 0820 MOVF 0x20, 0x0
0015 00A7 MOVWF 0x27
5309/05/2016
32 – GOTO com argumento numérico
Pulado
; Programa 32 – GOTO com argumento numérico
#include <p16f877.inc> ;definição da PIC
constant ondecadê = 0x20 ;endereço
CLRF ondecadê
MOVF ondecadê,0
MOVWF ondecadê+1
BSF ondecadê,0
MOVF ondecadê,0
MOVWF ondecadê+2
BSF ondecadê,1
MOVF ondecadê,0
MOVWF ondecadê+3
GOTO 0x00d ;11 bits
BSF ondecadê,2
MOVF ondecadê,0
MOVWF ondecadê+4
BSF ondecadê,3
MOVF ondecadê,0
MOVWF ondecadê+5
BSF ondecadê,4
MOVF ondecadê,0
MOVWF ondecadê+6
BSF ondecadê,7
MOVF ondecadê,0
MOVWF ondecadê+7
end ;fim
Pulado
021 0x00
022 0x01
023 0x03
024 0x00
025 0x0B
026 0x1B
027 0x9B
Pulado
MPLAB® SIM1
5409/05/2016
• O endereço real fornece, diretamente, o valor da
posição da flash para onde o PC deve apontar após
a instrução GOTO.
• Este tipo de programação é o que aparece no
código assembly puro (disassembly).
• Este tipo de programação requer o conhecimento da
posição exata do próximo ponto de execução.
• Nem sempre a determinação deste endereço é fácil.
• Ao acrescentar ou remover linhas no programa,
pode ser necessário recalcular tais endereços.
GOTO com argumento numérico
10. 09/05/2016
10
MPLAB® SIM1
000A 01A0 CLRF 0x20
000B 0820 MOVF 0x20, 0x0
000C 00A1 MOVWF 0x21
000D 1420 BSF 0x20, 0x0
000E 0820 MOVF 0x20, 0x0
000F 00A2 MOVWF 0x22
0010 14A0 BSF 0x20, 0x1
0011 0820 MOVF 0x20, 0x0
0012 00A3 MOVWF 0x23
0013 2817 GOTO 0x017
0014 1520 BSF 0x20, 0x2
0015 0820 MOVF 0x20, 0x0
0016 00A4 MOVWF 0x24
0017 15A0 BSF 0x20, 0x3
0018 0820 MOVF 0x20, 0x0
0019 00A5 MOVWF 0x25
001A 1620 BSF 0x20, 0x4
001B 0820 MOVF 0x20, 0x0
001C 00A6 MOVWF 0x26
001D 17A0 BSF 0x20, 0x7
001E 0820 MOVF 0x20, 0x0
001F 00A7 MOVWF 0x27
5509/05/2016
33 – GOTO com rótulo absoluto
Pulado
; Programa 33 - GOTO com rótulo absoluto
#include <p16f877.inc> ;definição da PIC
org 0xa ;alterar
constant ondecadê = 0x20 ;endereço
CLRF ondecadê ;SRAM(ondecadê) = 0x00
MOVF ondecadê,0 ;W = SRAM(ondecadê)
MOVWF ondecadê+1 ;SRAM(ondecadê+1) = W
BSF ondecadê,0 ;SRAM(ondecadê), bit 0 = 1
MOVF ondecadê,0 ;W = SRAM(ondecadê)
MOVWF ondecadê+2 ;SRAM(ondecadê+2) = W
BSF ondecadê,1 ;SRAM(ondecadê), bit 1 = 1
MOVF ondecadê,0 ;W = SRAM(ondecadê)
MOVWF ondecadê+3 ;SRAM(ondecadê+3) = W
GOTO ali ;11 bits
BSF ondecadê,2 ;SRAM(ondecadê), bit 2 = 1
MOVF ondecadê,0 ;W = SRAM(ondecadê)
MOVWF ondecadê+4 ;SRAM(ondecadê+4) = W
ali
BSF ondecadê,3 ;SRAM(ondecadê), bit 3 = 1
MOVF ondecadê,0 ;W = SRAM(ondecadê)
MOVWF ondecadê+5 ;SRAM(ondecadê+5) = W
BSF ondecadê,4 ;SRAM(ondecadê), bit 4 = 1
MOVF ondecadê,0 ;W = SRAM(ondecadê)
MOVWF ondecadê+6 ;SRAM(ondecadê+6) = W
BSF ondecadê,7 ;SRAM(ondecadê), bit 7 = 1
MOVF ondecadê,0 ;W = SRAM(ondecadê)
MOVWF ondecadê+7 ;SRAM(ondecadê+7) = W
end ;fim
ali = 17h
Pulado
Pulado
021 0x00
022 0x01
023 0x03
024 0x00
025 0x0B
026 0x1B
027 0x9B
MPLAB® SIM1
5609/05/2016
33 – GOTO com rótulo absoluto
• O rótulo pode ser colocado na própria
linha onde se encontra a instrução para
onde o salto é direcionado.
• Experimente colocar o rótulo “ali” antes da
linha onde a instrução GOTO se encontra.
MPLAB® SIM1
5709/05/2016
34 – Efeito do overflow do endereço da PM
• O endereço 0803h é inválido, pois podem ser
usados, somente, onze bits para a PM.
• Isto significa que 0803h é convertido para 003h.
• Há erro no endereçamento.
07F9 3FFF
07FA 0000 NOP
07FB 0000 NOP
07FC 0000 NOP
07FD 0000 NOP
07FE 2803 GOTO 0x003
07FF 0000 NOP
0800 0000 NOP
0801 0000 NOP
0802 0000 NOP
0803 0000 NOP
0804 0000 NOP
0805 0000 NOP
0806 0000 NOP
0807 3FFF
; Programa 34 - Efeito do overflow do endereço
org 0x7fa ;ponto de início
NOP
NOP
NOP
NOP
GOTO ali
NOP
NOP
NOP
NOP
ali
NOP
NOP
NOP
NOP
end
Página 0
Página 1
MPLAB® SIM1
5809/05/2016
• Ao usar a instrução GOTO, é preciso
cuidar para que o jump não tente passar
de uma página para outra.
• Na ocorrência do overflow do argumento
da instrução GOTO, os bits excedentes
são simplesmente ignorados.
• A instrução GOTO, naturalmente, não
permite a troca de página. Jumps entre
páginas não são permitidos.
• Mais adiante será visto um
procedimento para o uso da instrução
GOTO em jumps entre páginas.
34 – Efeito do overflow do endereço da PM
MPLAB® SIM1
5909/05/2016
GOTO – Endereço relativo
• GOTO $:
• Vai para o endereço da $ flash.
• $ indica o endereço atual apontado pelo PC, o
endereço da instrução GOTO.
• O símbolo “$” não pertence ao assembler puro,
é uma extensão do MPLAB que representa o
endereço atual da flash.
• O endereço $-1 aponta para a instrução
anterior, uma linha acima no programa.
• O endereço $+1 aponta para a instrução
seguinte, uma linha abaixo no programa.
• Pode-se usar avançar ou retornar várias linhas.
MPLAB® SIM1
09/05/2016
; Programa 35 - GOTO com rótulo relativo
#include <p16f877.inc> ;definição da PIC
org 0xa ;alterar
constant ondecadê = 0x20 ;endereço
CLRF ondecadê
MOVF ondecadê,0
MOVWF ondecadê+1
BSF ondecadê,0
MOVF ondecadê,0
MOVWF ondecadê+2
BSF ondecadê,1
MOVF ondecadê,0
MOVWF ondecadê+3
GOTO $+4 ;11 bits
BSF ondecadê,2
MOVF ondecadê,0
MOVWF ondecadê+4
BSF ondecadê,3
MOVF ondecadê,0
MOVWF ondecadê+5
BSF ondecadê,4
MOVF ondecadê,0
MOVWF ondecadê+6
BSF ondecadê,7
MOVF ondecadê,0
MOVWF ondecadê+7
end ;fim
000A 01A0 CLRF 0x20
000B 0820 MOVF 0x20, 0x0
000C 00A1 MOVWF 0x21
000D 1420 BSF 0x20, 0x0
000E 0820 MOVF 0x20, 0x0
000F 00A2 MOVWF 0x22
0010 14A0 BSF 0x20, 0x1
0011 0820 MOVF 0x20, 0x0
0012 00A3 MOVWF 0x23
0013 2817 GOTO 0x017
0014 1520 BSF 0x20, 0x2
0015 0820 MOVF 0x20, 0x0
0016 00A4 MOVWF 0x24
0017 15A0 BSF 0x20, 0x3
0018 0820 MOVF 0x20, 0x0
0019 00A5 MOVWF 0x25
001A 1620 BSF 0x20, 0x4
001B 0820 MOVF 0x20, 0x0
001C 00A6 MOVWF 0x26
001D 17A0 BSF 0x20, 0x7
001E 0820 MOVF 0x20, 0x0
001F 00A7 MOVWF 0x27
60
35 – GOTO com rótulo relativo
$ = 0x13h
$+4 = 0x17h
• Este programa gera o
mesmo disassembly
do programa 33.
Pulado
Pulado
11. 09/05/2016
11
MPLAB® SIM1
6109/05/2016
• Embora o valor $+n possa ser entendido
como linhas acima ou abaixo no código
assembly (arquivo “.asm”), ele indica, de fato,
linhas acima ou abaixo no código montado,
isto é, opcode’s acima ou abaixo.
• Códigos não-assembly, como linha em
branco, linha de comentário, linha de definição
de constantes, etc., não são considerados.
• Todas as linhas que não gerem opcode no
disassembler são ignoradas.
• Se linhas são adicionadas ou removidas entre
a instrução GOTO e o destino do salto, o
argumento deve ser recalculado.
GOTO com rótulo relativo
MPLAB® SIM1
0005 1283 BCF 0x03, 0x5
0006 1303 BCF 0x03, 0x6
0007 3003 MOVLW 0x03
0008 2005 CALL 0x00A
0009 3004 MOVLW 0x04
000A 3005 MOVLW 0x05
000B 0008 RETURN
000C 3006 MOVLW 0x06
6209/05/2016
36 – CALL
; Programa 36 – CALL - Errado
#include <p16f877.inc>
org 0x5
BCF STATUS,RP0
BCF STATUS,RP1
MOVLW 0x03
CALL Rotina
MOVLW 0x04
Rotina
MOVLW 0x05
RETURN
MOVLW 0x06
end
• O programa entra num laço infinito.
• É preciso impedir que a rotina “espera”
seja executada fora do chamado.
• Ocorre um stack underflow.
MPLAB® SIM1
6309/05/2016
35 – CALL
MPLAB® SIM1
6409/05/2016
37 – Seleção entre duas sub-rotinas
; Programa 37 - Duas sub-rotinas
#include <p16f877.inc>
org 0x5
BCF STATUS,C ;escolher entre BSF e BCF
BTFSS STATUS,C ;se C=0 então...
CALL RotinaC0 ;executa RotinaC0
BTFSC STATUS,C ;se C=1 então...
CALL RotinaC1 ;executa RotinaC1
GOTO Fim ;evita que as rotinas sejam executadas
RotinaC0
MOVLW 0x03
MOVWF 0x20
CLRF 0x21
RETURN
RotinaC1
MOVLW 0x04
MOVWF 0x21
CLRF 0x20
RETURN
Fim
end
• Label para sub-rotina.
• Label para ponto específico.
MPLAB® SIM1
6509/05/2016
0005 1003 BCF 0x03, 0x0
0006 1C03 BTFSS 0x03, 0x0
0007 200B CALL 0x00B
0008 1803 BTFSC 0x03, 0x0
0009 200F CALL 0x00F
000A 2813 GOTO 0x13
000B 3003 MOVLW 0x03
000C 00A0 MOVWF 0x20
000D 01A1 CLRF 0x21
000E 0008 RETURN
000F 3004 MOVLW 0x04
0010 00A1 MOVWF 0x21
0011 01A0 CLRF 0x20
0012 0008 RETURN
0005 1403 BSF 0x03, 0x0
0006 1C03 BTFSS 0x03, 0x0
0007 200B CALL 0x00B
0008 1803 BTFSC 0x03, 0x0
0009 200F CALL 0x00F
000A 2813 GOTO 0x13
000B 3003 MOVLW 0x03
000C 00A0 MOVWF 0x20
000D 01A1 CLRF 0x21
000E 0008 RETURN
000F 3004 MOVLW 0x04
0010 00A1 MOVWF 0x21
0011 01A0 CLRF 0x20
0012 0008 RETURN
020 0x00
021 0x04
020 0x03
021 0x00
37 – Seleção entre duas sub-rotinas
MPLAB® SIM1
6609/05/2016
37 – Seleção entre duas sub-rotinas
• Sempre que for necessário optar por dois ou mais
caminhos diferentes, este procedimento deve ser adotado.
• Somente é possível decidir entre dois caminhos. Se há
mais de dois caminhos a serem escolhidos, mais
procedimentos de decisão devem ser aplicados.
• Um bit é usado como critério de decisão entre duas
opções.
12. 09/05/2016
12
MPLAB® SIM1
09/05/2016
0005 BCF 0x03, 0x0
0006 BTFSS 0x03, 0x0
0007 CALL 0x00B
0008 BTFSC 0x03, 0x0
0009 CALL 0x00F
000A GOTO 0x13
000B MOVLW 0x03
000C MOVWF 0x20
000D CLRF 0x21
000E RETURN
000F MOVLW 0x04
0010 MOVWF 0x21
0011 CLRF 0x20
0012 RETURN
67
CALL e GOTO
• Antes de verificar a pilha, convém apagá-la.
• Ela não é apagada em um reset do debugger.
Faz o push
PC=7
Stack pointer
MPLAB® SIM1
6809/05/2016
38 – Programa anterior sem o uso de CALL
; Programa 38 - Programa anterior sem o uso de CALL
#include <p16f877.inc>
org 0x5
BCF STATUS,C ;escolher entre BSF e BCF
BTFSS STATUS,C ;se C=0 então...
GOTO RotinaC0 ;executa RotinaC0
GOTO RotinaC1 ;executa RotinaC1
RotinaC0
MOVLW 0x03
MOVWF 0x20
CLRF 0x21
GOTO Fim ;evita RotinaC1
RotinaC1
MOVLW 0x04
MOVWF 0x21
CLRF 0x20
GOTO Fim ;*
Fim
end
0005 1003 BCF 0x03, 0x0
0006 1C03 BTFSS 0x03, 0x0
0007 2809 GOTO 0x009
0008 280D GOTO 0x00D
0009 3003 MOVLW 0x03
000A 00A0 MOVWF 0x20
000B 01A1 CLRF 0x21
000C 2811 GOTO 0x011
000D 3004 MOVLW 0x04
000E 00A1 MOVWF 0x21
000F 01A0 CLRF 0x20
0010 2811 GOTO 0x011
*Esta linha pode serremovida.
MPLAB® SIM1
6909/05/2016
39 – Programa anterior sem o uso de GOTO
; Programa 39 - Programa anterior sem o uso de GOTO
#include <p16f877.inc>
org 0x5
CLRF PCLATH ;*
BCF STATUS,C ;escolher entre BSF e BCF
MOVLW 0xc
BTFSS STATUS,C ;se C=0 então...
MOVWF PCL ;executa RotinaC0
MOVLW 0x11
MOVWF PCL ;executa RotinaC1
;RotinaC0
MOVLW 0x03
MOVWF 0x20
CLRF 0x21
MOVLW 0x16 ;evita RotinaC1
MOVWF PCL ;evita RotinaC1
;RotinaC1
MOVLW 0x04
MOVWF 0x21
CLRF 0x20
MOVLW 0x16 ;*
MOVWF PCL ;*
end
*Esta linha pode serremovida.
0005 CLRF 0x0A
0006 BCF 0x03, 0x0
0007 MOVLW 0x0C
0008 BTFSS 0x03, 0x0
0009 MOVWF 0x02
000A MOVLW 0x11
000B MOVWF 0x02
000C MOVLW 0x03
000D MOVWF 0x20
000E CLRF 0x21
000F MOVLW 0x16
0010 MOVWF 0x02
0011 MOVLW 0x04
0012 MOVWF 0x21
0013 CLRF 0x20
0014 MOVLW 0x16
0015 MOVWF 0x02
MPLAB® SIM1
7009/05/2016
40 – CALL sem RETURN
; Programa 39 - CALL sem RETURN - Proibido
#include <p16f877.inc>
org 0x5
BCF STATUS,C ;escolher entre BSF e BCF
BTFSS STATUS,C ;se C=0 então...
CALL RotinaC0 ;executa RotinaC0
BTFSC STATUS,C ;se C=1 então...
CALL RotinaC1 ;executa RotinaC1
RotinaC0
MOVLW 0x03
MOVWF 0x20
CLRF 0x21
GOTO Fim
RotinaC1
MOVLW 0x04
MOVWF 0x21
CLRF 0x20
GOTO Fim
Fim
end
• Este programa funciona, mas dá erro na pilha.
• Para cada CALL, deve existir um RETURN.
• Não é correto o uso de CALL sem RETURN.
0005 BCF 0x03, 0x0
0006 BTFSS 0x03, 0x0
0007 CALL 0x00A
0008 BTFSC 0x03, 0x0
0009 CALL 0x00E
000A MOVLW 0x03
000B MOVWF 0x20
000C CLRF 0x21
000D GOTO 0x012
000E MOVLW 0x04
000F MOVWF 0x21
0010 CLRF 0x20
0011 GOTO 0x012
MPLAB® SIM1
7109/05/2016
Não uso da instrução CALL
• A substituição do CALL por GOTO ajuda a
prevenir stack overflow.
• É recomendável o uso de GOTO nas situações:
1. Desvios que não envolvam sub-rotinas.
2. Desvios para sub-rotinas que sejam chamadas,
somente, em uma única linha do programa.
3. Desvios para sub-rotinas que, embora tenham
mais pontos de chamada, forçam, após a
execução, o PC a ir para o mesmo ponto.
MPLAB® SIM1
7209/05/2016
Não uso da instrução CALL
• Quando há desvios para sub-rotinas que tenham
mais pontos de chamada e, após o retorno, o
programa deve prosseguir a partir do ponto onde
estava antes da chamada, então é recomendado
o uso do CALL, pois, cada ponto de chamada
produzirá um RETURN diferente com base no
endereço diferente contido na TOS.
• Se, mesmo nesse tipo de situação, for
necessário eliminar o CALL, por motivo de stack
overflow, então é preciso criar várias cópias da
sub-rotina, uma para cada ponto de chamada.
13. 09/05/2016
13
MPLAB® SIM1
0005 CALL 0x007
0006 GOTO 0x010
0007 MOVLW 0x03
0008 MOVWF 0x20
0009 CLRF 0x21
000A CALL 0x00C
000B RETURN
000C MOVLW 0x04
000D MOVWF 0x21
000E CLRF 0x20
000F RETURN
7309/05/2016
41 – Uma sub-rotina dentro de outra
; Programa 41 - Uma sub-rotina dentro da outra
#include <p16f877.inc>
org 0x5
CALL RotinaC0 ;executa RotinaC1
GOTO Fim
RotinaC0
MOVLW 0x03
MOVWF 0x20
CLRF 0x21
CALL RotinaC1 ;executa RotinaC1
RETURN
RotinaC1
MOVLW 0x04
MOVWF 0x21
CLRF 0x20
RETURN
Fim
end
020 0x03
021 0x04
MPLAB® SIM1
Escopo de GOTO e CALL
7409/05/2016
• O argumento das instruções GOTO e CALL tem 11 bits.
• O argumento pode variar de 000h até 7FFh.
• As instruções GOTO e CALL não permitem mudança de
página da program memory.
• Ao usar rótulo absoluto, é preciso verificar se o local do
programa onde este rótulo está colocado não pertence a
uma página diferente do local onde a instrução GOTO ou
CALL se encontram.
• Ao usar rótulo relativo ($), é preciso verificar se o
deslocamento do PC não apontaria para uma outra página.
• Qualquer tentativa de mudança de página nas instruções
GOTO e CALL implica na eliminação de PC<12:11>,
levando o PC para um local errado.
MPLAB® SIM1
Criação de um temporizador
• A MCU é muito rápida na percepção humana.
• Uma única variável de 8 bits não é suficiente para criar
um tempo de duração útil.
• Quanto maior for o tempo de espera, maior é o número
de variáveis (GPR´s) necessários.
• Por meio da escolha do valor inicial destas variáveis na
linha de código ASM, pode-se configurar a temporização.
7509/05/2016
MPLAB® SIM1
• A variável de contagem pode ser qualquer GPR.
• O modo mais fácil de comparação de um valor é
verificando se ele é zero.
• Um zero pode ser identificado por meio do bit “Z” do status
register ou por meio das instruções do tipo “skip if zero”.
• Como a verificação é feita sobre o zero, então este é o
valor final da contagem.
• A contagem é decrescente.
• A contagem é encerrada quando o valor zero é obtido.
• A máxima contagem é feita com o GPR valendo
inicialmente FFh ou um valor inferior.
• A mínima contagem é feita com o GPR valendo
inicialmente 01h.
7609/05/2016
Criação de um temporizador
MPLAB® SIM1
42 – Temporizador com uma variável
7709/05/2016
; Programa 42 - Temporizador com uma variável
#include <p16f877.inc>
org 0x5
constant TEMPO = 0x20
constant VALOR = 0x0f ;configurável
MOVLW VALOR
MOVWF TEMPO
DECFSZ TEMPO, 0x1
GOTO $-0x1
end
Valor que define
a temporização
Endereço
arbitrário
MOVLW 0x0F
MOVWF 0x20
DECFSZ 0x20, 0x1
GOTO 0x007
Use o comando animate para observar a contagem.
MPLAB® SIM1
42 – Temporizador com uma variável
7809/05/2016
Use o comando animate para observar a contagem.
14. 09/05/2016
14
MPLAB® SIM1
; Programa 43 - Proteção do WDT
#include <p16f877.inc>
org 0x5
constant TEMPO = 0x20
constant VALOR = 0x0f ;configurável
MOVLW VALOR
MOVWF TEMPO
CLRWDT
DECFSZ TEMPO, 0x1
GOTO $-0x2
end
43 – Proteção do WDT
7909/05/2016
• Dependendo da configuração do WDT, pode haver um reset
na PIC® antes do término da contagem.
• Convém reiniciar WDT no decorrer da contagem.
• Se o WDT está desabilitado, este cuidado não é necessário.
• A inclusão de instruções no ciclo de contagem aumenta o
tempo da contagem em 1TCY.
MOVLW 0x0F
MOVWF 0x20
CLRWDT
DECFSZ 0x20, 0x1
GOTO 0x007
MPLAB® SIM1
Cálculo aproximado do tempo
8009/05/2016
CLRWDT
DECFSZ TEMPO,1
GOTO $-0x2
• Na 1ª execução do CLRWDT, TEMPO = 0x0F.
• Na 2ª execução do CLRWDT, TEMPO = 0x0E.
• Na 15ª execução do CLRWDT, TEMPO = 0x01.
• Nesta repetição, o DECFSZ faz TEMPO = 0x00.
• Nesta repetição, o DECFSZ faz o skip.
• Nesta repetição, o GOTO não é executado.
• O ciclo de contagem é executado 15 vezes e não 16.
• O CLRWDT e o DECFSZ são executados 15 vezes.
• O GOTO é executado 14 vezes.
MPLAB® SIM1
Cálculo aproximado do tempo
8109/05/2016
• O CLRWDT é 1TCY.
• O DECFSZ e o GOTO são 2TCY.
• O ciclo de contagem é 1TCY + 2TCY + 2TCY = 5TCY.
• O ciclo total é (145TCY) + 3TCY = 73TCY.
• Considerar as duas operações de movimentação.
• Tempo = 73TCY + 1TCY + 1TCY = 75TCY.
• 1TCY = 4TOSC.
• 75TCY = 300TOSC.
• fOSC = 20MHz (suposição).
• TOSC = 50ns.
• 300TOSC = 15s.
CLRWDT
DECFSZ TEMPO,1
GOTO $-0x2
MPLAB® SIM1
8209/05/2016
44 – Contador de dois bytes
; Programa 44 - Contador de dois bytes
#include <P16F877.INC>
org 0x5
constant TEMPOA = 0x20
constant TEMPOB = 0x21
constant VALOR = 0x0f ;configurável
MOVLW VALOR
MOVWF TEMPOB
MOVWF TEMPOA
CLRWDT
DECFSZ TEMPOA, 0x1
GOTO $-0x2
DECFSZ TEMPOB, 0x1
GOTO $-0x5
end
TEMPOA: Variável menos significativa
TEMPOB: Variável mais significativa
MOVLW 0x0F
MOVWF 0x21
MOVWF 0x20
CLRWDT
DECFSZ 0x20, 0x1
GOTO 0x008
DECFSZ 0x21, 0x1
GOTO 0x007
MPLAB® SIM1
8309/05/2016
45 – Contador de três bytes
; Programa 45 – Contador de três bytes
#include <P16F877.INC>
org 0x5
constant TEMPOA = 0x20
constant TEMPOB = 0x21
constant TEMPOC = 0x22
constant VALOR = 0xff ;configurável
MOVLW VALOR
MOVWF TEMPOC
MOVWF TEMPOB
MOVWF TEMPOA
CLRWDT
DECFSZ TEMPOA, 0x1
GOTO $-0x2
DECFSZ TEMPOB, 0x1
GOTO $-0x5
DECFSZ TEMPOC, 0x1
GOTO $-0x8
end
MOVLW 0x03
MOVWF 0x22
MOVWF 0x21
MOVWF 0x20
CLRWDT
DECFSZ 0x20, 0x1
GOTO 0x009
DECFSZ 0x21, 0x1
GOTO 0x008
DECFSZ 0x22, 0x1
GOTO 0x007
MPLAB® SIM1
8409/05/2016
Criação do temporizador com três variáveis
Espera
MOVLW VALORC
MOVWF TEMPOC
MOVLW VALORB
MOVWF TEMPOB
MOVLW VALORA
MOVWF TEMPOA
CLRWDT
DECFSZ TEMPOA,0x1
GOTO $-0x2
DECFSZ TEMPOB,0x1
GOTO $-0x6
DECFSZ TEMPOC,0x1
GOTO $-0xa
RETURN
Retorna a quantidade
de linhas mencionada
Valores que definem a temporização
0x01 a 0xff
Não aceitam valor 0x00
constant TEMPOA = 0x20
constant TEMPOB = 0x21
constant TEMPOC = 0x22
Na lista de definições:
Rotina “Espera”
Endereços
arbitrários
15. 09/05/2016
15
MPLAB® SIM1
; Programa 46 – Configuração 31h C2h 8Dh
#include <P16F877.INC>
org 0x5
constant VALORA = 0x31 ;configurável
constant VALORB = 0xc2 ;configurável
constant VALORC = 0x28 ;configurável
constant TEMPOA = 0x20
constant TEMPOB = 0x21
constant TEMPOC = 0x22
MOVLW VALORC
MOVWF TEMPOC
MOVLW VALORB
MOVWF TEMPOB
MOVLW VALORA
MOVWF TEMPOA
CLRWDT
DECFSZ TEMPOA, 0x1
GOTO $-0x2
DECFSZ TEMPOB, 0x1
GOTO $-0x6
DECFSZ TEMPOC, 0x1
GOTO $-0xa
end
8509/05/2016
46 – Configuração 31h C2h 8Dh
• 31h = 049d de 0d a 048d.
• C2h = 194d de 0d a 193d.
• 28h = 141d de 0d a 140d.
• 49 194 141 = 1.340.346 passos.
• A contagem é de 000000h a 1473B9h.
MOVLW 0x28
MOVWF 0x22
MOVLW 0xC2
MOVWF 0x21
MOVLW 0x31
MOVWF 0x20
CLRWDT
DECFSZ 0x20, 0x1
GOTO 0x00B
DECFSZ 0x21, 0x1
GOTO 0x009
DECFSZ 0x22, 0x1
GOTO 0x007
MPLAB® SIM1
8609/05/2016
47 – Quatro variáveis
; Programa 46 – Quatro variáveis
#include <P16F877.INC>
org 0x5
constant VALORA = 0x31
constant VALORB = 0xc2
constant VALORC = 0x8d
constant VALORD = 0xff
constant TEMPOA = 0x20
constant TEMPOB = 0x21
constant TEMPOC = 0x22
constant TEMPOD = 0x23
MOVLW VALORD
MOVWF TEMPOD
MOVLW VALORC
MOVWF TEMPOC
MOVLW VALORB
MOVWF TEMPOB
MOVLW VALORA
MOVWF TEMPOA
CLRWDT
DECFSZ TEMPOA, 0x1
GOTO $-0x2-0x0
DECFSZ TEMPOB, 0x1
GOTO $-0x2-0x4
DECFSZ TEMPOC, 0x1
GOTO $-0x2-0x8
DECFSZ TEMPOD, 0x1
GOTO $-0x2-0xc
end
MOVLW 0xFF
MOVWF 0x23
MOVLW 0x8D
MOVWF 0x22
MOVLW 0xC2
MOVWF 0x21
MOVLW 0x31
MOVWF 0x20
CLRWDT
DECFSZ 0x20, 0x1
GOTO 0x00D
DECFSZ 0x21, 0x1
GOTO 0x00B
DECFSZ 0x22, 0x1
GOTO 0x009
DECFSZ 0x23, 0x1
GOTO 0x007
MPLAB® SIM1
8709/05/2016
47 – Quatro variáveis
MOVLW VALORD
MOVWF TEMPOD
MOVLW VALORC
MOVWF TEMPOC
MOVLW VALORB
MOVWF TEMPOB
MOVLW VALORA
MOVWF TEMPOA
CLRWDT
DECFSZ TEMPOA, 0x1
GOTO $-0x2-0x0
DECFSZ TEMPOB, 0x1
GOTO $-0x2-0x4
DECFSZ TEMPOC, 0x1
GOTO $-0x2-0x8
DECFSZ TEMPOD, 0x1
GOTO $-0x2-0xc
Rotina a ser repetida
1 linha (n=1)
n+1 = 2
• O argumento da instrução GOTO foi parametrizado.
• Isto facilita a programação dos parâmetros.
• Ao inserir novas linhas na rotina a ser repetida,
basta corrigir o valor 0x02.
MPLAB® SIM1
8809/05/2016
48 – WDT não overflow
; Programa 48 – WDT não overflow
MOVLW 0x3b
MOVWF 0x22
MOVLW 0xff
MOVWF 0x21
MOVLW 0xfd
MOVWF 0x20
DECFSZ 0x20,0x1
GOTO 0x006
DECFSZ 0x21,0x1
GOTO 0x004
DECFSZ 0x22,0x1
GOTO 0x002
end
Output
CORE-W0014:Halted due to PC incrementing overthe Maximum PC address and wrapping back to Zero
• 3.806.385 passos de contagem.
• Não ocorre WDT overflow.
Executar um reset.
MPLAB® SIM1
8909/05/2016
49 – WDT overflow
; Programa 49 – WDT overflow
MOVLW 0x3b
MOVWF 0x22
MOVLW 0xff
MOVWF 0x21
MOVLW 0xfe
MOVWF 0x20
DECFSZ 0x20,0x1
GOTO 0x006
DECFSZ 0x21,0x1
GOTO 0x004
DECFSZ 0x22,0x1
GOTO 0x002
end
Output
CORE-W0003:WatchdogTimerevent occurred.Break in executionrequested
• 3.821.430 passos de contagem.
• Ocorre WDT overflow.
Executar um reset.
MPLAB® SIM1
9009/05/2016
; Programa 50 – Habilitação do WDT
#include <P16F877.INC>
__config _WDT_OFF
org 0x5
constant VALOR = 0xff
constant TEMPO = 0x20
MOVLW VALOR
MOVWF TEMPO+2
MOVWF TEMPO+1
MOVWF TEMPO
DECFSZ TEMPO,1
GOTO $-1
DECFSZ TEMPO+1,1
GOTO $-4
DECFSZ TEMPO+2,1
GOTO $-7
end
50 – Habilitação do WDT
; Programa 50 – Habilitação do WDT
#include <P16F877.INC>
__config _WDT_ON
org 0x5
constant VALOR = 0xff
constant TEMPO = 0x20
MOVLW VALOR
MOVWF TEMPO+2
MOVWF TEMPO+1
MOVWF TEMPO
DECFSZ TEMPO,1
GOTO $-1
DECFSZ TEMPO+1,1
GOTO $-4
DECFSZ TEMPO+2,1
GOTO $-7
end
CORE-W0003:WatchdogTimereventoccurred.Breakinexecutionrequested
CORE-W0014:HaltedduetoPCincrementingovertheMaximumPCaddressandwrappingbacktoZero
16. 09/05/2016
16
MPLAB® SIM1
9109/05/2016
51 – Habilitação do WDT sem #include
; Programa 50 – Habilitação do WDT
#include <P16F877.INC>
__config _WDT_OFF
org 0x5
constant VALOR = 0xff
constant TEMPO = 0x20
MOVLW VALOR
MOVWF TEMPO+2
MOVWF TEMPO+1
MOVWF TEMPO
DECFSZ TEMPO,1
GOTO $-1
DECFSZ TEMPO+1,1
GOTO $-4
DECFSZ TEMPO+2,1
GOTO $-7
end
; Programa 51 – Habilitação do WDT sem #include
__config 0x3ffb
org 0x5
constant VALOR = 0xff
constant TEMPO = 0x20
MOVLW VALOR
MOVWF TEMPO+2
MOVWF TEMPO+1
MOVWF TEMPO
DECFSZ TEMPO,1
GOTO $-1
DECFSZ TEMPO+1,1
GOTO $-4
DECFSZ TEMPO+2,1
GOTO $-7
end
MPLAB® SIM1
; Programa 52 – Configuração do WDT
#include <P16F877.INC>
__config _WDT_ON
org 0x5
constant VALOR = 0x9c
constant TEMPO = 0x20
;WDT Postscaler = 1:64
BCF STATUS, RP1
BSF STATUS, RP0
BSF OPTION_REG,PS2
BSF OPTION_REG,PS1
BCF OPTION_REG,PS0
MOVLW VALOR
MOVWF TEMPO+2
MOVWF TEMPO+1
MOVWF TEMPO
DECFSZ TEMPO,1
GOTO $-1
DECFSZ TEMPO+1,1
GOTO $-4
DECFSZ TEMPO+2,1
GOTO $-7
end
9209/05/2016
; Programa 52 – Configuração do WDT
#include <P16F877.INC>
__config _WDT_ON
org 0x5
constant VALOR = 0x9c
constant TEMPO = 0x20
;WDT Postscaler = 1:128
BCF STATUS, RP1
BSF STATUS, RP0
BSF OPTION_REG,PS2
BSF OPTION_REG,PS1
BSF OPTION_REG,PS0
MOVLW VALOR
MOVWF TEMPO+2
MOVWF TEMPO+1
MOVWF TEMPO
DECFSZ TEMPO,1
GOTO $-1
DECFSZ TEMPO+1,1
GOTO $-4
DECFSZ TEMPO+2,1
GOTO $-7
end
52 – Configuração do WDT
CORE-W0003:WatchdogTimereventoccurred.Breakinexecutionrequested
CORE-W0014:HaltedduetoPCincrementingovertheMaximumPCaddressandwrappingbacktoZero
MPLAB® SIM1
9309/05/2016
EEPROM – Leitura direta
• Na leitura direta, o endereço da EEPROM a ser
lido é determinado diretamente no programa.
• Esta opção tem a vantagem de ser mais simples.
• Esta opção tem a desvantagem de não permitir
que o endereço da EEPROM esteja
condicionado a outras variáveis do sistema.
MPLAB® SIM1
9409/05/2016
53 – EEPROM – Leitura direta
; Programa 53 - EEPROM – Leitura direta
; Baseado no exemplo 4-1 do datasheet da pic16f877
#include <p16f877.inc>
org 0x5
constant ondecadê1 = 0x4f ;endereço da EEPROM data memory (8 bits)
constant ondecadê2 = 0x22 ;endereço da SRAM file memory (7 bits)
; Busca o endereço da posição da EEPROM a ser lida
MOVLW ondecadê1 ;W = ondecadê1
BSF STATUS,RP1
BCF STATUS,RP0 ;Seleciona o banco 2 (10b)
MOVWF EEADR ;SRAM(EEADR) = W
; Faz a leitura da EEPROM(ondecadê1)
BSF STATUS,RP1 ;*
BSF STATUS,RP0 ;Seleciona o banco 3 (11b)
BCF EECON1,EEPGD ;Configura para EEPROM
BSF EECON1,RD ;Inicia leitura
BSF STATUS,RP1 ;*
BCF STATUS,RP0 ;Seleciona o banco 2 (10b)
MOVF EEDATA,W ;W = SRAM(EEDATA)
; Copia para a SRAM(ondecadê2)
BCF STATUS,RP1 ;Seleciona o banco 0 (00b)
BCF STATUS,RP0 ;*
MOVWF ondecadê2 ;SRAM(ondecadê2) = W
end
MOVLW 0x4F
BSF 0x03, 0x6
BCF 0x03, 0x5
MOVWF 0x0D
BSF 0x03, 0x6
BSF 0x03, 0x5
BCF 0x0C, 0x7
BSF 0x0C, 0x0
BSF 0x03, 0x6
BCF 0x03, 0x5
MOVF 0x0C, 0x0
BCF 0x03, 0x6
BCF 0x03, 0x5
MOVWF 0x22
*Esta linha pode serremovida.
MPLAB® SIM1
9509/05/2016
53 – EEPROM – Leitura direta – Testando
1 – Escolha o valor para a posição 04Fh da EEPROM.
• O GPR´s 022h recebe
o conteúdo da posição
047h da EEPROM.
2 – Execute o programa.
MPLAB® SIM1
9609/05/2016
53 – EEPROM – Leitura direta – Testando
Verificação dos registros.
17. 09/05/2016
17
MPLAB® SIM1
9709/05/2016
53 – EEPROM – Leitura direta
• Três valores estão envolvidos:
• Endereço na EEPROM (ondecadê1,0x4F).
• Endereço do GPR que conterá o valor do
dado contido no endereço selecionado na
EEPROM (ondecadê2,0x22).
• Dado contido na EEPROM (0x88).
MPLAB® SIM1
9809/05/2016
54 – EEPROM – Leitura indireta
• Na leitura indireta, o endereço da EEPROM a ser lido
está localizado em um GPR.
• Esta opção tem a desvantagem de ser mais complexa.
• Esta opção tem a vantagem permitir que o endereço
da EEPROM esteja condicionado a outras variáveis do
sistema.
• Primeiramente, o GPR é gravado com um valor
determinado pelas variáveis em questão.
MPLAB® SIM1
9909/05/2016
54 – EEPROM – Leitura indireta
; Programa 54 - EEPROM – Leitura indireta
; Baseado no exemplo 4-1 do datasheet da pic16f877
#include <p16f877.inc>
org 0x5
constant ondecadê1 = 0x20 ;Endereço do GPR (7 bits) que contém o endereço da EEPROM (8 bits)
constant ondecadê2 = 0x21 ;Endereço do GPR (7 bits) que conterá o dado lido da EEPROM (8 bits)
; Busca o endereço da posição da EEPROM a ser lida
BCF STATUS,RP1
BCF STATUS,RP0 ;Seleciona o banco 0 (00b)
MOVF ondecadê1,W ;W = SRAM(ondecadê1)
BSF STATUS,RP1 ;Seleciona o banco 2 (10b)
BCF STATUS,RP0 ;*
MOVWF EEADR ;SRAM(EEADR) = W
; Faz a leitura da EEPROM(SRAM(ondecadê1))
BSF STATUS,RP1 ;*
BSF STATUS,RP0 ;Seleciona o banco 3 (11b)
BCF EECON1,EEPGD ;Configura para EEPROM
BSF EECON1,RD ;Inicia leitura
BSF STATUS,RP1 ;*
BCF STATUS,RP0 ;Seleciona o banco 2 (10b)
MOVF EEDATA,W ;W = SRAM(EEDATA)
; Copia para a SRAM(0x21)
BCF STATUS,RP1 ;Seleciona o banco 0 (00b)
BCF STATUS,RP0 ;*
MOVWF ondecadê2 ;SRAM(ondecadê2) = W
end
BCF 0x03, 0x6
BCF 0x03, 0x5
MOVF 0x20, 0x0
BSF 0x03, 0x6
BCF 0x03, 0x5
MOVWF 0x0D
BSF 0x03, 0x6
BSF 0x03, 0x5
BCF 0x0C, 0x7
BSF 0x0C, 0x0
BSF 0x03, 0x6
BCF 0x03, 0x5
MOVF 0x0C, 0x0
BCF 0x03, 0x6
BCF 0x03, 0x5
MOVWF 0x21
*Esta linha pode serremovida.
MPLAB® SIM1
10009/05/2016
54 – EEPROM – Leitura indireta – Testando
1 – Escolha um valor para o GPR 020h.
2 – Escolha o valor para a posição da EEPROM dada pelo valor do GPR 020h.
MPLAB® SIM1
10109/05/2016
54 – EEPROM – Leitura indireta – Testando
3 – Execute o programa.
• O GPR 021h recebe o conteúdo
da posição da EEPROM indicada
pelo conteúdo do registrador 020h.
MPLAB® SIM1
10209/05/2016
54 – EEPROM – Leitura indireta
• Quatro valores estão envolvidos:
• Endereço do GPR que contém o valor do endereço
na EEPROM a ser lido (ondecadê1=0x20).
• Endereço na EEPROM (0x5E).
• Endereço do GPR que conterá o valor do dado
contido no endereço selecionado na EEPROM
(ondecadê2=0x21).
• Dado contido na EEPROM (0xA9)
18. 09/05/2016
18
MPLAB® SIM1
10309/05/2016
MOVF endereço, W ;W = endereço ,endereço para gravação
MOVWF EEADR ;SRAM(EEADR) = W
MOVF dado, W ;W = dado ,dado para gravação
MOVWF EEDATA ;SRAM(EEDATA) = W
• EEDATA contém o byte que será escrito na EEPROM.
• EEADR contém o endereço do byte na EEPROM.
• Importante é prestar atenção no controle dos bancos.
• As quatro linhas abaixo não podem faltar.
55 – EEPROM – Escrita direta
MPLAB® SIM1
10409/05/2016
1. BCF EECON1, EEPGD ;Configura para EEPROM
2. BSF EECON1, WREN ;Habilita escrita
3. MOVLW 0x55 ;W = 55h - primeira parte do código de escrita
4. MOVWF EECON2 ;SRAM(EECON2) = W
5. MOVLW 0xaa ;W = AAh - segunda parte do código de escrita
6. MOVWF EECON2 ;SRAM(EECON2) = W
7. BSF EECON1, WR ;Inicia escrita. Ao terminar,WR=0
8. BCF EECON1, WREN ;Desabilita escrita
• As oito linhas abaixo não podem faltar.
• A sequência deve ser preservada.
• A gravação é realizada após a instrução 7.
• Para várias escritas, as linhas 1 e 2 podem
ser usadas no início da primeira escrita e a
linha 8 no final da última escrita.
55 – EEPROM – Escrita direta
MPLAB® SIM1
; Programa 54 – EEPROM – Escrita direta
; Baseado no exemplo 4-2 do datasheet da pic16f877
#include <p16f877.inc>
org 0x5
constant ondecadê = 0x05 ;endereço da EEPROM (8 bits)
constant marqualrélio = 0xca ;dado para a EEPROM (8 bits)
;Configura os registradores para a escrita
BSF STATUS, RP1
BCF STATUS, RP0
MOVLW ondecadê ;W = ondecadê1
MOVWF EEADR ;SRAM(EEADR) = W
MOVLW marqualrélio ;W = marqualrélio
MOVWF EEDATA ;SRAM(EEDATA) = W
BSF STATUS, RP1 ;*
BSF STATUS, RP0
BCF EECON1, EEPGD ;Configura para EEPROM
BSF EECON1, WREN ;Habilita escrita
;Realiza a escrita
MOVLW 0x55 ;W = 55h - primeira parte do código de escrita
MOVWF EECON2 ;SRAM(EECON2) = W
MOVLW 0xaa ;W = AAh - segunda parte do código de escrita
MOVWF EECON2 ;SRAM(EECON2) = W
BSF EECON1, WR ;Inicia escrita
BCF EECON1, WREN ;Desabilita escrita
end
Escreve
Define endereço
Define dado
Configura
10509/05/2016
55 – EEPROM – Escrita direta BSF 0x03, 0x6
BCF 0x03, 0x5
MOVLW 0x05
MOVWF 0x0D
MOVLW 0xCA
MOVWF 0x0C
BSF 0x03, 0x6
BSF 0x03, 0x5
BCF 0x0C, 0x7
BSF 0x0C, 0x2
MOVLW 0x55
MOVWF 0x0D
MOVLW 0xAA
MOVWF 0x0D
BSF 0x0C, 0x1
BCF 0x0C, 0x2
*Esta linha pode serremovida.
MPLAB® SIM1
10609/05/2016
55 – EEPROM – Escrita direta – Testando
1 – Escolha um valor para o endereço de gravação.
2 – Escolha um valor para o dado a ser gravado.
MPLAB® SIM1
10709/05/2016
3 – Execute o programa.
55 – EEPROM – Escrita direta – Testando
• A posição 033h recebe o valor 022h.
MPLAB® SIM1
Escreve
Define endereço
Define dado
Configura
10809/05/2016
56 – EEPROM – Escrita indireta
; Programa 56 – EEPROM – Escrita indireta
; Baseado no exemplo 4-2 do datasheet da pic16f877
#include <p16f877.inc>
org 0x5
constant ondecadê1 = 0x20 ;Endereço do GPR (7 bits) que contém o dado para a EEPROM (8 bits)
constant ondecadê2 = 0x21 ;Endereço do GPR (7 bits) que contém o endereço da EEPROM (8 bits)
;Configura os registradores para a escrita
BCF STATUS, RP1
BCF STATUS, RP0
MOVF ondecadê2, W ;W = SRAM(ondecadê2), endereço para gravação
BSF STATUS, RP1
BCF STATUS, RP0 ;*
MOVWF EEADR ;SRAM(EEADR) = W
BCF STATUS, RP1
BCF STATUS, RP0 ;*
MOVF ondecadê1, W ;W = SRAM(ondecadê1), dado para gravação
BSF STATUS, RP1
BCF STATUS, RP0 ;*do
MOVWF EEDATA ;SRAM(EEDATA) = W
BSF STATUS, RP1 ;*
BSF STATUS, RP0
BCF EECON1, EEPGD ;Configura para EEPROM
BSF EECON1, WREN ;Habilita escrita
;Realiza a escrita
MOVLW 0x55 ;W = 55h - primeira parte do código de escrita
MOVWF EECON2 ;SRAM(EECON2) = W
MOVLW 0xaa ;W = AAh - segunda parte do código de escrita
MOVWF EECON2 ;SRAM(EECON2) = W
BSF EECON1, WR ;Inicia escrita
BCF EECON1, WREN ;Desabilita escrita
end
BCF 0x03, 0x6
BCF 0x03, 0x5
MOVF 0x21, 0x0
BSF 0x03, 0x6
BCF 0x03, 0x5
MOVWF 0x0D
BCF 0x03, 0x6
BCF 0x03, 0x5
MOVF 0x20, 0x0
BSF 0x03, 0x6
BCF 0x03, 0x5
MOVWF 0x0C
BSF 0x03, 0x6
BSF 0x03, 0x5
BCF 0x0C, 0x7
BSF 0x0C, 0x2
MOVLW 0x55
MOVWF 0x0D
MOVLW 0xAA
MOVWF 0x0D
BSF 0x0C, 0x1
*Esta linha pode serremovida.
19. 09/05/2016
19
MPLAB® SIM1
BSF STATUS, RP1
BSF STATUS, RP0
BCF EECON1, EEPGD
BSF EECON1, WREN
MOVLW 0x55
MOVWF EECON2
MOVLW 0xAA
MOVWF EECON2
BSF EECON1, WR
BCF EECON1, WREN
10909/05/2016
Não
interromper
• O acréscimo de um comando
qualquer (mesmo NOP) nos três
pontos mostrados impede a gravação.
• É preciso usar uma proteção contra
interrupção.
EEPROM – Escrita – Proteção contra interrup.
MPLAB® SIM1
11009/05/2016
Proteção
contra
interrupção
BCF INTCON, GIE
XXXXXXXXX
BSF INTCON, GIE
Área
protegida
Desabilita
interrupção
Reabilita
interrupção
INTCON: Interrupt Control register
GIE: Global Interrupt Enable bit
EEPROM – Escrita – Proteção contra interrup.
MPLAB® SIM1
11109/05/2016
• Como o tempo de gravação de uma palavra
na EEPROM pode ser maior do que o ciclo
de instrução, a execução do programa
prossegue enquanto a palavra é gravada.
• Ao iniciar uma gravação, deve-se verificar
que a EEPROM não se encontra em um outro
processo de gravação iniciado anteriormente.
EEPROM – Escrita – Verificação do estado
MPLAB® SIM1
11209/05/2016
;Verifica se está em processo de escrita
BSF STATUS, RP1
BSF STATUS, RP0
BTFSC EECON1, WR ;Se o bit WR de EECON1 for 0, pular a próxima linha
GOTO $-1 ;Retorna à linha anterior até que a escrita tenha terminado
• BTFSC EECON1, WR :
• Verifica se WR=0 ou WR=0.
• Se for 0, isto é, a EEPROM não está sendo gravada, pula a
instrução seguinte e prossegue com a execução.
• Se for 1, isto é, a EEPROM está em gravação, executa a
instrução seguinte.
• O programa fica paralisado até o término da escrita.
• Esta verificação somente é necessária se, anteriormente a
uma leitura ou escrita, foi feita uma escrita na EEPROM.
EEPROM – Escrita – Verificação do estado
MPLAB® SIM1
; Programa 57 – EEPROM – Proteções
; Baseado no exemplo 4-2 do datasheet da pic16f877
#include <p16f877.inc>
org 0x5
constant ondecadê1 = 0x20 ;Endereço do GPR (7 bits) que contém o dado para a EEPROM (8 bits)
constant ondecadê2 = 0x21 ;Endereço do GPR (7 bits) que contém o endereço da EEPROM (8 bits)
;Verifica se está em processo de escrita
BSF STATUS, RP1 ;
BSF STATUS, RP0 ;Banco 3
BTFSC EECON1, WR ;Se o bit WR de EECON1 for 0, pular a próxima linha
GOTO $-1 ;Retorna à linha anterior até que a escrita tenha terminado
;Escreve
BCF STATUS, RP1 ;
BCF STATUS, RP0 ;Banco 0
MOVF ondecadê2, W ;W = SRAM(ondecadê2), endereço para gravação
BSF STATUS, RP1 ;Banco 2
MOVWF EEADR ;EEADR = W
BCF STATUS, RP1 ;Banco 0
MOVF ondecadê1, W ;W = SRAM(ondecadê1), dado para gravação
BSF STATUS, RP1 ;Banco 2
MOVWF EEDATA ;EEDATA = W
BSF STATUS, RP0 ;Banco 3
BCF EECON1, EEPGD ;Configura para EEPROM
BSF EECON1, WREN ;Habilita escrita
BCF INTCON, GIE ;Desabilita interrupções, caso use interrupção
MOVLW 0x55 ;W = 55h - primeira parte do código de escrita
MOVWF EECON2 ;EECON2 = W
MOVLW 0xaa ;W = AAh - segunda parte do código de escrita
MOVWF EECON2 ;EECON2 = W
BSF EECON1, WR ;Inicia escrita
BSF INTCON, GIE ;Habilita interrupções, caso use interrupção
BCF EECON1, WREN ;Desabilita escrita
end 11309/05/2016
57 – EEPROM – Proteções
Proteçãocontrainterrupção
BSF 0x03, 0x6
BSF 0x03, 0x5
BTFSC 0x0C, 0x1
GOTO 0x07
BCF 0x03, 0x6
BCF 0x03, 0x5
MOVF 0x21, 0x0
BSF 0x03, 0x6
MOVWF 0x0d
BCF 0x03, 0x6
MOVF 0x20, 0x0
BSF 0x03, 0x6
MOVWF 0x0C
BSF 0x03, 0x5
BCF 0x0C, 0x7
BSF 0x0C, 0x2
BCF 0x0B, 0x7
MOVLW 0x55
MOVWF 0x0D
MOVLW 0xAA
MOVWF 0x0D
BSF 0x0C, 0x1
BSF 0x0B, 0x7
BCF 0x0C, 0x2
MPLAB® SIM1
11409/05/2016
58 – EEPROM – Procedimentos múltiplos
• Vamos escrever a palavra “Marco” na SRAM.
• Depois, copiaremos esta palavra da SRAM
para a EEPROM.
• Depois, copiaremos esta palavra da
EEPROM para um outro local da SRAM.
20. 09/05/2016
20
MPLAB® SIM1
11509/05/2016
58 – EEPROM – Procedimentos múltiplos
Caractere ASCII
M 4Dh
a 61h
r 72h
c 63h
o 6Fh
American Standard Code for Information Interchange
MPLAB® SIM1
11609/05/2016
58 – EEPROM – Procedimentos múltiplos
; Programa 57 – EEPROM – Procedimentos múltiplos
#include <p16f877.inc>
org 0x5
constant ondecadê1 = 0x11 ;endereço M origem
constant ondecadê2 = 0x12 ;endereço a origem
constant ondecadê3 = 0x13 ;endereço r origem
constant ondecadê4 = 0x14 ;endereço c origem
constant ondecadê5 = 0x15 ;endereço o origem
constant ondecadê6 = 0x16 ;endereço M destino
constant ondecadê7 = 0x17 ;endereço a destino
constant ondecadê8 = 0x18 ;endereço r destino
constant ondecadê9 = 0x19 ;endereço c destino
constant ondecadêA = 0x1a ;endereço o destino
constant ondeEEP1 = 0x01 ;endereço M na EEPROM
constant ondeEEP2 = 0x02 ;endereço a na EEPROM
constant ondeEEP3 = 0x03 ;endereço r na EEPROM
constant ondeEEP4 = 0x04 ;endereço c na EEPROM
constant ondeEEP5 = 0x05 ;endereço o na EEPROM
constant letraM = 0x4d ;dado para M
constant letraa = 0x61 ;dado para a
constant letrar = 0x72 ;dado para r
constant letrac = 0x63 ;dado para c
constant letrao = 0x6f ;dado para o
Parte 1: Declaração das constantes.
MPLAB® SIM1
11709/05/2016
58 – EEPROM – Procedimentos múltiplos
;escreve "Marco" na SRAM
BSF STATUS,RP1
BCF STATUS,RP0
MOVLW letraM
MOVWF ondecadê1
MOVLW letraa
MOVWF ondecadê2
MOVLW letrar
MOVWF ondecadê3
MOVLW letrac
MOVWF ondecadê4
MOVLW letrao
MOVWF ondecadê5
Parte 2: Gravação dos registros.
111 0x4D
112 0x61
113 0x72
114 0x63
115 0x6F
MPLAB® SIM1
Parte 3: Cópia para a EEPROM.
11809/05/2016
58 – EEPROM – Procedimentos múltiplos
M
a
r
c
o
BSF STATUS ,RP0
BCF EECON1 ,EEPGD
BSF EECON1 ,WREN
CALL EsperaEE
MOVLW ondeEEP1
MOVWF EEADR
MOVF ondecadê1,W
CALL EscreveEE
CALL EsperaEE
MOVLW ondeEEP2
MOVWF EEADR
MOVF ondecadê2,W
CALL EscreveEE
CALL EsperaEE
MOVLW ondeEEP3
MOVWF EEADR
MOVF ondecadê3,W
CALL EscreveEE
CALL EsperaEE
MOVLW ondeEEP4
MOVWF EEADR
MOVF ondecadê4,W
CALL EscreveEE
CALL EsperaEE
MOVLW ondeEEP5
MOVWF EEADR
MOVF ondecadê5,W
CALL EscreveEE
BCF EECON1, WREN
MPLAB® SIM1
Parte 3: Cópia para a EEPROM.
11909/05/2016
58 – EEPROM – Procedimentos múltiplos
MPLAB® SIM1
Parte 4: Cópia para a SRAM.
12009/05/2016
58 – EEPROM – Procedimentos múltiplos
MOVLW ondeEEP1
CALL EscreveSRAM
MOVWF ondecadê6
MOVLW ondeEEP2
CALL EscreveSRAM
MOVWF ondecadê7
MOVLW ondeEEP3
CALL EscreveSRAM
MOVWF ondecadê8
MOVLW ondeEEP4
CALL EscreveSRAM
MOVWF ondecadê9
MOVLW ondeEEP5
CALL EscreveSRAM
MOVWF ondecadêA
GOTO Fim
M
a
r
c
o
116 0x4D
117 0x61
118 0x72
119 0x63
11A 0x6F
21. 09/05/2016
21
MPLAB® SIM1
Parte 5: Sub-rotinas
12109/05/2016
58 – EEPROM – Procedimentos múltiplos
EsperaEE
BTFSC EECON1 ,WR
GOTO $-1
BCF STATUS ,RP0
RETURN
EscreveEE
MOVWF EEDATA
BSF STATUS ,RP0
MOVLW 0x55
MOVWF EECON2
MOVLW 0xaa
MOVWF EECON2
BSF EECON1 ,WR
RETURN
EscreveSRAM
BCF STATUS ,RP0
MOVWF EEADR
BSF STATUS ,RP0
BSF EECON1 ,RD
BCF STATUS ,RP0
MOVF EEDATA ,W
RETURN
end
MPLAB® SIM1
111 0x4D
112 0x61
113 0x72
114 0x63
115 0x6F
116 0x4D
117 0x61
118 0x72
119 0x63
11A 0x6F
Parte 6: Finalização.
12209/05/2016
58 – EEPROM – Procedimentos múltiplos
MPLAB® SIM1
12309/05/2016
58 – EEPROM – Procedimentos múltiplos
BSF 0x03, 0x6
BCF 0x03, 0x5
MOVLW 0x4D
MOVWF 0x11
MOVLW 0x61
MOVWF 0x12
MOVLW 0x72
MOVWF 0x13
MOVLW 0x63
MOVWF 0x14
MOVLW 0x6f
MOVWF 0x15
BSF 0x03, 0x5
BCF 0x0C, 0x7
BSF 0x0C, 0x2
BCF 0x0C, 0x2
MOVLW 0x01
CALL 0x049
MOVWF 0x16
MOVLW 0x02
CALL 0x049
MOVWF 0x17
MOVLW 0x03
CALL 0x049
MOVWF 0x18
MOVLW 0x04
CALL 0x049
MOVWF 0x19
MOVLW 0x05
CALL 0x049
MOVWF 0x1A
GOTO 0x051
BTFSC 0x0C, 0x1
GOTO 0x3D
BCF 0x03, 0x5
RETURN
MOVWF 0x0C
BSF 0x03, 0x5
MOVLW 0x55
MOVWF 0x0D
MOVLW 0xaA
MOVWF 0x0D
BSF 0x0C, 0x1
RETURN
BCF 0x03, 0x5
MOVWF 0x0D
BSF 0x03, 0x5
BSF 0x0C, 0x0
BCF 0x03, 0x5
MOVF 0x0C, 0x0
RETURN
CALL 0x03D
MOVLW 0x01
MOVWF 0x0D
MOVF 0x11, 0x0
CALL 0x041
CALL 0x03D
MOVLW 0x02
MOVWF 0x0D
MOVF 0x12, 0x0
CALL 0x041
CALL 0x03D
MOVLW 0x03
MOVWF 0x0D
MOVF 0x13, 0x0
CALL 0x041
CALL 0x03D
MOVLW 0x04
MOVWF 0x0D
MOVF 0x14, 0x0
CALL 0x041
CALL 0x03D
MOVLW 0x05
MOVWF 0x0D
MOVF 0x15, 0x0
CALL 0x041
MPLAB® SIM1
12409/05/2016
59,60 – FLASH – Leitura
• As versões antigas do código apresentaram erro.
• Elas foram desenvolvidas em um computador
antigo e, nele, funcionavam perfeitamente.
• Provavelmente existe uma falha no temporizador do
MPLAB® de modo que a performance do
computador está interferindo na simulação da
temporização do chip real.
• O problema foi solucionado adicionando-se a rotina
para aguardar o término do processo de leitura.
BTFSC EECON1,RD
GOTO $-1
MPLAB® SIM1
12509/05/2016
59 – FLASH – Leitura em posição baixa
; Universidade Federal de São João del-Rei
; Prof. Marco Aurélio Seluque Fregonezi
; Programa 59 – FLASH – Leitura indireta em posição baixa
#include <p16f877.inc>
org 0x5
constant ondecadê1 = 0x0b ;endereço LOW da FLASH
constant ondecadê2 = 0x22 ;GPR L
constant ondecadê3 = 0x23 ;GPR H
; Busca o endereço da posição da FLASH a ser lida
BSF STATUS,RP1
BCF STATUS,RP0 ;*
MOVLW ondecadê1
MOVWF EEADR ;SRAM(EEADR) = W
CLRF EEADRH ;SRAM(EEADRH) = 0
; Faz a leitura da FLASH(ondecadê1)
BSF STATUS,RP0 ;Banco 3
BSF EECON1,EEPGD ;Configura para FLASH
BSF EECON1,RD ;Inicia leitura
; Copia para a SRAM(ondecadê2 e ondecadê3)
BTFSC EECON1,RD
GOTO $-1
BCF STATUS,RP0
MOVF EEDATH,W
MOVWF ondecadê2 ;Banco 2, 122h
MOVF EEDATA,W
MOVWF ondecadê3 ;Banco 2, 123h
end
0005 1703 BSF 0x03, 0x6
0006 1283 BCF 0x03, 0x5
0007 300B MOVLW 0x0b
0008 008D MOVWF 0x0d
0009 018F CLRF 0x0f
000A 1683 BSF 0x03, 0x5
000B 178C BSF 0x0c, 0x7
000C 140C BSF 0x0c, 0x0
000D 180C BTFSC 0x0c, 0x0
000E 280D GOTO 0x00d
000F 1283 BCF 0x03, 0x5
0010 080E MOVF 0x0e, 0x0
0011 00A2 MOVWF 0x22
0012 080C MOVF 0x0c, 0x0
0013 00A3 MOVWF 0x23
122 0x17
123 0x8C
*Esta linha pode serremovida.
Banco 2
MPLAB® SIM1
0005 1703 BSF 0x03, 0x6
0006 1283 BCF 0x03, 0x5
0007 300B MOVLW 0x0b
0008 008D MOVWF 0x0d
0009 018F CLRF 0x0f
000A 1683 BSF 0x03, 0x5
000B 178C BSF 0x0c, 0x7
000C 140C BSF 0x0c, 0x0
000D 180C BTFSC 0x0c, 0x0
000E 280D GOTO 0x00d
000F 1283 BCF 0x03, 0x5
0010 080E MOVF 0x0e, 0x0
0011 00A2 MOVWF 0x22
0012 080C MOVF 0x0c, 0x0
0013 00A3 MOVWF 0x23
12609/05/2016
59 – FLASH – Leitura em posição baixa
22. 09/05/2016
22
MPLAB® SIM1
12709/05/2016
60 – FLASH – Leitura em posição alta
; Universidade Federal de São João del-Rei
; Prof. Marco Aurélio Seluque Fregonezi
; Programa 60 – FLASH – Leitura indireta em posição alta
#include <p16f877.inc>
org 0x5
constant ondecadê1 = 0x1b ;endereço H da FLASH
constant ondecadê2 = 0x68 ;endereço L da FLASH
constant ondecadê3 = 0x23 ;endereço H da SRAM
constant ondecadê4 = 0x24 ;endereço L da SRAM
; Busca o endereço da posição da FLASH a ser lida
BSF STATUS,RP1
MOVLW ondecadê1
MOVWF EEADRH ;SRAM(EEADRH) = W
MOVLW ondecadê2
MOVWF EEADR ;SRAM(EEADR) = W
; Faz a leitura da FLASH(ondecadê1 e ondecadê2)
BSF STATUS,RP0
BSF EECON1,EEPGD ;Configura para FLASH
BSF EECON1,RD ;Inicia leitura
; Copia para a SRAM(ondecadê3 e ondecadê4)
BTFSC EECON1,RD
GOTO $-1
BCF STATUS,RP0
MOVF EEDATH,W
MOVWF ondecadê3 ;Banco 2, 123h
MOVF EEDATA,W
MOVWF ondecadê4 ;Banco 2, 124h
end
0005 1703 BSF 0x03, 0x6
0006 301B MOVLW 0x1b
0007 008F MOVWF 0x0f
0008 3068 MOVLW 0x68
0009 008D MOVWF 0x0d
000A 1683 BSF 0x03, 0x5
000B 178C BSF 0x0c, 0x7
000C 140C BSF 0x0c, 0x0
000D 180C BTFSC 0x0c, 0x0
000E 280D GOTO 0x00d
000F 1283 BCF 0x03, 0x5
0010 080E MOVF 0x0e, 0x0
0011 00A3 MOVWF 0x23
0012 080C MOVF 0x0c, 0x0
0013 00A4 MOVWF 0x24
MPLAB® SIM1
123 0x21
124 0x30
1B67 3FFF
1B68 3021 MOVLW 0x21
1B69 3FFF
12809/05/2016
Digitar
60 – FLASH – Leitura em posição alta
Banco 2
MPLAB® SIM1
12909/05/2016
61 – FLASH – Escrita
; Programa 61
#include <p16f877.inc>
org 0x5
;Escreve
BCF STATUS, RP0
MOVLW 0x20 ;endereço L para gravação
MOVWF EEADR ;EEADR = W
MOVLW 0x00 ;endereço H para gravação
MOVWF EEADRH ;EEADRH = W
MOVLW 0x10 ;dado L para gravação
MOVWF EEDATA ;EEDATA = W
MOVLW 0x30 ;dado H para gravação
MOVWF EEDATH ;EEDATA = W
BSF STATUS, RP0 ;Banco 3
BSF EECON1, EEPGD ;Configura para FLASH
BSF EECON1, WREN ;Habilita escrita
BCF INTCON, GIE ;Desabilita interrupções, caso use interrupção
MOVLW 0x55 ;W = 55h - primeira parte do código de escrita
MOVWF EECON2 ;EECON2 = W
MOVLW 0xaa ;W = AAh - segunda parte do código de escrita
MOVWF EECON2 ;EECON2 = W
BSF EECON1, WR ;Inicia escrita
BTFSC EECON1, WR ;Se o bit WR de EECON1 for 0, pular a próxima linha
GOTO $-1 ;Retorna à linha anterior até que a escrita tenha terminado
BSF INTCON, GIE ;Habilita interrupções, caso use interrupção
BCF EECON1, WREN ;Desabilita escrita
end
0005 1283 BCF 0x03, 0x5
0006 1703 BSF 0x03, 0x6
0007 3020 MOVLW 0x20
0008 008D MOVWF 0x0d
0009 3000 MOVLW 0x00
000A 008F MOVWF 0x0f
000B 3010 MOVLW 0x10
000C 008C MOVWF 0x0c
000D 3030 MOVLW 0x30
000E 008E MOVWF 0x0e
000F 1683 BSF 0x03, 0x5
0010 178C BSF 0x0c, 0x7
0011 150C BSF 0x0c, 0x2
0012 138B BCF 0x0b, 0x7
0013 3055 MOVLW 0x55
0014 008D MOVWF 0x0d
0015 30AA MOVLW 0xaa
0016 008D MOVWF 0x0d
0017 148C BSF 0x0c, 0x1
0018 188C BTFSC 0x0c, 0x1
0019 2818 GOTO 0x018
001A 178B BSF 0x0b, 0x7
001B 110C BCF 0x0c, 0x2
MPLAB® SIM1
13009/05/2016
61 – FLASH – Escrita
• Este programa de escrita não pode ser testado
por meio do MPLAB® porque a program
memory do MPLAB® SIM não exibe alterações
no decorrer da execução do programa.
• Alterando o bit EEPGD para zero a gravação é
realizada na EEPROM, o que demonstra que o
programa está correto.
MPLAB® SIM1
; Programa 62 - ORG's múltiplos
org 0x5
MOVLW 0xaa
MOVWF 0x2a
MOVLW 0xaa+1
MOVWF 0x2a+1
org 0xf
MOVLW 0xbb
MOVWF 0x3a
MOVLW 0xbb+1
MOVWF 0x3a+1
end
13109/05/2016
62 – ORG’s múltiplos
0000 3FFF
0001 3FFF
0002 3FFF
0003 3FFF
0004 3FFF
0005 30AA MOVLW 0xAA
0006 00AA MOVWF 0x2A
0007 30AB MOVLW 0xAB
0008 00AB MOVWF 0x2B
0009 3FFF
000A 3FFF
000B 3FFF
000C 3FFF
000D 3FFF
000E 3FFF
000F 30BB MOVLW 0xBB
0010 00BA MOVWF 0x3A
0011 30BC MOVLW 0xBC
0012 00BB MOVWF 0x3B
0013 3FFF
0014 3FFF
0015 3FFF
MPLAB® SIM1
0000 3FFF
0001 3FFF
0002 3FFF
0003 3FFF
0004 3FFF
0005 30AA MOVLW 0xAA
0006 00AA MOVWF 0x2A
0007 30AB MOVLW 0xAB
0008 00AB MOVWF 0x2B
0009 3FFF
000A 3FFF
000B 3FFF
000C 3FFF
000D 3FFF
000E 3FFF
000F 30BB MOVLW 0xBB
0010 00BA MOVWF 0x3A
0011 30BC MOVLW 0xBC
0012 00BB MOVWF 0x3B
0013 3FFF
0014 3FFF
0015 3FFF
13209/05/2016
62 – ORG’s múltiplos
• 3FFFh ADDLW 0xFF
• Esta operação subtrai 1 do W.
• É preciso tomar cuidado ao
deixar espaços vazios
ocupados com 3FFFh.
• É preciso considerar esses
espaços na determinação do
endereço real de rótulos da
flash.
23. 09/05/2016
23
MPLAB® SIM1
13309/05/2016
63 – Uso do reset vector
; Programa 63 – Reset vector
org 0x0 ;pode ser removido
GOTO 0x5 ;pula o interrupt vector
org 0x5
MOVLW 0xbb
MOVWF 0x3a
MOVLW 0xbb+1
MOVWF 0x3a+1
end
Reset vector
Interrupt vector
0000 2805 GOTO 0x005
0001 3FFF
0002 3FFF
0003 3FFF
0004 3FFF
0005 30BB MOVLW 0xBB
0006 00BA MOVWF 0x3A
0007 30BC MOVLW 0xBC
0008 00BB MOVWF 0x3B
MPLAB® SIM1
13409/05/2016
64 – Uso do interrupt vector
; Universidade Federal de São João del-Rei
; Prof. Marco Aurélio Seluque Fregonezi
; Programa 63 – Interrupt vector
org 0x0
GOTO Início
org 0x4
GOTO RotinaInterrupção
org 0x5
Início
MOVLW 0xbb
MOVWF 0x3a
MOVLW 0xbb+1
MOVWF 0x3a+1
GOTO Fim
org 0x20
RotinaInterrupção
MOVLW 0xcc
MOVWF 0x3c
MOVLW 0xcc+1
MOVWF 0x3c+1
RETFIE
Fim
end
MPLAB® SIM1
13509/05/2016
65 – Bits de configuração
; Programa 64 – Bits de configuração
#include <P16F877.INC>
__config _WDT_OFF & _XT_OSC & _LVP_OFF
end
Apenas a configuração requerida pelo kit didático
• Todos os programas para o kit didático
devem possuir esta configuração.
• O WDT deve ser desligado a fim de
simplificar as atividades práticas.
• O oscilador deve ser XT porque essa é a
opção implementada em hardware.
• O LVP deve ser desligado.
• A não configuração do XT e do LVP gera erro
no momento da execução por meio do ICD2.
MPLAB® SIM1
13609/05/2016
Ajuste das mensagens de aviso
;-----Bank2------------------
EEDATA EQU H'010C'
EEADR EQU H'010D'
EEDATH EQU H'010E'
EEADRH EQU H'010F'
;-----Bank3------------------
EECON1 EQU H'018C'
EECON2 EQU H'018D'
;-----Bank2------------------
EEDATA EQU H'000C'
EEADR EQU H'000D'
EEDATH EQU H'000E'
EEADRH EQU H'000F'
;-----Bank3------------------
EECON1 EQU H'000C'
EECON2 EQU H'000D'
Alterar o arquivo p16f877.inc
Antes
Depois
MPLAB® SIM1
13709/05/2016
Ajuste das mensagens de aviso
Alterar o arquivo p16f877.inc
• Mesmo programando corretamente, a seguinte
mensagem de erro continua aparecendo:
• Message[302] H:2013_2ASSEMBLERAULAS59.ASM 24 : Register
in operand not in bank 0. Ensure that bank bits are correct.
• Isso acontece porque o arquivo “p16f877.inc”
apresenta os endereços dos SFR’s com 9 bits, porém
o endereçamento direto requer 7 bits.
• Para resolver esse problema, basta alterar todos os
endereços dos bancos 1, 2 e 3 para o seu respectivo
endereço no banco 0.
MPLAB® SIM1
13809/05/2016
• Montagem de opcode.
• Desmontagem de opcode.
• Geração do código disassembly a partir do código
MPASM.
• Determinação de valores da SRAM ou W a partir da
inspeção do programa.
• Determinação dos endereços dos opcodes.
• Determinação do argumento real para CALL e GOTO.
• Determinação dos valores da pilha.
• Identificação de stack overflow e stack underflow.
• Identificação de instruções que podem ser removidas.
• Identificação de endereços na EEPROM e na FLASH.
• Identificação de erros.
É preciso saber fazer:
24. 09/05/2016
24
DISPLAY DE 7 SEGMENTOS2
DISPLAY DE 7 SEGMENTOS
13909/05/2016
DISPLAY DE 7 SEGMENTOS2
Ciclo da automação industrial
14009/05/2016
Comandos
(Teclado)
Monitoração
(Display)
Entrada
proveniente do sensor
(Conversor A/D)
Saída
para o atuador
(PWM)
Controle
DISPLAY DE 7 SEGMENTOS2
Configuração do kit didático
• J1: Para baixo
• J2: Para baixo
• J3: Para baixo
• J4: Para cima
• CH1: Para baixo
• CH2: Para baixo
• CH3: Para baixo
• CH4: Para cima
• CH5: Para baixo
• CH6: Para cima
14109/05/2016
DISPLAY DE 7 SEGMENTOS2
Acionamento
14209/05/2016
RE<2:0>
RA<5>
DISPLAY DE 7 SEGMENTOS2
Acionamento
8
7
6
5
4
3 2
1
14309/05/2016
RD<7:0>
DISPLAY DE 7 SEGMENTOS2
Acionamento
• Posição A: LED’s
• Posição B: Display 7-seg.
• 8 bits de saída.
• Pode acionar os 8 LED’s <L7:L0>.
• Pode acionar os 8 LED’s do display.
14409/05/2016
25. 09/05/2016
25
DISPLAY DE 7 SEGMENTOS2
Acionamento
Ch4
Apostila Datapool PIC-2377
14509/05/2016
DISPLAY DE 7 SEGMENTOS2
Funcionamento
• O sinal deve ser multiplexado.
• A multiplexação é feita por RE<2:0> e RA<5>.
• PORTD<7:0> controla o display (8 diodos).
• Os 4 displays são controlados por PORTD<7:0>.
• Somente um display pode ser controlado por vez.
• São 12 bits de controle:
• RD<7:0> , RE<2:0> , RA<5>
• Todos bits são ativos em nível baixo.
14609/05/2016
DISPLAY DE 7 SEGMENTOS2
Funcionamento
• PORTD<7:0> está sempre ligada aos 4 displays.
• Se todos estiverem ligados, todos receberão o
mesmo valor.
• Para que recebam valores diferentes, devem ser
multiplexados.
• Na multiplexação (temporal), os displays ficam
piscando a uma frequência imperceptível.
• Esta multiplexação provoca uma leve perda na
luminosidade.
14709/05/2016
DISPLAY DE 7 SEGMENTOS2
Multiplexação por display
t
tt
t
14809/05/2016
• São quatro palavras de sete bits.
• O ponto não é usado.
DISPLAY DE 7 SEGMENTOS2
• São sete palavras de quatro bits.
• Quanto maior for o número de etapas de
multiplexação, maior é a redução do
número de bits envolvidos.
• Quanto maior for o número de LED’s
acionados individualmente por multiplexa-
ção, maior é a perda de luminosidade.
• Quanto maior for o número de etapas de
multiplexação, maior é o indesejável
efeito de cintilação.
Multiplexação por segmento
14909/05/2016
DISPLAY DE 7 SEGMENTOS2
Multiplexação
Sel1
8-bit
14
DEMUX
A0
A7
B0
B7
C0
C7
D0
D7
Sel0
15009/05/2016
26. 09/05/2016
26
DISPLAY DE 7 SEGMENTOS2
Multiplexação
15109/05/2016
• Os mesmos programas construídos para acionar display’s
por multiplexação temporal podem ser empregados no
acionamento de motor de passo.
• Ao invés de selecionar o display, seleciona-se a bobina do
motor.
• A diferença é que motor de passo permite o acionamento de
mais de uma bobina por vez, permitindo passos fracionados.
DISPLAY DE 7 SEGMENTOS2
Seleção de display
Display RA5 RE2 RE1 RE0
DPY1 1 1 1 0
DPY2 1 1 0 1
DPY3 1 0 1 1
DPY4 0 1 1 1
15209/05/2016
• É possível acionar mais de um display ao mesmo
tempo, mas, como não há memória, todos os
displays acionados apresentam o mesmo valor.
• A escolha pela lógica negativa foi feita pelo fabricante
do kit didático e nada tem a ver com a PIC®.
DISPLAY DE 7 SEGMENTOS2
4-bit ring
counter
Sel1
8-bit
14
DEMUX
Sel0
24
ENC
RE0
RE1
RE2
RA5
Multiplexação
clk
15309/05/2016
A0
A7
B0
B7
C0
C7
D0
D7
DISPLAY DE 7 SEGMENTOS2
Seleção de segmento
SEG RD7 RD6 RD5 RD4 RD3 RD2 RD1 RD0
1 1 1 1 1 1 1 1 0
2 1 1 1 1 1 1 0 1
3 1 1 1 1 1 0 1 1
4 1 1 1 1 0 1 1 1
5 1 1 1 0 1 1 1 1
6 1 1 0 1 1 1 1 1
7 1 0 1 1 1 1 1 1
8 0 1 1 1 1 1 1 1
8
7
6
5
4
3 2
1
15409/05/2016
DISPLAY DE 7 SEGMENTOS2
Seleção de segmento
15509/05/2016
• A contagem em anel, a decodificação e a
multiplexação são implementadas em software.
• A escolha pela lógica negativa foi feita pelo
fabricante do kit didático e nada tem a ver com
a arquitetura da PIC®.
• A formação de outros símbolos do display é
obtida por meio da junção das palavras de
seleção de cada segmento por meio da
operação AND.
8
7
6
5
4
3 2
1
DISPLAY DE 7 SEGMENTOS2
Seleção de segmento – Palavras com AND
SEG HEX BIN
1 FE 11111110
2 FD 11111101
3 FB 11111011
4 F7 11110111
5 EF 11101111
6 DF 11011111
7 BF 10111111
8 7F 01111111
15609/05/2016
8
7
6
5
4
3 2
1
27. 09/05/2016
27
DISPLAY DE 7 SEGMENTOS2
Palavras de interesse
Val. HEX BIN
0 03 0000 0011
1 9f 1001 1111
2 25 0010 0101
3 0d 0000 1101
4 99 1001 1001
5 49 0100 1001
6 41 0100 0001
7 1b 0001 1011
8 01 0000 0001
9 09 0000 1001
a 11 0001 0001
b c1 1100 0001
c 63 0110 0011
d 85 1000 0101
e 61 0110 0001
f 71 0111 0001 15709/05/2016
8
7
6
5
4
3 2
1
DISPLAY DE 7 SEGMENTOS2
Criação das constantes
• Não é preciso memorizar os códigos.
• Basta usar estas declarações em todos os programas.
• As chamadas são feitas sobre os nomes das constantes.
15809/05/2016
constant Disp0 = 0x03
constant Disp1 = 0x9f
constant Disp2 = 0x25
constant Disp3 = 0x0d
constant Disp4 = 0x99
constant Disp5 = 0x49
constant Disp6 = 0x41
constant Disp7 = 0x1b
constant Disp8 = 0x01
constant Disp9 = 0x09
constant DispA = 0x11
constant DispB = 0xc1
constant DispC = 0x63
constant DispD = 0x85
constant DispE = 0x61
constant DispF = 0x71
DISPLAY DE 7 SEGMENTOS2
Iniciação das portas
;Rotina de iniciação
BCF STATUS,RP0
BCF STATUS,RP1
BSF PORTE,RE0 ; Desabilita Display DPY1
BSF PORTE,RE1 ; Desabilita Display DPY2
BSF PORTE,RE2 ; Desabilita Display DPY3
BSF PORTA,RA5 ; Desabilita Display DPY4
BSF STATUS,RP0
CLRF TRISA ; Configura PORTA como saída
CLRF TRISD ; Configura PORTD como saída
CLRF TRISE ; Configura PORTE como saída
MOVLW 0x06 ; Carrega W com o valor 0x06
MOVWF ADCON1 ; PORTA e PORTE como digital
BCF STATUS,RP0
15909/05/2016
DISPLAY DE 7 SEGMENTOS2
16009/05/2016
; Programa 66 - Display 7 segmentos – Programa 1
#include <P16F877.INC>
__config _WDT_OFF & _XT_OSC & _LVP_OFF
;Rotina de iniciação
BCF STATUS,RP0
BCF STATUS,RP1
BCF PORTE,RE0 ; Habilita DPY1
BSF PORTE,RE1 ; Desabilita DPY2
BSF PORTE,RE2 ; Desabilita DPY3
BSF PORTA,RA5 ; Desabilita DPY4
BSF STATUS,RP0
CLRF TRISA ; Configura PORTA como saída
CLRF TRISD ; Configura PORTD como saída
CLRF TRISE ; Configura PORTE como saída
MOVLW 0x06 ; Carrega W com 0x06
MOVWF ADCON1 ; PORTA e PORTE como digital
BCF STATUS,RP0
MOVLW 0x01 ; Carrega "8."
MOVWF PORTD
end
Exemplo 1
Escolher um ou mais
Escolher outros símbolos
DISPLAY DE 7 SEGMENTOS2
Exemplo 2
16109/05/2016
• Este é um contador de 16 passos (0h a Fh).
• Não há manipulação na seleção de display.
• Todos os display’s apresentam o mesmo valor.
DISPLAY DE 7 SEGMENTOS2
Exemplo 2 – programa parte 1
16209/05/2016
; Programa 67 - Display 7 segmentos – Programa 2
#include <P16F877.INC>
__config _WDT_OFF & _XT_OSC & _LVP_OFF
constant TEMPOA = 0x20
constant TEMPOB = 0x21
constant TEMPOC = 0x22
constant VALOR = 0xff
constant Disp0 = 0x03
constant Disp1 = 0x9f
constant Disp2 = 0x25
constant Disp3 = 0x0d
constant Disp4 = 0x99
constant Disp5 = 0x49
constant Disp6 = 0x41
constant Disp7 = 0x1b
constant Disp8 = 0x01
constant Disp9 = 0x09
constant DispA = 0x11
constant DispB = 0xc1
constant DispC = 0x63
constant DispD = 0x85
constant DispE = 0x61
constant DispF = 0x71
Parâmetros iniciais
Escolher outros valores
entre 01h e FFh.
01h: Muito rápido
ffh: Muito lento
28. 09/05/2016
28
DISPLAY DE 7 SEGMENTOS2
16309/05/2016
Exemplo 2 – programa parte 2
;Rotina de iniciação
BCF STATUS,RP0
BCF STATUS,RP1
BCF PORTE,RE0 ; Habilita DPY1
BSF PORTE,RE1 ; Desabilita DPY2
BSF PORTE,RE2 ; Desabilita DPY3
BSF PORTA,RA5 ; Desabilita DPY4
BSF STATUS,RP0
CLRF TRISA ; Configura PORTA como saída
CLRF TRISD ; Configura PORTD como saída
CLRF TRISE ; Configura PORTE como saída
MOVLW 0x06 ; Carrega W com 0x06
MOVWF ADCON1 ; PORTA e PORTE como digital
BCF STATUS,RP0
Rotina de iniciação
Escolher um ou mais
DISPLAY DE 7 SEGMENTOS2
Exemplo 2 – programa parte 3
rotina
MOVLW Disp0
CALL Espera
MOVLW Disp1
CALL Espera
MOVLW Disp2
CALL Espera
MOVLW Disp3
CALL Espera
MOVLW Disp4
CALL Espera
MOVLW Disp5
CALL Espera
MOVLW Disp6
CALL Espera
MOVLW Disp7
CALL Espera
MOVLW Disp8
CALL Espera
MOVLW Disp9
CALL Espera
MOVLW DispA
CALL Espera
MOVLW DispB
CALL Espera
MOVLW DispC
CALL Espera
MOVLW DispD
CALL Espera
MOVLW DispE
CALL Espera
MOVLW DispF
CALL Espera
GOTO rotina
16409/05/2016
Manipulação dos displays e temporização
Espera
MOVWF PORTD
MOVLW VALOR
MOVWF TEMPOC
MOVLW VALOR
MOVWF TEMPOB
MOVLW VALOR
MOVWF TEMPOA
DECFSZ TEMPOA,F
GOTO $-0x1
DECFSZ TEMPOB,F
GOTO $-0x5
DECFSZ TEMPOC,F
GOTO $-0x9
RETURN
end
DISPLAY DE 7 SEGMENTOS2
Exemplo 2
16509/05/2016
• A constante VALOR é usada como parâmetro inicial
para os três GPR´s de contagem.
• Isto significa que, duplicando o valor atribuído à
constante VALOR, a temporização da rotina
Espera é, aproximadamente, multiplicada por oito.
• Este tempo deve ser grande para que o usuário
possa ler os valores apresentados no display.
DISPLAY DE 7 SEGMENTOS2
Exemplo 3
16609/05/2016
• Este programa coloca a palavra “3210” no visor.
• Há seleção de display.
• Há multiplexação temporal.
• A multiplexação pode seguir qualquer ordem.
DISPLAY DE 7 SEGMENTOS2
Exemplo 3 – programa parte 1
16709/05/2016
; Programa 68 - Display 7 segmentos – Programa 3
#include <P16F877.INC>
__config _WDT_OFF & _XT_OSC & _LVP_OFF
constant TEMPOA = 0x20
constant TEMPOB = 0x21
constant TEMPOC = 0x22
constant VALOR = 0x0f
constant Disp0 = 0x03
constant Disp1 = 0x9f
constant Disp2 = 0x25
constant Disp3 = 0x0d
Parâmetros iniciais
Escolher outros valores
entre 01h e FFh.
01h: Muito rápido
ffh: Muito lento
DISPLAY DE 7 SEGMENTOS2
16809/05/2016
Exemplo 3 – programa parte 2
;Rotina de iniciação
BCF STATUS,RP0
BCF STATUS,RP1
BSF PORTE,RE0 ; Desabilita Display DPY1
BSF PORTE,RE1 ; Desabilita Display DPY2
BSF PORTE,RE2 ; Desabilita Display DPY3
BSF PORTA,RA5 ; Desabilita Display DPY4
BSF STATUS,RP0
CLRF TRISA ; Configura PORTA como saída
CLRF TRISD ; Configura PORTD como saída
CLRF TRISE ; Configura PORTE como saída
MOVLW 0x06 ; Carrega W com 0x06
MOVWF ADCON1 ; PORTA e PORTE como digital
BCF STATUS,RP0
Todos os display’s
iniciam
desligados.
Rotina de iniciação