AUTOR Maurício Madeira Oliveira Página pessoal (fonte...

24
AUTOR Maurício Madeira Oliveira Página pessoal (fonte): www.seguidorsolar.com.br Este curso pode ser usado e divulgado, sem fins comerciais, citar fonte e autor Prévia: Curso de Microcontroladores PIC 16F628 6. Montagens Experimentais e Programas em Assembler 6.1 Pisca-pisca usando um LED e freqüência de dois hertz. Este circuito é muito simples, o PIC usa recursos de temporização por consumo de ciclos de máquina (se usarmos um clock de 4MHz (freqüência), o período, ou ciclo será de 1μs=(1/f)/4) e funções de controle de portas. Este primeiro exemplo pode ser chamado em programação para iniciantes de “alô mundo”. O circuito do pisca-pisca é visto na Figura 1. (14)Vdd PIC 16F628A (6)RB0 (5)Vss MCLR\(4) (16) Clk-out (15) Clk-in S1 D2 1N4148 + C3 10uF C2 33pF C1 33pF XTAL1 4.000MHZ +V V1 5V D1 LED1 R2 10k R1 360R Figura 1 – Circuito pisca-pisca. O programa em assembler ou código fonte comentado é o que segue: ; FORMULÁRIO PADRÃO PARA USO EM PROGRAMAÇÃO COM MICROCONTROLADORES

Transcript of AUTOR Maurício Madeira Oliveira Página pessoal (fonte...

Page 1: AUTOR Maurício Madeira Oliveira Página pessoal (fonte ...seguidorsolar.com.br/obras/Microcontrolador4.pdf · AUTOR Maurício Madeira Oliveira Página pessoal (fonte): Este curso

AUTOR Maurício Madeira Oliveira

Página pessoal (fonte): www.seguidorsolar.com.br Este curso pode ser usado e divulgado, sem fins comerciais, citar fonte e autor

Prévia: Curso de Microcontroladores PIC 16F628

6. Montagens Experimentais e Programas em Assembler

6.1 Pisca-pisca usando um LED e freqüência de dois hertz.

Este circuito é muito simples, o PIC usa recursos de temporização por consumo de

ciclos de máquina (se usarmos um clock de 4MHz (freqüência), o período, ou ciclo será de

1µs=(1/f)/4) e funções de controle de portas. Este primeiro exemplo pode ser chamado em

programação para iniciantes de “alô mundo”. O circuito do pisca-pisca é visto na Figura 1.

(14)Vdd

PIC 16F628A

(6)RB0

(5)Vss

MCLR\(4)

(16) Clk-out

(15) Clk-in

S1

D21N4148

+

C310uF

C233pF

C133pF

XTAL14.000MHZ

+V

V15V

D1LED1

R210k

R1360R

Figura 1 – Circuito pisca-pisca.

O programa em assembler ou código fonte comentado é o que segue:

; FORMULÁRIO PADRÃO PARA USO EM PROGRAMAÇÃO COM MICROCONTROLADORES

Page 2: AUTOR Maurício Madeira Oliveira Página pessoal (fonte ...seguidorsolar.com.br/obras/Microcontrolador4.pdf · AUTOR Maurício Madeira Oliveira Página pessoal (fonte): Este curso

; DA LINHA PIC ( MICROCHIP ). COM USO DO COMPILADOR MPASWIN.

;------------------------------------------------------------------------------

; ** Os registros da CPU serão escritas com letras maiúsculas, e a-

; pós " ; " os comentários não serão considerados pelo compilador.

;------------------------------------------------------------------------------

; PROJETO : Pisca-pisca DATA : 20/11/2008

;------------------------------------------------------------------------------

; AUTOR : Maurício Madeira Oliveira

;------------------------------------------------------------------------------

list p=16F628A ;para qual processador o código será gerado

radix dec ;padrão decimal para valores sem identificação

include <p16F628A.inc> ;anexa arquivo def.16F628A

__CONFIG _CP_OFF & _PWRTE_OFF & _BODEN_OFF & _MCLRE_ON & _INTRC_OSC_NOCLKOUT & _LVP_OFF

;------------------------------------------------------------------------------

; TABELA DE DEFINIÇÕES DE RAM E CONSTANTES (defino nomes associados a valores)

;------------------------------------------------------------------------------

x equ 20h ; define variável auxiliar x no end.20h da RAM (hexadecimal)

y equ 21h ; define variável auxiliar y no end.21h da RAM(hexadecimal)

m equ 22h ; define variável auxiliar m no end.22h da RAM (hexadecimal)

;------------------------------------------------------------------------------

;------------------------------------------------------------------------------

; MEMÓRIA DE PROGRAMA

;------------------------------------------------------------------------------

org 0 ; define inicio do programa a partir do end. 0h

goto início ; desvia o progrma para o label (rótulo) início

;------------------------------------------------------------------------------

; INÍCIO DA ROTINA DE INTERRUPÇÃO

;------------------------------------------------------------------------------

org 4 ; sempre inicia no end.4h as interrup.no PIC

; rotinas ...............................

retfie ; comando de retorno de interrupção

;------------------------------------------------------------------------------

; INÍCIO DO PROGRAMA

;------------------------------------------------------------------------------

início:

movlw 0 ; registrador w=0 (decimal)

movwf INTCON ; registrador INTCON=B'00000000', desabilito todas as interrupçoões

bcf STATUS, IRP ; clear no bit irp do reg.status, pré-seleciono banco 0 e 1

bcf STATUS, RP1 ; clear no bit RP1 (RP1=0)

bsf STATUS, RP0 ; set bit RP0 (RP0=1) com estas duas linhas seleciono o banco 1, onde está o TRISB e TRISA

;-------------------------------------------------------------------------------

; Poderia usar o comando BANKSEL que é uma diretiva para seleção de banco de memória do MPLAB

; ex. BANKSEL TRISB, não precisaria digitar as duas linhas anteriores

; Também poderia usar o comando: movlw B'001XXXXX' e após movwf STATUS, onde x = a qualquer valor;

; substituiriam as três linhas anteriores.

Page 3: AUTOR Maurício Madeira Oliveira Página pessoal (fonte ...seguidorsolar.com.br/obras/Microcontrolador4.pdf · AUTOR Maurício Madeira Oliveira Página pessoal (fonte): Este curso

;-------------------------------------------------------------------------------

movwf TRISB ; registrador TRISB=0 (B'00000000') , OU SEJA, PINOS DO PORTB CONFIGURADOS COMO

SAÍDAS

movlw 0FFH ; w=B'11111111'

movwf TRISA ; TRISA=B'11111111'pinos configurados como entradas

movlw 24 ; w=B'00011000'

movwf OPTION_REG ; registrador OPTION_REG=B'00011000', verificar nos livros esta config.c/ estes valores

bcf STATUS, RP0 ; clear bit RP0, seleciono banco 0

movlw 0

movwf PORTB ; zero as saídas do PORTB

volta:

bsf PORTB,0 ; set pino PB0 do PORTB

call tempo

bcf PORTB,0 ; clear PB0 do PORTB

call tempo

goto volta

tempo: ; início da rotina de tempo (s/uso dos timers),label de chamada para a função call ou outra

movlw 2 ; onde t1 é um valor numérico, base numérica (1uS)

; em uso (decimal, hexa, binário etc.)

movwf x ; variável x, onde ficara c/ o valor x=t1 (1uS)

tempo1:

movlw 250 ; onde t2 é um valor numérico (1uS) y=250

movwf y ; varável y, onde y=t2 (1uS)

tempo2:

movlw 248 ; onde t3 é um valor numérico (1uS) m=248

movwf m ; varável m, onde m=248 (1uS)

tempo3:

nop ; queima 1Us,para o clock de 4MHz (1uS)

decfsz m ; decrem.z e se m=0 salta próxima instrução (1uS ou 2uS)

; (2uS se saltar ou 1US se não saltar)

goto tempo3 ; ir pra o label tempo3 (2uS)

decfsz y ; decrem.y e se y=0 salta próxima instrução (1uS ou 2uS)

goto tempo2 ; ir pra o label tempo2 (2uS)

decfsz x ; decrem.x e se x=0 salta próxima instrução (1uS ou 2uS)

goto tempo1 ; ir pra o label tempo1 (2uS)

return ; função de retorno de subrotina ou desvio (2uS)

end

6.2 Pisca-pisca alternado, usando dois LED’s, período de meio segundo.

O circuito também usa o mesmo recurso de temporização do exemplo anterior, ou seja,

não usa os timer’s do microcontrolador. No circuito da Figura 2 é usado dois pinos para

acionamento dos led’s. O software é simples e usa as mesmas funções de controle de portas

do circuito anterior.

Page 4: AUTOR Maurício Madeira Oliveira Página pessoal (fonte ...seguidorsolar.com.br/obras/Microcontrolador4.pdf · AUTOR Maurício Madeira Oliveira Página pessoal (fonte): Este curso

Este tipo de implementação de rotina de tempo é bastante usual, em diversas famílias

de microcontroladores (tecnologias de diferentes fabricantes), pois, muitas vezes os

temporizadores já estão sendo usados e são necessários outros meios de implementar funções

de base de tempo.

Na Figura 2 é visualizado o circuito de pisca alternado.

(7)RB1MCLR\(4)

(15) Clk-in

(16) Clk-out

(5)Vss

(6)RB0

PIC 16F628A

(14)Vdd

D3LED2

S1

D21N4148

+

C310uF

C233pF

C133pF

XTAL14.000MHZ

+V

V15V

D1LED1

R3360R

R210k

R1360R

Figura 2 – Pisca-pisca alternado.

O programa comentado em assembler do pisca alternado é o que segue.

; FORMULÁRIO PADRÃO PARA USO EM PROGRAMAÇÃO COM MICROCONTROLADORES

; DA LINHA PIC ( MICROCHIP ). COM USO DO COMPILADOR MPASWIN.

;------------------------------------------------------------------------------

; ** Os registros da CPU serão escritas com letras maiúsculas, e a-

; pós " ; " os comentários não serão considerados pelo compilador.

;------------------------------------------------------------------------------

; PROJETO : Pisca - Dois Leds DATA : 22/11/2008

;------------------------------------------------------------------------------

; AUTOR : Maurício Madeira Oliveira

;------------------------------------------------------------------------------

list p=16F628A ;para qual processador o código será gerado

radix dec ;padrão decimal para valores sem identificação

include <p16F628A.inc> ;anexa arquivo def.16F628A

Page 5: AUTOR Maurício Madeira Oliveira Página pessoal (fonte ...seguidorsolar.com.br/obras/Microcontrolador4.pdf · AUTOR Maurício Madeira Oliveira Página pessoal (fonte): Este curso

__CONFIG _CP_OFF & _PWRTE_OFF & _BODEN_OFF & _MCLRE_ON & _INTRC_OSC_NOCLKOUT & _LVP_OFF

;------------------------------------------------------------------------------

; TABELA DE DEFINIÇÕES DE RAM E CONSTANTES (defino nomes associados a valores)

;------------------------------------------------------------------------------

x equ 20h ; define variável auxiliar x no end.20h da RAM (hexadecimal)

y equ 21h ; define variável auxiliar y no end.21h da RAM(hexadecimal)

m equ 22h ; define variável auxiliar m no end.22h da RAM (hexadecimal)

;------------------------------------------------------------------------------

;------------------------------------------------------------------------------

; MEMÓRIA DE PROGRAMA

;------------------------------------------------------------------------------

org 0 ; define inicio do programa a partir do end. 0h

goto início ; desvia o progrma para o label (rótulo) início

;------------------------------------------------------------------------------

; INÍCIO DA ROTINA DE INTERRUPÇÃO

;------------------------------------------------------------------------------

org 4 ; sempre inicia no end.4h as interrup.no PIC

; rotinas ...............................

retfie ; comando de retorno de interrupção

;------------------------------------------------------------------------------

; INÍCIO DO PROGRAMA - inicialização do uC

;------------------------------------------------------------------------------

início:

movlw 0 ; registrador w=0 (decimal)

movwf INTCON ; registrador INTCON=B'00000000', desabilito todas as interrupçoões

bcf STATUS, IRP ; clear no bit irp do reg.status, pré-seleciono banco 0 e 1

bcf STATUS, RP1 ; clear no bit RP1 (RP1=0)

bsf STATUS, RP0 ; set bit RP0 (RP0=1) com estas duas linhas seleciono o banco 1, onde está o TRISB e TRISA

movwf TRISB ; registrador TRISB=0 (B'00000000') , OU SEJA, PINOS DO PORTB CONFIGURADOS COMO

SAÍDAS

movlw 0FFH ; w=B'11111111'

movwf TRISA ; TRISA=B'11111111'pinos configurados como entradas

movlw 24 ; w=B'00011000'

movwf OPTION_REG ; registrador OPTION_REG=B'00011000', verificar nos livros esta config.c/ estes valores

bcf STATUS, RP0 ; clear bit RP0, seleciono banco 0

movlw 0

movwf PORTB ; zero as saídas do PORTB

;--------------------------------------------------------------------------------

; programa principal - aplicação

;--------------------------------------------------------------------------------

volta:

bsf PORTB,0 ; set pino PB0 do PORTB

bcf PORTB,1 ; clear pino PB1

call tempo

bcf PORTB,0 ; clear PB0 do PORTB

Page 6: AUTOR Maurício Madeira Oliveira Página pessoal (fonte ...seguidorsolar.com.br/obras/Microcontrolador4.pdf · AUTOR Maurício Madeira Oliveira Página pessoal (fonte): Este curso

bsf PORTB,1 ; set pino PB1

call tempo

goto volta

;---------------------------------------------------------------------------------

; Rotinas de tempo

;---------------------------------------------------------------------------------

tempo: ; início da rotina de tempo (s/uso dos timers),label de chamada para a função call ou outra

movlw 2 ; onde t1 é um valor numérico, base numérica (1uS)

; em uso (decimal, hexa, binário etc.)

movwf x ; variável x, onde ficara c/ o valor x=t1 (1uS)

tempo1:

movlw 250 ; onde t2 é um valor numérico (1uS) y=250

movwf y ; varável y, onde y=t2 (1uS)

tempo2:

movlw 248 ; onde t3 é um valor numérico (1uS) m=248

movwf m ; varável m, onde m=248 (1uS)

tempo3:

nop ; queima 1Us,para o clock de 4MHz (1uS)

decfsz m ; decrem.z e se m=0 salta próxima instrução (1uS ou 2uS)

; (2uS se saltar ou 1US se não saltar)

goto tempo3 ; ir pra o label tempo3 (2uS)

decfsz y ; decrem.y e se y=0 salta próxima instrução (1uS ou 2uS)

goto tempo2 ; ir pra o label tempo2 (2uS)

decfsz x ; decrem.x e se x=0 salta próxima instrução (1uS ou 2uS)

goto tempo1 ; ir pra o label tempo1 (2uS)

return ; função de retorno de subrotina ou desvio (2uS)

end

6.3 Seqüencial de oito canais (usando LED’s).

O circuito que é visto na Figura 3 usa todos os 8 pinos do PORTB. Através da função

de rotação a esquerda (RLF) e com o mesmo temporizador implementado nos circuitos

anteriores, fica bem simples o entendimento do funcionamento do circuito seqüencial.

O software que comanda o PIC é o descrito no formulário que segue.

; FORMULÁRIO PADRÃO PARA USO EM PROGRAMAÇÃO COM MICROCONTROLADORES

; DA LINHA PIC ( MICROCHIP ). COM USO DO COMPILADOR MPASWIN.

;------------------------------------------------------------------------------

; ** Os registros da CPU serão escritas com letras maiúsculas, e a-

; pós " ; " os comentários não serão considerados pelo compilador.

;------------------------------------------------------------------------------

; PROJETO : Pisca - Sequencial de 8 leds DATA : 22/11/2008

;------------------------------------------------------------------------------

; AUTOR : Maurício Madeira Oliveira

;------------------------------------------------------------------------------

Page 7: AUTOR Maurício Madeira Oliveira Página pessoal (fonte ...seguidorsolar.com.br/obras/Microcontrolador4.pdf · AUTOR Maurício Madeira Oliveira Página pessoal (fonte): Este curso

list p=16F628A ;para qual processador o código será gerado

radix dec ;padrão decimal para valores sem identificação

include <p16F628A.inc> ;anexa arquivo def.16F628A

__CONFIG _CP_OFF & _PWRTE_OFF & _BODEN_OFF & _MCLRE_ON & _INTRC_OSC_NOCLKOUT & _LVP_OFF

;------------------------------------------------------------------------------

; TABELA DE DEFINIÇÕES DE RAM E CONSTANTES (defino nomes associados a valores)

;------------------------------------------------------------------------------

x equ 20h ; define variável auxiliar x no end.20h da RAM (hexadecimal)

y equ 21h ; define variável auxiliar y no end.21h da RAM(hexadecimal)

m equ 22h ; define variável auxiliar m no end.22h da RAM (hexadecimal)

;------------------------------------------------------------------------------

; MEMÓRIA DE PROGRAMA

;------------------------------------------------------------------------------

org 0 ; define inicio do programa a partir do end. 0h

goto início ; desvia o progrma para o label (rótulo) início

;------------------------------------------------------------------------------

; INÍCIO DA ROTINA DE INTERRUPÇÃO

;------------------------------------------------------------------------------

org 4 ; sempre inicia no end.4h as interrup.no PIC

; rotinas ...............................

retfie ; comando de retorno de interrupção

;------------------------------------------------------------------------------

; INÍCIO DO PROGRAMA - inicialização do uC

;------------------------------------------------------------------------------

início:

movlw 0 ; registrador w=0 (decimal)

movwf INTCON ; registrador INTCON=B'00000000', desabilito todas as interrupçoões

bcf STATUS, IRP ; clear no bit irp do reg.status, pré-seleciono banco 0 e 1

bcf STATUS, RP1 ; clear no bit RP1 (RP1=0)

bsf STATUS, RP0 ; set bit RP0 (RP0=1) com estas duas linhas seleciono o banco 1, onde está o TRISB e TRISA

bcf STATUS, C ; clear carry . É IMPORTANTE ESTE CLEAR, POIS O COMANDO DE ROTAÇÃO

; (RLF) USA ESTE FLAG

movwf TRISB ; registrador TRISB=0 (B'00000000') , OU SEJA, PINOS DO PORTB CONFIGURADOS COMO

SAÍDAS

movlw 0FFH ; w=B'11111111'

movwf TRISA ; TRISA=B'11111111'pinos configurados como entradas

movlw 24 ; w=B'00011000'

movwf OPTION_REG ; registrador OPTION_REG=B'00011000', verificar nos livros esta config.c/ estes valores

bcf STATUS, RP0 ; clear bit RP0, seleciono banco 0

movlw 0

movwf PORTB ; zero as saídas do PORTB

;--------------------------------------------------------------------------------

; programa principal - aplicação

;--------------------------------------------------------------------------------

movlw 128 ; w=b'10000000'

movwf PORTB ; portb=w=b'10000000'

Page 8: AUTOR Maurício Madeira Oliveira Página pessoal (fonte ...seguidorsolar.com.br/obras/Microcontrolador4.pdf · AUTOR Maurício Madeira Oliveira Página pessoal (fonte): Este curso

volta:

rlf PORTB, 1 ; desloca bit à esquerda no PORTB ( o f=1, atua sobre o próprio registro)

call tempo ; chama subrotina de tempo

goto volta ; ir para label volta

;---------------------------------------------------------------------------------

; Rotinas de tempo

;---------------------------------------------------------------------------------

tempo: ; início da rotina de tempo (s/uso dos timers),label de chamada para a função call ou outra

movlw 2 ; onde t1 é um valor numérico, base numérica (1uS)

; em uso (decimal, hexa, binário etc.)

movwf x ; variável x, onde ficara c/ o valor x=t1 (1uS)

tempo1:

movlw 250 ; onde t2 é um valor numérico (1uS) y=250

movwf y ; varável y, onde y=t2 (1uS)

tempo2:

movlw 248 ; onde t3 é um valor numérico (1uS) m=248

movwf m ; varável m, onde m=248 (1uS)

tempo3:

nop ; queima 1Us,para o clock de 4MHz (1uS)

decfsz m ; decrem.z e se m=0 salta próxima instrução (1uS ou 2uS)

; (2uS se saltar ou 1US se não saltar)

goto tempo3 ; ir pra o label tempo3 (2uS)

decfsz y ; decrem.y e se y=0 salta próxima instrução (1uS ou 2uS)

goto tempo2 ; ir pra o label tempo2 (2uS)

decfsz x ; decrem.x e se x=0 salta próxima instrução (1uS ou 2uS)

goto tempo1 ; ir pra o label tempo1 (2uS)

return ; função de retorno de subrotina ou desvio (2uS)

end

O circuito básico do PIC é o mesmo dos pisca-piscas anteriores, apenas usando 8

conjuntos de LED’s e um novo comando. Com isto se observa a facilidade e o imenso

potencial de uso de um microcontrolador.

Em projetos com uso de microcontroladores, é fácil observar a importância do

software, pois a partir hardwares básicos é possível implementar vários circuitos com a

mudança de linhas de um programa de controle.

Page 9: AUTOR Maurício Madeira Oliveira Página pessoal (fonte ...seguidorsolar.com.br/obras/Microcontrolador4.pdf · AUTOR Maurício Madeira Oliveira Página pessoal (fonte): Este curso

PIC 16F628A

(6)RB0

(5)Vss

(16) Clk-out

(15) Clk-in

MCLR\(4)

(14)Vdd

(13)RB7

Total de 8 conjuntos

..........................D8

LED8

S1

D91N4148

+

C310uF

C233pF

C133pF

XTAL14.000MHZ

+V

V15V

D1LED1

R8360R

R210k

R1360R

Figura 3 – Circuito da seqüencial de oito canais.

6.4 Sensor com chave tipo normalmente aberta e sinalização com led temporizado.

Este circuito usa uma chave normalmente aberta como sensor, à mesma esta ligada no

pino RA0. Esta chave mecânica indica quando aberta o nível zero e quando fechada nível 1,

sinalizada pelo led 1 que está ligada no pino RB0 do µC; quando a chave for fechada (nível 1)

a subrotina de temporização é acionada.

O circuito é visto na Figura 4.

O programa de controle do circuito esta todo comentado. A função de entrada do sinal

a ser interpretado pelo programa é btfss.

; FORMULÁRIO PADRÃO PARA USO EM PROGRAMAÇÃO COM MICROCONTROLADORES ; DA LINHA PIC ( MICROCHIP ). COM USO DO COMPILADOR MPASWIN. ;------------------------------------------------------------------------------ ; ** Os registros da CPU serão escritas com letras maiúsculas, e a- ; pós " ; " os comentários não serão considerados pelo compilador. ;------------------------------------------------------------------------------ ; PROJETO : Sensor c/ temporização DATA : 25/11/2008 ;------------------------------------------------------------------------------ ; AUTOR : Maurício Madeira Oliveira ;------------------------------------------------------------------------------ list p=16F628A ;para qual processador o código será gerado radix dec ;padrão decimal para valores sem identificação include <p16F628A.inc> ;anexa arquivo def.16F628A __CONFIG _CP_OFF & _PWRTE_OFF & _BODEN_OFF & _MCLRE_ON & _INTRC_OSC_NOCLKOUT & _LVP_OFF ;------------------------------------------------------------------------------ ; TABELA DE DEFINIÇÕES DE RAM E CONSTANTES (defino nomes associados a valores) ;------------------------------------------------------------------------------ x equ 20h ; define variável auxiliar x no end.20h da RAM (hexadecimal) y equ 21h ; define variável auxiliar y no end.21h da RAM(hexadecimal) m equ 22h ; define variável auxiliar m no end.22h da RAM (hexadecimal) S1 equ 0 ; sensor 1 que usara o pino 0 do PORTA ;------------------------------------------------------------------------------ ;------------------------------------------------------------------------------ ; MEMÓRIA DE PROGRAMA ;------------------------------------------------------------------------------

Page 10: AUTOR Maurício Madeira Oliveira Página pessoal (fonte ...seguidorsolar.com.br/obras/Microcontrolador4.pdf · AUTOR Maurício Madeira Oliveira Página pessoal (fonte): Este curso

org 0 ; define inicio do programa a partir do end. 0h goto início ; desvia o progrma para o label (rótulo) início ;------------------------------------------------------------------------------ ; INÍCIO DA ROTINA DE INTERRUPÇÃO ;------------------------------------------------------------------------------ org 4 ; sempre inicia no end.4h as interrup.no PIC ; rotinas ............................... retfie ; comando de retorno de interrupção ;------------------------------------------------------------------------------ ; INÍCIO DO PROGRAMA - inicialização do uC ;------------------------------------------------------------------------------ início: movlw 0 ; registrador w=0 (decimal) movwf INTCON ; registrador INTCON=B'00000000', desabilito todas as interrupçoões bcf STATUS, IRP ; clear no bit irp do reg.status, pré-seleciono banco 0 e 1 bcf STATUS, RP1 ; clear no bit RP1 (RP1=0) bsf STATUS, RP0 ; set bit RP0 (RP0=1) com estas duas linhas seleciono o banco 1, onde está o TRISB e TRISA bcf STATUS, C ; clear carry

movwf TRISB ; registrador TRISB=0 (B'00000000') , OU SEJA, PINOS DO PORTB CONFIGURADOS ; COMO SAÍDAS

movlw 0FFH ; w=B'11111111' movwf TRISA ; TRISA=B'11111111'pinos configurados como entradas movlw 24 ; w=B'00011000' movwf OPTION_REG ; registrador OPTION_REG=B'00011000', verificar nos livros esta config.c/ estes valores bcf STATUS, RP0 ; clear bit RP0, seleciono banco 0 movlw 7 ; w=B'00000111' movwf CMCON ; cmcon=w, desligo o comparador analógico (o reset não faz isso) movlw 0 ; w=0 movwf CCP1CON ; CCP1CON=W=, desliga o módulo CCP (o reset faz isso, mas forçar o sinal por garantia) movwf PORTB ; zero as saídas do PORTB (PORTB=w=0) ;-------------------------------------------------------------------------------- ; programa principal - aplicação ;-------------------------------------------------------------------------------- sensor1: nop ; gasto um ciclo de máquina btfss PORTA, S1 ; se o bit S1 do portA for igual a 1,pula a próxima instrução goto sensor1 ; se esta aqui é porque S1=0, volta para sensor1 (fica testando o sensor S1) bsf PORTB,0 ; liga o led 1 conectado em RB0 call tempo ; chama rotina de tempo (para deixar o sinalizador led 1 ligado por um tempo) bcf PORTB,0 ; desliga o led 1 goto sensor1 ; desvia para o sensor1, volta a testar o sensor S1 ;--------------------------------------------------------------------------------- ; Rotinas de tempo ;--------------------------------------------------------------------------------- tempo: ; início da rotina de tempo (s/uso dos timers),label de chamada para a função call ou outra movlw 2 ; onde t1 é um valor numérico, base numérica (1uS) ; em uso (decimal, hexa, binário etc.) movwf x ; variável x, onde ficara c/ o valor x=t1 (1uS) tempo1: movlw 250 ; onde t2 é um valor numérico (1uS) y=250 movwf y ; varável y, onde y=t2 (1uS) tempo2: movlw 248 ; onde t3 é um valor numérico (1uS) m=248 movwf m ; varável m, onde m=248 (1uS) tempo3: nop ; queima 1Us,para o clock de 4MHz (1uS) decfsz m ; decrem.z e se m=0 salta próxima instrução (1uS ou 2uS) ; (2uS se saltar ou 1US se não saltar) goto tempo3 ; ir pra o label tempo3 (2uS) decfsz y ; decrem.y e se y=0 salta próxima instrução (1uS ou 2uS) goto tempo2 ; ir pra o label tempo2 (2uS) decfsz x ; decrem.x e se x=0 salta próxima instrução (1uS ou 2uS) goto tempo1 ; ir pra o label tempo1 (2uS) return ; função de retorno de subrotina ou desvio (2uS) end

Page 11: AUTOR Maurício Madeira Oliveira Página pessoal (fonte ...seguidorsolar.com.br/obras/Microcontrolador4.pdf · AUTOR Maurício Madeira Oliveira Página pessoal (fonte): Este curso

(17)RA0

(15) Clk-in

(16) Clk-out

MCLR\(4)

(5)Vss

(6)RB0

PIC 16F628A

(14)Vdd

R31k

S1

RESET

D21N4148

+

C310uF

C233pF

C133pF

XTAL14.000MHZ

+V

V15V

D1LED1

R210k

R1360R

Figura 4 – Sensor com chave normalmente aberta.

6.5 Detector de nível para sinal digital.

Este circuito informa através de dois led’s se o sinal amostrado no pino RA0 é alto(1),

ligando o led 1 (pino RB0), se é baixo (0), ligando o led 2 (pino RB1) ou se o sinal está

variando entre 0 e 1 (oscilador de onda quadrada), liga os dois led’s.

O programa de controle é bastante simples, e o circuito apresentado funciona para

sinais com tensão igual a da fonte de alimentação dos circuitos apresentados (5V).

Na Figura 5 é mostrado o esquema do circuito, o mesmo é simples e didático, pois

pode ser usado como base para circuitos mais sofisticados. Este exemplo mostra que o sinais

digitais amostrados podem ser analisados diretamente pelo software de controle.

Page 12: AUTOR Maurício Madeira Oliveira Página pessoal (fonte ...seguidorsolar.com.br/obras/Microcontrolador4.pdf · AUTOR Maurício Madeira Oliveira Página pessoal (fonte): Este curso

(7)RB1

PIC 16F628A

(14)Vdd

(6)RB0

(5)Vss

MCLR\(4)

(16) Clk-out

(15) Clk-in

(17)RA0 S1

Entrada sinal

D3LED2

R4360R

RESET

D21N4148

+

C310uF

C233pF

C133pF

XTAL14.000MHZ

+V

V15V

D1LED1

R31k

R210k

R1360R

Figura 5 – Detector de nível de sinal.

;------------------------------------------------------------------------------

; FORMULÁRIO PADRÃO PARA USO EM PROGRAMAÇÃO COM MICROCONTROLADORES

; DA LINHA PIC ( MICROCHIP ). COM USO DO COMPILADOR MPASWIN.

;------------------------------------------------------------------------------

; ** Os registros da CPU serão escritas com letras maiúsculas, e a-

; pós " ; " os comentários não serão considerados pelo compilador.

;------------------------------------------------------------------------------

; PROJETO : Detector de nível de sinal DATA : 26/11/2008

;------------------------------------------------------------------------------

; AUTOR : Maurício Madeira Oliveira

;------------------------------------------------------------------------------

list p=16F628A ;para qual processador o código será gerado

radix dec ;padrão decimal para valores sem identificação

include <p16F628A.inc> ;anexa arquivo def.16F628A

__CONFIG _CP_OFF & _PWRTE_OFF & _BODEN_OFF & _MCLRE_ON & _INTRC_OSC_NOCLKOUT & _LVP_OFF

;------------------------------------------------------------------------------

; TABELA DE DEFINIÇÕES DE RAM E CONSTANTES (defino nomes associados a valores)

;------------------------------------------------------------------------------

x equ 20h ; define variável auxiliar x no end.20h da RAM (hexadecimal)

y equ 21h ; define variável auxiliar y no end.21h da RAM(hexadecimal)

m equ 22h ; define variável auxiliar m no end.22h da RAM (hexadecimal)

S1 equ 0 ; sensor 1 que usara o pino 0 do PORTA

;------------------------------------------------------------------------------

;------------------------------------------------------------------------------

; MEMÓRIA DE PROGRAMA

;------------------------------------------------------------------------------

Page 13: AUTOR Maurício Madeira Oliveira Página pessoal (fonte ...seguidorsolar.com.br/obras/Microcontrolador4.pdf · AUTOR Maurício Madeira Oliveira Página pessoal (fonte): Este curso

org 0 ; define inicio do programa a partir do end. 0h

goto início ; desvia o progrma para o label (rótulo) início

;------------------------------------------------------------------------------

; INÍCIO DA ROTINA DE INTERRUPÇÃO

;------------------------------------------------------------------------------

org 4 ; sempre inicia no end.4h as interrup.no PIC

; rotinas ...............................

retfie ; comando de retorno de interrupção

;------------------------------------------------------------------------------

; INÍCIO DO PROGRAMA - inicialização do uC

;------------------------------------------------------------------------------

início:

movlw 0 ; registrador w=0 (decimal)

movwf INTCON ; registrador INTCON=B'00000000', desabilito todas as interrupçoões

bcf STATUS, IRP ; clear no bit irp do reg.status, pré-seleciono banco 0 e 1

bcf STATUS, RP1 ; clear no bit RP1 (RP1=0)

bsf STATUS, RP0 ; set bit RP0 (RP0=1) com estas duas linhas seleciono o banco 1, onde está o TRISB e TRISA

bcf STATUS, C ; clear carry

movwf TRISB ; registrador TRISB=0 (B'00000000') , OU SEJA, PINOS DO PORTB CONFIGURADOS

COMO SAÍDAS

movlw 0FFH ; w=B'11111111'

movwf TRISA ; TRISA=B'11111111'pinos configurados como entradas

movlw 24 ; w=B'00011000'

movwf OPTION_REG ; registrador OPTION_REG=B'00011000', verificar nos livros esta config.c/ estes valores

bcf STATUS, RP0 ; clear bit RP0, seleciono banco 0

movlw 7 ; w=B'00000111'

movwf CMCON ; cmcon=w, desligo o comparador analógico (o reset não faz isso)

movlw 0 ; w=0

movwf CCP1CON ; CCP1CON=W=, desliga o módulo CCP (o reset faz isso, mas forçar o sinal por garantia)

movwf PORTB ; zero as saídas do PORTB (PORTB=w=0)

;--------------------------------------------------------------------------------

; programa principal - aplicação

;--------------------------------------------------------------------------------

sensor1:

nop ; gasto um ciclo de máquina

btfss PORTA, S1 ; se o bit S1 do portA for igual a 1,pula a próxima instrução

goto sensor2 ; desvia para sensor2 (label), pois RA0 (S1) está em zero (nível baixo)

bsf PORTB,0 ; liga RB0 pois S1=1 (nível alto do sinal amostrado)

bcf PORTB,1 ; desliga RB1

goto sensor1 ; volta à sensor1 para continuar a testar o nível do sinal

sensor2:

bcf PORTB,0 ; desliga RB0, pois sinal amostrado têm nível baixo (zero)

bsf PORTB,1 ; liga RB0

goto sensor1 ; volta para sensor1

end

6.6 Contador de pulsos externos com uso de display de 7 seguimentos

Neste exemplo iremos utilizar nosso µC para contar um determinado número de pulsos

externos, em nosso caso serão 10, quando isto acontecer nosso timer 0 irá gerar uma

Page 14: AUTOR Maurício Madeira Oliveira Página pessoal (fonte ...seguidorsolar.com.br/obras/Microcontrolador4.pdf · AUTOR Maurício Madeira Oliveira Página pessoal (fonte): Este curso

interrupção no µC, a mesma será resolvida pelo software , que ligara um led (representando

uma carga qualquer) por 500mS, e após desligara, voltando para rotina principal do µC como

contador. Também aproveitaremos para ativar um display de 7 segmentos (de led) para

fixarmos mais este conceito (decodificador por software). O circuito é visualizado na Figura

6:

(03)RA4

(06)RB0(07)RB1(08)RB2(09)RB3(10)RB4(11)RB5(12)RB6(13)RB7

MCLR\(4)

(5)Vss

PIC 16F628A

(14)Vdd

(15) (16) Clk-in Clk-out

Entada

D1LED1

abcdefg.

Gnd

DISP1

S1

D21N4148

+

C310uF

C233pF

C133pF

XTAL14.000MHZ

+V

V15V

R4500R

R310k

R1360R

R210k

Figura 6 – Contador externo com display de 7 seguimentos.

O código de controle do circuito têm um maior grau de dificuldade, mas com os comentários

de cada linha se chega ao entendimento do mesmo.

; FORMULÁRIO PADRÃO PARA USO EM PROGRAMAÇÃO COM MICROCONTROLADORES

; DA LINHA PIC ( MICROCHIP ). COM USO DO COMPILADOR MPASWIN.

;------------------------------------------------------------------------------

; ** Os registros da CPU serão escritas com letras maiúsculas, e a-

; pós " ; " os comentários não serão considerados pelo compilador.

;------------------------------------------------------------------------------

; PROJETO : Contador de pulsos externos c/ display7 (7 seguimentos)e inmterrupção do timer0

; DATA : 25/11/2008

;------------------------------------------------------------------------------

; AUTOR : Maurício Madeira Oliveira

;------------------------------------------------------------------------------

Page 15: AUTOR Maurício Madeira Oliveira Página pessoal (fonte ...seguidorsolar.com.br/obras/Microcontrolador4.pdf · AUTOR Maurício Madeira Oliveira Página pessoal (fonte): Este curso

list p=16F628A ;para qual processador o código será gerado

radix dec ;padrão decimal para valores sem identificação

include <p16F628A.inc> ;anexa arquivo def.16F628A

__CONFIG _CP_OFF & _PWRTE_OFF & _BODEN_OFF & _MCLRE_ON & _INTRC_OSC_NOCLKOUT & _LVP_OFF

;------------------------------------------------------------------------------

; TABELA DE DEFINIÇÕES DE RAM E CONSTANTES (defino nomes associados a valores)

;------------------------------------------------------------------------------

x equ 20h ; define variável auxiliar x no end.20h da RAM (hexadecimal)

y equ 21h ; define variável auxiliar y no end.21h da RAM(hexadecimal)

m que 22h ; define variável auxiliar m no end.22h da RAM (hexadecimal)

l1 equ 7 ; led ligado a PORTB em RB7

STEMP equ 23h ; define variável temporária p/ guardar valores do STATUS

;------------------------------------------------------------------------------

;------------------------------------------------------------------------------

; TABELA DE MONTAGEM DO DISPLAY

;------------------------------------------------------------------------------

;

; a=RB0 define segmento do display ligado ao pino 0 do portB

; b=RB1 " " " " " " " 1 do portB

; c=RB2 " " " " " " " 2 do portB

; d=RB3 " " " " " " " 3 do portB

; e=RB4 " " " " " " " 4 do portB

; f=RB5 " " " " " " " 5 do portB

; g=RB6 " " " " " " " 6 do portB

;

; fica em binario: B'0gfedcba', para escrever n.7 ==> B'00000111' ou B'00000cba'

; , para escrever n.6 ==> B'01111101' ou B'0gfedc0a' , etc.

;

; a

; *******

; f * * b

; * g *

; ******* DISPLAY

; e * * c

; * *

; *******

; d

;------------------------------------------------------------------------------

; MEMÓRIA DE PROGRAMA

;------------------------------------------------------------------------------

org 0 ; define inicio do programa a partir do end. 0h

goto início ; desvia o progrma para o label (rótulo) início

;------------------------------------------------------------------------------

; INÍCIO DA ROTINA DE INTERRUPÇÃO

;------------------------------------------------------------------------------

org 4 ; sempre inicia no end.4h as interrup.no PIC

swapf STATUS,W

movwf STEMP ; stemp=w=status (c/nibles invertidos)

bsf PORTB,l1 ; ligo led1 pino 7 do portB

movlw 0x0F6 ; w=F6h

movwf TMR0 ; tmr0=w=F6h

Page 16: AUTOR Maurício Madeira Oliveira Página pessoal (fonte ...seguidorsolar.com.br/obras/Microcontrolador4.pdf · AUTOR Maurício Madeira Oliveira Página pessoal (fonte): Este curso

call tempo

bcf PORTB,l1 ; desligo led1

swapf STEMP,W

movwf STATUS ; move vlrs.stemp p/status (inv.nibles/fica correto)

bcf INTCON,T0IF ; zera o indicador de overflow p/iniciar novam.

retfie ; comando de retorno de interrupção

;------------------------------------------------------------------------------

; INÍCIO DO PROGRAMA - inicialização do uC

;------------------------------------------------------------------------------

início:

movlw B'10000000' ; w=10000000b

movwf INTCON ; INTCON=w , GIE esta habilitada

bcf STATUS, IRP ; clear no bit irp do reg.status, pré-seleciono banco 0 e 1

bcf STATUS, RP1 ; clear no bit RP1 (RP1=0)

bsf STATUS, RP0 ; set bit RP0 (RP0=1) com estas duas linhas seleciono o banco 1, onde está o TRISB e TRISA

movlw 0

movwf TRISB ; registrador TRISB=0 (B'00000000') , OU SEJA, PINOS DO PORTB CONFIGURADOS

COMO SAÍDAS

movlw 0FFH ; w=B'11111111'

movwf TRISA ; TRISA=B'11111111'pinos configurados como entradas

movlw B'11111000' ; w=11111000b

movwf OPTION_REG

;(OPTION=w|RPBU\=1|INTEDEG=1|TOCS=1|TOSE=1|PSA=1|PS2=0|PS1=0|PS0=0|==>T0CS=1contagem por RA4...)

bcf STATUS, RP0 ; clear bit RP0, seleciono banco 0

movlw 7 ; w=B'00000111'

movwf CMCON ; cmcon=w, desligo o comparador analógico

movlw 0 ; w=0

movwf CCP1CON ; CCP1CON=W=, desliga o módulo CCP (o reset faz isso, mas forçar o sinal por garantia)

movwf PORTB ; zero as saídas do PORTB (PORTB=w=0)

;--------------------------------------------------------------------------------

; programa principal - aplicação

;--------------------------------------------------------------------------------

movlw 0x0F5 ; w=0F5

movwf TMR0 ; timer0=w

bcf INTCON,T0IF ; reset no bit indicador de overflow

bsf INTCON,T0IE ; set o bit de interrupção do timer0

loop:

movf TMR0,0 ; w=tmr0

call certo ; sub-rotina de conversão p/7 segmentos

movwf PORTB ; portB=w

nop

goto loop

certo:

andlw B'00001111' ; and w p/limitar em 4 bits vlr.contador (w= tmr0 and b'00001111')

sublw 0x0E ; subtrai de 14 o vlr.de w (vlr.tmr0 acertado)(w=0x0E-w)

addwf PCL,1 ; soma valor de w com pcl, saltando p/ instrução

; necessária p/escrita do número correto

Page 17: AUTOR Maurício Madeira Oliveira Página pessoal (fonte ...seguidorsolar.com.br/obras/Microcontrolador4.pdf · AUTOR Maurício Madeira Oliveira Página pessoal (fonte): Este curso

;'0gfedcba' sequência dos segmentos

retlw B'01100111' ; retorna 9 (instrução de retorno de subrotina e com valor em w= cte.)

retlw B'01111111' ; retorna 8

retlw B'00000111' ; retorna 7

retlw B'01111100' ; retorna 6

retlw B'01101101' ; retorna 5

retlw B'01100110' ; retorna 4

retlw B'01001111' ; retorna 3

retlw B'01011011' ; retorna 2

retlw B'00000110' ; retorna 1

retlw B'00111111' ; retorna 0

;---------------------------------------------------------------------------------

; Rotinas de tempo

;---------------------------------------------------------------------------------

tempo: ; início da rotina de tempo (s/uso dos timers),label de chamada para a função call ou outra

movlw 2 ; onde t1 é um valor numérico, base numérica (1uS)

; em uso (decimal, hexa, binário etc.)

movwf x ; variável x, onde ficara c/ o valor x=t1 (1uS)

tempo1:

movlw 250 ; onde t2 é um valor numérico (1uS) y=250

movwf y ; varável y, onde y=t2 (1uS)

tempo2:

movlw 248 ; onde t3 é um valor numérico (1uS) m=248

movwf m ; varável m, onde m=248 (1uS)

tempo3:

nop ; queima 1Us,para o clock de 4MHz (1uS)

decfsz m ; decrem.z e se m=0 salta próxima instrução (1uS ou 2uS)

; (2uS se saltar ou 1US se não saltar)

goto tempo3 ; ir pra o label tempo3 (2uS)

decfsz y ; decrem.y e se y=0 salta próxima instrução (1uS ou 2uS)

goto tempo2 ; ir pra o label tempo2 (2uS)

decfsz x ; decrem.x e se x=0 salta próxima instrução (1uS ou 2uS)

goto tempo1 ; ir pra o label tempo1 (2uS)

return ; função de retorno de subrotina ou desvio (2uS)

end

6.7 Acionamento de Display LCD com palavra de 8 bits.

Na figura 7 é mostrado o circuito básico de um microcontrolador e um módulo de

LCD (display de cristal liquido), o mesmo é do tipo 2x16 (duas linhas por 16 colunas) com

iluminação de fundo (back light). As palavras de instrução e de escrita usam 8 bits, a tabela 1

descreve as palavras de inicialização (instrução) do módulo LCD para operar neste modo.

Será escrito no display “CURSO DE MICROCONTROLADOR”, desta forma, com o

software de controle e os comentários sobre o mesmo, se alcançará o entendimento básico de

uso deste dispositivo.

Page 18: AUTOR Maurício Madeira Oliveira Página pessoal (fonte ...seguidorsolar.com.br/obras/Microcontrolador4.pdf · AUTOR Maurício Madeira Oliveira Página pessoal (fonte): Este curso

(17)RA0(18)RA1

(06)RB0(07)RB1(08)RB2(09)RB3(10)RB4(11)RB5(12)RB6(13)RB7

........... B7B0ER/WRSCnteVss

Vdd

14131211109876543

2

1

MÓDULO LCD

MCLR\(4)

(5)Vss

PIC 16F628A

(14)Vdd

(15) (16) Clk-in Clk-out

R110k 40%

S1

D21N4148

+

C310uF

C233pF

C133pF

XTAL14.000MHZ

+V

V15V

R210k

Figura 7 – Módulo LCD controlado pelo PIC 16F628A.

; FORMULÁRIO PADRÃO PARA USO EM PROGRAMAÇÃO COM MICROCONTROLADORES

; DA LINHA PIC ( MICROCHIP ). COM USO DO COMPILADOR MPASWIN.

;------------------------------------------------------------------------------

; ** Os registros da CPU serão escritas com letras maiúsculas, e a-

; pós " ; " os comentários não serão considerados pelo compilador.

;------------------------------------------------------------------------------

; PROJETO : LCD (escreve no display: CURSO DE MICROCONTOLADORES)

; DATA : 10/12/2008

;------------------------------------------------------------------------------

; AUTOR : Maurício Madeira Oliveira

;------------------------------------------------------------------------------

list p=16F628A ;para qual processador o código será gerado

radix dec ;padrão decimal para valores sem identificação

include <p16F628A.inc> ;anexa arquivo def.16F628A

__CONFIG _CP_OFF & _PWRTE_OFF & _BODEN_OFF & _MCLRE_ON & _INTRC_OSC_NOCLKOUT & _LVP_OFF

;------------------------------------------------------------------------------

; TABELA DE DEFINIÇÕES DE RAM E CONSTANTES (defino nomes associados a valores)

;------------------------------------------------------------------------------

x equ 20h ; define variável auxiliar x na ram 0Ch (hexadecimal)

y equ 21h ; define variável auxiliar y na ram 0Dh (hexadecimal)

Page 19: AUTOR Maurício Madeira Oliveira Página pessoal (fonte ...seguidorsolar.com.br/obras/Microcontrolador4.pdf · AUTOR Maurício Madeira Oliveira Página pessoal (fonte): Este curso

con0 equ 0h ; controle do sinal RS (LCD) através do PA.0

con1 equ 1h ; controle do sinal CS (LCD) através do PA.1

;Definição de caracteres que serão usados:

M equ 0x4D

I equ 0x49

; C equ 0x43 ; C não pode ser usada pois é nome p/ carry no uC

R equ 0x52

O equ 0x4F

N equ 0x4E

T equ 0x54

L equ 0x4C

A equ 0x41

D equ 0x44

U equ 0x55

S equ 0x53

E equ 0x45

# equ 0x23

; espaço em branco 0x20

;------------------------------------------------------------------------------

;------------------------------------------------------------------------------

; MEMÓRIA DE PROGRAMA

;------------------------------------------------------------------------------

org 0 ; define inicio do programa a partir do end. 0h

goto início ; desvia o progrma para o label (rótulo) início

;------------------------------------------------------------------------------

; INÍCIO DA ROTINA DE INTERRUPÇÃO

;------------------------------------------------------------------------------

org 4 ; sempre inicia no end.4h as interrup.no PIC

; rotnas

retfie ; comando de retorno de interrupção

;------------------------------------------------------------------------------

; INÍCIO DO PROGRAMA - inicialização do uC

;------------------------------------------------------------------------------

início:

movlw B'00000000' ; w=00000000b

movwf INTCON ; INTCON=w , desabilitada as interrupções

bcf STATUS, IRP ; clear no bit irp do reg.status, pré-seleciono banco 0 e 1

bcf STATUS, RP1 ; clear no bit RP1 (RP1=0)

bsf STATUS, RP0 ; set bit RP0 (RP0=1) com estas duas linhas seleciono o banco 1, onde está o TRISB e TRISA

;-------------------------------------------------------------------------------

; Poderia usar o comando BANKSEL que é uma diretiva para seleção de banco de memória do MPLAB

; ex. BANKSEL TRISB, não precisaria digitar as duas linhas anteriores

; Também poderia usar o comando: movlw B'001XXXXX' e após movwf STATUS, onde x= a qualquer valor

; substituiria as três linhas anteriores (o registro STATUS está presente nos 4 bancos).

;-------------------------------------------------------------------------------

Page 20: AUTOR Maurício Madeira Oliveira Página pessoal (fonte ...seguidorsolar.com.br/obras/Microcontrolador4.pdf · AUTOR Maurício Madeira Oliveira Página pessoal (fonte): Este curso

movlw 0

movwf TRISB ; registrador TRISB=0 (B'00000000') , OU SEJA, PINOS DO PORTB CONFIGURADOS COMO

; SAÍDAS

movlw 0FCH ; w=B'11111100'

movwf TRISA ; TRISA=B'11111100'pinos configurados como entradas e PA.1 e PA.0 como saídas

movlw B'11011000' ; w=11011000b

movwf OPTION_REG ; OPTION=w ,|RPBU\=1|INTEDEG=1|TOCS=0|TOSE=1|PSA=1|PS2=0|PS1=0|PS0=0|==>ler

reg. p/ saber a config.

bcf STATUS, RP0 ; clear bit RP0, seleciono banco 0

movlw 7 ; w=B'00000111'

movwf CMCON ; cmcon=w, desligo o comparador analógico (o reset não faz isso)

movlw 0 ; w=0

movwf CCP1CON ; CCP1CON=W=, desliga o módulo CCP (o reset faz isso, mas forçar o sinal por garantia)

movwf PORTB ; zero as saídas do PORTB (PORTB=w=0)

movwf PORTA ; zero as saídas do PORTA

;--------------------------------------------------------------------------------

; programa principal - aplicação

;--------------------------------------------------------------------------------

principal: ;inicialização do display LCD

bcf PORTA,con0 ; portA P0=0, RS=0 ,LCD recebe instrução

movlw 0x38 ; w=38h

movwf PORTB ; portB=instrução 38 p/ o LCD

call tempo ; rotina de 20mS

movlw 0x38 ;

movwf PORTB ; Verificar tabela de configuração LCD

call tempo ;

movlw 0x06 ; w=o6h

movwf PORTB ; portB=inst. 06 p/ o LCD

call tempo

movlw 0x0E ; w=0Eh

movwf PORTB ; portB=inst. 0E p/ o LCD

call tempo

movlw 0x01 ; w=01h

movwf PORTB ; portB=inst. 01 p/ o LCD

call tempo

movlw 0x80 ; w=80h

movwf PORTB ; portB=inst. 80 p/ o LCD, iniciar na 1.linha

; e 1.coluna do LCD

call time ; rotina de 40uS (pode ter tempo menor p/esta inst.)

esc1: ; rotina de escrita na primeira linha do LCD

bcf PORTA,con0

movlw 0x84 ; cursor na coluna 84 da linha 1

movwf PORTB

call time

bsf PORTA,con0 ; portA P0=1, RS=1 , LCD recebe dados

Page 21: AUTOR Maurício Madeira Oliveira Página pessoal (fonte ...seguidorsolar.com.br/obras/Microcontrolador4.pdf · AUTOR Maurício Madeira Oliveira Página pessoal (fonte): Este curso

movlw 0x43 ; letra C

movwf PORTB

call time

movlw U

movwf PORTB

call time

movlw R

movwf PORTB

call time

movlw S

movwf PORTB

call time

movlw O

movwf PORTB

call time

movlw 0x20

movwf PORTB

call time

movlw D

movwf PORTB

call time

movlw E

movwf PORTB

call time

movlw 0x20

movwf PORTB

call time

bcf PORTA,con0 ; porta P0=0, RS=0 , LCD recebe inst.

movlw 0x0C0 ; w=C0h

movwf PORTB ; cursor vai p/2.linha, 1.coluna do LCD

call time

bsf PORTA,con0

movlw M

movwf PORTB

call time

movlw I

movwf PORTB

call time

movlw 0x43

movwf PORTB

call time

movlw R

movwf PORTB

call time

movlw O

movwf PORTB

call time

movlw 0x43

movwf PORTB

call time

movlw O

Page 22: AUTOR Maurício Madeira Oliveira Página pessoal (fonte ...seguidorsolar.com.br/obras/Microcontrolador4.pdf · AUTOR Maurício Madeira Oliveira Página pessoal (fonte): Este curso

movwf PORTB

call time

movlw N

movwf PORTB

call time

movlw T

movwf PORTB

call time

movlw R

movwf PORTB

call time

movlw O

movwf PORTB

call time

movlw L

movwf PORTB

call time

movlw A

movwf PORTB

call time

movlw D

movwf PORTB

call time

movlw O

movwf PORTB

call time

movlw R

movwf PORTB

call time

; goto principal ; ou a linha ==> aqui: .....

aqui: goto aqui

;---------------------------------------------------------------------------------

; Rotinas de tempo

;---------------------------------------------------------------------------------

tempo: ; rotina de +/- 20mS

bsf PORTA,con1 ; gera sinal (alto) p/ CS do LCD

bcf PORTA,con1 ; gera sinal (low ) p/ CS do LCD

movlw 250 ; w=250d, 1uS

movwf x ; x=w , 1uS

temp1:

movlw 18 ; 1uS

movwf y ; 1uS

temp2:

nop ; 1uS

decfsz y ; decrementa y de 1,se>0 exec.prox.inst.

goto temp2 ; se=0 salta prox.inst.

decfsz x ; 1uS

Page 23: AUTOR Maurício Madeira Oliveira Página pessoal (fonte ...seguidorsolar.com.br/obras/Microcontrolador4.pdf · AUTOR Maurício Madeira Oliveira Página pessoal (fonte): Este curso

goto temp1 ; 1uS

return ; 1uS

time: ; rontina de +/- 40uS

bsf PORTA,con1 ; gera sinal (alto) p/ CS do LCD

bcf PORTA,con1 ; gera sinal (low ) p/ CS do LCD

movlw 38 ; w=38d

movwf x

tim1:

nop

decfsz x

goto tim1

return

end

6.8 Acionamento de Display LCD com palavra de 4 bits.

Neste exemplo, o módulo de LCD será controlado com palavras de 4 bits. O código

em assembler é listado e novos comandos da família PIC são utilizados. Também é visto na

Figura 8 o circuito que economiza 4 pinos do microcontrolador. É utilizado um dos pinos do

PORTB para acionar um LED temporizado, que liga por +/- 2 segundos e após desligar o

programa escreve no módulo LCD. As informações para o módulo são transmitidas de 4 em 4

bits (nibles), sendo enviado primeiro os 4 bits mais significativos e após os demais (4 bits

menos significativos), sempre nesta ordem.

Page 24: AUTOR Maurício Madeira Oliveira Página pessoal (fonte ...seguidorsolar.com.br/obras/Microcontrolador4.pdf · AUTOR Maurício Madeira Oliveira Página pessoal (fonte): Este curso

(09)RB3(07)RB1(08)RB2(06)RB0(10)RB4(11)RB5(12)RB6(13)RB7

(17)RA0(18)RA1

........... B7B0ER/WRSCnteVss

Vdd

14131211109876543

2

1

MÓDULO LCD

MCLR\(4)

(5)Vss

PIC 16F628A

(14)Vdd

(15) (16) Clk-in Clk-out

D1LED1

R110k 40%

S1

D21N4148

+C3

10uF

C233pF

C133pF

XTAL14.000MHZ

+V

V15V

R3390R

R210k

Figura 8 – Módulo LCD ativado com palavra de 4 bit’s.

A forma e a mensagem escrita no módulo LCD é verificada na Figura 9.

Figura 9 – Mensagem escrita no módulo LCD.

C U R S O

P I C 1 6 F 6 2 8