24
06/06/2017 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 1 3 06/06/2017 DISPLAY DE 7 SEGMENTOS DISPLAY DE 7 SEGMENTOS 1 4 ; 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.

1. DISPLAY DE 7 SEGMENTOS 2. TECLADO Parte 9 3. … · BSF PORTA,RA5 ; Desabilita Display DPY4 GOTO Rotina 06/06/2017 14 Manipulação dos displays 1 DISPLAY DE 7 SEGMENTOS ... 1

  • Upload
    builien

  • View
    214

  • Download
    0

Embed Size (px)

Citation preview

06/06/2017

1

106/06/2017

Parte 9

PRÁTICAS

206/06/2017

1. DISPLAY DE 7 SEGMENTOS

2. TECLADO

3. PWM

4. ENTRADA ANALÓGICA

DISPLAY DE 7 SEGMENTOS1

306/06/2017

DISPLAY DE 7 SEGMENTOS

DISPLAY DE 7 SEGMENTOS1

406/06/2017

; Programa 67 - Display 7 segmentos – Programa 1

#include <P16F877.INC>

__config _WDT_OFF & _XT_OSC & _LVP_OFF

;Rotina de iniciação

BCF STATUS,RP0

BCF STATUS,RP1

BCF PORTE,RE0 ; Habilita DPY1

BSF PORTE,RE1 ; Desabilita DPY2

BSF PORTE,RE2 ; Desabilita DPY3

BSF PORTA,RA5 ; Desabilita DPY4

BSF STATUS,RP0

CLRF TRISA ; Configura PORTA como saída

CLRF TRISD ; Configura PORTD como saída

CLRF TRISE ; Configura PORTE como saída

MOVLW 0x06 ; Carrega W com 0x06

MOVWF ADCON1 ; PORTA e PORTE como digital

BCF STATUS,RP0

MOVLW 0x01 ; Carrega "8"

MOVWF PORTD

end

Exemplo 1

Escolher um ou mais

Escolher outros símbolos

DISPLAY DE 7 SEGMENTOS1

506/06/2017

Exemplo 1

• Neste programa observamos um bug.

• Ao invés de acender apenas um display, acenderam dois.

• A causa deste bug não foi descoberta, porém não se trata de

um erro no programa.

• Ao efetuar multiplexação temporal no display, este bug

desaparece.

• Este display não foi feito para ser operado sem multiplexação.

DISPLAY DE 7 SEGMENTOS1Exemplo 2

606/06/2017

• Este é um contador de 16 passos (0h a Fh).

• Não há manipulação na seleção de display.

• Todos os display’s apresentam o mesmo valor.

06/06/2017

2

DISPLAY DE 7 SEGMENTOS1Exemplo 2 – programa parte 1

706/06/2017

; Programa 68 - Display 7 segmentos – Programa 2

#include <P16F877.INC>

__config _WDT_OFF & _XT_OSC & _LVP_OFF

constant TEMPOA = 0x20

constant TEMPOB = 0x21

constant TEMPOC = 0x22

constant VALOR = 0xff

constant Disp0 = 0x03

constant Disp1 = 0x9f

constant Disp2 = 0x25

constant Disp3 = 0x0d

constant Disp4 = 0x99

constant Disp5 = 0x49

constant Disp6 = 0x41

constant Disp7 = 0x1b

constant Disp8 = 0x01

constant Disp9 = 0x09

constant DispA = 0x11

constant DispB = 0xc1

constant DispC = 0x63

constant DispD = 0x85

constant DispE = 0x61

constant DispF = 0x71

Parâmetros iniciais

Escolher outros valores entre 01h e FFh.01h: Muito rápido

ffh: Muito lento

DISPLAY DE 7 SEGMENTOS1

806/06/2017

Exemplo 2 – programa parte 2

;Rotina de iniciação

BCF STATUS,RP0

BCF STATUS,RP1

BCF PORTE,RE0 ; Habilita DPY1

BSF PORTE,RE1 ; Desabilita DPY2

BSF PORTE,RE2 ; Desabilita DPY3

BSF PORTA,RA5 ; Desabilita DPY4

BSF STATUS,RP0

CLRF TRISA ; Configura PORTA como saída

CLRF TRISD ; Configura PORTD como saída

CLRF TRISE ; Configura PORTE como saída

MOVLW 0x06 ; Carrega W com 0x06

MOVWF ADCON1 ; PORTA e PORTE como digital

BCF STATUS,RP0

Rotina de iniciação

Escolher um ou mais

DISPLAY DE 7 SEGMENTOS1Exemplo 2 – programa parte 3

rotina

MOVLW Disp0

CALL Espera

MOVLW Disp1

CALL Espera

MOVLW Disp2

CALL Espera

MOVLW Disp3

CALL Espera

MOVLW Disp4

CALL Espera

MOVLW Disp5

CALL Espera

MOVLW Disp6

CALL Espera

MOVLW Disp7

CALL Espera

MOVLW Disp8

CALL Espera

MOVLW Disp9

CALL Espera

MOVLW DispA

CALL Espera

MOVLW DispB

CALL Espera

MOVLW DispC

CALL Espera

MOVLW DispD

CALL Espera

MOVLW DispE

CALL Espera

MOVLW DispF

CALL Espera

GOTO rotina

906/06/2017

Manipulação dos displays e temporização

Espera

MOVWF PORTD

MOVLW VALOR

MOVWF TEMPOC

MOVWF TEMPOB

MOVWF TEMPOA

DECFSZ TEMPOA,F

GOTO $-0x1

DECFSZ TEMPOB,F

GOTO $-0x4

DECFSZ TEMPOC,F

GOTO $-0x7

RETURN

end

DISPLAY DE 7 SEGMENTOS1Exemplo 2

1006/06/2017

• A constante VALOR é usada como parâmetro inicial

para os três GPR´s de contagem.

• Isto significa que, duplicando o valor atribuído àconstante VALOR, a temporização da rotina

Espera é, aproximadamente, multiplicada por oito.

• Este tempo deve ser grande para que o usuário

possa ler os valores apresentados no display.

DISPLAY DE 7 SEGMENTOS1Exemplo 3

1106/06/2017

• Este programa coloca a palavra “3210” no visor.

• Há seleção de display.

• Há multiplexação temporal.

• A multiplexação pode seguir qualquer ordem.

DISPLAY DE 7 SEGMENTOS1Exemplo 3 – programa parte 1

1206/06/2017

; Programa 69 - Display 7 segmentos – Programa 3

#include <P16F877.INC>

__config _WDT_OFF & _XT_OSC & _LVP_OFF

constant TEMPOA = 0x20

constant TEMPOB = 0x21

constant TEMPOC = 0x22

constant VALOR = 0x0f

constant Disp0 = 0x03

constant Disp1 = 0x9f

constant Disp2 = 0x25

constant Disp3 = 0x0d

Parâmetros iniciais

Escolher outros valores entre 01h e FFh.01h: Muito rápido

ffh: Muito lento

06/06/2017

3

DISPLAY DE 7 SEGMENTOS1

1306/06/2017

Exemplo 3 – programa parte 2

;Rotina de iniciação

BCF STATUS,RP0

BCF STATUS,RP1

BSF PORTE,RE0 ; Desabilita Display DPY1

BSF PORTE,RE1 ; Desabilita Display DPY2

BSF PORTE,RE2 ; Desabilita Display DPY3

BSF PORTA,RA5 ; Desabilita Display DPY4

BSF STATUS,RP0

CLRF TRISA ; Configura PORTA como saída

CLRF TRISD ; Configura PORTD como saída

CLRF TRISE ; Configura PORTE como saída

MOVLW 0x06 ; Carrega W com 0x06

MOVWF ADCON1 ; PORTA e PORTE como digital

BCF STATUS,RP0

Todos os display’s

iniciam desligados.

Rotina de iniciação

DISPLAY DE 7 SEGMENTOS1Exemplo 3 – programa parte 3

Rotina

BCF PORTE,RE0 ; Habilita o Display DPY1

MOVLW Disp0 ; Carrega 0

CALL Espera ; Chamada da subrotina Espera

BSF PORTE,RE0 ; Desabilita Display DPY1

BCF PORTE,RE1 ; Habilita o Display DPY2

MOVLW Disp1 ; Carrega 1

CALL Espera ; Chamada da subrotina Espera

BSF PORTE,RE1 ; Desabilita Display DPY2

BCF PORTE,RE2 ; Habilita o Display DPY3

MOVLW Disp2 ; Carrega 2

CALL Espera ; Chamada da subrotina Espera

BSF PORTE,RE2 ; Desabilita Display DPY3

BCF PORTA,RA5 ; Habilita o Display DPY4

MOVLW Disp3 ; Carrega 3

CALL Espera ; Chamada da subrotina Espera

BSF PORTA,RA5 ; Desabilita Display DPY4

GOTO Rotina1406/06/2017

Manipulação dos displays

DISPLAY DE 7 SEGMENTOS1Exemplo 3 – programa parte 4

1506/06/2017

Temporização e encerramento

Espera

MOVWF PORTD

MOVLW VALOR

MOVWF TEMPOC

MOVWF TEMPOB

MOVWF TEMPOA

DECFSZ TEMPOA,F

GOTO $-0x1

DECFSZ TEMPOB,F

GOTO $-0x4

DECFSZ TEMPOC,F

GOTO $-0x7

RETURN

end

• No exemplo 2, o tempo precisa ser

grande para que o observador possa

identificar os símbolos apresentados.

• No exemplo 3, o tempo precisa ser

pequeno para que o observador não

possa identificar a multiplexação.

• No exemplo 3, poder-se-ia usar,

apenas, uma variável de contagem,

mas, para fins didáticos, foram

usadas três variáveis, para que se

possa aumentar o tempo e observar

a multiplexação.

DISPLAY DE 7 SEGMENTOS1Exemplo 3

t

t

t

t

1606/06/2017

DISPLAY DE 7 SEGMENTOS1Exemplo 3

1706/06/2017

• Diminuindo o tempo de espera entre as escritas, obtém-

se uma frequência tão alta que torne a multiplexação

temporal imperceptível ao usuário.

• O usuário tem a impressão de que os quatro números

estão sempre escritos.

• A rotina Espera poderia ser removida, gerando a máxima

frequência de multiplexação, porém é melhor mantê-la,

pois isso permite a escolha da frequência, idealmente a

menor possível e que seja invisível aos olhos humanos.

• Como o tempo é baixo, é possível remover um ou dois

GPR´s de contagem.

DISPLAY DE 7 SEGMENTOS1Exemplo 4

1806/06/2017

Multiplexação

06/06/2017

4

DISPLAY DE 7 SEGMENTOS1

; Programa 70 - Display 7 segmentos – Programa 4

#include <P16F877.INC>

__config _WDT_OFF & _XT_OSC & _LVP_OFF

constant TEMPOA = 0x20

constant TEMPOB = 0x21

constant TEMPOC = 0x22

constant VALOR = 0x0f ; Configurar

constant Disp0 = 0x03

constant Disp1 = 0x9f

constant Disp2 = 0x25

constant Disp3 = 0x0d

constant Disp4 = 0x99

constant Disp5 = 0x49

constant Disp6 = 0x41

constant Disp7 = 0x1b

constant Disp8 = 0x01

constant Disp9 = 0x09

constant DispA = 0x11

constant DispB = 0xc1

constant DispC = 0x63

constant DispD = 0x85

constant DispE = 0x61

constant DispF = 0x71

Exemplo 4 – programa parte 1

1906/06/2017

Parâmetros iniciais e configuração das portas

;Rotina de iniciação

BCF STATUS,RP0

BCF STATUS,RP1

BSF PORTE,RE0 ; Desabilita Display DPY1

BSF PORTE,RE1 ; Desabilita Display DPY2

BSF PORTE,RE2 ; Desabilita Display DPY3

BSF PORTA,RA5 ; Desabilita Display DPY4

BSF STATUS,RP0

CLRF TRISA ; Configura PORTA como saída

CLRF TRISD ; Configura PORTD como saída

CLRF TRISE ; Configura PORTE como saída

MOVLW 0x06 ; Carrega W com 0x06

MOVWF ADCON1 ; PORTA e PORTE como digital

BCF STATUS,RP0

DISPLAY DE 7 SEGMENTOS1

2006/06/2017

BCF PORTE,RE0 ; Habilita o Display DPY1

MOVLW Disp8 ; Carrega 0

CALL Espera ; Chamada da subrotina Espera

BSF PORTE,RE0 ; Desabilita Display DPY1

BCF PORTE,RE1 ; Habilita o Display DPY2

MOVLW Disp9 ; Carrega 1

CALL Espera ; Chamada da subrotina Espera

BSF PORTE,RE1 ; Desabilita Display DPY2

BCF PORTE,RE2 ; Habilita o Display DPY3

MOVLW DispA ; Carrega 2

CALL Espera ; Chamada da subrotina Espera

BSF PORTE,RE2 ; Desabilita Display DPY3

BCF PORTA,RA5 ; Habilita o Display DPY4

MOVLW DispB ; Carrega 3

CALL Espera ; Chamada da subrotina Espera

BSF PORTA,RA5 ; Desabilita Display DPY4

