1 06/06/2017
Parte 9
PRÁTICAS
2 06/06/20171. DISPLAY DE 7 SEGMENTOS
2. TECLADO
3. PWM
4. ENTRADA ANALÓGICA
DISPLAY DE 7 SEGMENTOS
1
3 06/06/2017DISPLAY DE 7 SEGMENTOS
DISPLAY DE 7 SEGMENTOS
1
4 06/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 maisEscolher outros símbolos
DISPLAY DE 7 SEGMENTOS
1
5 06/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 SEGMENTOS
1
Exemplo 2
6 06/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.
DISPLAY DE 7 SEGMENTOS
1
Exemplo 2 – programa parte 1
7 06/06/2017
; Programa 68 - Display 7 segmentos – Programa 2 #include<P16F877.INC>
__config_WDT_OFF &_XT_OSC &_LVP_OFF constantTEMPOA =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 SEGMENTOS
1
8 06/06/2017Exemplo 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 SEGMENTOS
1
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 9 06/06/2017Manipulaçã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 SEGMENTOS
1
Exemplo 2
10 06/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 SEGMENTOS
1
Exemplo 3
11 06/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 SEGMENTOS
1
Exemplo 3 – programa parte 1
12 06/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
13 06/06/2017
Exemplo 3 – programa parte 2
;Rotina de iniciaçãoBCF 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
Exemplo 3 – programa parte 3
RotinaBCF 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 Rotina 14
06/06/2017
Manipulação dos displays
DISPLAY DE 7 SEGMENTOS
1
Exemplo 3 – programa parte 4
15 06/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 SEGMENTOS
1
Exemplo 3
t
t
t
t
16 06/06/2017DISPLAY DE 7 SEGMENTOS
1
Exemplo 3
17 06/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 SEGMENTOS
1
Exemplo 4
18 06/06/2017 MultiplexaçãoDISPLAY DE 7 SEGMENTOS
1
; Programa 70 - Display 7 segmentos – Programa 4 #include<P16F877.INC>
__config_WDT_OFF &_XT_OSC &_LVP_OFF constantTEMPOA =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
19 06/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 SEGMENTOS
1
20 06/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 SEGMENTOS
1
Exemplo 4 – programa parte 3
21 06/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 SEGMENTOS
1
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, 0x5Exemplo 4
22 06/06/2017 Disassembly 00 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 RETURNDISPLAY DE 7 SEGMENTOS
1
• 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.
23 06/06/2017
Exemplo 5
DISPLAY DE 7 SEGMENTOS
1
Exemplo 5
Etapa 1 Etapa 2 Etapa 3 Etapa 4t2
24 06/06/2017 Multiplexação – nível 1Exemplo 5
Etapa 1 Etapa 2 Etapa 3 Etapa 4
t1
25 06/06/2017
• 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
26 06/06/2017
DISPLAY DE 7 SEGMENTOS
1
Exemplo 5 – Programa parte 1
27 06/06/2017
; Programa 71 - Display 7 segmentos – Programa 5 #include<P16F877.INC>
__config_WDT_OFF &_XT_OSC &_LVP_OFF constantTEMPO= 0x20
constantTEMPOD= 0x23 constantTEMPOE= 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 SEGMENTOS
1
Exemplo 5 – Temporização da informação
MOVLW 0x07 ; Carrega WMOVWF 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 dosdisplay’s
28 06/06/2017
DISPLAY DE 7 SEGMENTOS
1
29 06/06/2017Exemplo 5 – Etapa 1
MOVLW 0x07 ; Carrega WMOVWF 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
DECFSZTEMPOD,F; Decrementa TEMPOD e pula 1
GOTO Parte1b ; Retorna
DECFSZTEMPOE,F; Decrementa TEMPOE e pula 1
GOTO Parte1a ; Retorna
DISPLAY DE 7 SEGMENTOS
1
30 06/06/2017
Exemplo 5
• Ao invés de empregar as os valores0x07
e0xff, é 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.
DISPLAY DE 7 SEGMENTOS
1
Exemplo 6
31 06/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 SEGMENTOS
1
Exemplo 6
32 06/06/2017 DPY1 DPY2 DPY3 DPY4 H L H L H L H L t t t t TDISPLAY DE 7 SEGMENTOS
1
Exemplo 6
33 06/06/2017; Programa 72 - Display 7 segmentos – Programa 6
#include<P16F877.INC> __config_WDT_OFF &_XT_OSC &_LVP_OFF constantTEMPOA0x20 constant TEMPOB0x21 constant TEMPOC0x22 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
MOVWFADCON1 ; 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
CALLEspera ; Chamada da subrotina Espera
BSF PORTE,RE0 ; Desabilita Display DPY1
BCF PORTE,RE1; Habilita o Display DPY2
MOVLWDisp1 ; Carrega 1
CALLEspera ; Chamada da subrotina Espera
BSF PORTE,RE1 ; Desabilita Display DPY2
BCF PORTE,RE0; Habilita o Display DPY1
MOVLWDisp0 ; Carrega 0
CALLEspera ; Chamada da subrotina Espera
BSF PORTE,RE0 ; Desabilita Display DPY1
BCF PORTE,RE2; Habilita o Display DPY3
MOVLWDisp2 ; Carrega 2
CALLEspera ; Chamada da subrotina Espera
BSF PORTE,RE2 ; Desabilita Display DPY3
BCF PORTE,RE0; Habilita o Display DPY1
MOVLWDisp0 ; Carrega 0
CALLEspera ; Chamada da subrotina Espera
BSF PORTE,RE0 ; Desabilita Display DPY1
BCF PORTA,RA5; Habilita o Display DPY4
MOVLWDisp3 ; Carrega 3
CALLEspera ; Chamada da subrotina Espera
BSF PORTA,RA5 ; Desabilita Display DPY4
BCF PORTE,RE0; Habilita o Display DPY1
MOVLWDisp0 ; Carrega 0
CALLEspera ; Chamada da subrotina Espera
BSF PORTE,RE0 ; Desabilita Display DPY1
GOTORotina
TECLADO
2
TECLADO
34 06/06/2017TECLADO
2
Exemplo 1 – Configuração da porta B
MOVLW 0x0fMOVWF TRISB ; Configura PORTB como 4 saídas e 4 entradas
Saídas ativas em 0 Entradas TRIS 0 0 Saída 1 Entrada Entradas Saídas 35 06/06/2017
TECLADO
2
Exemplo 1 – Proposta
36 06/06/2017 L7L6L5L4L3L2L1L0 L7L6L5L4L3L2L1L0 L7L6L5L4L3L2L1L0 L7L6L5L4L3L2L1L0Exemplo 1 – Listagem
37 06/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
38 06/06/2017
• A máscara serve para desabilitar os quatro LED´s não utilizados.
• Os bits da máscara em “um” eliminam os respectivos 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
TECLADO
2
Exemplo 2 – Proposta
39 06/06/2017TECLADO
2
Exemplo 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
40 06/06/2017 Ig u a l a o a n te ri o r
TECLADO
2
RotinaBCF 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
41 06/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
TECLADO
2
42 06/06/2017• Uma linha é lida por vez. • São quatro linhas.
• Os LED´s são acesos em um dutty-cycle de 25%.
TECLADO
2
Exemplo 3 – Proposta
43 06/06/2017TECLADO
2
;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
constantmarqualré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 44 06/06/2017
Exemplo 3 – Listagem
Ig u a l a o a n te ri o rTECLADO
2
45 06/06/2017• A permutação serve para transformar o barramento de oito bits da MCU em um barramento de quatro bits para PORTB.
• Primeiramente, é enviado o nibble menos significativo. • Posteriormente, é enviado o nibble mais significativo. • Os LED´s são acesos em um dutty-cycle de 50%.
SWAPFmarqualrélio,W ; Inverte os nibbles para os LEDs
Exemplo 3 – Análise
TECLADO
2
46 06/06/2017Outros 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.
TECLADO
2
47 06/06/2017
Exemplo 4 – Toogle
Usa a rotina “trava”. L7L6L5L4L3L2L1L0 L7L6L5L4L3L2L1L0
TECLADO
2
48 06/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”.
Ig u a l a o a n te ri o r M u d o u
Exemplo 4 – Toogle
49 06/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”.
Ig u a l a o a n te ri o r 50 06/06/2017
Exemplo 6 – Contador anel de 9 bits
TECLADO
2
51 06/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”.
Ig u a l a o a n te ri o r
TECLADO
2
52 06/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
TECLADO
2
Exemplo 7 – Parte 1 – Definição das constantes
53 06/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
TECLADO
2
Exemplo 7 – Parte 2 – Configurações
54 06/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
TECLADO
2
Exemplo 7 – Parte 3 – Rotina
55 06/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”.
TECLADO
2
Exemplo 8 – Sensibilidade ao nível da tecla
56 06/06/2017
• Tecla apertada: Aceso
• Tecla solta: Apagado
t Apertada Aceso 0 1 ApagadoSolta Tecla apertada? Tecla solta Não Sim Tecla apertada
Tecla solta? Não Acende
Sim Apaga
TECLADO
2
Exemplo 8 – Sensibilidade ao nível da tecla
57 06/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
t Apertada Aceso 0 1 ApagadoSolta
TECLADO
2
Exemplo 9 – Acionamento ao apertar a tecla
58 06/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
TECLADO
2
Exemplo 10 – Teclado multifunção – Raiz
59 06/06/2017
; Programa 82 - Teclado – Programa 10 #include<P16F877.INC>
__config_WDT_OFF &_XT_OSC &_LVP_OFF constantmarqualré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
TECLADO
2
Exemplo 10 – Teclado multifunção – Tecla 0
60 06/06/2017 Tecla0 BTFSS PORTB,RB0 ;Slave 0 GOTO Tecla0 CLRF marqualrélio Tecla0b COMF marqualrélio,F CALL Espera GOTO Tecla0b
Exemplo 10 – Teclado multifunção – Tecla 1
61 06/06/2017 Tecla1 BTFSS PORTB,RB1 ;Slave 1 GOTO Tecla1 CLRF marqualrélio BSF STATUS,C Tecla1b RLF marqualrélio,F CALL Espera GOTO Tecla1bExemplo 10 – Teclado multifunção – Tecla 2
62 06/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
TECLADO
2
Exemplo 10 – Teclado multifunção – Tecla 3
63 06/06/2017 Tecla3 BTFSS PORTB,RB3 ;Slave 3 GOTO Tecla3 CLRF marqualrélio Tecla3b INCF marqualrélio,F CALL Espera GOTO Tecla3b
TECLADO
2
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 EsperaCOMF 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
PWM
3
PWM
65 06/06/2017PWM
3
66 06/06/2017Exemplo 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
PWM
3
Exemplo 1 – 8 bits
67 06/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
PWM
3
Exemplo 2 – 10 bits
68 06/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
PWM
3
Exemplo 2 – 10 bits – Melhorado
69 06/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 Ig u a l a o a n te ri o r
PWM
3
Exemplo 3 – Graduação em cinco níveis – 8 bits
70 06/06/2017 VMÉDIA 100% 75% 50% 25% 0%
Espera DC CCPR1L CCP1X CCP1Y Decimal
0% 00000000b00h 0 0 0 25% 00111111b3Fh 0 0 252 50% 01111110b7Eh 0 0 504 75% 10111101bBDh 0 0 756 100% 11111100bFCh 0 0 1008
PWM
3
; 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
71 06/06/2017 DC CCPR1L 0% 00000000b00h 25% 00111111b3Fh 50% 01111110b7Eh 75% 10111101bBDh 100% 11111100bFCh
PWM
3
Exemplo 3 – Sub-rotina “Espera”
72 06/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
Exemplo 4 – Graduação em quatro níveis – 10 bits
73 06/06/2017 100% 67% 33% 0% VMÉDIA Espera DC CCPR1L CCP1X CCP1Y Decimal 0% 00000000b00h 0 0 0 33% 01010101b55h 0 1 341 67% 10101010bAAh 1 0 682 100% 11111111bFFh 1 1 1023Exemplo 4 – Configuração
74 06/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
PWM
3
Exemplo 4 – Rotina
75 06/06/2017 RotinaMOVLW 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% 11111111bFFh 1 1 67% 10101010bAAh 1 0 33% 01010101b55h 0 1 0% 00000000b00h 0 0
PWM
3
100% 0%Exemplo 5 – Onda dente-de-serra de 8 bits
76 06/06/2017 VMÉDIA FFh 00h CCPR1L
PWM
3
Exemplo 5 – Configuração
77 06/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.
PWM
3
Exemplo 5 – Rotina
78 06/06/2017 Rotina INCF CCPR1L,F constant TEMPOA= 0x21 constant TEMPOB= 0x22constant VALOR= 0xbf ;Configurar
MOVLW VALOR MOVWF TEMPOB MOVWF TEMPOA DECFSZ TEMPOA,F GOTO $-0x1 DECFSZ TEMPOB,F GOTO $-0x4 GOTO Rotina end Esp e ra
PWM
3
100%
0%
Exemplo 6 – Onda triangular de 8 bits
79 06/06/2017 VMÉDIA FFh 00h CCPR1L
PWM
3
Exemplo 6 – Configuração
80 06/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
PWM
3
Exemplo 6
81 06/06/2017 Subida CALL Espera INCFSZ CCPR1L,F GOTO SubidaGOTO Descida+1 ;Evita o spike para baixo
Descida CALL Espera DECFSZ CCPR1L,F GOTO Descida GOTO Subida Espera constantTEMPOA = 0x21 constantTEMPOB = 0x22 constantVALOR = 0xbf MOVLW VALOR MOVWF TEMPOB MOVWF TEMPOA DECFSZ TEMPOA,F GOTO $-0x1 DECFSZ TEMPOB,F GOTO $-0x4 RETURN end
PWM
3
Exemplo 7 – PWM selecionado por teclas
82 06/06/2017 1 100% 2/3 67% 1/3 33% 0 0% DC CCPR1L CCP1X CCP1Y Decimal 0% 00000000b00h 0 0 0 33% 01010101b55h 0 1 341 67% 10101010bAAh 1 0 682 100% 11111111bFFh 1 1 1023
PWM
3
Exemplo 7 – Parte principal
83 06/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
PWM
3
Exemplo 7 – Sub-rotinas
84 06/06/2017 Tecla0 BTFSS PORTB,RB0 ;Slave 0 GOTO Tecla0 MOVLW 0x00MOVWF 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% 00000000b00h 0 0 33% 01010101b55h 0 1 67% 10101010bAAh 1 0 100% 11111111bFFh 1 1
Exemplo 8 – PWM alternado por uma tecla
85 06/06/2017 0% 25% 50% 75% 100% DC CCPR1L CCP1X CCP1Y Decimal 0% 00000000b00h 0 0 0 25% 00111111b3Fh 0 0 252 50% 01111110b7Eh 0 0 504 75% 10111101bBDh 0 0 756 100% 11111100bFCh 0 0 1008 86 06/06/2017 VMÉDIA 100% 75% 50% 25% 0%Trava DC CCPR1L CCP1X CCP1Y Decimal
0% 00000000b00h 0 0 0 25% 00111111b3Fh 0 0 252 50% 01111110b7Eh 0 0 504 75% 10111101bBDh 0 0 756 100% 11111100bFCh 0 0 1008
Exemplo 8 – PWM alternado por uma tecla
PWM
3
Exemplo 8 – Parte principal
87 06/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% 00000000b00h 25% 00111111b3Fh 50% 01111110b7Eh 75% 10111101bBDh 100% 11111100bFCh
PWM
3
Exemplo 8 – Sub-rotina “Trava”
88 06/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
PWM
3
89 06/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”
PWM
3
Exemplo 9 – PWM com teclas
+/-90 06/06/2017
PWM
3
; 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 ;* 91 06/06/2017
Exemplo 9 – PWM com teclas +/- – Parte 1
*Esta linha pode ser removida.
PWM
3
92 06/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
PWM
3
93 06/06/2017 Escreve MOVF marqualrélio, W MOVWFCCPR1L ;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,FExemplo 9 – PWM com teclas +/- – Parte 3
*Esta linha pode ser removida.
CCPR1L 7 4 3 0 antes CCPR1L 3 0 0000 depois
PWM
3
94 06/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
+/-PWM
3
95 06/06/2017 ; Programa 92 - PWM – Programa 10 #include<P16F877.INC>__config_WDT_OFF &_XT_OSC &_LVP_OFF
constantmarqualré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 ;*
PWM
3
96 06/06/2017Exemplo 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
97 06/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
+/-98 06/06/2017
Conflito
PWM1PWM
3
99 06/06/2017Conflito
• 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.
PWM
3
Exemplo 11 – PWM selecionado por teclas
100 06/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%
PWM
3
Exemplo 11 – PWM selecionado por teclas
101 06/06/2017 DC CCPR1L CCP1X CCP1Y Decimal 0% 00000000b0x00 0 0 0d 14,3% 00100100b0x24 1 0 0146d 28,6% 01001001b 0x49 0 0 0292d 42,9% 01101101b0x6d 1 0 0438d 57,1% 10010010b0x92 0 0 0584d 71,4% 10110110b0xb6 1 0 0730d 85,7% 11011011b0xdb 0 0 0876d 100% 11111111b0xff 1 0 1022d
PWM
3
Exemplo 11 – PWM selecionado por teclas
102 06/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
PWM
3
Exemplo 11 – PWM selecionado por teclas
103 06/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
PWM
3
Exemplo 11 – PWM selecionado por teclas
104 06/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ÓGICA
4
ENTRADA ANALÓGICA
105 06/06/2017ENTRADA ANALÓGICA
4
Exemplo 1 – Palavra binária
106 06/06/2017 ADRESL PORTD 0d 0V 255d 5V
ENTRADA ANALÓGICA
4
;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
107 06/06/2017
ENTRADA ANALÓGICA
4
Exemplo 1 – Palavra binária – Rotina
108 06/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
109 06/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
Exemplo 2 – Palavra anel – 3 bits
110 06/06/2017 ADRESL PORTD Val. Mín. Máx. 0 0000000000011111 1 0010000000111111 2 0100000001011111 3 0110000001111111 4 1000000010011111 5 1010000010111111 6 1100000011011111 7 1110000011111111 L7L6L5L4L3L2L1L0 ADRESH
ENTRADA ANALÓGICA
4
; 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
111 06/06/2017
Exemplo 2 – Palavra anel – 3 bits – Parte 1
Ig u a l a o a n te ri o r
ENTRADA ANALÓGICA
4
112 06/06/2017 RotinaBSF 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ÓGICA
4
113 06/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 endExemplo 2 – Palavra anel – 3 bits – Parte 3
ENTRADA ANALÓGICA
4
Exemplo 3 – Palavra hexadecimal – 4 bits
114 06/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
ENTRADA ANALÓGICA
4
115 06/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ÓGICA
4
116 06/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ÓGICA
4
117 06/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ÓGICA
4
118 06/06/2017 TerminaSeleção MOVWF PORTD constant TEMPOA= 0x21 constant TEMPOB= 0x22 constant TEMPOC= 0x23constant 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ÓGICA
4
Exemplos 4 a 11 – Controle PWM
119 06/06/2017 ADRES CCPRENTRADA ANALÓGICA
4
Exemplo 4 – Controle PWM – 8 bits
120 06/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. Bl o co b á si co