Upload
builien
View
214
Download
0
Embed Size (px)
Citation preview
06/06/2017
1
106/06/2017
Parte 9
PRÁTICAS
206/06/2017
1. DISPLAY DE 7 SEGMENTOS
2. TECLADO
3. PWM
4. ENTRADA ANALÓGICA
DISPLAY DE 7 SEGMENTOS1
306/06/2017
DISPLAY DE 7 SEGMENTOS
DISPLAY DE 7 SEGMENTOS1
406/06/2017
; Programa 67 - 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 SEGMENTOS1
506/06/2017
Exemplo 1
• Neste programa observamos um bug.
• Ao invés de acender apenas um display, acenderam dois.
• A causa deste bug não foi descoberta, porém não se trata de
um erro no programa.
• Ao efetuar multiplexação temporal no display, este bug
desaparece.
• Este display não foi feito para ser operado sem multiplexação.
DISPLAY DE 7 SEGMENTOS1Exemplo 2
606/06/2017
• 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.
06/06/2017
2
DISPLAY DE 7 SEGMENTOS1Exemplo 2 – programa parte 1
706/06/2017
; Programa 68 - 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
DISPLAY DE 7 SEGMENTOS1
806/06/2017
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 SEGMENTOS1Exemplo 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
906/06/2017
Manipulação dos displays e temporização
Espera
MOVWF PORTD
MOVLW VALOR
MOVWF TEMPOC
MOVWF TEMPOB
MOVWF TEMPOA
DECFSZ TEMPOA,F
GOTO $-0x1
DECFSZ TEMPOB,F
GOTO $-0x4
DECFSZ TEMPOC,F
GOTO $-0x7
RETURN
end
DISPLAY DE 7 SEGMENTOS1Exemplo 2
1006/06/2017
• 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 SEGMENTOS1Exemplo 3
1106/06/2017
• 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 SEGMENTOS1Exemplo 3 – programa parte 1
1206/06/2017
; Programa 69 - 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
06/06/2017
3
DISPLAY DE 7 SEGMENTOS1
1306/06/2017
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
DISPLAY DE 7 SEGMENTOS1Exemplo 3 – programa parte 3
Rotina
BCF PORTE,RE0 ; Habilita o Display DPY1
MOVLW Disp0 ; Carrega 0
CALL Espera ; Chamada da subrotina Espera
BSF PORTE,RE0 ; Desabilita Display DPY1
BCF PORTE,RE1 ; Habilita o Display DPY2
MOVLW Disp1 ; Carrega 1
CALL Espera ; Chamada da subrotina Espera
BSF PORTE,RE1 ; Desabilita Display DPY2
BCF PORTE,RE2 ; Habilita o Display DPY3
MOVLW Disp2 ; Carrega 2
CALL Espera ; Chamada da subrotina Espera
BSF PORTE,RE2 ; Desabilita Display DPY3
BCF PORTA,RA5 ; Habilita o Display DPY4
MOVLW Disp3 ; Carrega 3
CALL Espera ; Chamada da subrotina Espera
BSF PORTA,RA5 ; Desabilita Display DPY4
GOTO Rotina1406/06/2017
Manipulação dos displays
DISPLAY DE 7 SEGMENTOS1Exemplo 3 – programa parte 4
1506/06/2017
Temporização e encerramento
Espera
MOVWF PORTD
MOVLW VALOR
MOVWF TEMPOC
MOVWF TEMPOB
MOVWF TEMPOA
DECFSZ TEMPOA,F
GOTO $-0x1
DECFSZ TEMPOB,F
GOTO $-0x4
DECFSZ TEMPOC,F
GOTO $-0x7
RETURN
end
• No exemplo 2, o tempo precisa ser
grande para que o observador possa
identificar os símbolos apresentados.
• No exemplo 3, o tempo precisa ser
pequeno para que o observador não
possa identificar a multiplexação.
• No exemplo 3, poder-se-ia usar,
apenas, uma variável de contagem,
mas, para fins didáticos, foram
usadas três variáveis, para que se
possa aumentar o tempo e observar
a multiplexação.
DISPLAY DE 7 SEGMENTOS1Exemplo 3
t
t
t
t
1606/06/2017
DISPLAY DE 7 SEGMENTOS1Exemplo 3
1706/06/2017
• Diminuindo o tempo de espera entre as escritas, obtém-
se uma frequência tão alta que torne a multiplexação
temporal imperceptível ao usuário.
• O usuário tem a impressão de que os quatro números
estão sempre escritos.
• A rotina Espera poderia ser removida, gerando a máxima
frequência de multiplexação, porém é melhor mantê-la,
pois isso permite a escolha da frequência, idealmente a
menor possível e que seja invisível aos olhos humanos.
• Como o tempo é baixo, é possível remover um ou dois
GPR´s de contagem.
DISPLAY DE 7 SEGMENTOS1Exemplo 4
1806/06/2017
Multiplexação
06/06/2017
4
DISPLAY DE 7 SEGMENTOS1
; Programa 70 - Display 7 segmentos – Programa 4
#include <P16F877.INC>
__config _WDT_OFF & _XT_OSC & _LVP_OFF
constant TEMPOA = 0x20
constant TEMPOB = 0x21
constant TEMPOC = 0x22
constant VALOR = 0x0f ; Configurar
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
Exemplo 4 – programa parte 1
1906/06/2017
Parâmetros iniciais e configuraçã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 0x06
MOVWF ADCON1 ; PORTA e PORTE como digital
BCF STATUS,RP0
DISPLAY DE 7 SEGMENTOS1
2006/06/2017
BCF PORTE,RE0 ; Habilita o Display DPY1
MOVLW Disp8 ; Carrega 0
CALL Espera ; Chamada da subrotina Espera
BSF PORTE,RE0 ; Desabilita Display DPY1
BCF PORTE,RE1 ; Habilita o Display DPY2
MOVLW Disp9 ; Carrega 1
CALL Espera ; Chamada da subrotina Espera
BSF PORTE,RE1 ; Desabilita Display DPY2
BCF PORTE,RE2 ; Habilita o Display DPY3
MOVLW DispA ; Carrega 2
CALL Espera ; Chamada da subrotina Espera
BSF PORTE,RE2 ; Desabilita Display DPY3
BCF PORTA,RA5 ; Habilita o Display DPY4
MOVLW DispB ; Carrega 3
CALL Espera ; Chamada da subrotina Espera
BSF PORTA,RA5 ; Desabilita Display DPY4
BCF PORTE,RE0 ; Habilita o Display DPY1
MOVLW DispC ; Carrega 0
CALL Espera ; Chamada da subrotina Espera
BSF PORTE,RE0 ; Desabilita Display DPY1
BCF PORTE,RE1 ; Habilita o Display DPY2
MOVLW DispD ; Carrega 1
CALL Espera ; Chamada da subrotina Espera
BSF PORTE,RE1 ; Desabilita Display DPY2
BCF PORTE,RE2 ; Habilita o Display DPY3
MOVLW DispE ; Carrega 2
CALL Espera ; Chamada da subrotina Espera
BSF PORTE,RE2 ; Desabilita Display DPY3
BCF PORTA,RA5 ; Habilita o Display DPY4
MOVLW DispF ; Carrega 3
CALL Espera ; Chamada da subrotina Espera
BSF PORTA,RA5 ; Desabilita Display DPY4
GOTO Rotina ; Retorna ao nome Rotina
Rotina
BCF PORTE,RE0 ; Habilita o Display DPY1
MOVLW Disp0 ; Carrega 0
CALL Espera ; Chamada da subrotina Espera
BSF PORTE,RE0 ; Desabilita Display DPY1
BCF PORTE,RE1 ; Habilita o Display DPY2
MOVLW Disp1 ; Carrega 1
CALL Espera ; Chamada da subrotina Espera
BSF PORTE,RE1 ; Desabilita Display DPY2
BCF PORTE,RE2 ; Habilita o Display DPY3
MOVLW Disp2 ; Carrega 2
CALL Espera ; Chamada da subrotina Espera
BSF PORTE,RE2 ; Desabilita Display DPY3
BCF PORTA,RA5 ; Habilita o Display DPY4
MOVLW Disp3 ; Carrega 3
CALL Espera ; Chamada da subrotina Espera
BSF PORTA,RA5 ; Desabilita Display DPY4
BCF PORTE,RE0 ; Habilita o Display DPY1
MOVLW Disp4 ; Carrega 0
CALL Espera ; Chamada da subrotina Espera
BSF PORTE,RE0 ; Desabilita Display DPY1
BCF PORTE,RE1 ; Habilita o Display DPY2
MOVLW Disp5 ; Carrega 1
CALL Espera ; Chamada da subrotina Espera
BSF PORTE,RE1 ; Desabilita Display DPY2
BCF PORTE,RE2 ; Habilita o Display DPY3
MOVLW Disp6 ; Carrega 2
CALL Espera ; Chamada da subrotina Espera
BSF PORTE,RE2 ; Desabilita Display DPY3
BCF PORTA,RA5 ; Habilita o Display DPY4
MOVLW Disp7 ; Carrega 3
CALL Espera ; Chamada da subrotina Espera
BSF PORTA,RA5 ; Desabilita Display DPY4
Exemplo 4 – programa parte 2
DISPLAY DE 7 SEGMENTOS1Exemplo 4 – programa parte 3
2106/06/2017
Temporização e encerramento
Espera
MOVWF PORTD
MOVLW VALOR
MOVWF TEMPOC
MOVWF TEMPOB
MOVWF TEMPOA
DECFSZ TEMPOA,F
GOTO $-0x1
DECFSZ TEMPOB,F
GOTO $-0x4
DECFSZ TEMPOC,F
GOTO $-0x7
RETURN
end
DISPLAY DE 7 SEGMENTOS1
0D BCF 0x09, 0
0E MOVLW0x03
0F CALL 0x4e
10 BSF 0x09, 0
11 BCF 0x09, 0x1
12 MOVLW0x9f
13 CALL 0x4e
14 BSF 0x09, 0x1
15 BCF 0x09, 0x2
16 MOVLW0x25
17 CALL 0x4e
18 BSF 0x09, 0x2
19 BCF 0x05, 0x5
1A MOVLW0x0d
1B CALL 0x4e
1C BSF 0x05, 0x5
1D BCF 0x09, 0
1E MOVLW0x99
1F CALL 0x4e
20 BSF 0x09, 0
21 BCF 0x09, 0x1
22 MOVLW0x49
23 CALL 0x4e
24 BSF 0x09, 0x1
25 BCF 0x09, 0x2
26 MOVLW0x41
27 CALL 0x4e
28 BSF 0x09, 0x2
29 BCF 0x05, 0x5
2A MOVLW0x1b
2B CALL 0x4e
2C BSF 0x05, 0x5
2D BCF 0x09, 0
2E MOVLW0x01
2F CALL 0x4e
30 BSF 0x09, 0
31 BCF 0x09, 0x1
32 MOVLW0x09
33 CALL 0x4e
34 BSF 0x09, 0x1
35 BCF 0x09, 0x2
36 MOVLW0x11
37 CALL 0x4e
38 BSF 0x09, 0x2
39 BCF 0x05, 0x5
3A MOVLW0xc1
3B CALL 0x4e
3C BSF 0x05, 0x5
3D BCF 0x09, 0
3E MOVLW0x63
3F CALL 0x4e
40 BSF 0x09, 0
41 BCF 0x09, 0x1
42 MOVLW0x85
43 CALL 0x4e
44 BSF 0x09, 0x1
45 BCF 0x09, 0x2
46 MOVLW0x61
47 CALL 0x4e
48 BSF 0x09, 0x2
49 BCF 0x05, 0x5
4A MOVLW0x71
4B CALL 0x4e
4C BSF 0x05, 0x5
Exemplo 4
2206/06/2017
Disassembly00 BCF 0x03, 0x5
01 BCF 0x03, 0x6
02 BSF 0x09, 0
03 BSF 0x09, 0x1
04 BSF 0x09, 0x2
05 BSF 0x05, 0x5
06 BSF 0x03, 0x5
07 CLRF 0x05
08 CLRF 0x08
09 CLRF 0x09
0A MOVLW 0x06
0B MOVWF 0x1f
0C BCF 0x03, 0x5
4D GOTO 0x0d
4E MOVWF 0x08
4F MOVLW 0x0f
50 MOVLW 0x0f
51 MOVLW 0x0f
52 MOVWF 0x20
53 DECFSZ 0x20, 0x1
54 GOTO 0x55
55 DECFSZ 0x21, 0x1
56 GOTO 0x53
57 DECFSZ 0x22, 0x1
58 GOTO 0x51
59 RETURN
DISPLAY DE 7 SEGMENTOS1
• Para que se crie um display com informação
variável no tempo a uma taxa suficientemente
lenta para que seja perceptível ao usuário, é
preciso criar um loop de rotinas ou sub-
rotinas, cada uma delas consistindo de seu
próprio loop multiplexador.
• Pode ser necessário a criação de várias
variáveis de controle de temporização.
2306/06/2017
Exemplo 5
DISPLAY DE 7 SEGMENTOS1Exemplo 5
Etapa 1
Etapa 2
Etapa 3
Etapa 4
t2
2406/06/2017
Multiplexação – nível 1
06/06/2017
5
DISPLAY DE 7 SEGMENTOS1Exemplo 5
Etapa 1 Etapa 2 Etapa 3 Etapa 4
t1
2506/06/2017
DISPLAY DE 7 SEGMENTOS1
• t1: Tempo pequeno, imperceptível ao usuário.
• t2: Tempo grande, perceptível ao usuário.
• t1: Multiplexação temporal dos 4 display’s.
• t2: Multiplexação temporal dos 4 estados do display total.
• t1: Variável Tempo.
• t2: Variáveis TempoD e TempoE.
Exemplo 5
2606/06/2017
DISPLAY DE 7 SEGMENTOS1Exemplo 5 – Programa parte 1
2706/06/2017
; Programa 71 - Display 7 segmentos – Programa 5
#include <P16F877.INC>
__config _WDT_OFF & _XT_OSC & _LVP_OFF
constant TEMPO = 0x20
constant TEMPOD = 0x23
constant TEMPOE = 0x24
constant VALOR = 0x0f ; Configurar
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
;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
Parâmetros iniciais, rotina de iniciação e temporização
Espera
MOVLW VALOR
MOVWF TEMPO
DECFSZ TEMPO,F
GOTO $-0x1
RETURN
end
DISPLAY DE 7 SEGMENTOS1Exemplo 5 – Temporização da informação
MOVLW 0x07 ; Carrega W
MOVWF TEMPOE ; Carrega TEMPOE com W
Parte1a
MOVLW 0xff ; Carrega W
MOVWF TEMPOD ; Carrega TEMPOD com W
Parte1b
.
.
.
.
DECFSZ TEMPOD,F ; Decrementa TEMPOD e pula 1
GOTO Parte1b ; Retorna
DECFSZ TEMPOE,F ; Decrementa TEMPOE e pula 1
GOTO Parte1a ; Retorna
Manipulação dos display’s
2806/06/2017
DISPLAY DE 7 SEGMENTOS1
2906/06/2017
Exemplo 5 – Etapa 1MOVLW 0x07 ; Carrega W
MOVWF TEMPOE ; Carrega TEMPOE com W
Parte1a
MOVLW 0xff ; Carrega W
MOVWF TEMPOD ; Carrega TEMPOD com W
Parte1b
BCF PORTE,RE0; Habilita o Display DPY1
MOVLW Disp0 ; Carrega 0
CALL Espera ; Chamada da subrotina Espera
BSF PORTE,RE0; Desabilita Display DPY1
BCF PORTE,RE1; Habilita o Display DPY2
MOVLW Disp1 ; Carrega 1
CALL Espera ; Chamada da subrotina Espera
BSF PORTE,RE1; Desabilita Display DPY2
BCF PORTE,RE2; Habilita o Display DPY3
MOVLW Disp2 ; Carrega 2
CALL Espera ; Chamada da subrotina Espera
BSF PORTE,RE2; Desabilita Display DPY3
BCF PORTA,RA5; Habilita o Display DPY4
MOVLW Disp3 ; Carrega 3
CALL Espera ; Chamada da subrotina Espera
BSF PORTA,RA5; Desabilita Display DPY4
DECFSZ TEMPOD,F ; Decrementa TEMPOD e pula 1
GOTO Parte1b ; Retorna
DECFSZ TEMPOE,F ; Decrementa TEMPOE e pula 1
GOTO Parte1a ; Retorna
DISPLAY DE 7 SEGMENTOS1
3006/06/2017
Exemplo 5
• Ao invés de empregar as os valores 0x07
e 0xff, é possível usar valores individuais,
para cada uma das quatro etapas.
• Isto significa que algumas etapas pode ser
mais demoradas, e outras podem ser mais
breves.
06/06/2017
6
DISPLAY DE 7 SEGMENTOS1Exemplo 6
3106/06/2017
• Trata-se do exemplo 3 com mais passos de multiplexação.
• DPY1: Dutty-Cycle de 4/7 – 57,14%
• DPY2: Dutty-Cycle de 1/7 – 14,29%
• DPY3: Dutty-Cycle de 1/7 – 14,29%
• DPY4: Dutty-Cycle de 1/7 – 14,29%
DISPLAY DE 7 SEGMENTOS1Exemplo 6
3206/06/2017
DPY1
DPY2
DPY3
DPY4
H
L
H
L
H
L
H
L
t
t
t
t
T
DISPLAY DE 7 SEGMENTOS1Exemplo 6
3306/06/2017
; Programa 72 - Display 7 segmentos – Programa 6
#include <P16F877.INC>
__config _WDT_OFF & _XT_OSC & _LVP_OFF
constant TEMPOA 0x20
constant TEMPOB 0x21
constant TEMPOC 0x22
constant VALOR 0x0f ;configurar
constant Disp0 0x03
constant Disp1 0x9f
constant Disp2 0x25
constant Disp3 0x0d
;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
Espera
MOVWF PORTD
MOVLW VALOR
MOVWF TEMPOC
MOVWF TEMPOB
MOVWF TEMPOA
DECFSZ TEMPOA,F
GOTO $-0x1
DECFSZ TEMPOB,F
GOTO $-0x4
DECFSZ TEMPOC,F
GOTO $-0x7
RETURN
end
Rotina
BCF PORTE,RE0 ; Habilita o Display DPY1
MOVLWDisp0 ; Carrega 0
CALL Espera ; Chamada da subrotina Espera
BSF PORTE,RE0 ; Desabilita Display DPY1
BCF PORTE,RE1 ; Habilita o Display DPY2
MOVLWDisp1 ; Carrega 1
CALL Espera ; Chamada da subrotina Espera
BSF PORTE,RE1 ; Desabilita Display DPY2
BCF PORTE,RE0 ; Habilita o Display DPY1
MOVLWDisp0 ; Carrega 0
CALL Espera ; Chamada da subrotina Espera
BSF PORTE,RE0 ; Desabilita Display DPY1
BCF PORTE,RE2 ; Habilita o Display DPY3
MOVLWDisp2 ; Carrega 2
CALL Espera ; Chamada da subrotina Espera
BSF PORTE,RE2 ; Desabilita Display DPY3
BCF PORTE,RE0 ; Habilita o Display DPY1
MOVLWDisp0 ; Carrega 0
CALL Espera ; Chamada da subrotina Espera
BSF PORTE,RE0 ; Desabilita Display DPY1
BCF PORTA,RA5 ; Habilita o Display DPY4
MOVLWDisp3 ; Carrega 3
CALL Espera ; Chamada da subrotina Espera
BSF PORTA,RA5 ; Desabilita Display DPY4
BCF PORTE,RE0 ; Habilita o Display DPY1
MOVLWDisp0 ; Carrega 0
CALL Espera ; Chamada da subrotina Espera
BSF PORTE,RE0 ; Desabilita Display DPY1
GOTO Rotina
TECLADO2
TECLADO
3406/06/2017
TECLADO2Exemplo 1 – Configuração da porta B
MOVLW 0x0f
MOVWF TRISB ; Configura PORTB como 4 saídas e 4 entradas
Saídasativas em 0
Entradas
TRIS 00 Saída1 Entrada
Entradas
Saídas
3506/06/2017
TECLADO2Exemplo 1 – Proposta
3606/06/2017
L7 L6 L5 L4 L3 L2 L1 L0L7 L6 L5 L4 L3 L2 L1 L0 L7 L6 L5 L4 L3 L2 L1 L0 L7 L6 L5 L4 L3 L2 L1 L0
06/06/2017
7
TECLADO2Exemplo 1 – Listagem
3706/06/2017
; Programa 73 - Teclado – Programa 1
#include <P16F877.INC>
__config _WDT_OFF & _XT_OSC & _LVP_OFF
;Rotina de iniciação
BCF STATUS,RP1
BSF STATUS,RP0
CLRF TRISC ; Configura PORTC como saída
CLRF TRISD ; Configura PORTD como saída
MOVLW 0x0f
MOVWF TRISB ; Configura PORTB como 4 saídas e 4 entradas
BCF STATUS,RP0
MOVLW 0xff
MOVWF PORTB ; Teclado inativo 11111111
MOVLW 0xfe
MOVWF PORTC ; Habilita o teclado linha 0 11111110
Rotina
MOVF PORTB,W ; Leitura do teclado
IORLW 0xf0 ; Mascara o nibble mais significativo
MOVWF PORTD ; Indicar as teclas nos LEDs
GOTO Rotina
end
TECLADO2
3806/06/2017
• A máscara serve para desabilitar os quatro
LED´s não utilizados.
• Os bits da máscara em “um” eliminam osrespectivos bits de PORTB.
• A operação IOR foi escolhida por causa da
lógica negativa de acionamento dos LED´s.
• Apenas uma linha é lida.
• Não existe multiplexação temporal.
• Os LED´s são acesos em um dutty-cycle
de 100%.
IORLW 0xf0 ; Mascara o nibble mais significativo
Exemplo 1 – Análise
TECLADO2Exemplo 2 – Proposta
3906/06/2017
TECLADO2Exemplo 2 – Parte 1 – Iniciação
; Programa 74 - Teclado – Programa 2
#include <P16F877.INC>
__config _WDT_OFF & _XT_OSC & _LVP_OFF
;Rotina de iniciação
BCF STATUS,RP1
BSF STATUS,RP0
CLRF TRISC ; Configura PORTC como saída
CLRF TRISD ; Configura PORTD como saída
MOVLW 0x0f
MOVWF TRISB ; Configura PORTB como 4 saídas e 4 entradas
BCF STATUS,RP0
MOVLW 0xff
MOVWF PORTB ; Teclado inativo 11111111
MOVWF PORTC ; Teclado inativo 11111111
4006/06/2017
Igu
al a
o a
nte
rior
TECLADO2
Rotina
BCF PORTC,RC0 ; Habilita o teclado linha 0 11111110
CALL Subrotina
BSF PORTC,RC0 ; Desabilita teclado linha 0
BCF PORTC,RC1 ; Habilita o teclado linha 1 11111101
CALL Subrotina
BSF PORTC,RC1 ; Desabilita teclado linha 1
BCF PORTC,RC2 ; Habilita o teclado linha 2 11111011
CALL Subrotina
BSF PORTC,RC2 ; Desabilita teclado linha 2
BCF PORTC,RC3 ; Habilita o teclado linha 3 11110111
CALL Subrotina
BSF PORTC,RC3 ; Desabilita teclado linha 3
GOTO Rotina
Exemplo 2 – Parte 2 – Rotina
4106/06/2017
Subrotina
MOVF PORTB,W ; Leitura do teclado
IORLW 0xf0 ; Mascara o nibble mais significativo
MOVWF PORTD ; Indicar as teclas nos LEDs
RETURN
end
TECLADO2
4206/06/2017
• Uma linha é lida por vez.
• São quatro linhas.
• Os LED´s são acesos em um dutty-cycle de 25%.
Exemplo 2 – Brilho dos LED´s
06/06/2017
8
TECLADO2Exemplo 3 – Proposta
4306/06/2017
TECLADO2
;75 - Teclado – Programa 3
#include <P16F877.INC>
__config _WDT_OFF & _XT_OSC & _LVP_OFF
;Rotina de iniciação
BCF STATUS,RP1
BSF STATUS,RP0
CLRF TRISC ; Configura PORTC como saída
CLRF TRISD ; Configura PORTD como saída
MOVLW 0x0f
MOVWF TRISB ; Configura PORTB como 4 saídas e 4 entradas
BCF STATUS,RP0
MOVLW 0xff
MOVWF PORTB ; Teclado inativo 11111111
MOVWF PORTC ; Teclado inativo 11111111
Rotina
constant marqualrélio = 0x20
BCF PORTC,RC0 ; Habilita o teclado linha 0 11111110
MOVF PORTB,W ; Leitura do teclado linha 0
IORLW 0xf0 ; Mascara o nibble mais significativo
MOVWF PORTD ; Indicar as teclas nos LEDs
BSF PORTC,RC0 ; Desabilita teclado linha 0
BCF PORTC,RC1 ; Habilita o teclado linha 1 11111101
MOVF PORTB,W ; Leitura do teclado linha 1
IORLW 0xf0 ; Mascara o nibble mais significativo
MOVWF marqualrélio
SWAPF marqualrélio,W ; Inverte os nibbles para os LEDs
MOVWF PORTD ; Indicar as teclas nos LEDs
BSF PORTC,RC1 ; Desabilita teclado linha 1
GOTO Rotina ; Retorna ao nome Rotina
end
4406/06/2017
Exemplo 3 – Listagem
Igu
al a
o a
nte
rior
TECLADO2
4506/06/2017
• A permutação serve para transformar o barramento de
oito bits da MCU em um barramento de quatro bits paraPORTB.
• Primeiramente, é enviado o nibble menos significativo.
• Posteriormente, é enviado o nibble mais significativo.
• Os LED´s são acesos em um dutty-cycle de 50%.
SWAPF marqualrélio,W ; Inverte os nibbles para os LEDs
Exemplo 3 – Análise
TECLADO2
4606/06/2017
Outros exemplos
• Exemplo 4: Função toogle-switch usando push-button.
• Exemplo 5: Contador binário de 8 bits.
• Exemplo 6: Contador anel de 9 bits.
• Exemplo 7: Contador hexadecimal de 1 nibble.
• Exemplo 8: Sensibilidade ao nível da tecla.
• Exemplo 9: Acionamento ao apertar a tecla.
• Exemplo 10: Teclado multifuncional.
• Em todos esses exemplos, o sistema possui memória, é
uma máquina de estados estáveis finitos, o estado atual
é preservado até que se pressione a tecla.
• Em sistemas desse tipo, é preciso criar travamentos de
proteção contra transitórios no chaveamento.
TECLADO2
4706/06/2017
Exemplo 4 – Toogle
Usa a rotina “trava”.
L7 L6 L5 L4 L3 L2 L1 L0 L7 L6 L5 L4 L3 L2 L1 L0
TECLADO2
4806/06/2017
; Programa 76 - Teclado – Programa 4
#include <P16F877.INC>
__config _WDT_OFF & _XT_OSC & _LVP_OFF
constant marqualrélio = 0x20
;Rotina de iniciação
BCF STATUS,RP1
BSF STATUS,RP0
CLRF TRISC ; Configura PORTC como saída
CLRF TRISD ; Configura PORTD como saída
MOVLW 0x0f
MOVWF TRISB ; Configura PORTB como 4 saídas e 4 entradas
BCF STATUS,RP0
MOVLW 0xff
MOVWF PORTB ; Teclado inativo 11111111
MOVWF PORTC ; Teclado inativo 11111111
MOVWF PORTD ; LEDs apagados 11111111
BCF PORTC,RC0 ; Habilita o teclado linha 0 11111110
CLRF marqualrélio
Rotina
CALL Trava
COMF marqualrélio,F ; TOOGLE
MOVF marqualrélio,W
MOVWF PORTD
GOTO Rotina
end Usa a rotina “trava”.
Igu
al a
o a
nte
rior
Mu
dou
Exemplo 4 – Toogle
06/06/2017
9
TECLADO2
4906/06/2017
; Programa 77 - Teclado – Programa 5
#include <P16F877.INC>
__config _WDT_OFF & _XT_OSC & _LVP_OFF
constant marqualrélio = 0x20
;Rotina de iniciação
BCF STATUS,RP1
BSF STATUS,RP0
CLRF TRISC ; Configura PORTC como saída
CLRF TRISD ; Configura PORTD como saída
MOVLW 0x0f
MOVWF TRISB ; Configura PORTB como 4 saídas e 4 entradas
BCF STATUS,RP0
MOVLW 0xff
MOVWF PORTB ; Teclado inativo 11111111
MOVWF PORTC ; Teclado inativo 11111111
MOVWF PORTD ; LEDs apagados 11111111
BCF PORTC,RC0 ; Habilita o teclado linha 0 11111110
CLRF marqualrélio
Rotina
CALL Trava
INCF marqualrélio,F ; Passo de contagem
COMF marqualrélio,W ; Ajusta à lógica negativa
MOVWF PORTD
GOTO Rotina
end
Exemplo 5 – Contador binário de 8 bits
Usa a rotina “trava”.
Igu
al a
o a
nte
rior
TECLADO2
5006/06/2017
Exemplo 6 – Contador anel de 9 bits
TECLADO2
5106/06/2017
; Programa 78 - Teclado – Programa 6
#include <P16F877.INC>
__config _WDT_OFF & _XT_OSC & _LVP_OFF
constant marqualrélio = 0x20
;Rotina de iniciação
BCF STATUS,RP1
BSF STATUS,RP0
CLRF TRISC ; Configura PORTC como saída
CLRF TRISD ; Configura PORTD como saída
MOVLW 0x0f
MOVWF TRISB ; Configura PORTB como 4 saídas e 4 entradas
BCF STATUS,RP0
MOVLW 0xff
MOVWF PORTB ; Teclado inativo 11111111
MOVWF PORTC ; Teclado inativo 11111111
MOVWF PORTD ; LEDs apagados 11111111
BCF PORTC,RC0 ; Habilita o teclado linha 0 11111110
MOVLW 0x01 ; Valor inicial do contador anel
MOVWF marqualrélio
BCF STATUS,C
Rotina
CALL Trava
RLF marqualrélio,F ; Multiplica por 2
COMF marqualrélio,W ; Ajusta à lógica negativa
MOVWF PORTD
GOTO Rotina
end
Exemplo 6 – Contador anel de 9 bits
Usa a rotina “trava”.
Igu
al a
o a
nte
rior
TECLADO2
5206/06/2017
• A configuração carry = 0 é feita porque a
rotação para a esquerda usa este bit como bit
fracionário de entrada.
• A configuração inicial 0x01 é necessária porque
a rotação do valor 0x00 não faria diferença.
• Outra opção seria usar a configuração 0x00
junto com carry = 1.
MOVLW 0x01 ; Valor inicial do contador anel
MOVWF marqualrélio
BCF STATUS,C
Exemplo 6 – Contador anel de 9 bits
TECLADO2Exemplo 7 – Parte 1 – Definição das constantes
5306/06/2017
Mudar J3 para baixo
; Programa 79 - Teclado – Programa 7
#include <P16F877.INC>
__config _WDT_OFF & _XT_OSC & _LVP_OFF
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
TECLADO2Exemplo 7 – Parte 2 – Configurações
5406/06/2017
;Rotina de iniciação
BCF STATUS,RP1
BSF STATUS,RP0
CLRF TRISA ; Configura PORTA como saída
CLRF TRISC ; Configura PORTC como saída
CLRF TRISD ; Configura PORTD como saída
CLRF TRISE ; Configura PORTE como saída
MOVLW 0x0f
MOVWF TRISB ; Configura PORTB como 4 saídas e 4 entradas
MOVLW 0x06 ; Carrega W com 0x06
MOVWF ADCON1 ; PORTA e PORTE como digital
BCF STATUS,RP0
BCF PORTE,RE0 ; Habilita DPY1
BSF PORTE,RE1 ; Desabilita DPY2
BSF PORTE,RE2 ; Desabilita DPY3
BSF PORTA,RA5 ; Desabilita DPY4
MOVLW 0xff
MOVWF PORTB ; Teclado inativo 11111111
MOVWF PORTC ; Teclado inativo 11111111
MOVWF PORTD ; LED’s apagados 11111111
BCF PORTC,RC0 ; Habilita o teclado linha 0 11111110
06/06/2017
10
TECLADO2Exemplo 7 – Parte 3 – Rotina
5506/06/2017
Rotina
CALL Trava
MOVLW Disp0
MOVWF PORTD
CALL Trava
MOVLW Disp1
MOVWF PORTD
CALL Trava
MOVLW Disp2
MOVWF PORTD
CALL Trava
MOVLW Disp3
MOVWF PORTD
CALL Trava
MOVLW Disp8
MOVWF PORTD
CALL Trava
MOVLW Disp9
MOVWF PORTD
CALL Trava
MOVLW DispA
MOVWF PORTD
CALL Trava
MOVLW DispB
MOVWF PORTD
CALL Trava
MOVLW Disp4
MOVWF PORTD
CALL Trava
MOVLW Disp5
MOVWF PORTD
CALL Trava
MOVLW Disp6
MOVWF PORTD
CALL Trava
MOVLW Disp7
MOVWF PORTD
CALL Trava
MOVLW DispC
MOVWF PORTD
CALL Trava
MOVLW DispD
MOVWF PORTD
CALL Trava
MOVLW DispE
MOVWF PORTD
CALL Trava
MOVLW DispF
MOVWF PORTD
GOTO Rotina
end
Usa a rotina “trava”.
TECLADO2Exemplo 8 – Sensibilidade ao nível da tecla
5606/06/2017
• Tecla apertada: Aceso
• Tecla solta: Apagado
tApertada
Aceso0
1Solta
Apagado
Tecla apertada?
Tecla solta
Não
Sim
Tecla apertada
Tecla solta?Não
Acende
Sim
Apaga
TECLADO2Exemplo 8 – Sensibilidade ao nível da tecla
5706/06/2017
; Programa 80 - Teclado – Programa 8
#include <P16F877.INC>
__config _WDT_OFF & _XT_OSC & _LVP_OFF
;Rotina de iniciação
BCF STATUS,RP1
BSF STATUS,RP0
CLRF TRISC
CLRF TRISD
MOVLW 0x0f
MOVWF TRISB
BCF STATUS,RP0
MOVLW 0xfe
MOVWF PORTC
CLRF PORTD ; LED´s acesos
Rotina
COMF PORTD ; LED´s apagados
BTFSC PORTB,RB0 ; Master - Tecla solta
GOTO $-0x1 ; Master - Tecla solta
COMF PORTD ; LED´s acesos
BTFSS PORTB,RB0 ; Slave - Tecla pressionada
GOTO $-0x1 ; Slave - Tecla pressionada
GOTO Rotina
end
• Tecla apertada: Aceso
• Tecla solta: Apagado
tApertada
Aceso0
1Solta
Apagado
TECLADO2Exemplo 9 – Acionamento ao apertar a tecla
5806/06/2017
; Programa 81 - Teclado – Programa 9
#include <P16F877.INC>
__config _WDT_OFF & _XT_OSC & _LVP_OFF
;Rotina de iniciação
BCF STATUS,RP1
BSF STATUS,RP0
CLRF TRISC
CLRF TRISD
MOVLW 0x0f
MOVWF TRISB
BCF STATUS,RP0
MOVLW 0xfe
MOVWF PORTC
CLRF PORTD
Rotina
BTFSC PORTB,RB0 ; Master
GOTO $-0x1 ; Master
CALL Espera ; Master
COMF PORTD ; Toogle
BTFSS PORTB,RB0 ; Slave
GOTO $-0x1 ; Slave
CALL Espera ; Slave
GOTO Rotina
Espera
constant TEMPOA = 0x21
constant TEMPOB = 0x22
constant VALOR = 0x7f
MOVLW VALOR
MOVWF TEMPOB
MOVWF TEMPOA
DECFSZ TEMPOA,F
GOTO $-0x1
DECFSZ TEMPOB,F
GOTO $-0x4
RETURN
end
TECLADO2Exemplo 10 – Teclado multifunção – Raiz
5906/06/2017
; Programa 82 - Teclado – Programa 10
#include <P16F877.INC>
__config _WDT_OFF & _XT_OSC & _LVP_OFF
constant marqualrélio = 0x20
;Rotina de iniciação
BCF STATUS,RP1
BSF STATUS,RP0
CLRF TRISC
CLRF TRISD
MOVLW 0x0f
MOVWF TRISB
BCF STATUS,RP0
MOVLW 0xff
MOVWF PORTB ; Teclado inativo 11111111
MOVWF PORTD
MOVLW 0xfe
MOVWF PORTC ; Habilita o teclado linha 0 11111110
CLRF marqualrélio
Rotina
CALL SelecionaTecla
GOTO Rotina
TECLADO2Exemplo 10 – Teclado multifunção – Tecla 0
6006/06/2017
Tecla0
BTFSS PORTB,RB0 ;Slave 0
GOTO Tecla0
CLRF marqualrélio
Tecla0b
COMF marqualrélio,F
CALL Espera
GOTO Tecla0b
06/06/2017
11
TECLADO2Exemplo 10 – Teclado multifunção – Tecla 1
6106/06/2017
Tecla1
BTFSS PORTB,RB1 ;Slave 1
GOTO Tecla1
CLRF marqualrélio
BSF STATUS,C
Tecla1b
RLF marqualrélio,F
CALL Espera
GOTO Tecla1b
TECLADO2Exemplo 10 – Teclado multifunção – Tecla 2
6206/06/2017
Tecla2
BTFSS PORTB,RB2 ;Slave 2
GOTO Tecla2
CLRF marqualrélio
BSF STATUS,C
Tecla2b
RRF marqualrélio,F
CALL Espera
GOTO Tecla2b
TECLADO2Exemplo 10 – Teclado multifunção – Tecla 3
6306/06/2017
Tecla3
BTFSS PORTB,RB3 ;Slave 3
GOTO Tecla3
CLRF marqualrélio
Tecla3b
INCF marqualrélio,F
CALL Espera
GOTO Tecla3b
TECLADO2
06/06/2017
SelecionaTecla
BTFSS PORTB,RB0 ;Master 0
GOTO Tecla0
BTFSS PORTB,RB1 ;Master 1
GOTO Tecla1
BTFSS PORTB,RB2 ;Master 2
GOTO Tecla2
BTFSS PORTB,RB3 ;Master 3
GOTO Tecla3
RETURN
Espera
COMF marqualrélio,W ; Ajusta à lógica negativa
MOVWF PORTD
constant TEMPOA = 0x21
constant TEMPOB = 0x22
constant TEMPOC = 0x23
constant VALOR = 0x1f
MOVLW VALOR
MOVWF TEMPOC
MOVWF TEMPOB
MOVWF TEMPOA
CALL SelecionaTecla
DECFSZ TEMPOA,F
GOTO $-0x2
DECFSZ TEMPOB,F
GOTO $-0x5
DECFSZ TEMPOC,F
GOTO $-0x8
RETURN
end
Exemplo 10 – Teclado multifunção – Subrotinas
64
PWM3
PWM
6506/06/2017
PWM3
6606/06/2017
Exemplo Programa bits PR2
1 83 8 FEh
2 84 10 FFh
3 85 8 FBh
4 86 10 FFh
5 87 8 FFh
6 88 8 FFh
7 89 10 FFh
8 90 8 FBh
9 91 8 FFh
10 92 8 FFh
11 93 9 FFh
Configurações
06/06/2017
12
PWM3Exemplo 1 – 8 bits
6706/06/2017
; Programa 83 - PWM – Programa 1
#include <P16F877.INC>
__config _WDT_OFF & _XT_OSC & _LVP_OFF
;Rotina de iniciação
BCF STATUS,RP1
BSF STATUS,RP0
CLRF TRISC ;Configura PORTC como saída
MOVLW 0xfe
MOVWF PR2 ;Configura o período do PWM
BCF STATUS,RP0
MOVLW 0x07
MOVWF T2CON ;Habilita o Timer2 com 1:16
MOVLW 0x0f
MOVWF CCP1CON ;Habilita o PWM 1
MOVLW 0xff ;Dutty-cycle de 100% exatamente
MOVWF CCPR1L
end
Experimente
alterar
PWM3Exemplo 2 – 10 bits
6806/06/2017
; Programa 84 - PWM – Programa 2
#include <P16F877.INC>
__config _WDT_OFF & _XT_OSC & _LVP_OFF
;Rotina de iniciação
BCF STATUS,RP1
BSF STATUS,RP0
CLRF TRISC ;Configura PORTC como saída
MOVLW 0xff
MOVWF PR2 ;Configura o período do PWM
BCF STATUS,RP0
MOVLW 0x07
MOVWF T2CON ;Habilita o Timer2 com 1:16
MOVLW 0x0f
MOVWF CCP1CON ;Habilita o PWM 1
MOVLW 0xff
MOVWF CCPR1L
BSF CCP1CON,CCP1X
BSF CCP1CON,CCP1Y;11111111_11 ; 99,90234375%
end
Experimente
alterar
PWM3Exemplo 2 – 10 bits – Melhorado
6906/06/2017
; Programa 84 - PWM – Programa 2
#include <P16F877.INC>
__config _WDT_OFF & _XT_OSC & _LVP_OFF
;Rotina de iniciação
BCF STATUS,RP1
BSF STATUS,RP0
CLRF TRISC ;Configura PORTC como saída
MOVLW 0xff
MOVWF PR2 ;Configura o período do PWM
BCF STATUS,RP0
MOVLW 0x07
MOVWF T2CON ;Habilita o Timer2 com 1:16
MOVLW 0x3f
MOVWF CCP1CON ;Habilita o PWM 1
MOVLW 0xff
MOVWF CCPR1L
end
Igu
al a
o a
nte
rior
PWM3Exemplo 3 – Graduação em cinco níveis – 8 bits
7006/06/2017
VMÉDIA
100%
75%
50%
25%
0%
Espera DC CCPR1L CCP1X CCP1Y Decimal
0%00000000b
00h 0 0 0
25%00111111b
3Fh 0 0 252
50%01111110b
7Eh 0 0 504
75%10111101b
BDh 0 0 756
100%11111100b
FCh 0 0 1008
PWM3
; Programa 85 - PWM – Programa 3
#include <P16F877.INC>
__config _WDT_OFF & _XT_OSC & _LVP_OFF
;Rotina de iniciação
BCF STATUS,RP1
BSF STATUS,RP0
CLRF TRISC ;Configura PORTC como saída
MOVLW 0xfb ;Motivo: 0xfb = 0xfc(100%) - 1
MOVWF PR2 ;Configura o período do PWM
BCF STATUS,RP0
MOVLW 0x07
MOVWF T2CON ;Habilita o Timer2 com 1:16
MOVLW 0x0f
MOVWF CCP1CON ;Habilita o PWM 1
Rotina
MOVLW 0x00 ;Dutty-cycle de 0% exatamente
CALL Espera
MOVLW 0x3f ;Dutty-cycle de 25% exatamente
CALL Espera
MOVLW 0x7e ;Dutty-cycle de 50% exatamente
CALL Espera
MOVLW 0xbd ;Dutty-cycle de 75% exatamente
CALL Espera
MOVLW 0xfc ;Dutty-cycle de 100% exatamente
CALL Espera
GOTO Rotina
end
Exemplo 3 – Parte principal
7106/06/2017
DC CCPR1L
0%00000000b
00h
25%00111111b
3Fh
50%01111110b
7Eh
75%10111101b
BDh
100%11111100b
FCh
PWM3Exemplo 3 – Sub-rotina “Espera”
7206/06/2017
Espera
MOVWF CCPR1L
constant TEMPOA = 0x21
constant TEMPOB = 0x22
constant TEMPOC = 0x23
constant VALOR = 0x7f;configurável
MOVLW VALOR
MOVWF TEMPOC
MOVWF TEMPOB
MOVWF TEMPOA
DECFSZ TEMPOA,F
GOTO $-0x1
DECFSZ TEMPOB,F
GOTO $-0x4
DECFSZ TEMPOC,F
GOTO $-0x7
RETURN
Empregada também no exemplo 4
06/06/2017
13
PWM3Exemplo 4 – Graduação em quatro níveis – 10 bits
7306/06/2017
100%
67%
33%
0%
VMÉDIA
Espera
DC CCPR1L CCP1X CCP1Y Decimal
0%00000000b
00h 0 0 0
33%01010101b
55h 0 1 341
67%10101010b
AAh 1 0 682
100%11111111b
FFh 1 1 1023
PWM3Exemplo 4 – Configuração
7406/06/2017
; Programa 86 - PWM – Programa 4
#include<P16F877.INC>
__config_WDT_OFF & _XT_OSC & _LVP_OFF
;Rotina de iniciação
BCF STATUS,RP1
BSF STATUS,RP0
CLRF TRISC ;Configura PORTC como saída
MOVLW 0xff
MOVWF PR2 ;Configura o período do PWM
BCF STATUS,RP0
MOVLW 0x07
MOVWF T2CON ;Habilita o Timer2 com 1:16
MOVLW 0x0f
MOVWF CCP1CON ;Habilita o PWM 1
Utiliza a subrotina “Espera” do exemplo 3
PWM3Exemplo 4 – Rotina
7506/06/2017
Rotina
MOVLW 0xff ;Dutty-cycle de 100% aproximadamente
MOVWF CCPR1L
BSF CCP1CON,CCP1X ;esta linha pode ser removida
BSF CCP1CON,CCP1Y ;11111111_11
CALL Espera
MOVLW 0xaa ;Dutty-cycle de 67% aproximadamente
MOVWF CCPR1L
BSF CCP1CON,CCP1X ;esta linha pode ser removida
BCF CCP1CON,CCP1Y ;10101010_10
CALL Espera
MOVLW 0x55 ;Dutty-cycle de 33% aproximadamente
MOVWF CCPR1L
BCF CCP1CON,CCP1X
BSF CCP1CON,CCP1Y ;01010101_01
CALL Espera
MOVLW 0x00 ;Dutty-cycle de 0% exatamente
MOVWF CCPR1L
BCF CCP1CON,CCP1X
BCF CCP1CON,CCP1Y ;00000000_00
CALL Espera
GOTO Rotina
end
DC CCPR1L CCP1X CCP1Y
100%11111111b
FFh 1 1
67%10101010b
AAh 1 0
33%01010101b
55h 0 1
0%00000000b
00h 0 0
PWM3
100%
0%
Exemplo 5 – Onda dente-de-serra de 8 bits
7606/06/2017
VMÉDIA
FFh
00h
CCPR1L
PWM3Exemplo 5 – Configuração
7706/06/2017
; Programa 87 - PWM – Programa 5
#include <P16F877.INC>
__config _WDT_OFF & _XT_OSC & _LVP_OFF
;Rotina de iniciação
BCF STATUS,RP1
BSF STATUS,RP0
CLRF TRISC ;Configura PORTC como saída
MOVLW 0xff
MOVWF PR2 ;Configura o período do PWM
BCF STATUS,RP0
MOVLW 0x07
MOVWF T2CON ;Habilita o Timer2 com 1:16
MOVLW 0x0f
MOVWF CCP1CON ;Habilita o PWM 1
CLRF CCPR1L
• São 256 níveis diferentes.
• Usar o procedimento anterior geraria um programa grande.
• É mais fácil usar incremento.
• Um GPR precisa ser usado como elemento de memória.
• Opcionalmente, o próprio SFR CCPR1L pode ser usado
como memória.
PWM3Exemplo 5 – Rotina
7806/06/2017
Rotina
INCF CCPR1L,F
constant TEMPOA = 0x21
constant TEMPOB = 0x22
constant VALOR = 0xbf ;Configurar
MOVLW VALOR
MOVWF TEMPOB
MOVWF TEMPOA
DECFSZ TEMPOA,F
GOTO $-0x1
DECFSZ TEMPOB,F
GOTO $-0x4
GOTO Rotina
end
Esp
era
06/06/2017
14
PWM3
100%
0%
Exemplo 6 – Onda triangular de 8 bits
7906/06/2017
VMÉDIA
FFh
00h
CCPR1L
PWM3Exemplo 6 – Configuração
8006/06/2017
; Programa 88 - PWM – Programa 6
#include <P16F877.INC>
__config _WDT_OFF & _XT_OSC & _LVP_OFF
;Rotina de iniciação
BCF STATUS,RP1
BSF STATUS,RP0
CLRF TRISC ;Configura PORTC como saída
MOVLW 0xff
MOVWF PR2 ;Configura o período do PWM
BCF STATUS,RP0
MOVLW 0x07
MOVWF T2CON ;Habilita o Timer2 com 1:16
MOVLW 0x0f
MOVWF CCP1CON ;Habilita o PWM 1
CLRF CCPR1L
Igual ao anterior
PWM3Exemplo 6
8106/06/2017
Subida
CALL Espera
INCFSZ CCPR1L,F
GOTO Subida
GOTO Descida+1 ;Evita o spike para baixo
Descida
CALL Espera
DECFSZ CCPR1L,F
GOTO Descida
GOTO Subida
Espera
constant TEMPOA = 0x21
constant TEMPOB = 0x22
constant VALOR = 0xbf
MOVLW VALOR
MOVWF TEMPOB
MOVWF TEMPOA
DECFSZ TEMPOA,F
GOTO $-0x1
DECFSZ TEMPOB,F
GOTO $-0x4
RETURN
end
PWM3Exemplo 7 – PWM selecionado por teclas
8206/06/2017
1
100%
2/3
67%
1/3
33%
0
0%
DC CCPR1L CCP1X CCP1Y Decimal
0%00000000b
00h 0 0 0
33%01010101b
55h 0 1 341
67%10101010b
AAh 1 0 682
100%11111111b
FFh 1 1 1023
PWM3Exemplo 7 – Parte principal
8306/06/2017
Rotina
BTFSS PORTB,RB0 ;Master 0
GOTO Tecla0
BTFSS PORTB,RB1 ;Master 1
GOTO Tecla1
BTFSS PORTB,RB2 ;Master 2
GOTO Tecla2
BTFSS PORTB,RB3 ;Master 3
GOTO Tecla3
GOTO Rotina
end
; Programa 89 - PWM – Programa 7
#include <P16F877.INC>
__config _WDT_OFF & _XT_OSC & _LVP_OFF
;Rotina de iniciação
BCF STATUS,RP1
BSF STATUS,RP0
CLRF TRISC
MOVLW 0x0f
MOVWF TRISB
MOVLW 0xff
MOVWF PR2
BCF STATUS,RP0
MOVLW 0x07
MOVWF T2CON
MOVLW 0x0f
MOVWF CCP1CON
MOVLW 0xfe
MOVWF PORTC
PWM3Exemplo 7 – Sub-rotinas
8406/06/2017
Tecla0
BTFSS PORTB,RB0 ;Slave 0
GOTO Tecla0
MOVLW 0x00
MOVWF CCPR1L ;Dutty-cycle de 0% exatamente
BCF CCP1CON,CCP1X
BCF CCP1CON,CCP1Y
GOTO Rotina
Tecla1
BTFSS PORTB,RB1 ;Slave 1
GOTO Tecla1
MOVLW 0x55
MOVWF CCPR1L ;Dutty-cycle de 33% aproximadamente
BCF CCP1CON,CCP1X
BSF CCP1CON,CCP1Y
GOTO Rotina
Tecla2
BTFSS PORTB,RB2 ;Slave 2
GOTO Tecla2
MOVLW 0xaa
MOVWF CCPR1L ;Dutty-cycle de 67% aproximadamente
BSF CCP1CON,CCP1X
BCF CCP1CON,CCP1Y
GOTO Rotina
Tecla3
BTFSS PORTB,RB3 ;Slave 3
GOTO Tecla3
MOVLW 0xff
MOVWF CCPR1L ;Dutty-cycle de 100% aproximadamente
BSF CCP1CON,CCP1X
BSF CCP1CON,CCP1Y
GOTO Rotina
DC CCPR1L CCP1X CCP1Y
0%00000000b
00h 0 0
33%01010101b
55h 0 1
67%10101010b
AAh 1 0
100%11111111b
FFh 1 1
06/06/2017
15
PWM3Exemplo 8 – PWM alternado por uma tecla
8506/06/2017
0% 25% 50% 75% 100%
DC CCPR1L CCP1X CCP1Y Decimal
0%00000000b
00h 0 0 0
25%00111111b
3Fh 0 0 252
50%01111110b
7Eh 0 0 504
75%10111101b
BDh 0 0 756
100%11111100b
FCh 0 0 1008
PWM3
8606/06/2017
VMÉDIA
100%
75%
50%
25%
0%
Trava DC CCPR1L CCP1X CCP1Y Decimal
0%00000000b
00h 0 0 0
25%00111111b
3Fh 0 0 252
50%01111110b
7Eh 0 0 504
75%10111101b
BDh 0 0 756
100%11111100b
FCh 0 0 1008
Exemplo 8 – PWM alternado por uma tecla
PWM3Exemplo 8 – Parte principal
8706/06/2017
Rotina
MOVLW 0x00
CALL Trava
MOVLW 0x3f
CALL Trava
MOVLW 0x7e
CALL Trava
MOVLW 0xbd
CALL Trava
MOVLW 0xfc
CALL Trava
GOTO Rotina
end
; Programa 90 - PWM – Programa 8
#include <P16F877.INC>
__config _WDT_OFF & _XT_OSC & _LVP_OFF
;Rotina de iniciação
BCF STATUS,RP1
BSF STATUS,RP0
CLRF TRISC
MOVLW 0x0f
MOVWF TRISB
MOVLW 0xfb
MOVWF PR2
BCF STATUS,RP0
MOVLW 0x07
MOVWF T2CON
MOVLW 0x0f
MOVWF CCP1CON
MOVLW 0xfe
MOVWF PORTC
No anterior era 0xff
DC CCPR1L
0%00000000b
00h
25%00111111b
3Fh
50%01111110b
7Eh
75%10111101b
BDh
100%11111100b
FCh
PWM3Exemplo 8 – Sub-rotina “Trava”
8806/06/2017
Trava
MOVWF CCPR1L
BTFSC PORTB,RB0 ;master
GOTO $-0x1
BTFSS PORTB,RB0 ;slave
GOTO $-0x1
constant TEMPOA = 0x21
constant TEMPOB = 0x22
constant TEMPOC = 0x23
constant VALOR = 0x3f ;configurável
MOVLW VALOR
MOVWF TEMPOC
MOVWF TEMPOB
MOVWF TEMPOA
DECFSZ TEMPOA,F
GOTO $-0x1
DECFSZ TEMPOB,F
GOTO $-0x4
DECFSZ TEMPOC,F
GOTO $-0x7
RETURN
PWM3
8906/06/2017
• O exemplo 7 não precisa de trava porque a função das
quatro teclas é sempre a mesma, não é necessário saber
qual o estado anterior, e, por isso, uma consideração de
múltiplas tecladas, da parte da MCU, decorrente de
oscilação, não provoca efeito cumulativo.
• O exemplo 8 precisa de trava porque a função da tecla é
variável, é necessário saber qual o estado anterior, e, por
isso, uma consideração de múltiplas tecladas, da parte da
MCU, decorrente de oscilação, provoca efeito cumulativo.
Exemplo 8 – Sub-rotina “Trava”
PWM3Exemplo 9 – PWM com teclas +/-
9006/06/2017
Decremento Incremento
06/06/2017
16
PWM3
; Programa 91 - PWM – Programa 9
#include <P16F877.INC>
__config _WDT_OFF & _XT_OSC & _LVP_OFF
constant marqualrélio = 0x20
;Rotina de iniciação
CLRF marqualrélio
BCF STATUS,RP1
BSF STATUS,RP0
CLRF TRISC
MOVLW 0x0f
MOVWF TRISB
MOVLW 0xff
MOVWF PR2
BCF STATUS,RP0
MOVLW 0x07
MOVWF T2CON
MOVLW 0x0f
MOVWF CCP1CON
MOVLW 0xfe
MOVWF PORTC
Rotina
BTFSS PORTB,RB0 ;master 0
GOTO Tecla0
BTFSS PORTB,RB1 ;master 1
GOTO Tecla1
GOTO Rotina
Tecla0
BTFSS PORTB,RB0 ;slave 0
GOTO Tecla0
DECF marqualrélio,F
GOTO Escreve
Tecla1
BTFSS PORTB,RB1 ;slave 1
GOTO Tecla1
INCF marqualrélio,F
GOTO Escreve ;*9106/06/2017
Exemplo 9 – PWM com teclas +/- – Parte 1
*Esta linha pode ser removida.
PWM3
9206/06/2017
Exemplo 9 – PWM com teclas +/- – Parte 2
*Esta linha pode ser removida.
;espera
constant TEMPOA = 0x21
constant TEMPOB = 0x22
constant TEMPOC = 0x23
constant VALOR = 0x3f
MOVLW VALOR
MOVWF TEMPOC
MOVWF TEMPOB
MOVWF TEMPOA
DECFSZ TEMPOA,F
GOTO $-0x1
DECFSZ TEMPOB,F
GOTO $-0x4
DECFSZ TEMPOC,F
GOTO $-0x7
GOTO Rotina
end
PWM3
9306/06/2017
Escreve
MOVF marqualrélio, W
MOVWF CCPR1L
;multiplica por 16
BCF STATUS,C
RLF CCPR1L,F
BCF STATUS,C
RLF CCPR1L,F
BCF STATUS,C
RLF CCPR1L,F
BCF STATUS,C
RLF CCPR1L,F
Exemplo 9 – PWM com teclas +/- – Parte 3
*Esta linha pode ser removida.
CCPR1L
7 4 3 0
antes
CCPR1L
3 0 0000
depois
PWM3
9406/06/2017
• As quatro instruções RLF têm a função de multiplicar
CCPR1L por dezesseis.
• Esta multiplicação tem o objetivo de tornar o efeito da
tecla mais grosso de modo que o controle da variação no
brilho ocorra mais rapidamente.
• São usados quatro bits na determinação do dutty-cycle.
• São dezesseis níveis admissíveis.
• Um incremento no valor máximo gera o valor mínimo.
• Um decremento no valor mínimo gera o valor máximo.
• O programa pode ser aprimorado eliminando o wrap back.
Exemplo 9 – PWM com teclas +/-
PWM3
9506/06/2017
; Programa 92 - PWM – Programa 10
#include <P16F877.INC>
__config _WDT_OFF & _XT_OSC & _LVP_OFF
constant marqualrélio = 0x20
;Rotina de iniciação
CLRF marqualrélio
BCF STATUS,RP1
BSF STATUS,RP0
CLRF TRISC
MOVLW 0x0f
MOVWF TRISB
MOVLW 0xff
MOVWF PR2
BCF STATUS,RP0
MOVLW 0x07
MOVWF T2CON
MOVLW 0x0f
MOVWF CCP1CON
MOVLW 0xfe
MOVWF PORTC
Exemplo 10 – Teclas +/- melhoradas
*Esta linha pode ser removida.
;espera
constant TEMPOA = 0x21
constant TEMPOB = 0x22
constant TEMPOC = 0x23
constant VALOR = 0x3f
MOVLW VALOR
MOVWF TEMPOC
MOVWF TEMPOB
MOVWF TEMPOA
DECFSZ TEMPOA,F
GOTO $-0x1
DECFSZ TEMPOB,F
GOTO $-0x4
DECFSZ TEMPOC,F
GOTO $-0x7
GOTO Rotina
end
Etapas iguais às do programa anterior
Rotina
BTFSS PORTB,RB0 ;master 0
GOTO Tecla0
BTFSS PORTB,RB1 ;master 1
GOTO Tecla1
GOTO Rotina
Tecla0
BTFSS PORTB,RB0 ;slave 0
GOTO Tecla0
DECF marqualrélio,F
GOTO Escreve
Tecla1
BTFSS PORTB,RB1 ;slave 1
GOTO Tecla1
INCF marqualrélio,F
GOTO Escreve ;*
PWM3
9606/06/2017
Exemplo 10 – Teclas +/- melhoradas
*Esta linha pode ser removida.
Escreve
MOVF marqualrélio, W
MOVWF CCPR1L
;multiplica por 32
MOVLW 0x07 ;máscara 0000_0111
ANDWF CCPR1L,F ;aplica a máscara
BCF STATUS,C
RLF CCPR1L,F
RLF CCPR1L,F
RLF CCPR1L,F
RLF CCPR1L,F
RLF CCPR1L,F
06/06/2017
17
PWM3
9706/06/2017
• As cinco instruções RLF têm a função de multiplicar
CCPR1L por 32.
• São usados três bits na determinação do dutty-cycle.
• São oito níveis admissíveis.
• A máscara é usada para eliminar os bits de retorno
em um na rotação.
• Por causa do uso da máscara, não é preciso zerar o
cary em cada rotação.
Exemplo 10 – PWM com teclas +/-
PWM3
9806/06/2017
Conflito
PWM1
PWM3
9906/06/2017
Conflito
• Quando a saída PWM1 está em nível lógico baixo, a
terceira linha do teclado também é ativada porque o
pino é o mesmo.
• Por causa deste problema, pode ser que, ao acionar as
teclas da terceira linha no instante em que o sinal PWM
esteja em “0”, elas funcionem normalmente apesar do
programa ter acionado apenas a primeira linha.
• Quanto mais baixo é o dutty-cycle, maior é a
probabilidade de que a terceira linha funcione
inadvertidamente.
PWM3Exemplo 11 – PWM selecionado por teclas
10006/06/2017
3/7
42,9%
2/7
28,6%
1/7
14,3%
0
0%
7/7
100%
6/7
85,7%
5/7
71,4%
4/7
57,1%
PWM3Exemplo 11 – PWM selecionado por teclas
10106/06/2017
DC CCPR1L CCP1X CCP1Y Decimal
0%00000000b
0x00 0 0 0d
14,3%00100100b
0x24 1 0 0146d
28,6%01001001b
0x49 0 0 0292d
42,9%01101101b
0x6d 1 0 0438d
57,1%10010010b
0x92 0 0 0584d
71,4%10110110b
0xb6 1 0 0730d
85,7%11011011b
0xdb 0 0 0876d
100%11111111b
0xff 1 0 1022d
PWM3Exemplo 11 – PWM selecionado por teclas
10206/06/2017
; Programa 93 - PWM – Programa 11
#include <P16F877.INC>
__config _WDT_OFF & _XT_OSC & _LVP_OFF
;Rotina de iniciação
BCF STATUS,RP1
BSF STATUS,RP0
CLRF TRISC
MOVLW 0x0f
MOVWF TRISB
MOVLW 0xff
MOVWF PR2
BCF STATUS,RP0
MOVLW 0x07
MOVWF T2CON
MOVLW 0x0f
MOVWF CCP1CON
CLRF CCPR1L
BCF CCP1CON,CCP1X
BCF CCP1CON,CCP1Y
Espera
constant TEMPOA = 0x21
constant TEMPOB = 0x22
constant TEMPOC = 0x23
constant VALOR = 0x1f
MOVLW VALOR
MOVWF TEMPOC
MOVWF TEMPOB
MOVWF TEMPOA
DECFSZ TEMPOA,F
GOTO $-0x1
DECFSZ TEMPOB,F
GOTO $-0x4
DECFSZ TEMPOC,F
GOTO $-0x7
RETURN
end
06/06/2017
18
PWM3Exemplo 11 – PWM selecionado por teclas
10306/06/2017
Rotina
BCF PORTC,RC0
BTFSS PORTB,RB0 ;Master 00
GOTO Tecla00
BTFSS PORTB,RB1 ;Master 01
GOTO Tecla01
BTFSS PORTB,RB2 ;Master 02
GOTO Tecla02
BTFSS PORTB,RB3 ;Master 03
GOTO Tecla03
BSF PORTC,RC0
BCF PORTC,RC1
BTFSS PORTB,RB0 ;Master 10
GOTO Tecla10
BTFSS PORTB,RB1 ;Master 11
GOTO Tecla11
BTFSS PORTB,RB2 ;Master 12
GOTO Tecla12
BTFSS PORTB,RB3 ;Master 13
GOTO Tecla13
BSF PORTC,RC1
GOTO Rotina
PWM3Exemplo 11 – PWM selecionado por teclas
10406/06/2017
Tecla00
BTFSS PORTB,RB0 ;Slave 00
GOTO Tecla00
CALL Espera
MOVLW 0x00
MOVWF CCPR1L ;Dutty-cycle de 0/7
BCF CCP1CON,CCP1X
GOTO Rotina
Tecla01
BTFSS PORTB,RB1 ;Slave 01
GOTO Tecla01
CALL Espera
MOVLW 0x24
MOVWF CCPR1L ;Dutty-cycle de 1/7
BSF CCP1CON,CCP1X
GOTO Rotina
Tecla02
BTFSS PORTB,RB2 ;Slave 02
GOTO Tecla02
CALL Espera
MOVLW 0x49
MOVWF CCPR1L ;Dutty-cycle de 2/7
BCF CCP1CON,CCP1X
GOTO Rotina
Tecla03
BTFSS PORTB,RB3 ;Slave 03
GOTO Tecla03
CALL Espera
MOVLW 0x6d
MOVWF CCPR1L ;Dutty-cycle de 3/7
BSF CCP1CON,CCP1X
GOTO Rotina
Tecla10
BTFSS PORTB,RB0 ;Slave 10
GOTO Tecla10
CALL Espera
MOVLW 0x92
MOVWF CCPR1L ;Dutty-cycle de 4/7
BCF CCP1CON,CCP1X
GOTO Rotina
Tecla11
BTFSS PORTB,RB1 ;Slave 11
GOTO Tecla11
CALL Espera
MOVLW 0xb6
MOVWF CCPR1L ;Dutty-cycle de 5/7
BSF CCP1CON,CCP1X
GOTO Rotina
Tecla12
BTFSS PORTB,RB2 ;Slave 12
GOTO Tecla12
CALL Espera
MOVLW 0xdb
MOVWF CCPR1L ;Dutty-cycle de 6/7
BCF CCP1CON,CCP1X
GOTO Rotina
Tecla13
BTFSS PORTB,RB3 ;Slave 13
GOTO Tecla13
CALL Espera
MOVLW 0xff
MOVWF CCPR1L ;Dutty-cycle de 7/7
BSF CCP1CON,CCP1X
GOTO Rotina
ENTRADA ANALÓGICA4
ENTRADA ANALÓGICA
10506/06/2017
ENTRADA ANALÓGICA4Exemplo 1 – Palavra binária
10606/06/2017
ADRESL
PORTD
0d 0V
255d 5V
ENTRADA ANALÓGICA4
; Programa 94 - Entrada analógica – Programa 1
#include <P16F877.INC>
__config _WDT_OFF & _XT_OSC & _LVP_OFF
;Rotina de iniciação
BCF STATUS,RP1
BSF STATUS,RP0
CLRF TRISD
CLRF ADCON1 ;Habilita os oito canais AD
MOVLW 0x08 ;00001000b
MOVWF TRISA ;Entrada AD
BCF STATUS,RP0
MOVLW 0x59
MOVWF ADCON0 ;0101_10X1
;01 - ADCLOCK = FOSC/8 = FCY/2
;011 - AN3
;0 - GODONE
;1 – ADON
end
Exemplo 1 – Palavra binária – Parte 1
10706/06/2017
ENTRADA ANALÓGICA4Exemplo 1 – Palavra binária – Rotina
10806/06/2017
Rotina
BSF ADCON0,GO ;Inicia a conversão AD
BTFSC ADCON0,GO ;Verifica fim da conversão
GOTO $-0x1
MOVF ADRESH,W ;Leitura do valor de tensão
MOVWF PORTD
;espera
constant TEMPOA = 0x21
constant TEMPOB = 0x22
constant TEMPOC = 0x23
constant VALOR = 0x3f
MOVLW VALOR
MOVWF TEMPOC
MOVWF TEMPOB
MOVWF TEMPOA
DECFSZ TEMPOA,F
GOTO $-0x1
DECFSZ TEMPOB,F
GOTO $-0x4
DECFSZ TEMPOC,F
GOTO $-0x7
GOTO Rotina
06/06/2017
19
ENTRADA ANALÓGICA4
10906/06/2017
• O AD clock é de fCY/2.
• TAD = TCY2.
• O tempo para a conversão é:
• tconv = 10TAD.
• tconv = 20TCY.
Exemplo 1 – Palavra binária
ENTRADA ANALÓGICA4Exemplo 2 – Palavra anel – 3 bits
11006/06/2017
ADRESL
PORTD
Val. Mín. Máx.0 00000000 00011111
1 00100000 00111111
2 01000000 01011111
3 01100000 01111111
4 10000000 10011111
5 10100000 10111111
6 11000000 11011111
7 11100000 11111111
L7 L6 L5 L4 L3 L2 L1 L0
ADRESH
ENTRADA ANALÓGICA4
; Programa 95 - Entrada analógica – Programa 2
#include <P16F877.INC>
__config _WDT_OFF & _XT_OSC & _LVP_OFF
;Rotina de iniciação
BCF STATUS,RP1
BSF STATUS,RP0
CLRF TRISD
CLRF ADCON1 ;Habilita os oito canais AD
MOVLW 0x08 ;00001000b
MOVWF TRISA ;Entrada AD
BCF STATUS,RP0
MOVLW 0x59
MOVWF ADCON0 ;0101_10X1
;01 - ADCLOCK = FOSC/8 = FCY/2
;011 - AN3
;0 - GODONE
;1 – ADON
11106/06/2017
Exemplo 2 – Palavra anel – 3 bits – Parte 1
Igu
al a
o a
nte
rior
ENTRADA ANALÓGICA4
11206/06/2017
Rotina
BSF ADCON0,GO ;Inicia a conversão AD
BTFSC ADCON0,GO ;Verifica fim da conversão
GOTO $-0x1
MOVF ADRESH,W ;Leitura do valor de tensão
CLRF PORTD
COMF PORTD
;seleção de meias
BTFSS ADRESH,0x7
GOTO R01234567
GOTO R89ABCDEF
;seleção de quartas
R01234567
BTFSS ADRESH,0x6
GOTO R0123
GOTO R4567
R89ABCDEF
BTFSS ADRESH,0x6
GOTO R89AB
GOTO RCDEF
;seleção de oitavas
R0123
BTFSS ADRESH,0x5
GOTO R01
GOTO R23
R4567
BTFSS ADRESH,0x5
GOTO R45
GOTO R67
R89AB
BTFSS ADRESH,0x5
GOTO R89
GOTO RAB
RCDEF
BTFSS ADRESH,0x5
GOTO RCD
GOTO REF
Exemplo 2 – Palavra anel – 3 bits – Parte 2
;oitavas
R01
BCF PORTD,RD0
GOTO TerminaSeleção
R23
BCF PORTD,RD1
GOTO TerminaSeleção
R45
BCF PORTD,RD2
GOTO TerminaSeleção
R67
BCF PORTD,RD3
GOTO TerminaSeleção
R89
BCF PORTD,RD4
GOTO TerminaSeleção
RAB
BCF PORTD,RD5
GOTO TerminaSeleção
RCD
BCF PORTD,RD6
GOTO TerminaSeleção
REF
BCF PORTD,RD7
GOTO TerminaSeleção
ENTRADA ANALÓGICA4
11306/06/2017
TerminaSeleção
constant TEMPOA = 0x21
constant TEMPOB = 0x22
constant TEMPOC = 0x23
constant VALOR = 0x3f
MOVLW VALOR
MOVWF TEMPOC
MOVWF TEMPOB
MOVWF TEMPOA
DECFSZ TEMPOA,F
GOTO $-0x1
DECFSZ TEMPOB,F
GOTO $-0x4
DECFSZ TEMPOC,F
GOTO $-0x7
GOTO Rotina
end
Exemplo 2 – Palavra anel – 3 bits – Parte 3
ENTRADA ANALÓGICA4Exemplo 3 – Palavra hexadecimal – 4 bits
11406/06/2017
ADRESL
PORTD
Val. Mín. Máx.0 00000000 00001111
1 00010000 00011111
2 00100000 00101111
3 00110000 00111111
4 01000000 01001111
5 01010000 01011111
6 01100000 01101111
7 01110000 01111111
8 10000000 10001111
9 10010000 10011111
a 10100000 10101111
b 10110000 10111111
c 11000000 11001111
d 11010000 11011111
e 11100000 11101111
f 11110000 11111111
ADRESH
06/06/2017
20
ENTRADA ANALÓGICA4
11506/06/2017
; Programa 96 - Entrada analógica – Programa 3
#include <P16F877.INC>
__config _WDT_OFF & _XT_OSC & _LVP_OFF
;Rotina de iniciação
BCF STATUS,RP0
BCF STATUS,RP1
CLRF PORTA
CLRF PORTD
BSF STATUS,RP0
CLRF TRISD
CLRF ADCON1 ;Habilita os oito canais AD
MOVLW 0x08 ;00001000b
MOVWF TRISA ;Entrada AD
MOVLW 0xdf
MOVWF OPTION_REG
BCF PORTE,RE0 ;Habilita DPY1
BSF PORTE,RE1 ;Desabilita DPY2
BSF PORTE,RE2 ;Desabilita DPY3
BSF PORTA,RA5 ;Desabilita DPY4
BCF STATUS,RP0
MOVLW 0x59
MOVWF ADCON0 ;0101_10X1
;01 - ADCLOCK = FOSC/8 = FCY/2
;011 - AN3
;0 - GODONE
;1 – ADON
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
Exemplo 3 – Palavra hexadecimal – 4 bits
ENTRADA ANALÓGICA4
11606/06/2017
Rotina
BSF ADCON0,GO ;Inicia a conversão AD
BTFSC ADCON0,GO ;Verifica fim da conversão
GOTO $-0x1 ;Não precisava verificar porque já tem a espera adiante
MOVF ADRESH,W ;Leitura do valor de tensão
Exemplo 3 – Palavra hexadecimal – 4 bits
ENTRADA ANALÓGICA4
11706/06/2017
;seleção de oitavas
R0123
BTFSS ADRESH,0x5
GOTO R01
GOTO R23
R4567
BTFSS ADRESH,0x5
GOTO R45
GOTO R67
R89AB
BTFSS ADRESH,0x5
GOTO R89
GOTO RAB
RCDEF
BTFSS ADRESH,0x5
GOTO RCD
GOTO REF
;seleção de décimas sextas
R01
BTFSS ADRESH,0x4
GOTO R_0
GOTO R_1
R23
BTFSS ADRESH,0x4
GOTO R_2
GOTO R_3
R45
BTFSS ADRESH,0x4
GOTO R_4
GOTO R_5
R67
BTFSS ADRESH,0x4
GOTO R_6
GOTO R_7
R89
BTFSS ADRESH,0x4
GOTO R_8
GOTO R_9
RAB
BTFSS ADRESH,0x4
GOTO R_A
GOTO R_B
RCD
BTFSS ADRESH,0x4
GOTO R_C
GOTO R_D
REF
BTFSS ADRESH,0x4
GOTO R_E
GOTO R_F
;escreve
R_0
MOVLW Disp0
GOTO TerminaSeleção
R_1
MOVLW Disp1
GOTO TerminaSeleção
R_2
MOVLW Disp2
GOTO TerminaSeleção
R_3
MOVLW Disp3
GOTO TerminaSeleção
R_4
MOVLW Disp4
GOTO TerminaSeleção
R_5
MOVLW Disp5
GOTO TerminaSeleção
R_6
MOVLW Disp6
GOTO TerminaSeleção
R_7
MOVLW Disp7
GOTO TerminaSeleção
R_8
MOVLW Disp8
GOTO TerminaSeleção
R_9
MOVLW Disp9
GOTO TerminaSeleção
R_A
MOVLW DispA
GOTO TerminaSeleção
R_B
MOVLW DispB
GOTO TerminaSeleção
R_C
MOVLW DispC
GOTO TerminaSeleção
R_D
MOVLW DispD
GOTO TerminaSeleção
R_E
MOVLW DispE
GOTO TerminaSeleção
R_F
MOVLW DispF
GOTO TerminaSeleção
;seleção de meias
BTFSS ADRESH,7
GOTO R01234567
GOTO R89ABCDEF
;seleção de quartas
R01234567
BTFSS ADRESH,0x6
GOTO R0123
GOTO R4567
R89ABCDEF
BTFSS ADRESH,0x6
GOTO R89AB
GOTO RCDEF
Exemplo 3 – Palavra hexadecimal – 4 bits
ENTRADA ANALÓGICA4
11806/06/2017
TerminaSeleção
MOVWF PORTD
constant TEMPOA = 0x21
constant TEMPOB = 0x22
constant TEMPOC = 0x23
constant VALOR = 0x3f ;configurável
MOVLW VALOR
MOVWF TEMPOC
MOVWF TEMPOB
MOVWF TEMPOA
DECFSZ TEMPOA,F
GOTO $-0x1
DECFSZ TEMPOB,F
GOTO $-0x4
DECFSZ TEMPOC,F
GOTO $-0x7
RETURN
end
Exemplo 3 – Palavra hexadecimal – 4 bits
ENTRADA ANALÓGICA4Exemplos 4 a 11 – Controle PWM
11906/06/2017
ADRES
CCPR
ENTRADA ANALÓGICA4Exemplo 4 – Controle PWM – 8 bits
12006/06/2017
; Programa 97 - Entrada analógica – Programa 4
#include <P16F877.INC>
__config _WDT_OFF & _XT_OSC & _LVP_OFF
;Rotina de iniciação
BCF STATUS,RP1
BSF STATUS,RP0
CLRF ADCON1 ;Habilita os oito canais AD
MOVLW 0x08 ;00001000b
MOVWF TRISA ;Entrada AD
CLRF TRISC
MOVLW 0xff
MOVWF PR2
BCF STATUS,RP0
MOVLW 0x07
MOVWF T2CON
MOVLW 0x0f
MOVWF CCP1CON
BCF STATUS,RP0
MOVLW 0x59 ;0101_10X1
MOVWF ADCON0
Rotina
BSF ADCON0,GO ;Inicia a conversão AD
BTFSC ADCON0,GO ;Verifica fim da conversão
GOTO $-0x1
MOVF ADRESH,W ;Leitura do valor de tensão
MOVWF CCPR1L ;Envio para o CCP1
GOTO Rotina
end
• Este programa serve
como base para os
programas seguintes.
Blo
co b
ásic
o
06/06/2017
21
ENTRADA ANALÓGICA4
; Programa 98 - Entrada analógica – Programa 5
#include <P16F877.INC>
__config _WDT_OFF & _XT_OSC & _LVP_OFF
;Rotina de iniciação
BCF STATUS,RP1
BSF STATUS,RP0
CLRF ADCON1 ;Habilita os oito canais AD
MOVLW 0x08 ;00001000b
MOVWF TRISA ;Entrada AD
CLRF TRISC
MOVLW 0xff
MOVWF PR2
BCF STATUS,RP0
MOVLW 0x07
MOVWF T2CON
MOVLW 0x0f
MOVWF CCP1CON
BCF STATUS,RP0
MOVLW 0x59 ;0101_10X1
MOVWF ADCON0
Exemplo 5 – Controle invertido – 8 bits – Parte 1
12106/06/2017
Igu
al a
o a
nte
rior
ENTRADA ANALÓGICA4Exemplo 5 – Controle invertido – 8 bits – Parte 2
12206/06/2017
Rotina
BSF ADCON0,GO ;Inicia a conversão de dado
BTFSC ADCON0,GO ;Verifica fim da conversão
GOTO $-0x1
MOVF ADRESH,W ;Leitura do valor de tensão
MOVWF CCPR1L ;Envio para o CCP1
COMF CCPR1L,F
GOTO Rotina
end
Igu
al a
o a
nte
rior
ENTRADA ANALÓGICA4Exemplos 4 e 5
12306/06/2017
100%
0%
VMÉDIA
FFh
00h x(graus)
Exemplo 4
100%
0%
VMÉDIA
FFh
00h x(graus)
Exemplo 5
ENTRADA ANALÓGICA4
; Programa 99 - Entrada analógica – Programa 6
#include <P16F877.INC>
__config _WDT_OFF & _XT_OSC & _LVP_OFF
;Rotina de iniciação
BCF STATUS,RP1
BSF STATUS,RP0
CLRF ADCON1 ;Habilita os oito canais AD
MOVLW 0x08 ;00001000b
MOVWF TRISA ;Entrada AD
CLRF TRISC
MOVLW 0xff
MOVWF PR2
BCF STATUS,RP0
MOVLW 0x07
MOVWF T2CON
MOVLW 0x0f
MOVWF CCP1CON
BCF STATUS,RP0
MOVLW 0x59 ;0101_10X1
MOVWF ADCON0
Exemplo 6 – Controle duplicado – 8 bits – Parte 1
12406/06/2017
Igu
al a
o a
nte
rior
ENTRADA ANALÓGICA4Exemplo 6 – Controle duplicado – 8 bits – Parte 2
12506/06/2017
Rotina
BSF ADCON0,GO ;Inicia a conversão AD
BTFSC ADCON0,GO ;Verifica fim da conversão
GOTO $-0x1
MOVF ADRESH,W ;Leitura do valor de tensão
MOVWF CCPR1L ;Envio para o CCP1
RLF CCPR1L,F
GOTO Rotina
end
• A alteração provocada pelo carry é irrelevante no
contexto do brilho da lâmpada e pode ser desprezada.
Igu
al a
o a
nte
rior
ENTRADA ANALÓGICA4
; Programa 100 - Entrada analógica – Programa 7
#include <P16F877.INC>
__config _WDT_OFF & _XT_OSC & _LVP_OFF
;Rotina de iniciação
BCF STATUS,RP1
BSF STATUS,RP0
CLRF ADCON1 ;Habilita os oito canais AD
MOVLW 0x08 ;00001000b
MOVWF TRISA ;Entrada AD
CLRF TRISC
MOVLW 0xff
MOVWF PR2
BCF STATUS,RP0
MOVLW 0x07
MOVWF T2CON
MOVLW 0x0f
MOVWF CCP1CON
BCF STATUS,RP0
MOVLW 0x59 ;0101_10X1
MOVWF ADCON0
Exemplo 7 – Onda triangular – 8 bits – Parte 1
12606/06/2017
Igu
al a
o a
nte
rior
06/06/2017
22
ENTRADA ANALÓGICA4
12706/06/2017
Rotina
BSF ADCON0,GO ;Inicia a conversão de dado
BTFSC ADCON0,GO ;Verifica fim da conversão
GOTO $-0x1
MOVF ADRESH,W ;Leitura do valor de tensão
MOVWF CCPR1L ;Envio para o CCP1
BTFSC CCPR1L,0x7
COMF CCPR1L,F
RLF CCPR1L,F
GOTO Rotina
end
Exemplo 7 – Onda triangular – 8 bits – Parte 2
Igu
al a
o a
nte
rior
ENTRADA ANALÓGICA4Exemplos 6 e 7
12806/06/2017
100%
0%
VMÉDIA
FFh
00h x(graus)
Exemplo 6
100%
0%
VMÉDIA
FFh
00h x(graus)
Exemplo 7
ENTRADA ANALÓGICA4
; Programa 101 - Entrada analógica – Programa 8
#include <P16F877.INC>
__config _WDT_OFF & _XT_OSC & _LVP_OFF
;Rotina de iniciação
BCF STATUS,RP1
BSF STATUS,RP0
CLRF ADCON1 ;Habilita os oito canais AD
MOVLW 0x08 ;00001000b
MOVWF TRISA ;Entrada AD
CLRF TRISC
MOVLW 0xff
MOVWF PR2
BCF STATUS,RP0
MOVLW 0x07
MOVWF T2CON
MOVLW 0x0f
MOVWF CCP1CON
BCF STATUS,RP0
MOVLW 0x59 ;0101_10X1
MOVWF ADCON0
Exemplo 8 – Duplo triangular – 8 bits – Parte 1
12906/06/2017
Igu
al a
o a
nte
rior
ENTRADA ANALÓGICA4
13006/06/2017
Rotina
BSF ADCON0,GO ;Inicia a conversão AD
BTFSC ADCON0,GO ;Verifica fim da conversão
GOTO $-0x1
MOVF ADRESH,W ;Leitura do valor de tensão
MOVWF CCPR1L ;Envio para o CCP1
BTFSC CCPR1L,0x6
COMF CCPR1L,F
RLF CCPR1L,F
RLF CCPR1L,F
GOTO Rotina
end
Exemplo 8 – Duplo triangular – 8 bits – Parte 2
Igu
al a
o a
nte
rior
ENTRADA ANALÓGICA4
; Programa 102 - Entrada analógica – Programa 9
#include <P16F877.INC>
__config _WDT_OFF & _XT_OSC & _LVP_OFF
;Rotina de iniciação
BCF STATUS,RP1
BSF STATUS,RP0
CLRF ADCON1 ;Habilita os oito canais AD
MOVLW 0x08 ;00001000b
MOVWF TRISA ;Entrada AD
CLRF TRISC
MOVLW 0xff
MOVWF PR2
BCF STATUS,RP0
MOVLW 0x07
MOVWF T2CON
MOVLW 0x0f
MOVWF CCP1CON
BCF STATUS,RP0
MOVLW 0x59 ;0101_10X1
MOVWF ADCON0
Exemplo 9 – Redução a 8 níveis – 8 bits – Parte 1
13106/06/2017
Igu
al a
o a
nte
rior
ENTRADA ANALÓGICA4
13206/06/2017
Rotina
BSF ADCON0,GO ;Inicia a conversão AD
BTFSC ADCON0,GO ;Verifica fim da conversão
GOTO $-0x1
MOVF ADRESH,W ;Leitura do valor de tensão
MOVWF CCPR1L ;Envio para o CCP1
MOVLW 0xe0 ;1110_0000
ANDWF CCPR1L,F
GOTO Rotina
end
Exemplo 9 – Redução a 8 níveis – 8 bits – Parte 2
Igu
al a
o a
nte
rior
06/06/2017
23
ENTRADA ANALÓGICA4Exemplos 8 e 9
13306/06/2017
100%
0%
VMÉDIA
FFh
00h x(graus)
Exemplo 8
100%
0%
VMÉDIA
FFh
00h x(graus)
Exemplo 9
00h 20h 40h 60h 80h A0h
C0h E0h
ENTRADA ANALÓGICA4Exemplos 9 melhorado
13406/06/2017
00h 20h 40h 60h 80h A0h
C0h E0h
00h 24h 48h 6Ch 90h B4h D8h FCh
Exemplo 9 Exemplo 9 corrigido
• O exemplo 9 atinge, no máximo o valor E0h.
• Ele pode ser melhorado para atingir até o valor FCh.
• Como os valores binários seriam mais complicados, a
solução seria usar uma look-up table como no exemplo 3.
ENTRADA ANALÓGICA4
; Programa 103 - Entrada analógica – Programa 10
#include <P16F877.INC>
__config _WDT_OFF & _XT_OSC & _LVP_OFF
;Rotina de iniciação
BCF STATUS,RP1
BSF STATUS,RP0
CLRF ADCON1 ;Habilita os oito canais AD
MOVLW 0x08 ;00001000b
MOVWF TRISA ;Entrada AD
CLRF TRISC
MOVLW 0xff
MOVWF PR2
BCF STATUS,RP0
MOVLW 0x07
MOVWF T2CON
MOVLW 0x0f
MOVWF CCP1CON
BCF STATUS,RP0
MOVLW 0x59 ;0101_10X1
MOVWF ADCON0
Exemplo 10 – Blink regulável – 8 bits – Parte 1
13506/06/2017
Igu
al a
o a
nte
rior
ENTRADA ANALÓGICA4
13606/06/2017
CLRF CCPR1L
Rotina
;toogle na lâmpada
COMF CCPR1L
;faz a conversão
BSF ADCON0,GO
BTFSC ADCON0,GO
GOTO $-0x1
;manipula o resultado
BCF STATUS,C
RRF ADRESH,F
BCF STATUS,C
RRF ADRESH,F
MOVLW 0x17
ADDWF ADRESH,W
Exemplo 10 – Blink regulável – 8 bits – Parte 2
Igu
al a
o a
nte
rior
;espera
constant TEMPOA = 0x21
constant TEMPOB = 0x22
constant TEMPOC = 0x23
MOVWF TEMPOC
MOVWF TEMPOB
MOVWF TEMPOA
DECFSZ TEMPOA,F
GOTO $-0x1
DECFSZ TEMPOB,F
GOTO $-0x4
DECFSZ TEMPOC,F
GOTO $-0x7
GOTO Rotina
end
ENTRADA ANALÓGICA4
13706/06/2017
Exemplo 10 – Blink regulável – 8 bits
• O valor máximo de ADRESH é de FFh.
• A sua máxima divisão inteira por quatro é de 3Fh.
• O máximo parâmetro da temporização é de3Fh + 17h = 56h.
• Isto implica na mínima frequência pisca-pisca.
• O valor mínimo de ADRESH é de 00h.
• A sua mínima divisão inteira por quatro é de 00h.
• O mínimo parâmetro da temporização é de00h + 17h = 17h.
• Isto implica na máxima frequência pisca-pisca.
ENTRADA ANALÓGICA4Exemplo 11 – Controle PWM – 10 bits – Parte 1
13806/06/2017
; Programa 104 - Entrada analógica – Programa 11
#include <P16F877.INC>
__config _WDT_OFF & _XT_OSC & _LVP_OFF
;Rotina de iniciação
BCF STATUS,RP1
BSF STATUS,RP0
CLRF ADCON1 ;Habilita os oito canais AD
MOVLW 0x08 ;00001000b
MOVWF TRISA ;Entrada AD
CLRF TRISC
MOVLW 0xff
MOVWF PR2
BCF STATUS,RP0
MOVLW 0x07
MOVWF T2CON
MOVLW 0x0f
MOVWF CCP1CON
BCF STATUS,RP0
MOVLW 0x59 ;0101_10X1
MOVWF ADCON0
Igu
al a
o a
nte
rior
06/06/2017
24
ENTRADA ANALÓGICA4Exemplo 11 – Controle PWM – 10 bits – Parte 2
13906/06/2017
Rotina
BSF ADCON0,GO ;Inicia a conversão AD
BTFSC ADCON0,GO ;Verifica fim da conversão
GOTO $-0x1
MOVF ADRESH,W ;Leitura do valor de tensão
MOVWF CCPR1L
BTFSS ADRESL,0x7
GOTO R0X
GOTO R1X
R0X
BCF CCP1CON,CCP1X
BTFSS ADRESL,0x6
GOTO R0Y
GOTO R1Y
R1X
BSF CCP1CON,CCP1X
BTFSS ADRESL,0x6
GOTO R0Y
GOTO R1Y
R0Y
BCF CCP1CON,CCP1Y
GOTO Rotina
R1Y
BSF CCP1CON,CCP1Y
GOTO Rotina
end
Cópia dos dois
bits menos significativos
Igu
al a
o d
os p
rog
ram
as
4, 5,
6, 7,
8 e
9
ENTRADA ANALÓGICA4
14006/06/2017
• São gastas catorze linhas de código para a
cópia dos dois bits menos significativos.
• A rotina para a cópia dos 8 bits mais
significativos emprega, apenas, seis linhas.
Controle PWM
BTFSS 2TCY
GOTO 2TCY
GOTO 2TCY
BCF 1TCY
BTFSS 2TCY
GOTO 2TCY
GOTO 2TCY
BSF 1TCY
BTFSS 2TCY
GOTO 2TCY
GOTO 2TCY
BCF 1TCY
GOTO 2TCY
BSF 1TCY
BSF 1TCY
BTFSC 2TCY
GOTO 2TCY
MOVF 1TCY
MOVWF 1TCY
GOTO 2TCY
ENTRADA ANALÓGICA4
14106/06/2017
BTFSS ADRESL,0x7
GOTO R0X
GOTO R1X
R0X
BCF CCP1CON,CCP1X
BTFSS ADRESL,0x6
GOTO R0Y
GOTO R1Y
R1X
BSF CCP1CON,CCP1X
BTFSS ADRESL,0x6
GOTO R0Y
GOTO R1Y
R0Y
BCF CCP1CON,CCP1Y
GOTO Rotina
R1Y
BSF CCP1CON,CCP1Y
GOTO Rotina
BTFSS ADRESL,0x7
GOTO R0X
GOTO R1X
R0X
BCF CCP1CON,CCP1X
BTFSS ADRESL,0x6
GOTO R0Y
GOTO R1Y
R1X
BSF CCP1CON,CCP1X
BTFSS ADRESL,0x6
GOTO R0Y
GOTO R1Y
R0Y
BCF CCP1CON,CCP1Y
GOTO Rotina
R1Y
BSF CCP1CON,CCP1Y
GOTO Rotina
BTFSS ADRESL,0x7
GOTO R0X
GOTO R1X
R0X
BCF CCP1CON,CCP1X
BTFSS ADRESL,0x6
GOTO R0Y
GOTO R1Y
R1X
BSF CCP1CON,CCP1X
BTFSS ADRESL,0x6
GOTO R0Y
GOTO R1Y
R0Y
BCF CCP1CON,CCP1Y
GOTO Rotina
R1Y
BSF CCP1CON,CCP1Y
GOTO Rotina
BTFSS ADRESL,0x7
GOTO R0X
GOTO R1X
R0X
BCF CCP1CON,CCP1X
BTFSS ADRESL,0x6
GOTO R0Y
GOTO R1Y
R1X
BSF CCP1CON,CCP1X
BTFSS ADRESL,0x6
GOTO R0Y
GOTO R1Y
R0Y
BCF CCP1CON,CCP1Y
GOTO Rotina
R1Y
BSF CCP1CON,CCP1Y
GOTO Rotina
Exemplo 11 – Controle PWM – 10 bits00 01 10 11
BTFSS
GOTO
BCF/BSF
BTFSS
GOTO
BSF/BSF
Instr
uções
ENTRADA ANALÓGICA4
14206/06/2017
• São gastos 10TCY’s para a cópia dos
dois bits menos significativos.
• São gastos 9TCY’s para a cópia dos
oito bits menos significativos.
• O uso de 10 bits mais do que duplica
o tempo de execução da cópia.
Controle PWM
BTFSS 2TCY
GOTO 2TCY
BCF/BSF 1TCY
BTFSS 2TCY
GOTO 2TCY
BCF/BSF 1TCY
BSF 1TCY
BTFSC 2TCY
GOTO 2TCY
MOVF 1TCY
MOVWF 1TCY
GOTO 2TCY