BCF PORTE,RE0 ; Habilita o Display DPY1

MOVLW DispC ; Carrega 0

CALL Espera ; Chamada da subrotina Espera

BSF PORTE,RE0 ; Desabilita Display DPY1

BCF PORTE,RE1 ; Habilita o Display DPY2

MOVLW DispD ; Carrega 1

CALL Espera ; Chamada da subrotina Espera

BSF PORTE,RE1 ; Desabilita Display DPY2

BCF PORTE,RE2 ; Habilita o Display DPY3

MOVLW DispE ; Carrega 2

CALL Espera ; Chamada da subrotina Espera

BSF PORTE,RE2 ; Desabilita Display DPY3

BCF PORTA,RA5 ; Habilita o Display DPY4

MOVLW DispF ; Carrega 3

CALL Espera ; Chamada da subrotina Espera

BSF PORTA,RA5 ; Desabilita Display DPY4

GOTO Rotina ; Retorna ao nome Rotina

Rotina

BCF PORTE,RE0 ; Habilita o Display DPY1

MOVLW Disp0 ; Carrega 0

CALL Espera ; Chamada da subrotina Espera

BSF PORTE,RE0 ; Desabilita Display DPY1

BCF PORTE,RE1 ; Habilita o Display DPY2

MOVLW Disp1 ; Carrega 1

CALL Espera ; Chamada da subrotina Espera

BSF PORTE,RE1 ; Desabilita Display DPY2

BCF PORTE,RE2 ; Habilita o Display DPY3

MOVLW Disp2 ; Carrega 2

CALL Espera ; Chamada da subrotina Espera

BSF PORTE,RE2 ; Desabilita Display DPY3

BCF PORTA,RA5 ; Habilita o Display DPY4

MOVLW Disp3 ; Carrega 3

CALL Espera ; Chamada da subrotina Espera

BSF PORTA,RA5 ; Desabilita Display DPY4

BCF PORTE,RE0 ; Habilita o Display DPY1

MOVLW Disp4 ; Carrega 0

CALL Espera ; Chamada da subrotina Espera

BSF PORTE,RE0 ; Desabilita Display DPY1

BCF PORTE,RE1 ; Habilita o Display DPY2

MOVLW Disp5 ; Carrega 1

CALL Espera ; Chamada da subrotina Espera

BSF PORTE,RE1 ; Desabilita Display DPY2

BCF PORTE,RE2 ; Habilita o Display DPY3

MOVLW Disp6 ; Carrega 2

CALL Espera ; Chamada da subrotina Espera

BSF PORTE,RE2 ; Desabilita Display DPY3

BCF PORTA,RA5 ; Habilita o Display DPY4

MOVLW Disp7 ; Carrega 3

CALL Espera ; Chamada da subrotina Espera

BSF PORTA,RA5 ; Desabilita Display DPY4

Exemplo 4 – programa parte 2

DISPLAY DE 7 SEGMENTOS1Exemplo 4 – programa parte 3

2106/06/2017

Temporização e encerramento

Espera

MOVWF PORTD

MOVLW VALOR

MOVWF TEMPOC

MOVWF TEMPOB

MOVWF TEMPOA

DECFSZ TEMPOA,F

GOTO $-0x1

DECFSZ TEMPOB,F

GOTO $-0x4

DECFSZ TEMPOC,F

GOTO $-0x7

RETURN

end

DISPLAY DE 7 SEGMENTOS1

0D BCF 0x09, 0

0E MOVLW0x03

0F CALL 0x4e

10 BSF 0x09, 0

11 BCF 0x09, 0x1

12 MOVLW0x9f

13 CALL 0x4e

14 BSF 0x09, 0x1

15 BCF 0x09, 0x2

16 MOVLW0x25

17 CALL 0x4e

18 BSF 0x09, 0x2

19 BCF 0x05, 0x5

1A MOVLW0x0d

1B CALL 0x4e

1C BSF 0x05, 0x5

1D BCF 0x09, 0

1E MOVLW0x99

1F CALL 0x4e

20 BSF 0x09, 0

21 BCF 0x09, 0x1

22 MOVLW0x49

23 CALL 0x4e

24 BSF 0x09, 0x1

25 BCF 0x09, 0x2

26 MOVLW0x41

27 CALL 0x4e

28 BSF 0x09, 0x2

29 BCF 0x05, 0x5

2A MOVLW0x1b

2B CALL 0x4e

2C BSF 0x05, 0x5

2D BCF 0x09, 0

2E MOVLW0x01

2F CALL 0x4e

30 BSF 0x09, 0

31 BCF 0x09, 0x1

32 MOVLW0x09

33 CALL 0x4e

34 BSF 0x09, 0x1

35 BCF 0x09, 0x2

36 MOVLW0x11

37 CALL 0x4e

38 BSF 0x09, 0x2

39 BCF 0x05, 0x5

3A MOVLW0xc1

3B CALL 0x4e

3C BSF 0x05, 0x5

3D BCF 0x09, 0

3E MOVLW0x63

3F CALL 0x4e

40 BSF 0x09, 0

41 BCF 0x09, 0x1

42 MOVLW0x85

43 CALL 0x4e

44 BSF 0x09, 0x1

45 BCF 0x09, 0x2

46 MOVLW0x61

47 CALL 0x4e

48 BSF 0x09, 0x2

49 BCF 0x05, 0x5

4A MOVLW0x71

4B CALL 0x4e

4C BSF 0x05, 0x5

Exemplo 4

2206/06/2017

Disassembly00 BCF 0x03, 0x5

01 BCF 0x03, 0x6

02 BSF 0x09, 0

03 BSF 0x09, 0x1

04 BSF 0x09, 0x2

05 BSF 0x05, 0x5

06 BSF 0x03, 0x5

07 CLRF 0x05

08 CLRF 0x08

09 CLRF 0x09

0A MOVLW 0x06

0B MOVWF 0x1f

0C BCF 0x03, 0x5

4D GOTO 0x0d

4E MOVWF 0x08

4F MOVLW 0x0f

50 MOVLW 0x0f

51 MOVLW 0x0f

52 MOVWF 0x20

53 DECFSZ 0x20, 0x1

54 GOTO 0x55

55 DECFSZ 0x21, 0x1

56 GOTO 0x53

57 DECFSZ 0x22, 0x1

58 GOTO 0x51

59 RETURN

DISPLAY DE 7 SEGMENTOS1

• Para que se crie um display com informação

variável no tempo a uma taxa suficientemente

lenta para que seja perceptível ao usuário, é

preciso criar um loop de rotinas ou sub-

rotinas, cada uma delas consistindo de seu

próprio loop multiplexador.

• Pode ser necessário a criação de várias

variáveis de controle de temporização.

2306/06/2017

Exemplo 5

DISPLAY DE 7 SEGMENTOS1Exemplo 5

Etapa 1

Etapa 2

Etapa 3

Etapa 4

t2

2406/06/2017

Multiplexação – nível 1

06/06/2017

5

DISPLAY DE 7 SEGMENTOS1Exemplo 5

Etapa 1 Etapa 2 Etapa 3 Etapa 4

t1

2506/06/2017

DISPLAY DE 7 SEGMENTOS1

• t1: Tempo pequeno, imperceptível ao usuário.

• t2: Tempo grande, perceptível ao usuário.

• t1: Multiplexação temporal dos 4 display’s.

• t2: Multiplexação temporal dos 4 estados do display total.

• t1: Variável Tempo.

• t2: Variáveis TempoD e TempoE.

Exemplo 5

2606/06/2017

DISPLAY DE 7 SEGMENTOS1Exemplo 5 – Programa parte 1

2706/06/2017

; Programa 71 - Display 7 segmentos – Programa 5

#include <P16F877.INC>

__config _WDT_OFF & _XT_OSC & _LVP_OFF

constant TEMPO = 0x20

constant TEMPOD = 0x23

constant TEMPOE = 0x24

constant VALOR = 0x0f ; Configurar

constant Disp0 = 0x03

constant Disp1 = 0x9f

constant Disp2 = 0x25

constant Disp3 = 0x0d

constant Disp4 = 0x99

constant Disp5 = 0x49

constant Disp6 = 0x41

constant Disp7 = 0x1b

constant Disp8 = 0x01

constant Disp9 = 0x09

constant DispA = 0x11

constant DispB = 0xc1

constant DispC = 0x63

constant DispD = 0x85

constant DispE = 0x61

constant DispF = 0x71

;Rotina de iniciação

BCF STATUS,RP0

BCF STATUS,RP1

BSF PORTE,RE0 ; Desabilita Display DPY1

BSF PORTE,RE1 ; Desabilita Display DPY2

BSF PORTE,RE2 ; Desabilita Display DPY3

BSF PORTA,RA5 ; Desabilita Display DPY4

BSF STATUS,RP0

CLRF TRISA ; Configura PORTA como saída

CLRF TRISD ; Configura PORTD como saída

CLRF TRISE ; Configura PORTE como saída

MOVLW 0x06 ; Carrega W com 0x06

MOVWF ADCON1 ; PORTA e PORTE como digital

BCF STATUS,RP0

Parâmetros iniciais, rotina de iniciação e temporização

Espera

MOVLW VALOR

MOVWF TEMPO

DECFSZ TEMPO,F

GOTO $-0x1

RETURN

end

DISPLAY DE 7 SEGMENTOS1Exemplo 5 – Temporização da informação

MOVLW 0x07 ; Carrega W

MOVWF TEMPOE ; Carrega TEMPOE com W

Parte1a

MOVLW 0xff ; Carrega W

MOVWF TEMPOD ; Carrega TEMPOD com W

Parte1b

.

.

.

.

DECFSZ TEMPOD,F ; Decrementa TEMPOD e pula 1

GOTO Parte1b ; Retorna

DECFSZ TEMPOE,F ; Decrementa TEMPOE e pula 1

GOTO Parte1a ; Retorna

Manipulação dos display’s

2806/06/2017

DISPLAY DE 7 SEGMENTOS1

2906/06/2017

Exemplo 5 – Etapa 1MOVLW 0x07 ; Carrega W

MOVWF TEMPOE ; Carrega TEMPOE com W

Parte1a

MOVLW 0xff ; Carrega W

MOVWF TEMPOD ; Carrega TEMPOD com W

Parte1b

BCF PORTE,RE0; Habilita o Display DPY1

MOVLW Disp0 ; Carrega 0

CALL Espera ; Chamada da subrotina Espera

BSF PORTE,RE0; Desabilita Display DPY1

BCF PORTE,RE1; Habilita o Display DPY2

MOVLW Disp1 ; Carrega 1

CALL Espera ; Chamada da subrotina Espera

BSF PORTE,RE1; Desabilita Display DPY2

BCF PORTE,RE2; Habilita o Display DPY3

MOVLW Disp2 ; Carrega 2

CALL Espera ; Chamada da subrotina Espera

BSF PORTE,RE2; Desabilita Display DPY3

BCF PORTA,RA5; Habilita o Display DPY4

MOVLW Disp3 ; Carrega 3

CALL Espera ; Chamada da subrotina Espera

BSF PORTA,RA5; Desabilita Display DPY4

DECFSZ TEMPOD,F ; Decrementa TEMPOD e pula 1

GOTO Parte1b ; Retorna

DECFSZ TEMPOE,F ; Decrementa TEMPOE e pula 1

GOTO Parte1a ; Retorna

DISPLAY DE 7 SEGMENTOS1

3006/06/2017

Exemplo 5

• Ao invés de empregar as os valores 0x07

e 0xff, é possível usar valores individuais,

para cada uma das quatro etapas.

• Isto significa que algumas etapas pode ser

mais demoradas, e outras podem ser mais

breves.

06/06/2017

6

DISPLAY DE 7 SEGMENTOS1Exemplo 6

3106/06/2017

• Trata-se do exemplo 3 com mais passos de multiplexação.

• DPY1: Dutty-Cycle de 4/7 – 57,14%

• DPY2: Dutty-Cycle de 1/7 – 14,29%

• DPY3: Dutty-Cycle de 1/7 – 14,29%

• DPY4: Dutty-Cycle de 1/7 – 14,29%

DISPLAY DE 7 SEGMENTOS1Exemplo 6

3206/06/2017

DPY1

DPY2

DPY3

DPY4

H

L

H

L

H

L

H

L

t

t

t

t

T

DISPLAY DE 7 SEGMENTOS1Exemplo 6

3306/06/2017

; Programa 72 - Display 7 segmentos – Programa 6

#include <P16F877.INC>

__config _WDT_OFF & _XT_OSC & _LVP_OFF

constant TEMPOA 0x20

constant TEMPOB 0x21

constant TEMPOC 0x22

constant VALOR 0x0f ;configurar

constant Disp0 0x03

constant Disp1 0x9f

constant Disp2 0x25

constant Disp3 0x0d

;Rotina de iniciação

BCF STATUS,RP0

BCF STATUS,RP1

BSF PORTE,RE0 ; Desabilita Display DPY1

BSF PORTE,RE1 ; Desabilita Display DPY2

BSF PORTE,RE2 ; Desabilita Display DPY3

BSF PORTA,RA5 ; Desabilita Display DPY4

BSF STATUS,RP0

CLRF TRISA ; Configura PORTA como saída

