• Nenhum resultado encontrado

Parte 9 PRÁTICAS DISPLAY DE 7 SEGMENTOS DISPLAY DE 7 SEGMENTOS DISPLAY DE 7 SEGMENTOS DISPLAY DE 7 SEGMENTOS DISPLAY DE 7 SEGMENTOS

N/A
N/A
Protected

Academic year: 2021

Share "Parte 9 PRÁTICAS DISPLAY DE 7 SEGMENTOS DISPLAY DE 7 SEGMENTOS DISPLAY DE 7 SEGMENTOS DISPLAY DE 7 SEGMENTOS DISPLAY DE 7 SEGMENTOS"

Copied!
24
0
0

Texto

(1)

1 06/06/2017

Parte 9

PRÁTICAS

2 06/06/2017

1. DISPLAY DE 7 SEGMENTOS

2. TECLADO

3. PWM

4. ENTRADA ANALÓGICA

DISPLAY DE 7 SEGMENTOS

1

3 06/06/2017

DISPLAY 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 mais

Escolher 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.

(2)

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/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 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/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 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

(3)

13 06/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

Exemplo 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 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/2017

DISPLAY 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ção

(4)

DISPLAY 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, 0x5

Exemplo 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 RETURN

DISPLAY 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 4

t2

24 06/06/2017 Multiplexação – nível 1

(5)

Exemplo 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 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 dosdisplay’s

28 06/06/2017

DISPLAY DE 7 SEGMENTOS

1

29 06/06/2017

Exemplo 5 – Etapa 1

MOVLW 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

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.

(6)

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 T

DISPLAY 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/2017

TECLADO

2

Exemplo 1 – Configuração da porta B

MOVLW 0x0f

MOVWF 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 L7L6L5L4L3L2L1L0

(7)

Exemplo 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/2017

TECLADO

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

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

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%.

(8)

TECLADO

2

Exemplo 3 – Proposta

43 06/06/2017

TECLADO

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 r

TECLADO

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/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.

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

(9)

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

(10)

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

(11)

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 Tecla1b

Exemplo 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 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

PWM

3

PWM

65 06/06/2017

PWM

3

66 06/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

(12)

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

(13)

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 1023

Exemplo 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 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% 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= 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 e ra

(14)

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 Subida

GOTO 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 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% 00000000b00h 0 0 33% 01010101b55h 0 1 67% 10101010bAAh 1 0 100% 11111111bFFh 1 1

(15)

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

(16)

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,F

Exemplo 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/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

(17)

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

PWM1

PWM

3

99 06/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.

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

(18)

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/2017

ENTRADA 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

(19)

109 06/06/2017

• O AD clock é de fCY/2.

• TAD= TCY2.

• O tempo para a conversão é:

• tconv= 10TAD.

• tconv= 20TCY.

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 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Ó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 end

Exemplo 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

(20)

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= 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ÓGICA

4

Exemplos 4 a 11 – Controle PWM

119 06/06/2017 ADRES CCPR

ENTRADA 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

Referências

Documentos relacionados

Todos os estudos, desenhos, projetos e documentos, sejam de que natureza for, fornecidos pela HTubo ao cliente, são propriedade da HTubo, sendo ela a titular de todos os direitos de

b) A proteção deve estar bem presa à ferramenta elétrica e posicionada para máxima segurança, de tal forma que uma parte mínima do disco fique exposta ao operador. Por exemplo:

A mitigação dos impactos socioambientais ficou a cargo de um Plano de Ações Ambientais, composto de 14 programas, específicos para cada segmento natural alterado

Se o grupo tentar usar a escada que leva até o próximo nível da masmorra, eles disparam uma armadilha que começará a movimentar engrenagens que fará com que os degraus comecem

Indicações gerais Os valores apresentados nesta secção pretendem apenas descrever o produto sob o ponto de vista da protecção e segurança para o homem e para o ambiente, não

Se toda a gente atirar a cor para o ar AO MESMO TEMPO, isto vai criar uma espetacular NUVEM COLORIDA, um clímax de festa só possível no THE COLOR RUN™.. Posso ter

O tônus muscular enquanto portador de significado: subsídios para a compreensão do tono como linguagem corporal.. “O tono muscular é a atividade primitiva e permanente do

Funções para Simplificação de Programa: • Ciclo de acabamento (G70) • Remoção de material em torneamento (G71) • Remoção de material em faceamento (G72) • Usinagem