CLRF TRISD ; Configura PORTD como saída

CLRF TRISE ; Configura PORTE como saída

MOVLW 0x06 ; Carrega W com 0x06

MOVWF ADCON1 ; PORTA e PORTE como digital

BCF STATUS,RP0

Espera

MOVWF PORTD

MOVLW VALOR

MOVWF TEMPOC

MOVWF TEMPOB

MOVWF TEMPOA

DECFSZ TEMPOA,F

GOTO $-0x1

DECFSZ TEMPOB,F

GOTO $-0x4

DECFSZ TEMPOC,F

GOTO $-0x7

RETURN

end

Rotina

BCF PORTE,RE0 ; Habilita o Display DPY1

MOVLWDisp0 ; Carrega 0

CALL Espera ; Chamada da subrotina Espera

BSF PORTE,RE0 ; Desabilita Display DPY1

BCF PORTE,RE1 ; Habilita o Display DPY2

MOVLWDisp1 ; Carrega 1

CALL Espera ; Chamada da subrotina Espera

BSF PORTE,RE1 ; Desabilita Display DPY2

BCF PORTE,RE0 ; Habilita o Display DPY1

MOVLWDisp0 ; Carrega 0

CALL Espera ; Chamada da subrotina Espera

BSF PORTE,RE0 ; Desabilita Display DPY1

BCF PORTE,RE2 ; Habilita o Display DPY3

MOVLWDisp2 ; Carrega 2

CALL Espera ; Chamada da subrotina Espera

BSF PORTE,RE2 ; Desabilita Display DPY3

BCF PORTE,RE0 ; Habilita o Display DPY1

MOVLWDisp0 ; Carrega 0

CALL Espera ; Chamada da subrotina Espera

BSF PORTE,RE0 ; Desabilita Display DPY1

BCF PORTA,RA5 ; Habilita o Display DPY4

MOVLWDisp3 ; Carrega 3

CALL Espera ; Chamada da subrotina Espera

BSF PORTA,RA5 ; Desabilita Display DPY4

BCF PORTE,RE0 ; Habilita o Display DPY1

MOVLWDisp0 ; Carrega 0

CALL Espera ; Chamada da subrotina Espera

BSF PORTE,RE0 ; Desabilita Display DPY1

GOTO Rotina

TECLADO2

TECLADO

3406/06/2017

TECLADO2Exemplo 1 – Configuração da porta B

MOVLW 0x0f

MOVWF TRISB ; Configura PORTB como 4 saídas e 4 entradas

Saídasativas em 0

Entradas

TRIS 00 Saída1 Entrada

Entradas

Saídas

3506/06/2017

TECLADO2Exemplo 1 – Proposta

3606/06/2017

L7 L6 L5 L4 L3 L2 L1 L0L7 L6 L5 L4 L3 L2 L1 L0 L7 L6 L5 L4 L3 L2 L1 L0 L7 L6 L5 L4 L3 L2 L1 L0

06/06/2017

7

TECLADO2Exemplo 1 – Listagem

3706/06/2017

; Programa 73 - Teclado – Programa 1

#include <P16F877.INC>

__config _WDT_OFF & _XT_OSC & _LVP_OFF

;Rotina de iniciação

BCF STATUS,RP1

BSF STATUS,RP0

CLRF TRISC ; Configura PORTC como saída

CLRF TRISD ; Configura PORTD como saída

MOVLW 0x0f

MOVWF TRISB ; Configura PORTB como 4 saídas e 4 entradas

BCF STATUS,RP0

MOVLW 0xff

MOVWF PORTB ; Teclado inativo 11111111

MOVLW 0xfe

MOVWF PORTC ; Habilita o teclado linha 0 11111110

Rotina

MOVF PORTB,W ; Leitura do teclado

IORLW 0xf0 ; Mascara o nibble mais significativo

MOVWF PORTD ; Indicar as teclas nos LEDs

GOTO Rotina

end

TECLADO2

3806/06/2017

• A máscara serve para desabilitar os quatro

LED´s não utilizados.

• Os bits da máscara em “um” eliminam osrespectivos bits de PORTB.

• A operação IOR foi escolhida por causa da

lógica negativa de acionamento dos LED´s.

• Apenas uma linha é lida.

• Não existe multiplexação temporal.

• Os LED´s são acesos em um dutty-cycle

de 100%.

IORLW 0xf0 ; Mascara o nibble mais significativo

Exemplo 1 – Análise

TECLADO2Exemplo 2 – Proposta

3906/06/2017

TECLADO2Exemplo 2 – Parte 1 – Iniciação

; Programa 74 - Teclado – Programa 2

#include <P16F877.INC>

__config _WDT_OFF & _XT_OSC & _LVP_OFF

;Rotina de iniciação

BCF STATUS,RP1

BSF STATUS,RP0

CLRF TRISC ; Configura PORTC como saída

CLRF TRISD ; Configura PORTD como saída

MOVLW 0x0f

MOVWF TRISB ; Configura PORTB como 4 saídas e 4 entradas

BCF STATUS,RP0

MOVLW 0xff

MOVWF PORTB ; Teclado inativo 11111111

MOVWF PORTC ; Teclado inativo 11111111

4006/06/2017

Igu

al a

o a

nte

rior

TECLADO2

Rotina

BCF PORTC,RC0 ; Habilita o teclado linha 0 11111110

CALL Subrotina

BSF PORTC,RC0 ; Desabilita teclado linha 0

BCF PORTC,RC1 ; Habilita o teclado linha 1 11111101

CALL Subrotina

BSF PORTC,RC1 ; Desabilita teclado linha 1

BCF PORTC,RC2 ; Habilita o teclado linha 2 11111011

CALL Subrotina

BSF PORTC,RC2 ; Desabilita teclado linha 2

BCF PORTC,RC3 ; Habilita o teclado linha 3 11110111

CALL Subrotina

BSF PORTC,RC3 ; Desabilita teclado linha 3

GOTO Rotina

Exemplo 2 – Parte 2 – Rotina

4106/06/2017

Subrotina

MOVF PORTB,W ; Leitura do teclado

IORLW 0xf0 ; Mascara o nibble mais significativo

MOVWF PORTD ; Indicar as teclas nos LEDs

RETURN

end

TECLADO2

4206/06/2017

• Uma linha é lida por vez.

• São quatro linhas.

• Os LED´s são acesos em um dutty-cycle de 25%.

Exemplo 2 – Brilho dos LED´s

06/06/2017

8

TECLADO2Exemplo 3 – Proposta

4306/06/2017

TECLADO2

;75 - Teclado – Programa 3

#include <P16F877.INC>

__config _WDT_OFF & _XT_OSC & _LVP_OFF

;Rotina de iniciação

BCF STATUS,RP1

BSF STATUS,RP0

CLRF TRISC ; Configura PORTC como saída

CLRF TRISD ; Configura PORTD como saída

MOVLW 0x0f

MOVWF TRISB ; Configura PORTB como 4 saídas e 4 entradas

BCF STATUS,RP0

MOVLW 0xff

MOVWF PORTB ; Teclado inativo 11111111

MOVWF PORTC ; Teclado inativo 11111111

Rotina

constant marqualrélio = 0x20

BCF PORTC,RC0 ; Habilita o teclado linha 0 11111110

MOVF PORTB,W ; Leitura do teclado linha 0

IORLW 0xf0 ; Mascara o nibble mais significativo

MOVWF PORTD ; Indicar as teclas nos LEDs

BSF PORTC,RC0 ; Desabilita teclado linha 0

BCF PORTC,RC1 ; Habilita o teclado linha 1 11111101

MOVF PORTB,W ; Leitura do teclado linha 1

IORLW 0xf0 ; Mascara o nibble mais significativo

MOVWF marqualrélio

SWAPF marqualrélio,W ; Inverte os nibbles para os LEDs

MOVWF PORTD ; Indicar as teclas nos LEDs

BSF PORTC,RC1 ; Desabilita teclado linha 1

GOTO Rotina ; Retorna ao nome Rotina

end

4406/06/2017

Exemplo 3 – Listagem

Igu

al a

o a

nte

rior

TECLADO2

4506/06/2017

• A permutação serve para transformar o barramento de

oito bits da MCU em um barramento de quatro bits paraPORTB.

• Primeiramente, é enviado o nibble menos significativo.

• Posteriormente, é enviado o nibble mais significativo.

• Os LED´s são acesos em um dutty-cycle de 50%.

SWAPF marqualrélio,W ; Inverte os nibbles para os LEDs

Exemplo 3 – Análise

TECLADO2

4606/06/2017

Outros exemplos

• Exemplo 4: Função toogle-switch usando push-button.

• Exemplo 5: Contador binário de 8 bits.

• Exemplo 6: Contador anel de 9 bits.

• Exemplo 7: Contador hexadecimal de 1 nibble.

• Exemplo 8: Sensibilidade ao nível da tecla.

• Exemplo 9: Acionamento ao apertar a tecla.

• Exemplo 10: Teclado multifuncional.

• Em todos esses exemplos, o sistema possui memória, é

uma máquina de estados estáveis finitos, o estado atual

é preservado até que se pressione a tecla.

• Em sistemas desse tipo, é preciso criar travamentos de

proteção contra transitórios no chaveamento.

TECLADO2

4706/06/2017

Exemplo 4 – Toogle

Usa a rotina “trava”.

L7 L6 L5 L4 L3 L2 L1 L0 L7 L6 L5 L4 L3 L2 L1 L0

TECLADO2

4806/06/2017

; Programa 76 - Teclado – Programa 4

#include <P16F877.INC>

__config _WDT_OFF & _XT_OSC & _LVP_OFF

constant marqualrélio = 0x20

;Rotina de iniciação

BCF STATUS,RP1

BSF STATUS,RP0

CLRF TRISC ; Configura PORTC como saída

CLRF TRISD ; Configura PORTD como saída

MOVLW 0x0f

MOVWF TRISB ; Configura PORTB como 4 saídas e 4 entradas

BCF STATUS,RP0

MOVLW 0xff

MOVWF PORTB ; Teclado inativo 11111111

MOVWF PORTC ; Teclado inativo 11111111

MOVWF PORTD ; LEDs apagados 11111111

BCF PORTC,RC0 ; Habilita o teclado linha 0 11111110

CLRF marqualrélio

Rotina

CALL Trava

COMF marqualrélio,F ; TOOGLE

MOVF marqualrélio,W

MOVWF PORTD

GOTO Rotina

end Usa a rotina “trava”.

Igu

al a

o a

nte

rior

Mu

dou

Exemplo 4 – Toogle

06/06/2017

9

TECLADO2

4906/06/2017

; Programa 77 - Teclado – Programa 5

#include <P16F877.INC>

__config _WDT_OFF & _XT_OSC & _LVP_OFF

constant marqualrélio = 0x20

;Rotina de iniciação

BCF STATUS,RP1

BSF STATUS,RP0

CLRF TRISC ; Configura PORTC como saída

CLRF TRISD ; Configura PORTD como saída

MOVLW 0x0f

MOVWF TRISB ; Configura PORTB como 4 saídas e 4 entradas

BCF STATUS,RP0

MOVLW 0xff

MOVWF PORTB ; Teclado inativo 11111111

MOVWF PORTC ; Teclado inativo 11111111

MOVWF PORTD ; LEDs apagados 11111111

BCF PORTC,RC0 ; Habilita o teclado linha 0 11111110

CLRF marqualrélio

Rotina

CALL Trava

INCF marqualrélio,F ; Passo de contagem

COMF marqualrélio,W ; Ajusta à lógica negativa

MOVWF PORTD

GOTO Rotina

end

Exemplo 5 – Contador binário de 8 bits

Usa a rotina “trava”.

Igu

al a

o a

nte

rior

TECLADO2

5006/06/2017

Exemplo 6 – Contador anel de 9 bits

TECLADO2

5106/06/2017

; Programa 78 - Teclado – Programa 6

#include <P16F877.INC>

__config _WDT_OFF & _XT_OSC & _LVP_OFF

constant marqualrélio = 0x20

;Rotina de iniciação

BCF STATUS,RP1

BSF STATUS,RP0

CLRF TRISC ; Configura PORTC como saída

CLRF TRISD ; Configura PORTD como saída

MOVLW 0x0f

MOVWF TRISB ; Configura PORTB como 4 saídas e 4 entradas

BCF STATUS,RP0

MOVLW 0xff

MOVWF PORTB ; Teclado inativo 11111111

MOVWF PORTC ; Teclado inativo 11111111

MOVWF PORTD ; LEDs apagados 11111111

BCF PORTC,RC0 ; Habilita o teclado linha 0 11111110

MOVLW 0x01 ; Valor inicial do contador anel

MOVWF marqualrélio

BCF STATUS,C

Rotina

CALL Trava

RLF marqualrélio,F ; Multiplica por 2

COMF marqualrélio,W ; Ajusta à lógica negativa

MOVWF PORTD

GOTO Rotina

end

Exemplo 6 – Contador anel de 9 bits

Usa a rotina “trava”.

Igu

al a

o a

nte

rior

TECLADO2

5206/06/2017

• A configuração carry = 0 é feita porque a

rotação para a esquerda usa este bit como bit

fracionário de entrada.

• A configuração inicial 0x01 é necessária porque

a rotação do valor 0x00 não faria diferença.

• Outra opção seria usar a configuração 0x00

junto com carry = 1.

MOVLW 0x01 ; Valor inicial do contador anel

MOVWF marqualrélio

BCF STATUS,C

Exemplo 6 – Contador anel de 9 bits

TECLADO2Exemplo 7 – Parte 1 – Definição das constantes

5306/06/2017

Mudar J3 para baixo

; Programa 79 - Teclado – Programa 7

#include <P16F877.INC>

__config _WDT_OFF & _XT_OSC & _LVP_OFF

constant Disp0 = 0x03

constant Disp1 = 0x9f

constant Disp2 = 0x25

constant Disp3 = 0x0d

constant Disp4 = 0x99

constant Disp5 = 0x49

constant Disp6 = 0x41

constant Disp7 = 0x1b

constant Disp8 = 0x01

constant Disp9 = 0x09

constant DispA = 0x11

constant DispB = 0xc1

constant DispC = 0x63

constant DispD = 0x85

constant DispE = 0x61

constant DispF = 0x71

TECLADO2Exemplo 7 – Parte 2 – Configurações

5406/06/2017

;Rotina de iniciação

BCF STATUS,RP1

BSF STATUS,RP0

CLRF TRISA ; Configura PORTA como saída

CLRF TRISC ; Configura PORTC como saída

CLRF TRISD ; Configura PORTD como saída

CLRF TRISE ; Configura PORTE como saída

MOVLW 0x0f

MOVWF TRISB ; Configura PORTB como 4 saídas e 4 entradas

MOVLW 0x06 ; Carrega W com 0x06

MOVWF ADCON1 ; PORTA e PORTE como digital

BCF STATUS,RP0

BCF PORTE,RE0 ; Habilita DPY1

BSF PORTE,RE1 ; Desabilita DPY2

BSF PORTE,RE2 ; Desabilita DPY3

BSF PORTA,RA5 ; Desabilita DPY4

MOVLW 0xff

MOVWF PORTB ; Teclado inativo 11111111

MOVWF PORTC ; Teclado inativo 11111111

MOVWF PORTD ; LED’s apagados 11111111

BCF PORTC,RC0 ; Habilita o teclado linha 0 11111110

06/06/2017

10

TECLADO2Exemplo 7 – Parte 3 – Rotina

5506/06/2017

Rotina

CALL Trava

MOVLW Disp0

MOVWF PORTD

CALL Trava

MOVLW Disp1

MOVWF PORTD

CALL Trava

MOVLW Disp2

MOVWF PORTD

CALL Trava

MOVLW Disp3

MOVWF PORTD

CALL Trava

MOVLW Disp8

MOVWF PORTD

CALL Trava

MOVLW Disp9

MOVWF PORTD

CALL Trava

MOVLW DispA

MOVWF PORTD

CALL Trava

MOVLW DispB

MOVWF PORTD

CALL Trava

MOVLW Disp4

MOVWF PORTD

CALL Trava

MOVLW Disp5

MOVWF PORTD

CALL Trava

MOVLW Disp6

MOVWF PORTD

CALL Trava

MOVLW Disp7

MOVWF PORTD

CALL Trava

MOVLW DispC

MOVWF PORTD

CALL Trava

MOVLW DispD

MOVWF PORTD

CALL Trava

MOVLW DispE

MOVWF PORTD

CALL Trava

MOVLW DispF

MOVWF PORTD

GOTO Rotina

end

Usa a rotina “trava”.

TECLADO2Exemplo 8 – Sensibilidade ao nível da tecla

5606/06/2017

• Tecla apertada: Aceso

• Tecla solta: Apagado

tApertada

Aceso0

1Solta

Apagado

Tecla apertada?

Tecla solta

Não

Sim

Tecla apertada

Tecla solta?Não

Acende

Sim

Apaga

TECLADO2Exemplo 8 – Sensibilidade ao nível da tecla

5706/06/2017

; Programa 80 - Teclado – Programa 8

#include <P16F877.INC>

__config _WDT_OFF & _XT_OSC & _LVP_OFF

;Rotina de iniciação

BCF STATUS,RP1

BSF STATUS,RP0

CLRF TRISC

CLRF TRISD

MOVLW 0x0f

MOVWF TRISB

BCF STATUS,RP0

MOVLW 0xfe

MOVWF PORTC

CLRF PORTD ; LED´s acesos

Rotina

COMF PORTD ; LED´s apagados

BTFSC PORTB,RB0 ; Master - Tecla solta

GOTO $-0x1 ; Master - Tecla solta

COMF PORTD ; LED´s acesos

BTFSS PORTB,RB0 ; Slave - Tecla pressionada

GOTO $-0x1 ; Slave - Tecla pressionada

GOTO Rotina

end

• Tecla apertada: Aceso

• Tecla solta: Apagado

tApertada

Aceso0

1Solta

Apagado

TECLADO2Exemplo 9 – Acionamento ao apertar a tecla

5806/06/2017

; Programa 81 - Teclado – Programa 9

#include <P16F877.INC>

__config _WDT_OFF & _XT_OSC & _LVP_OFF

;Rotina de iniciação

BCF STATUS,RP1

BSF STATUS,RP0

CLRF TRISC

CLRF TRISD

MOVLW 0x0f

MOVWF TRISB

BCF STATUS,RP0

MOVLW 0xfe

MOVWF PORTC

CLRF PORTD

Rotina

BTFSC PORTB,RB0 ; Master

GOTO $-0x1 ; Master

CALL Espera ; Master

COMF PORTD ; Toogle

BTFSS PORTB,RB0 ; Slave

GOTO $-0x1 ; Slave

CALL Espera ; Slave

GOTO Rotina

Espera

constant TEMPOA = 0x21

constant TEMPOB = 0x22

constant VALOR = 0x7f

MOVLW VALOR

MOVWF TEMPOB

MOVWF TEMPOA

DECFSZ TEMPOA,F

GOTO $-0x1

DECFSZ TEMPOB,F

GOTO $-0x4

RETURN

end

TECLADO2Exemplo 10 – Teclado multifunção – Raiz

5906/06/2017

; Programa 82 - Teclado – Programa 10

#include <P16F877.INC>

__config _WDT_OFF & _XT_OSC & _LVP_OFF

constant marqualrélio = 0x20

;Rotina de iniciação

BCF STATUS,RP1

BSF STATUS,RP0

CLRF TRISC

CLRF TRISD

MOVLW 0x0f

MOVWF TRISB

BCF STATUS,RP0

MOVLW 0xff

MOVWF PORTB ; Teclado inativo 11111111

MOVWF PORTD

MOVLW 0xfe

MOVWF PORTC ; Habilita o teclado linha 0 11111110

CLRF marqualrélio

Rotina

CALL SelecionaTecla

GOTO Rotina

TECLADO2Exemplo 10 – Teclado multifunção – Tecla 0

6006/06/2017

Tecla0

BTFSS PORTB,RB0 ;Slave 0

GOTO Tecla0

CLRF marqualrélio

Tecla0b

COMF marqualrélio,F

CALL Espera

GOTO Tecla0b

06/06/2017

11

TECLADO2Exemplo 10 – Teclado multifunção – Tecla 1

6106/06/2017

Tecla1

BTFSS PORTB,RB1 ;Slave 1

GOTO Tecla1

CLRF marqualrélio

BSF STATUS,C

Tecla1b

RLF marqualrélio,F

CALL Espera

GOTO Tecla1b

TECLADO2Exemplo 10 – Teclado multifunção – Tecla 2

6206/06/2017

Tecla2

BTFSS PORTB,RB2 ;Slave 2

GOTO Tecla2

CLRF marqualrélio

BSF STATUS,C

Tecla2b

RRF marqualrélio,F

CALL Espera

GOTO Tecla2b

TECLADO2Exemplo 10 – Teclado multifunção – Tecla 3

6306/06/2017

Tecla3

BTFSS PORTB,RB3 ;Slave 3

GOTO Tecla3

CLRF marqualrélio

Tecla3b

INCF marqualrélio,F

CALL Espera

GOTO Tecla3b

TECLADO2

06/06/2017

SelecionaTecla

BTFSS PORTB,RB0 ;Master 0

GOTO Tecla0

BTFSS PORTB,RB1 ;Master 1

GOTO Tecla1

BTFSS PORTB,RB2 ;Master 2

GOTO Tecla2

BTFSS PORTB,RB3 ;Master 3

GOTO Tecla3

RETURN

Espera

COMF marqualrélio,W ; Ajusta à lógica negativa

MOVWF PORTD

constant TEMPOA = 0x21

constant TEMPOB = 0x22

constant TEMPOC = 0x23

constant VALOR = 0x1f

MOVLW VALOR

MOVWF TEMPOC

MOVWF TEMPOB

MOVWF TEMPOA

CALL SelecionaTecla

DECFSZ TEMPOA,F

GOTO $-0x2

DECFSZ TEMPOB,F

GOTO $-0x5

DECFSZ TEMPOC,F

GOTO $-0x8

RETURN

end

Exemplo 10 – Teclado multifunção – Subrotinas

64

PWM3

PWM

6506/06/2017

PWM3

6606/06/2017

Exemplo Programa bits PR2

1 83 8 FEh

2 84 10 FFh

3 85 8 FBh

4 86 10 FFh

5 87 8 FFh

6 88 8 FFh

7 89 10 FFh

8 90 8 FBh

9 91 8 FFh

10 92 8 FFh

11 93 9 FFh

Configurações

06/06/2017

12

PWM3Exemplo 1 – 8 bits

6706/06/2017

; Programa 83 - PWM – Programa 1

#include <P16F877.INC>

__config _WDT_OFF & _XT_OSC & _LVP_OFF

;Rotina de iniciação

BCF STATUS,RP1

BSF STATUS,RP0

CLRF TRISC ;Configura PORTC como saída

MOVLW 0xfe

MOVWF PR2 ;Configura o período do PWM

BCF STATUS,RP0

MOVLW 0x07

MOVWF T2CON ;Habilita o Timer2 com 1:16

MOVLW 0x0f

MOVWF CCP1CON ;Habilita o PWM 1

MOVLW 0xff ;Dutty-cycle de 100% exatamente

MOVWF CCPR1L

end

Experimente

alterar

PWM3Exemplo 2 – 10 bits

6806/06/2017

; Programa 84 - PWM – Programa 2

#include <P16F877.INC>

__config _WDT_OFF & _XT_OSC & _LVP_OFF

;Rotina de iniciação

BCF STATUS,RP1

BSF STATUS,RP0

CLRF TRISC ;Configura PORTC como saída

MOVLW 0xff

MOVWF PR2 ;Configura o período do PWM

BCF STATUS,RP0

MOVLW 0x07

MOVWF T2CON ;Habilita o Timer2 com 1:16

MOVLW 0x0f

MOVWF CCP1CON ;Habilita o PWM 1

MOVLW 0xff

MOVWF CCPR1L

BSF CCP1CON,CCP1X

BSF CCP1CON,CCP1Y;11111111_11 ; 99,90234375%

end

Experimente

alterar

PWM3Exemplo 2 – 10 bits – Melhorado

6906/06/2017

; Programa 84 - PWM – Programa 2

#include <P16F877.INC>

__config _WDT_OFF & _XT_OSC & _LVP_OFF

;Rotina de iniciação

BCF STATUS,RP1

BSF STATUS,RP0

CLRF TRISC ;Configura PORTC como saída

MOVLW 0xff

MOVWF PR2 ;Configura o período do PWM

BCF STATUS,RP0

MOVLW 0x07

MOVWF T2CON ;Habilita o Timer2 com 1:16

MOVLW 0x3f

MOVWF CCP1CON ;Habilita o PWM 1

MOVLW 0xff

MOVWF CCPR1L

end

Igu

al a

o a

nte

rior

PWM3Exemplo 3 – Graduação em cinco níveis – 8 bits

7006/06/2017

VMÉDIA

100%

75%

50%

25%

0%

Espera DC CCPR1L CCP1X CCP1Y Decimal

0%00000000b

00h 0 0 0

25%00111111b

3Fh 0 0 252

50%01111110b

7Eh 0 0 504

75%10111101b

BDh 0 0 756

100%11111100b

FCh 0 0 1008

PWM3

; Programa 85 - PWM – Programa 3

#include <P16F877.INC>

__config _WDT_OFF & _XT_OSC & _LVP_OFF

;Rotina de iniciação

BCF STATUS,RP1

BSF STATUS,RP0

CLRF TRISC ;Configura PORTC como saída

MOVLW 0xfb ;Motivo: 0xfb = 0xfc(100%) - 1

MOVWF PR2 ;Configura o período do PWM

BCF STATUS,RP0

MOVLW 0x07

MOVWF T2CON ;Habilita o Timer2 com 1:16

MOVLW 0x0f

MOVWF CCP1CON ;Habilita o PWM 1

Rotina

MOVLW 0x00 ;Dutty-cycle de 0% exatamente

CALL Espera

MOVLW 0x3f ;Dutty-cycle de 25% exatamente

CALL Espera

MOVLW 0x7e ;Dutty-cycle de 50% exatamente

CALL Espera

MOVLW 0xbd ;Dutty-cycle de 75% exatamente

CALL Espera

MOVLW 0xfc ;Dutty-cycle de 100% exatamente

CALL Espera

GOTO Rotina

end

Exemplo 3 – Parte principal

7106/06/2017

DC CCPR1L

0%00000000b

00h

25%00111111b

3Fh

50%01111110b

7Eh

75%10111101b

BDh

100%11111100b

FCh

PWM3Exemplo 3 – Sub-rotina “Espera”

7206/06/2017

Espera

MOVWF CCPR1L

constant TEMPOA = 0x21

constant TEMPOB = 0x22

constant TEMPOC = 0x23

constant VALOR = 0x7f;configurável

MOVLW VALOR

MOVWF TEMPOC

MOVWF TEMPOB

MOVWF TEMPOA

DECFSZ TEMPOA,F

GOTO $-0x1

DECFSZ TEMPOB,F

GOTO $-0x4

DECFSZ TEMPOC,F

GOTO $-0x7

RETURN

Empregada também no exemplo 4

06/06/2017

13

PWM3Exemplo 4 – Graduação em quatro níveis – 10 bits

7306/06/2017

100%

67%

33%

0%

VMÉDIA

Espera

DC CCPR1L CCP1X CCP1Y Decimal

0%00000000b

00h 0 0 0

33%01010101b

55h 0 1 341

67%10101010b

AAh 1 0 682

100%11111111b

FFh 1 1 1023

PWM3Exemplo 4 – Configuração

7406/06/2017

; Programa 86 - PWM – Programa 4

#include<P16F877.INC>

__config_WDT_OFF & _XT_OSC & _LVP_OFF

;Rotina de iniciação

BCF STATUS,RP1

BSF STATUS,RP0

CLRF TRISC ;Configura PORTC como saída

MOVLW 0xff

MOVWF PR2 ;Configura o período do PWM

BCF STATUS,RP0

MOVLW 0x07

MOVWF T2CON ;Habilita o Timer2 com 1:16

MOVLW 0x0f

MOVWF CCP1CON ;Habilita o PWM 1

Utiliza a subrotina “Espera” do exemplo 3

PWM3Exemplo 4 – Rotina

7506/06/2017

Rotina

MOVLW 0xff ;Dutty-cycle de 100% aproximadamente

MOVWF CCPR1L

BSF CCP1CON,CCP1X ;esta linha pode ser removida

BSF CCP1CON,CCP1Y ;11111111_11

CALL Espera

MOVLW 0xaa ;Dutty-cycle de 67% aproximadamente

MOVWF CCPR1L

BSF CCP1CON,CCP1X ;esta linha pode ser removida

BCF CCP1CON,CCP1Y ;10101010_10

CALL Espera

MOVLW 0x55 ;Dutty-cycle de 33% aproximadamente

MOVWF CCPR1L

BCF CCP1CON,CCP1X

BSF CCP1CON,CCP1Y ;01010101_01

CALL Espera

MOVLW 0x00 ;Dutty-cycle de 0% exatamente

MOVWF CCPR1L

BCF CCP1CON,CCP1X

BCF CCP1CON,CCP1Y ;00000000_00

CALL Espera

GOTO Rotina

end

DC CCPR1L CCP1X CCP1Y

100%11111111b

FFh 1 1

67%10101010b

AAh 1 0

33%01010101b

55h 0 1

0%00000000b

00h 0 0

PWM3

100%

0%

Exemplo 5 – Onda dente-de-serra de 8 bits

7606/06/2017

VMÉDIA

FFh

00h

CCPR1L

PWM3Exemplo 5 – Configuração

7706/06/2017

; Programa 87 - PWM – Programa 5

#include <P16F877.INC>

__config _WDT_OFF & _XT_OSC & _LVP_OFF

;Rotina de iniciação

BCF STATUS,RP1

BSF STATUS,RP0

CLRF TRISC ;Configura PORTC como saída

MOVLW 0xff

MOVWF PR2 ;Configura o período do PWM

BCF STATUS,RP0

MOVLW 0x07

MOVWF T2CON ;Habilita o Timer2 com 1:16

MOVLW 0x0f

MOVWF CCP1CON ;Habilita o PWM 1

CLRF CCPR1L

• São 256 níveis diferentes.

• Usar o procedimento anterior geraria um programa grande.

• É mais fácil usar incremento.

• Um GPR precisa ser usado como elemento de memória.

• Opcionalmente, o próprio SFR CCPR1L pode ser usado

como memória.

PWM3Exemplo 5 – Rotina

7806/06/2017

Rotina

INCF CCPR1L,F

constant TEMPOA = 0x21

constant TEMPOB = 0x22

constant VALOR = 0xbf ;Configurar

MOVLW VALOR

MOVWF TEMPOB

MOVWF TEMPOA

DECFSZ TEMPOA,F

GOTO $-0x1

DECFSZ TEMPOB,F

GOTO $-0x4

GOTO Rotina

end

Esp

era

06/06/2017

14

PWM3

100%

0%

Exemplo 6 – Onda triangular de 8 bits

7906/06/2017

VMÉDIA

FFh

00h

CCPR1L

PWM3Exemplo 6 – Configuração

8006/06/2017

; Programa 88 - PWM – Programa 6

#include <P16F877.INC>

__config _WDT_OFF & _XT_OSC & _LVP_OFF

;Rotina de iniciação

BCF STATUS,RP1

BSF STATUS,RP0

CLRF TRISC ;Configura PORTC como saída

MOVLW 0xff

MOVWF PR2 ;Configura o período do PWM

BCF STATUS,RP0

MOVLW 0x07

MOVWF T2CON ;Habilita o Timer2 com 1:16

MOVLW 0x0f

MOVWF CCP1CON ;Habilita o PWM 1

CLRF CCPR1L

Igual ao anterior

PWM3Exemplo 6

8106/06/2017

Subida

CALL Espera

INCFSZ CCPR1L,F

GOTO Subida

GOTO Descida+1 ;Evita o spike para baixo

Descida

CALL Espera

DECFSZ CCPR1L,F

GOTO Descida

GOTO Subida

Espera

constant TEMPOA = 0x21

constant TEMPOB = 0x22

constant VALOR = 0xbf

MOVLW VALOR

MOVWF TEMPOB

MOVWF TEMPOA

DECFSZ TEMPOA,F

GOTO $-0x1

DECFSZ TEMPOB,F

GOTO $-0x4

RETURN

end

PWM3Exemplo 7 – PWM selecionado por teclas

8206/06/2017

1

100%

2/3

67%

1/3

33%

0

0%

DC CCPR1L CCP1X CCP1Y Decimal

0%00000000b

00h 0 0 0

33%01010101b

55h 0 1 341

67%10101010b

AAh 1 0 682

100%11111111b

FFh 1 1 1023

PWM3Exemplo 7 – Parte principal

8306/06/2017

Rotina

BTFSS PORTB,RB0 ;Master 0

GOTO Tecla0

BTFSS PORTB,RB1 ;Master 1

GOTO Tecla1

BTFSS PORTB,RB2 ;Master 2

GOTO Tecla2

BTFSS PORTB,RB3 ;Master 3

GOTO Tecla3

GOTO Rotina

end

; Programa 89 - PWM – Programa 7

#include <P16F877.INC>

__config _WDT_OFF & _XT_OSC & _LVP_OFF

;Rotina de iniciação

BCF STATUS,RP1

BSF STATUS,RP0

CLRF TRISC

MOVLW 0x0f

MOVWF TRISB

MOVLW 0xff

MOVWF PR2

BCF STATUS,RP0

MOVLW 0x07

MOVWF T2CON

MOVLW 0x0f

MOVWF CCP1CON

MOVLW 0xfe

MOVWF PORTC

PWM3Exemplo 7 – Sub-rotinas

8406/06/2017

Tecla0

BTFSS PORTB,RB0 ;Slave 0

GOTO Tecla0

MOVLW 0x00

MOVWF CCPR1L ;Dutty-cycle de 0% exatamente

BCF CCP1CON,CCP1X

BCF CCP1CON,CCP1Y

GOTO Rotina

Tecla1

BTFSS PORTB,RB1 ;Slave 1

GOTO Tecla1

MOVLW 0x55

MOVWF CCPR1L ;Dutty-cycle de 33% aproximadamente

BCF CCP1CON,CCP1X

BSF CCP1CON,CCP1Y

GOTO Rotina

Tecla2

BTFSS PORTB,RB2 ;Slave 2

GOTO Tecla2

MOVLW 0xaa

MOVWF CCPR1L ;Dutty-cycle de 67% aproximadamente

BSF CCP1CON,CCP1X

BCF CCP1CON,CCP1Y

GOTO Rotina

Tecla3

BTFSS PORTB,RB3 ;Slave 3

GOTO Tecla3

MOVLW 0xff

MOVWF CCPR1L ;Dutty-cycle de 100% aproximadamente

BSF CCP1CON,CCP1X

BSF CCP1CON,CCP1Y

GOTO Rotina

DC CCPR1L CCP1X CCP1Y

0%00000000b

00h 0 0

33%01010101b

55h 0 1

67%10101010b

AAh 1 0

100%11111111b

FFh 1 1

06/06/2017

15

PWM3Exemplo 8 – PWM alternado por uma tecla

8506/06/2017

0% 25% 50% 75% 100%

DC CCPR1L CCP1X CCP1Y Decimal

0%00000000b

00h 0 0 0

25%00111111b

3Fh 0 0 252

50%01111110b

7Eh 0 0 504

75%10111101b

BDh 0 0 756

100%11111100b

FCh 0 0 1008

PWM3

8606/06/2017

VMÉDIA

100%

75%

50%

25%

0%

Trava DC CCPR1L CCP1X CCP1Y Decimal

0%00000000b

00h 0 0 0

25%00111111b

3Fh 0 0 252

50%01111110b

7Eh 0 0 504

75%10111101b

BDh 0 0 756

100%11111100b

FCh 0 0 1008

Exemplo 8 – PWM alternado por uma tecla

PWM3Exemplo 8 – Parte principal

8706/06/2017

Rotina

MOVLW 0x00

CALL Trava

MOVLW 0x3f

CALL Trava

MOVLW 0x7e

CALL Trava

MOVLW 0xbd

CALL Trava

MOVLW 0xfc

CALL Trava

GOTO Rotina

end

; Programa 90 - PWM – Programa 8

#include <P16F877.INC>

__config _WDT_OFF & _XT_OSC & _LVP_OFF

;Rotina de iniciação

BCF STATUS,RP1

BSF STATUS,RP0

CLRF TRISC

MOVLW 0x0f

MOVWF TRISB

MOVLW 0xfb

MOVWF PR2

BCF STATUS,RP0

MOVLW 0x07

MOVWF T2CON

MOVLW 0x0f

MOVWF CCP1CON

MOVLW 0xfe

MOVWF PORTC

No anterior era 0xff

DC CCPR1L

0%00000000b

00h

25%00111111b

3Fh

50%01111110b

7Eh

75%10111101b

BDh

100%11111100b

FCh

PWM3Exemplo 8 – Sub-rotina “Trava”

8806/06/2017

Trava

MOVWF CCPR1L

BTFSC PORTB,RB0 ;master

GOTO $-0x1

BTFSS PORTB,RB0 ;slave

GOTO $-0x1

constant TEMPOA = 0x21

constant TEMPOB = 0x22

constant TEMPOC = 0x23

constant VALOR = 0x3f ;configurável

MOVLW VALOR

MOVWF TEMPOC

MOVWF TEMPOB

MOVWF TEMPOA

DECFSZ TEMPOA,F

GOTO $-0x1

DECFSZ TEMPOB,F

GOTO $-0x4

DECFSZ TEMPOC,F

GOTO $-0x7

RETURN

PWM3

8906/06/2017

• O exemplo 7 não precisa de trava porque a função das

quatro teclas é sempre a mesma, não é necessário saber

qual o estado anterior, e, por isso, uma consideração de

múltiplas tecladas, da parte da MCU, decorrente de

oscilação, não provoca efeito cumulativo.

• O exemplo 8 precisa de trava porque a função da tecla é

variável, é necessário saber qual o estado anterior, e, por

isso, uma consideração de múltiplas tecladas, da parte da

MCU, decorrente de oscilação, provoca efeito cumulativo.

Exemplo 8 – Sub-rotina “Trava”

PWM3Exemplo 9 – PWM com teclas +/-

9006/06/2017

Decremento Incremento

06/06/2017

16

PWM3

; Programa 91 - PWM – Programa 9

#include <P16F877.INC>

__config _WDT_OFF & _XT_OSC & _LVP_OFF

constant marqualrélio = 0x20

;Rotina de iniciação

CLRF marqualrélio

BCF STATUS,RP1

BSF STATUS,RP0

CLRF TRISC

MOVLW 0x0f

MOVWF TRISB

MOVLW 0xff

MOVWF PR2

BCF STATUS,RP0

MOVLW 0x07

MOVWF T2CON

MOVLW 0x0f

MOVWF CCP1CON

MOVLW 0xfe

MOVWF PORTC

Rotina

BTFSS PORTB,RB0 ;master 0

GOTO Tecla0

BTFSS PORTB,RB1 ;master 1

GOTO Tecla1

GOTO Rotina

Tecla0

BTFSS PORTB,RB0 ;slave 0

GOTO Tecla0

DECF marqualrélio,F

GOTO Escreve

Tecla1

BTFSS PORTB,RB1 ;slave 1

GOTO Tecla1

INCF marqualrélio,F

GOTO Escreve ;*9106/06/2017

Exemplo 9 – PWM com teclas +/- – Parte 1

*Esta linha pode ser removida.

PWM3

9206/06/2017

Exemplo 9 – PWM com teclas +/- – Parte 2

*Esta linha pode ser removida.

;espera

constant TEMPOA = 0x21

constant TEMPOB = 0x22

constant TEMPOC = 0x23

constant VALOR = 0x3f

MOVLW VALOR

MOVWF TEMPOC

MOVWF TEMPOB

MOVWF TEMPOA

DECFSZ TEMPOA,F

GOTO $-0x1

DECFSZ TEMPOB,F

GOTO $-0x4

DECFSZ TEMPOC,F

GOTO $-0x7

GOTO Rotina

end

PWM3

9306/06/2017

Escreve

MOVF marqualrélio, W

MOVWF CCPR1L

;multiplica por 16

BCF STATUS,C

RLF CCPR1L,F

BCF STATUS,C

RLF CCPR1L,F

BCF STATUS,C

RLF CCPR1L,F

BCF STATUS,C

RLF CCPR1L,F

Exemplo 9 – PWM com teclas +/- – Parte 3

*Esta linha pode ser removida.

CCPR1L

7 4 3 0

antes

CCPR1L

3 0 0000

depois

PWM3

9406/06/2017

• As quatro instruções RLF têm a função de multiplicar

CCPR1L por dezesseis.

• Esta multiplicação tem o objetivo de tornar o efeito da

tecla mais grosso de modo que o controle da variação no

brilho ocorra mais rapidamente.

• São usados quatro bits na determinação do dutty-cycle.

• São dezesseis níveis admissíveis.

• Um incremento no valor máximo gera o valor mínimo.

• Um decremento no valor mínimo gera o valor máximo.

• O programa pode ser aprimorado eliminando o wrap back.

Exemplo 9 – PWM com teclas +/-

PWM3

9506/06/2017

; Programa 92 - PWM – Programa 10

#include <P16F877.INC>

__config _WDT_OFF & _XT_OSC & _LVP_OFF

constant marqualrélio = 0x20

;Rotina de iniciação

CLRF marqualrélio

BCF STATUS,RP1

BSF STATUS,RP0

CLRF TRISC

MOVLW 0x0f

MOVWF TRISB

MOVLW 0xff

MOVWF PR2

BCF STATUS,RP0

MOVLW 0x07

MOVWF T2CON

MOVLW 0x0f

MOVWF CCP1CON

MOVLW 0xfe

MOVWF PORTC

Exemplo 10 – Teclas +/- melhoradas

*Esta linha pode ser removida.

;espera

constant TEMPOA = 0x21

constant TEMPOB = 0x22

constant TEMPOC = 0x23

constant VALOR = 0x3f

MOVLW VALOR

MOVWF TEMPOC

MOVWF TEMPOB

MOVWF TEMPOA

DECFSZ TEMPOA,F

GOTO $-0x1

DECFSZ TEMPOB,F

GOTO $-0x4

DECFSZ TEMPOC,F

GOTO $-0x7

GOTO Rotina

end

Etapas iguais às do programa anterior

Rotina

BTFSS PORTB,RB0 ;master 0

GOTO Tecla0

BTFSS PORTB,RB1 ;master 1

GOTO Tecla1

GOTO Rotina

Tecla0

BTFSS PORTB,RB0 ;slave 0

GOTO Tecla0

DECF marqualrélio,F

GOTO Escreve

Tecla1

BTFSS PORTB,RB1 ;slave 1

GOTO Tecla1

INCF marqualrélio,F

GOTO Escreve ;*

PWM3

9606/06/2017

Exemplo 10 – Teclas +/- melhoradas

*Esta linha pode ser removida.

Escreve

MOVF marqualrélio, W

MOVWF CCPR1L

;multiplica por 32

MOVLW 0x07 ;máscara 0000_0111

ANDWF CCPR1L,F ;aplica a máscara

BCF STATUS,C

RLF CCPR1L,F

RLF CCPR1L,F

RLF CCPR1L,F

RLF CCPR1L,F

RLF CCPR1L,F

06/06/2017

17

PWM3

9706/06/2017

• As cinco instruções RLF têm a função de multiplicar

CCPR1L por 32.

• São usados três bits na determinação do dutty-cycle.

• São oito níveis admissíveis.

• A máscara é usada para eliminar os bits de retorno

em um na rotação.

• Por causa do uso da máscara, não é preciso zerar o

cary em cada rotação.

Exemplo 10 – PWM com teclas +/-

PWM3

9806/06/2017

Conflito

PWM1

PWM3

9906/06/2017

Conflito

• Quando a saída PWM1 está em nível lógico baixo, a

terceira linha do teclado também é ativada porque o

pino é o mesmo.

• Por causa deste problema, pode ser que, ao acionar as

teclas da terceira linha no instante em que o sinal PWM

esteja em “0”, elas funcionem normalmente apesar do

programa ter acionado apenas a primeira linha.

• Quanto mais baixo é o dutty-cycle, maior é a

probabilidade de que a terceira linha funcione

inadvertidamente.

PWM3Exemplo 11 – PWM selecionado por teclas

10006/06/2017

3/7

42,9%

2/7

28,6%

1/7

14,3%

0

0%

7/7

100%

6/7

85,7%

5/7

71,4%

4/7

57,1%

PWM3Exemplo 11 – PWM selecionado por teclas

10106/06/2017

DC CCPR1L CCP1X CCP1Y Decimal

0%00000000b

0x00 0 0 0d

14,3%00100100b

0x24 1 0 0146d

28,6%01001001b

0x49 0 0 0292d

42,9%01101101b

0x6d 1 0 0438d

57,1%10010010b

0x92 0 0 0584d

71,4%10110110b

0xb6 1 0 0730d

85,7%11011011b

0xdb 0 0 0876d

100%11111111b

0xff 1 0 1022d

PWM3Exemplo 11 – PWM selecionado por teclas

10206/06/2017

; Programa 93 - PWM – Programa 11

#include <P16F877.INC>

__config _WDT_OFF & _XT_OSC & _LVP_OFF

;Rotina de iniciação

BCF STATUS,RP1

BSF STATUS,RP0

CLRF TRISC

MOVLW 0x0f

MOVWF TRISB

MOVLW 0xff

MOVWF PR2

BCF STATUS,RP0

MOVLW 0x07

MOVWF T2CON

MOVLW 0x0f

MOVWF CCP1CON

CLRF CCPR1L

BCF CCP1CON,CCP1X

BCF CCP1CON,CCP1Y

Espera

constant TEMPOA = 0x21

constant TEMPOB = 0x22

constant TEMPOC = 0x23

constant VALOR = 0x1f

MOVLW VALOR

MOVWF TEMPOC

MOVWF TEMPOB

MOVWF TEMPOA

DECFSZ TEMPOA,F

GOTO $-0x1

DECFSZ TEMPOB,F

GOTO $-0x4

DECFSZ TEMPOC,F

GOTO $-0x7

RETURN

end

06/06/2017

18

PWM3Exemplo 11 – PWM selecionado por teclas

10306/06/2017

Rotina

BCF PORTC,RC0

BTFSS PORTB,RB0 ;Master 00

GOTO Tecla00

BTFSS PORTB,RB1 ;Master 01

GOTO Tecla01

BTFSS PORTB,RB2 ;Master 02

GOTO Tecla02

BTFSS PORTB,RB3 ;Master 03

GOTO Tecla03

BSF PORTC,RC0

BCF PORTC,RC1

BTFSS PORTB,RB0 ;Master 10

GOTO Tecla10

BTFSS PORTB,RB1 ;Master 11

GOTO Tecla11

BTFSS PORTB,RB2 ;Master 12

GOTO Tecla12

BTFSS PORTB,RB3 ;Master 13

GOTO Tecla13

BSF PORTC,RC1

GOTO Rotina

PWM3Exemplo 11 – PWM selecionado por teclas

10406/06/2017

Tecla00

BTFSS PORTB,RB0 ;Slave 00

GOTO Tecla00

CALL Espera

MOVLW 0x00

MOVWF CCPR1L ;Dutty-cycle de 0/7

BCF CCP1CON,CCP1X

GOTO Rotina

Tecla01

BTFSS PORTB,RB1 ;Slave 01

GOTO Tecla01

CALL Espera

MOVLW 0x24

MOVWF CCPR1L ;Dutty-cycle de 1/7

BSF CCP1CON,CCP1X

GOTO Rotina

Tecla02

BTFSS PORTB,RB2 ;Slave 02

GOTO Tecla02

CALL Espera

MOVLW 0x49

MOVWF CCPR1L ;Dutty-cycle de 2/7

BCF CCP1CON,CCP1X

GOTO Rotina

Tecla03

BTFSS PORTB,RB3 ;Slave 03

GOTO Tecla03

CALL Espera

MOVLW 0x6d

MOVWF CCPR1L ;Dutty-cycle de 3/7

BSF CCP1CON,CCP1X

GOTO Rotina

Tecla10

BTFSS PORTB,RB0 ;Slave 10

GOTO Tecla10

CALL Espera

MOVLW 0x92

MOVWF CCPR1L ;Dutty-cycle de 4/7

BCF CCP1CON,CCP1X

GOTO Rotina

Tecla11

BTFSS PORTB,RB1 ;Slave 11

GOTO Tecla11

CALL Espera

MOVLW 0xb6

MOVWF CCPR1L ;Dutty-cycle de 5/7

BSF CCP1CON,CCP1X

GOTO Rotina

Tecla12

BTFSS PORTB,RB2 ;Slave 12

GOTO Tecla12

CALL Espera

MOVLW 0xdb

MOVWF CCPR1L ;Dutty-cycle de 6/7

BCF CCP1CON,CCP1X

GOTO Rotina

Tecla13

BTFSS PORTB,RB3 ;Slave 13

GOTO Tecla13

CALL Espera

MOVLW 0xff

MOVWF CCPR1L ;Dutty-cycle de 7/7

BSF CCP1CON,CCP1X

GOTO Rotina

ENTRADA ANALÓGICA4

ENTRADA ANALÓGICA

10506/06/2017

ENTRADA ANALÓGICA4Exemplo 1 – Palavra binária

10606/06/2017

ADRESL

PORTD

0d 0V

255d 5V

ENTRADA ANALÓGICA4

; Programa 94 - Entrada analógica – Programa 1

#include <P16F877.INC>

__config _WDT_OFF & _XT_OSC & _LVP_OFF

;Rotina de iniciação

BCF STATUS,RP1

BSF STATUS,RP0

CLRF TRISD

CLRF ADCON1 ;Habilita os oito canais AD

MOVLW 0x08 ;00001000b

MOVWF TRISA ;Entrada AD

BCF STATUS,RP0

MOVLW 0x59

MOVWF ADCON0 ;0101_10X1

;01 - ADCLOCK = FOSC/8 = FCY/2

;011 - AN3

;0 - GODONE

;1 – ADON

end

Exemplo 1 – Palavra binária – Parte 1

10706/06/2017

ENTRADA ANALÓGICA4Exemplo 1 – Palavra binária – Rotina

10806/06/2017

Rotina

BSF ADCON0,GO ;Inicia a conversão AD

BTFSC ADCON0,GO ;Verifica fim da conversão

GOTO $-0x1

MOVF ADRESH,W ;Leitura do valor de tensão

MOVWF PORTD

;espera

constant TEMPOA = 0x21

constant TEMPOB = 0x22

constant TEMPOC = 0x23

constant VALOR = 0x3f

MOVLW VALOR

MOVWF TEMPOC

MOVWF TEMPOB

MOVWF TEMPOA

DECFSZ TEMPOA,F

GOTO $-0x1

DECFSZ TEMPOB,F

GOTO $-0x4

DECFSZ TEMPOC,F

GOTO $-0x7

GOTO Rotina

06/06/2017

19

ENTRADA ANALÓGICA4

10906/06/2017

• O AD clock é de fCY/2.

• TAD = TCY2.

• O tempo para a conversão é:

• tconv = 10TAD.

• tconv = 20TCY.

Exemplo 1 – Palavra binária

ENTRADA ANALÓGICA4Exemplo 2 – Palavra anel – 3 bits

11006/06/2017

ADRESL

PORTD

Val. Mín. Máx.0 00000000 00011111

1 00100000 00111111

2 01000000 01011111

3 01100000 01111111

4 10000000 10011111

5 10100000 10111111

6 11000000 11011111

7 11100000 11111111

L7 L6 L5 L4 L3 L2 L1 L0

ADRESH

ENTRADA ANALÓGICA4

; Programa 95 - Entrada analógica – Programa 2

#include <P16F877.INC>

__config _WDT_OFF & _XT_OSC & _LVP_OFF

;Rotina de iniciação

BCF STATUS,RP1

BSF STATUS,RP0

CLRF TRISD

CLRF ADCON1 ;Habilita os oito canais AD

MOVLW 0x08 ;00001000b

MOVWF TRISA ;Entrada AD

BCF STATUS,RP0

MOVLW 0x59

MOVWF ADCON0 ;0101_10X1

;01 - ADCLOCK = FOSC/8 = FCY/2

;011 - AN3

;0 - GODONE

;1 – ADON

11106/06/2017

Exemplo 2 – Palavra anel – 3 bits – Parte 1

Igu

al a

o a

nte

rior

ENTRADA ANALÓGICA4

11206/06/2017

Rotina

BSF ADCON0,GO ;Inicia a conversão AD

BTFSC ADCON0,GO ;Verifica fim da conversão

GOTO $-0x1

MOVF ADRESH,W ;Leitura do valor de tensão

CLRF PORTD

COMF PORTD

;seleção de meias

BTFSS ADRESH,0x7

GOTO R01234567

GOTO R89ABCDEF

;seleção de quartas

R01234567

BTFSS ADRESH,0x6

GOTO R0123

GOTO R4567

R89ABCDEF

BTFSS ADRESH,0x6

GOTO R89AB

GOTO RCDEF

;seleção de oitavas

R0123

BTFSS ADRESH,0x5

GOTO R01

GOTO R23

R4567

BTFSS ADRESH,0x5

GOTO R45

GOTO R67

R89AB

BTFSS ADRESH,0x5

GOTO R89

GOTO RAB

RCDEF

BTFSS ADRESH,0x5

GOTO RCD

GOTO REF

Exemplo 2 – Palavra anel – 3 bits – Parte 2

;oitavas

R01

BCF PORTD,RD0

GOTO TerminaSeleção

R23

BCF PORTD,RD1

GOTO TerminaSeleção

R45

BCF PORTD,RD2

GOTO TerminaSeleção

R67

BCF PORTD,RD3

GOTO TerminaSeleção

R89

BCF PORTD,RD4

GOTO TerminaSeleção

RAB

BCF PORTD,RD5

GOTO TerminaSeleção

RCD

BCF PORTD,RD6

GOTO TerminaSeleção

REF

BCF PORTD,RD7

GOTO TerminaSeleção

ENTRADA ANALÓGICA4

11306/06/2017

TerminaSeleção

constant TEMPOA = 0x21

constant TEMPOB = 0x22

constant TEMPOC = 0x23

constant VALOR = 0x3f

MOVLW VALOR

MOVWF TEMPOC

MOVWF TEMPOB

MOVWF TEMPOA

DECFSZ TEMPOA,F

GOTO $-0x1

DECFSZ TEMPOB,F

GOTO $-0x4

DECFSZ TEMPOC,F

GOTO $-0x7

GOTO Rotina

end

Exemplo 2 – Palavra anel – 3 bits – Parte 3

ENTRADA ANALÓGICA4Exemplo 3 – Palavra hexadecimal – 4 bits

11406/06/2017

ADRESL

PORTD

Val. Mín. Máx.0 00000000 00001111

1 00010000 00011111

2 00100000 00101111

3 00110000 00111111

4 01000000 01001111

5 01010000 01011111

6 01100000 01101111

7 01110000 01111111

8 10000000 10001111

9 10010000 10011111

a 10100000 10101111

b 10110000 10111111

c 11000000 11001111

d 11010000 11011111

e 11100000 11101111

f 11110000 11111111

ADRESH

06/06/2017

20

ENTRADA ANALÓGICA4

11506/06/2017

; Programa 96 - Entrada analógica – Programa 3

#include <P16F877.INC>

__config _WDT_OFF & _XT_OSC & _LVP_OFF

;Rotina de iniciação

BCF STATUS,RP0

BCF STATUS,RP1

CLRF PORTA

CLRF PORTD

BSF STATUS,RP0

CLRF TRISD

CLRF ADCON1 ;Habilita os oito canais AD

MOVLW 0x08 ;00001000b

MOVWF TRISA ;Entrada AD

MOVLW 0xdf

MOVWF OPTION_REG

BCF PORTE,RE0 ;Habilita DPY1

BSF PORTE,RE1 ;Desabilita DPY2

BSF PORTE,RE2 ;Desabilita DPY3

BSF PORTA,RA5 ;Desabilita DPY4

BCF STATUS,RP0

MOVLW 0x59

MOVWF ADCON0 ;0101_10X1

;01 - ADCLOCK = FOSC/8 = FCY/2

;011 - AN3

;0 - GODONE

;1 – ADON

constant Disp0 = 0x03

constant Disp1 = 0x9f

constant Disp2 = 0x25

constant Disp3 = 0x0d

constant Disp4 = 0x99

constant Disp5 = 0x49

constant Disp6 = 0x41

constant Disp7 = 0x1b

constant Disp8 = 0x01

constant Disp9 = 0x09

constant DispA = 0x11

constant DispB = 0xc1

constant DispC = 0x63

constant DispD = 0x85

constant DispE = 0x61

constant DispF = 0x71

Exemplo 3 – Palavra hexadecimal – 4 bits

ENTRADA ANALÓGICA4

11606/06/2017

Rotina

BSF ADCON0,GO ;Inicia a conversão AD

BTFSC ADCON0,GO ;Verifica fim da conversão

GOTO $-0x1 ;Não precisava verificar porque já tem a espera adiante

MOVF ADRESH,W ;Leitura do valor de tensão

Exemplo 3 – Palavra hexadecimal – 4 bits

ENTRADA ANALÓGICA4

11706/06/2017

;seleção de oitavas

R0123

BTFSS ADRESH,0x5

GOTO R01

GOTO R23

R4567

BTFSS ADRESH,0x5

GOTO R45

GOTO R67

R89AB

BTFSS ADRESH,0x5

GOTO R89

GOTO RAB

RCDEF

BTFSS ADRESH,0x5

GOTO RCD

GOTO REF

;seleção de décimas sextas

R01

BTFSS ADRESH,0x4

GOTO R_0

GOTO R_1

R23

BTFSS ADRESH,0x4

GOTO R_2

GOTO R_3

R45

BTFSS ADRESH,0x4

GOTO R_4

GOTO R_5

R67

BTFSS ADRESH,0x4

GOTO R_6

GOTO R_7

R89

BTFSS ADRESH,0x4

GOTO R_8

GOTO R_9

RAB

BTFSS ADRESH,0x4

GOTO R_A

GOTO R_B

RCD

BTFSS ADRESH,0x4

GOTO R_C

GOTO R_D

REF

BTFSS ADRESH,0x4

GOTO R_E

GOTO R_F

;escreve

R_0

MOVLW Disp0

GOTO TerminaSeleção

R_1

MOVLW Disp1

GOTO TerminaSeleção

R_2

MOVLW Disp2

GOTO TerminaSeleção

R_3

MOVLW Disp3

GOTO TerminaSeleção

R_4

MOVLW Disp4

GOTO TerminaSeleção

R_5

MOVLW Disp5

GOTO TerminaSeleção

R_6

MOVLW Disp6

GOTO TerminaSeleção

R_7

MOVLW Disp7

GOTO TerminaSeleção

R_8

MOVLW Disp8

GOTO TerminaSeleção

R_9

MOVLW Disp9

GOTO TerminaSeleção

R_A

MOVLW DispA

GOTO TerminaSeleção

R_B

MOVLW DispB

GOTO TerminaSeleção

R_C

MOVLW DispC

GOTO TerminaSeleção

R_D

MOVLW DispD

GOTO TerminaSeleção

R_E

MOVLW DispE

GOTO TerminaSeleção

R_F

MOVLW DispF

GOTO TerminaSeleção

;seleção de meias

BTFSS ADRESH,7

GOTO R01234567

GOTO R89ABCDEF

;seleção de quartas

R01234567

BTFSS ADRESH,0x6

GOTO R0123

GOTO R4567

R89ABCDEF

BTFSS ADRESH,0x6

GOTO R89AB

GOTO RCDEF

Exemplo 3 – Palavra hexadecimal – 4 bits

ENTRADA ANALÓGICA4

11806/06/2017

TerminaSeleção

MOVWF PORTD

constant TEMPOA = 0x21

constant TEMPOB = 0x22

constant TEMPOC = 0x23

constant VALOR = 0x3f ;configurável

MOVLW VALOR

MOVWF TEMPOC

MOVWF TEMPOB

MOVWF TEMPOA

DECFSZ TEMPOA,F

GOTO $-0x1

DECFSZ TEMPOB,F

GOTO $-0x4

DECFSZ TEMPOC,F

GOTO $-0x7

RETURN

end

Exemplo 3 – Palavra hexadecimal – 4 bits

ENTRADA ANALÓGICA4Exemplos 4 a 11 – Controle PWM

11906/06/2017

ADRES

CCPR

ENTRADA ANALÓGICA4Exemplo 4 – Controle PWM – 8 bits

12006/06/2017

; Programa 97 - Entrada analógica – Programa 4

#include <P16F877.INC>

__config _WDT_OFF & _XT_OSC & _LVP_OFF

;Rotina de iniciação

BCF STATUS,RP1

BSF STATUS,RP0

CLRF ADCON1 ;Habilita os oito canais AD

MOVLW 0x08 ;00001000b

MOVWF TRISA ;Entrada AD

CLRF TRISC

MOVLW 0xff

MOVWF PR2

BCF STATUS,RP0

MOVLW 0x07

MOVWF T2CON

MOVLW 0x0f

MOVWF CCP1CON

BCF STATUS,RP0

MOVLW 0x59 ;0101_10X1

MOVWF ADCON0

Rotina

BSF ADCON0,GO ;Inicia a conversão AD

BTFSC ADCON0,GO ;Verifica fim da conversão

GOTO $-0x1

MOVF ADRESH,W ;Leitura do valor de tensão

MOVWF CCPR1L ;Envio para o CCP1

GOTO Rotina

end

• Este programa serve

como base para os

programas seguintes.

Blo

co b

ásic

o

06/06/2017

21

ENTRADA ANALÓGICA4

; Programa 98 - Entrada analógica – Programa 5

#include <P16F877.INC>

__config _WDT_OFF & _XT_OSC & _LVP_OFF

;Rotina de iniciação

BCF STATUS,RP1

BSF STATUS,RP0

CLRF ADCON1 ;Habilita os oito canais AD

MOVLW 0x08 ;00001000b

MOVWF TRISA ;Entrada AD

CLRF TRISC

MOVLW 0xff

MOVWF PR2

BCF STATUS,RP0

MOVLW 0x07

MOVWF T2CON

MOVLW 0x0f

MOVWF CCP1CON

BCF STATUS,RP0

MOVLW 0x59 ;0101_10X1

MOVWF ADCON0

Exemplo 5 – Controle invertido – 8 bits – Parte 1

12106/06/2017

Igu

al a

o a

nte

rior

ENTRADA ANALÓGICA4Exemplo 5 – Controle invertido – 8 bits – Parte 2

12206/06/2017

Rotina

BSF ADCON0,GO ;Inicia a conversão de dado

BTFSC ADCON0,GO ;Verifica fim da conversão

GOTO $-0x1

MOVF ADRESH,W ;Leitura do valor de tensão

MOVWF CCPR1L ;Envio para o CCP1

COMF CCPR1L,F

GOTO Rotina

end

Igu

al a

o a

nte

rior

ENTRADA ANALÓGICA4Exemplos 4 e 5

12306/06/2017

100%

0%

VMÉDIA

FFh

00h x(graus)

Exemplo 4

100%

0%

VMÉDIA

FFh

00h x(graus)

Exemplo 5

ENTRADA ANALÓGICA4

; Programa 99 - Entrada analógica – Programa 6

#include <P16F877.INC>

__config _WDT_OFF & _XT_OSC & _LVP_OFF

;Rotina de iniciação

BCF STATUS,RP1

BSF STATUS,RP0

CLRF ADCON1 ;Habilita os oito canais AD

MOVLW 0x08 ;00001000b

MOVWF TRISA ;Entrada AD

CLRF TRISC

MOVLW 0xff

MOVWF PR2

BCF STATUS,RP0

MOVLW 0x07

MOVWF T2CON

MOVLW 0x0f

MOVWF CCP1CON

BCF STATUS,RP0

MOVLW 0x59 ;0101_10X1

MOVWF ADCON0

Exemplo 6 – Controle duplicado – 8 bits – Parte 1

12406/06/2017

Igu

al a

o a

nte

rior

ENTRADA ANALÓGICA4Exemplo 6 – Controle duplicado – 8 bits – Parte 2

12506/06/2017

Rotina

BSF ADCON0,GO ;Inicia a conversão AD

BTFSC ADCON0,GO ;Verifica fim da conversão

GOTO $-0x1

MOVF ADRESH,W ;Leitura do valor de tensão

MOVWF CCPR1L ;Envio para o CCP1

RLF CCPR1L,F

GOTO Rotina

end

• A alteração provocada pelo carry é irrelevante no

contexto do brilho da lâmpada e pode ser desprezada.

Igu

al a

o a

nte

rior

ENTRADA ANALÓGICA4

; Programa 100 - Entrada analógica – Programa 7

#include <P16F877.INC>

__config _WDT_OFF & _XT_OSC & _LVP_OFF

;Rotina de iniciação

BCF STATUS,RP1

BSF STATUS,RP0

CLRF ADCON1 ;Habilita os oito canais AD

MOVLW 0x08 ;00001000b

MOVWF TRISA ;Entrada AD

CLRF TRISC

MOVLW 0xff

MOVWF PR2

BCF STATUS,RP0

MOVLW 0x07

MOVWF T2CON

MOVLW 0x0f

MOVWF CCP1CON

BCF STATUS,RP0

MOVLW 0x59 ;0101_10X1

MOVWF ADCON0

Exemplo 7 – Onda triangular – 8 bits – Parte 1

12606/06/2017

Igu

al a

o a

nte

rior

06/06/2017

22

ENTRADA ANALÓGICA4

12706/06/2017

Rotina

BSF ADCON0,GO ;Inicia a conversão de dado

BTFSC ADCON0,GO ;Verifica fim da conversão

GOTO $-0x1

MOVF ADRESH,W ;Leitura do valor de tensão

MOVWF CCPR1L ;Envio para o CCP1

BTFSC CCPR1L,0x7

COMF CCPR1L,F

RLF CCPR1L,F

GOTO Rotina

end

Exemplo 7 – Onda triangular – 8 bits – Parte 2

Igu

al a

o a

nte

rior

ENTRADA ANALÓGICA4Exemplos 6 e 7

12806/06/2017

100%

0%

VMÉDIA

FFh

00h x(graus)

Exemplo 6

100%

0%

VMÉDIA

FFh

00h x(graus)

Exemplo 7

ENTRADA ANALÓGICA4

; Programa 101 - Entrada analógica – Programa 8

#include <P16F877.INC>

__config _WDT_OFF & _XT_OSC & _LVP_OFF

;Rotina de iniciação

BCF STATUS,RP1

BSF STATUS,RP0

CLRF ADCON1 ;Habilita os oito canais AD

MOVLW 0x08 ;00001000b

MOVWF TRISA ;Entrada AD

CLRF TRISC

MOVLW 0xff

MOVWF PR2

BCF STATUS,RP0

MOVLW 0x07

MOVWF T2CON

MOVLW 0x0f

MOVWF CCP1CON

BCF STATUS,RP0

MOVLW 0x59 ;0101_10X1

MOVWF ADCON0

Exemplo 8 – Duplo triangular – 8 bits – Parte 1

12906/06/2017

Igu

al a

o a

nte

rior

ENTRADA ANALÓGICA4

13006/06/2017

Rotina

BSF ADCON0,GO ;Inicia a conversão AD

BTFSC ADCON0,GO ;Verifica fim da conversão

GOTO $-0x1

MOVF ADRESH,W ;Leitura do valor de tensão

MOVWF CCPR1L ;Envio para o CCP1

BTFSC CCPR1L,0x6

COMF CCPR1L,F

RLF CCPR1L,F

RLF CCPR1L,F

GOTO Rotina

end

Exemplo 8 – Duplo triangular – 8 bits – Parte 2

Igu

al a

o a

nte

rior

ENTRADA ANALÓGICA4

; Programa 102 - Entrada analógica – Programa 9

#include <P16F877.INC>

__config _WDT_OFF & _XT_OSC & _LVP_OFF

;Rotina de iniciação

BCF STATUS,RP1

BSF STATUS,RP0

CLRF ADCON1 ;Habilita os oito canais AD

MOVLW 0x08 ;00001000b

MOVWF TRISA ;Entrada AD

CLRF TRISC

MOVLW 0xff

MOVWF PR2

BCF STATUS,RP0

MOVLW 0x07

MOVWF T2CON

MOVLW 0x0f

MOVWF CCP1CON

BCF STATUS,RP0

MOVLW 0x59 ;0101_10X1

MOVWF ADCON0

Exemplo 9 – Redução a 8 níveis – 8 bits – Parte 1

13106/06/2017

Igu

al a

o a

nte

rior

ENTRADA ANALÓGICA4

13206/06/2017

Rotina

BSF ADCON0,GO ;Inicia a conversão AD

BTFSC ADCON0,GO ;Verifica fim da conversão

GOTO $-0x1

MOVF ADRESH,W ;Leitura do valor de tensão

MOVWF CCPR1L ;Envio para o CCP1

MOVLW 0xe0 ;1110_0000

ANDWF CCPR1L,F

GOTO Rotina

end

Exemplo 9 – Redução a 8 níveis – 8 bits – Parte 2

Igu

al a

o a

nte

rior

06/06/2017

23

ENTRADA ANALÓGICA4Exemplos 8 e 9

13306/06/2017

100%

0%

VMÉDIA

FFh

00h x(graus)

Exemplo 8

100%

0%

VMÉDIA

FFh

00h x(graus)

Exemplo 9

00h 20h 40h 60h 80h A0h

C0h E0h

ENTRADA ANALÓGICA4Exemplos 9 melhorado

13406/06/2017

00h 20h 40h 60h 80h A0h

C0h E0h

00h 24h 48h 6Ch 90h B4h D8h FCh

Exemplo 9 Exemplo 9 corrigido

• O exemplo 9 atinge, no máximo o valor E0h.

• Ele pode ser melhorado para atingir até o valor FCh.

• Como os valores binários seriam mais complicados, a

solução seria usar uma look-up table como no exemplo 3.

ENTRADA ANALÓGICA4

; Programa 103 - Entrada analógica – Programa 10

#include <P16F877.INC>

__config _WDT_OFF & _XT_OSC & _LVP_OFF

;Rotina de iniciação

BCF STATUS,RP1

BSF STATUS,RP0

CLRF ADCON1 ;Habilita os oito canais AD

MOVLW 0x08 ;00001000b

MOVWF TRISA ;Entrada AD

CLRF TRISC

MOVLW 0xff

MOVWF PR2

BCF STATUS,RP0

MOVLW 0x07

MOVWF T2CON

MOVLW 0x0f

MOVWF CCP1CON

BCF STATUS,RP0

MOVLW 0x59 ;0101_10X1

MOVWF ADCON0

Exemplo 10 – Blink regulável – 8 bits – Parte 1

13506/06/2017

Igu

al a

o a

nte

rior

ENTRADA ANALÓGICA4

13606/06/2017

CLRF CCPR1L

Rotina

;toogle na lâmpada

COMF CCPR1L

;faz a conversão

BSF ADCON0,GO

BTFSC ADCON0,GO

GOTO $-0x1

;manipula o resultado

BCF STATUS,C

RRF ADRESH,F

BCF STATUS,C

RRF ADRESH,F

MOVLW 0x17

ADDWF ADRESH,W

Exemplo 10 – Blink regulável – 8 bits – Parte 2

Igu

al a

o a

nte

rior

;espera

constant TEMPOA = 0x21

constant TEMPOB = 0x22

constant TEMPOC = 0x23

MOVWF TEMPOC

MOVWF TEMPOB

MOVWF TEMPOA

DECFSZ TEMPOA,F

GOTO $-0x1

DECFSZ TEMPOB,F

GOTO $-0x4

DECFSZ TEMPOC,F

GOTO $-0x7

GOTO Rotina

end

ENTRADA ANALÓGICA4

13706/06/2017

Exemplo 10 – Blink regulável – 8 bits

• O valor máximo de ADRESH é de FFh.

• A sua máxima divisão inteira por quatro é de 3Fh.

• O máximo parâmetro da temporização é de3Fh + 17h = 56h.

• Isto implica na mínima frequência pisca-pisca.

• O valor mínimo de ADRESH é de 00h.

• A sua mínima divisão inteira por quatro é de 00h.

• O mínimo parâmetro da temporização é de00h + 17h = 17h.

• Isto implica na máxima frequência pisca-pisca.

ENTRADA ANALÓGICA4Exemplo 11 – Controle PWM – 10 bits – Parte 1

13806/06/2017

; Programa 104 - Entrada analógica – Programa 11

#include <P16F877.INC>

__config _WDT_OFF & _XT_OSC & _LVP_OFF

;Rotina de iniciação

BCF STATUS,RP1

BSF STATUS,RP0

CLRF ADCON1 ;Habilita os oito canais AD

MOVLW 0x08 ;00001000b

MOVWF TRISA ;Entrada AD

CLRF TRISC

MOVLW 0xff

MOVWF PR2

BCF STATUS,RP0

MOVLW 0x07

MOVWF T2CON

MOVLW 0x0f

MOVWF CCP1CON

BCF STATUS,RP0

MOVLW 0x59 ;0101_10X1

MOVWF ADCON0

Igu

al a

o a

nte

rior

06/06/2017

24

ENTRADA ANALÓGICA4Exemplo 11 – Controle PWM – 10 bits – Parte 2

13906/06/2017

Rotina

BSF ADCON0,GO ;Inicia a conversão AD

BTFSC ADCON0,GO ;Verifica fim da conversão

GOTO $-0x1

MOVF ADRESH,W ;Leitura do valor de tensão

MOVWF CCPR1L

BTFSS ADRESL,0x7

GOTO R0X

GOTO R1X

R0X

BCF CCP1CON,CCP1X

BTFSS ADRESL,0x6

GOTO R0Y

GOTO R1Y

R1X

BSF CCP1CON,CCP1X

BTFSS ADRESL,0x6

GOTO R0Y

GOTO R1Y

R0Y

BCF CCP1CON,CCP1Y

GOTO Rotina

R1Y

BSF CCP1CON,CCP1Y

GOTO Rotina

end

Cópia dos dois

bits menos significativos

Igu

al a

o d

os p

rog

ram

as

4, 5,

6, 7,

8 e

9

ENTRADA ANALÓGICA4

14006/06/2017

• São gastas catorze linhas de código para a

cópia dos dois bits menos significativos.

• A rotina para a cópia dos 8 bits mais

significativos emprega, apenas, seis linhas.

Controle PWM

BTFSS 2TCY

GOTO 2TCY

GOTO 2TCY

BCF 1TCY

BTFSS 2TCY

GOTO 2TCY

GOTO 2TCY

BSF 1TCY

BTFSS 2TCY

GOTO 2TCY

GOTO 2TCY

BCF 1TCY

GOTO 2TCY

BSF 1TCY

BSF 1TCY

BTFSC 2TCY

GOTO 2TCY

MOVF 1TCY

MOVWF 1TCY

GOTO 2TCY

ENTRADA ANALÓGICA4

14106/06/2017

BTFSS ADRESL,0x7

GOTO R0X

GOTO R1X

R0X

BCF CCP1CON,CCP1X

BTFSS ADRESL,0x6

GOTO R0Y

GOTO R1Y

R1X

BSF CCP1CON,CCP1X

BTFSS ADRESL,0x6

GOTO R0Y

GOTO R1Y

R0Y

BCF CCP1CON,CCP1Y

GOTO Rotina

R1Y

BSF CCP1CON,CCP1Y

GOTO Rotina

BTFSS ADRESL,0x7

GOTO R0X

GOTO R1X

R0X

BCF CCP1CON,CCP1X

BTFSS ADRESL,0x6

GOTO R0Y

GOTO R1Y

R1X

BSF CCP1CON,CCP1X

BTFSS ADRESL,0x6

GOTO R0Y

GOTO R1Y

R0Y

BCF CCP1CON,CCP1Y

GOTO Rotina

R1Y

BSF CCP1CON,CCP1Y

GOTO Rotina

BTFSS ADRESL,0x7

GOTO R0X

GOTO R1X

R0X

BCF CCP1CON,CCP1X

BTFSS ADRESL,0x6

GOTO R0Y

GOTO R1Y

R1X

BSF CCP1CON,CCP1X

BTFSS ADRESL,0x6

GOTO R0Y

GOTO R1Y

R0Y

BCF CCP1CON,CCP1Y

GOTO Rotina

R1Y

BSF CCP1CON,CCP1Y

GOTO Rotina

BTFSS ADRESL,0x7

GOTO R0X

GOTO R1X

R0X

BCF CCP1CON,CCP1X

BTFSS ADRESL,0x6

GOTO R0Y

GOTO R1Y

R1X

BSF CCP1CON,CCP1X

BTFSS ADRESL,0x6

GOTO R0Y

GOTO R1Y

R0Y

BCF CCP1CON,CCP1Y

GOTO Rotina

R1Y

BSF CCP1CON,CCP1Y

GOTO Rotina

Exemplo 11 – Controle PWM – 10 bits00 01 10 11

BTFSS

GOTO

BCF/BSF

BTFSS

GOTO

BSF/BSF

Instr

uções

ENTRADA ANALÓGICA4

14206/06/2017

• São gastos 10TCY’s para a cópia dos

dois bits menos significativos.

• São gastos 9TCY’s para a cópia dos

oito bits menos significativos.

• O uso de 10 bits mais do que duplica

o tempo de execução da cópia.

Controle PWM

BTFSS 2TCY

GOTO 2TCY

BCF/BSF 1TCY

BTFSS 2TCY

GOTO 2TCY

BCF/BSF 1TCY

BSF 1TCY

BTFSC 2TCY

GOTO 2TCY

MOVF 1TCY

MOVWF 1TCY

GOTO 2TCY