manual pi cmicro_exemplos___senaeng.com
Post on 30-Jul-2015
187 Views
Preview:
TRANSCRIPT
antó
nio
sérg
io s
ena
microcontroladoresPIC
-Exemplos práticos e exercícios
antó
nio
sérg
io s
ena
microcontroladoresPIC
-Exemplos práticos e exercícios
microcontroladores PIC Exemplos Práticos
antónio sérgio senawww.senaeng.com : : soluções em electrónica e microcontroladores+351.967033209 3
Índice de Conteúdos
Registo Temporário W ................................................................................................................3
Confi guração das portas do PIC .................................................................................................5
Activação dos pinos da porta B ...................................................................................................7
Activação dos pinos da porta B, 2 .............................................................................................10
Conversão numérica, Tabelas ....................................................................................................14
Conversão numérica, Tabelas 2 .................................................................................................15
Conversão numérica, Tabelas 3 .................................................................................................17
Endereçamento Indirecto da RAM ..........................................................................................19
Endereçamento Indirecto da RAM, 2 ......................................................................................20
Rotinas de atraso, Temporizadores ...........................................................................................22
Rotinas de atraso, Temporizadores, 2 .......................................................................................24
Rotinas de atraso, Temporizadores, 3 .......................................................................................27
Contador ......................................................................................................................................30
Contador, 2 ..................................................................................................................................34
Contador, 3 ..................................................................................................................................37
Conversão de valores, Tabelas, 7-segmentos ............................................................................40
Conversão de valores, Tabelas, 2 ...............................................................................................43
Conversão de valores, Tabelas, 3 ...............................................................................................47
Conversão de valores, Tabelas, 4 ...............................................................................................50
Conversão de valores, Tabelas, 5 ...............................................................................................55
Conversão de valores, Tabelas, 6 ...............................................................................................61
PWM ...........................................................................................................................................67
PWM, 2 .......................................................................................................................................70
Interrupções .................................................................................................................................73
Interrupções, 2.............................................................................................................................76
microcontroladores PIC Exemplos Práticos
antónio sérgio senawww.senaeng.com : : soluções em electrónica e microcontroladores+351.967033209 4
LCD .............................................................................................................................................79
LCD, 2 .........................................................................................................................................82
LCD, 3 .........................................................................................................................................86
Biblioteca para o LCD ................................................................................................................91
EUSART - Porta Série ..............................................................................................................95
EUSART - Porta Série, 2 ..........................................................................................................98
EUSART - Porta Série, 3 ....................................................................................................... 102
EUSART - Porta Série, 4 ....................................................................................................... 106
Comparadores .......................................................................................................................... 109
Comparadores, 2 ...................................................................................................................... 112
Conversor A/D ........................................................................................................................ 115
Conversor A/D, 2 .................................................................................................................... 118
microcontroladores PIC Exemplos Práticos
antónio sérgio senawww.senaeng.com : : soluções em electrónica e microcontroladores+351.967033209 5
Registo Temporário W
Este programa faz o carregamento do Registo Temporário W.
Fluxograma do programa
Exem
plo 1
microcontroladores PIC Exemplos Práticos
antónio sérgio senawww.senaeng.com : : soluções em electrónica e microcontroladores+351.967033209 6
Código fonte do programa
;#################################################################################
; Este programa faz o carregamento do Registo Temporário W, PIC16F886
; v1.0 01/02/2004
; Autor: António Sérgio Sena, www.senaeng.com
;#################################################################################
processor 16F886 ;confi gura o tipo de CPU usado
radix hex ;pre-defi nicao do tipo de valores numericos usados
;------------------------
inicio ;INICIO do programa
movlw 0x0F ;carrega W com o valor 0x0F
movlw 0x0A ;carrega W com o valor 0x0A
movlw 0x0D ;carrega W com o valor 0x0D
movlw 0x04 ;carrega W com o valor 0x04
movlw 0x33 ;carrega W com o valor 0x33
goto inicio
;------------------------
end
Exem
plo 1
microcontroladores PIC Exemplos Práticos
antónio sérgio senawww.senaeng.com : : soluções em electrónica e microcontroladores+351.967033209 7
Confi guração das portas do PIC
Este programa faz a confi guração das portas do PIC.É auxiliado fazendo a mudança de bancos de memória, tendo acesso directo aos registos de confi guração.
Fluxograma do programa
Exem
plo 2
microcontroladores PIC Exemplos Práticos
antónio sérgio senawww.senaeng.com : : soluções em electrónica e microcontroladores+351.967033209 8
Código fonte do programa;#################################################################################
; Este programa faz a confi guração das portas do PIC, fazendo a mudança de
; bancos de memória
; v1.0 01/02/2008 PIC16F886
; Autor: António Sérgio Sena, www.senaeng.com
;#################################################################################
processor 16F886 ;confi gura o tipo de CPU usado
radix hex ;pre-defi nicao do tipo de valores numericos usados
;---------------------------
status equ 0x03 ;defi ne endereco 0x03 com o nome de STATUS
trisb equ 0x86 ;defi ne endereco 0x86 com o nome de TRISB
;---------------------------
inicio ;INICIO do programa
bsf status,5 ;activa bit 5 do registo STATUS, BANCO 1
movlw 0x02 ;carrega W com o 0x02
movwf trisb ;move de W para TRISB
bcf status,5 ;desactiva bit 5 do registo STATUS, BANCO 0
bsf status,5 ;activa bit 5 do registo STATUS , BANCO 1
movlw 0xF0 ;carrega W como 0xF0
movwf trisb ;move de W para TRISB
bcf status,5 ;desactiva bit 5 do registo STATUS, BANCO 0
goto inicio ;retorna ao label INICIO
;---------------------------
end
Exem
plo 2
microcontroladores PIC Exemplos Práticos
antónio sérgio senawww.senaeng.com : : soluções em electrónica e microcontroladores+351.967033209 9
Activação dos pinos da porta B
Este programa activa os pinos da porta B, consoante o valor que lhe é carregado no registo PORTB.
Fluxograma do programa
Exem
plo 3
microcontroladores PIC Exemplos Práticos
antónio sérgio senawww.senaeng.com : : soluções em electrónica e microcontroladores+351.967033209 10
Esquema eléctrico
Exem
plo 3
microcontroladores PIC Exemplos Práticos
antónio sérgio senawww.senaeng.com : : soluções em electrónica e microcontroladores+351.967033209 11
Código fonte do programa;#################################################################################
; Este programa activa os pinos da porta B, consoante o valor que lhe é carregado
; v1.0 01/02/2008 PIC16F886; Autor: António Sérgio Sena, www.senaeng.com;#################################################################################
processor 16F886 ;confi gura o tipo de CPU usado radix hex ;pre-defi nicao do tipo de valores numericos usados include “P16F886.inc” ;inclui pre-defi nicoes do processador
__confi g _CONFIG1, _DEBUG_OFF & _LVP_OFF & _FCMEN_OFF & _IESO_OFF & _BOR_OFF & _CPD_OFF & _CP_OFF & _MCLRE_ON & _PWRTE_ON & _WDT_OFF & _INTRC_OSC_NOCLKOUT __confi g _CONFIG2, _WRT_OFF & _BOR40V
;---------------------------
org 0x0000 ;aponta para o endereço de memoria 0x0000 principal ;INICIO do programa ;confi gura toda a porta A para entrada/saida DIGITAL banksel ANSEL ;muda para o banco onde está o registo ANSEL clrf ANSEL ;limpa o registo ANSEL clrf ANSELH ;limpa o registo ANSELH
;confi gura portas A e B como entradas/saidas banksel TRISA ;muda para banco onde está o registo TRISA movlw 0x00 ;carrega W como 0x00 - 0=output e 1=input movwf TRISA ;move de W para TRISA movlw 0x00 ;carrega W como 0x00 movwf TRISB ;move de W para TRISB movlw 0x00 ;carrega W como 0x00 movwf TRISC ;move de W para TRISC banksel PORTB ;retorna ao banco 0
movlw 0xFF ;carrega W com o 0xFF bin: 1111 1111 movwf PORTB ;move de W para PORTB; movlw 0x44 ;carrega W com o 0x44 bin: 0100 0100; movwf PORTB ;move de W para PORTB
loop goto loop ;retorna ao INICIO ;--------------------------- end
Exem
plo 3
microcontroladores PIC Exemplos Práticos
antónio sérgio senawww.senaeng.com : : soluções em electrónica e microcontroladores+351.967033209 12
Activação dos pinos da porta B, 2(com pressão de tecla no pino RA0)
Este programa activa os pinos da porta B, consoante o valor que lhe é carregado no registo PORTB, quando a tecla que está ligada no pino RA0 é premida.
Fluxograma do programa
Exem
plo 4
microcontroladores PIC Exemplos Práticos
antónio sérgio senawww.senaeng.com : : soluções em electrónica e microcontroladores+351.967033209 13
Esquema eléctrico
Exem
plo 4
microcontroladores PIC Exemplos Práticos
antónio sérgio senawww.senaeng.com : : soluções em electrónica e microcontroladores+351.967033209 14
Código fonte do programa;#################################################################################
; Este programa activa todos os pinos da porta B, quando a tecla da entrada
; RA0 está premida
; v1.0 01/02/2008 PIC16F886
; Autor: António Sérgio Sena, www.senaeng.com
;#################################################################################
processor 16F886 ;confi gura o tipo de CPU usado
radix hex ;pre-defi nicao do tipo de valores numericos usados
include “P16F886.inc” ;inclui pre-defi nicoes do processador
__confi g _CONFIG1, _DEBUG_OFF & _LVP_OFF & _FCMEN_OFF & _IESO_OFF & _BOR_OFF &
_CPD_OFF & _CP_OFF & _MCLRE_ON & _PWRTE_ON & _WDT_OFF & _INTRC_OSC_NOCLKOUT
__confi g _CONFIG2, _WRT_OFF & _BOR40V
;---------------------------
org 0x0000 ;aponta para o endereço de memoria 0x0000
principal ;INICIO do programa
;confi gura toda a porta A para entrada/saida DIGITAL
banksel ANSEL ;muda para o banco onde está o registo ANSEL
clrf ANSEL ;limpa o registo ANSEL
clrf ANSELH ;limpa o registo ANSELH
;confi gura portas A e B como entradas/saidas
banksel TRISA ;muda para banco onde está o registo TRISA
movlw 0x01 ;carrega W com o 0x01
movwf TRISA ;move de W para TRISA
movlw 0x00 ;carrega W com o 0x00
movwf TRISB ;move de W para TRISB
movlw 0x00 ;carrega W com o 0x00
movwf TRISC ;move de W para TRISC
banksel PORTA ;muda para banco onde está o registo PORTA
apagar
clrf PORTB ;desliga toda a porta B
inicio
btfsc PORTA, 0 ;testa se a tecla em RA0 está premida
goto apagar ; não
Exem
plo 4
microcontroladores PIC Exemplos Práticos
antónio sérgio senawww.senaeng.com : : soluções em electrónica e microcontroladores+351.967033209 15
;sim
movlw 0xFF ;carrega W com 0xFF (activa todos os pinos b’11111111’)
movwf PORTB ;move de W para PORTB
goto inicio ;retorna ao INICIO
;---------------------------
end
Exem
plo 4
microcontroladores PIC Exemplos Práticos
antónio sérgio senawww.senaeng.com : : soluções em electrónica e microcontroladores+351.967033209 16
Conversão numérica, Tabelas
Este programa converte de um valor numérico para outro valor numérico, através do uso de tabelas.
Código fonte do programa;#################################################################################
; Este programa converte de um valor numérico para outro valor numérico,
; através do uso de tabelas
; v1.0 01/02/2008 PIC16F886
; Autor: António Sérgio Sena, www.senaeng.com
;#################################################################################
processor 16F886 ;confi gura o tipo de CPU usado
radix hex ;pre-defi nicao do tipo de valores numericos usados
include “p16f886.inc”
;---------------------------
inicio
movlw 0x00 ;carrega W com 0
call tabela ;chama a subrotina da tabela, para converter o valor
movlw 0x04 ;carrega W com 4
call tabela ;chama a subrotina da tabela, para converter o valor
goto inicio
;---------------------------
; org 0x00fe ;endereco onde está a TABELA
tabela
addwf PCL, f ;adiciona W ao Program Counter - Contador de Programa
retlw ‘s’ ;caracter ASCII “s”
retlw ‘e’
retlw ‘n’
retlw ‘a’
retlw ‘e’
retlw ‘n’
retlw ‘g’
;---------------------------
end
Exem
plo 5
microcontroladores PIC Exemplos Práticos
antónio sérgio senawww.senaeng.com : : soluções em electrónica e microcontroladores+351.967033209 17
Conversão numérica, Tabelas 2
Este programa converte de um valor numérico para outro valor numérico, através do uso de tabelas.Resolve o problema de saltos de mais de 8 bits.
Código fonte do programa;#################################################################################
;
; Este programa converte de um valor numérico para outro valor numérico,
; através do uso de tabelas.
; Resolve o problema de saltos de mais de 8 bits.
;
; v1.0 01/02/2008 PIC16F886
; Autor: António Sérgio Sena, www.senaeng.com
;
;#################################################################################
processor 16F886 ;confi gura o tipo de CPU usado
radix hex ;pre-defi nicao do tipo de valores numericos usados
include “P16F886.inc” ;inclui pre-defi nicoes do processador
;---------------------------
pcl equ 0x02 ;defi ne endereco 0x02 com o nome de PCL
pclath equ 0x0a ;defi ne endereco 0x0A com o nome de PCLATH
;---------------------------
inicio
movlw HIGH tabela ;carrega W com byte alto do endereco da TABELA
movwf pclath ;move de W para PCLATH
movlw 0x01 ;carrega W com 0
call tabela ;chama a subrotina da tabela, para converter
fi m goto fi m
;---------------------------
; org 0x01aa ;endereco onde estah a TABELA
org 0x00ff
Exem
plo 6
microcontroladores PIC Exemplos Práticos
antónio sérgio senawww.senaeng.com : : soluções em electrónica e microcontroladores+351.967033209 18
tabela
addwf PCL, f ;adiciona W ao Program Counter - Contador de Programa
retlw ‘s’ ;caracter ASCII “s”
retlw ‘e’
retlw ‘n’
retlw ‘a’
retlw ‘e’
retlw ‘n’
retlw ‘g’
;---------------------------
end
Exem
plo 6
microcontroladores PIC Exemplos Práticos
antónio sérgio senawww.senaeng.com : : soluções em electrónica e microcontroladores+351.967033209 19
Conversão numérica, Tabelas 3
Este programa converte de um valor numérico para outro valor numérico, através do uso de tabelas.Resolve o problema de saltos de mais de 8 bits.
Código fonte do programa;#################################################################################
;
; Este programa converte de um valor numérico para outro valor numérico,
; através do uso de tabelas.
; Resolve o problema de saltos de mais de 8 bits.
;
; v1.0 01/02/2008 PIC16F886
; Autor: António Sérgio Sena, www.senaeng.com
;
;#################################################################################
processor 16F886 ;confi gura o tipo de CPU usado
radix hex ;pre-defi nicao do tipo de valores numericos usados
include “P16F886.inc” ;inclui pre-defi nicoes do processador
;---------------------------
offset equ 0x20 ;defi ne endereco 0x20 com o nome de OFFSET
;---------------------------
clrf offset ;limpa registo OFFSET
inicio
movlw 0x03 ;carrega W com valor que se pretende retirar da TABELA
movwf offset ;move valor de W para registo OFFSET
movlw LOW tabela ;carrega W com byte baixo do endereco da TABELA
addwf offset, w ;adiciona ao registo OFFSET e coloca o resultado em W,
; para verifi car se a aritmetica de adicao infl uenciou
; o bit de CARRY no registo STATUS
movlw HIGH tabela ;carrega W com byte alto do endereco da TABELA
btfsc STATUS, 0 ;testa o bit de Carry, no STATUS, para verifi car se
; houve salto de Ex.: 0xFF para 0x100
addlw 1 ;Carry activo, entao incrementa W em uma unidade
Exem
plo 7
microcontroladores PIC Exemplos Práticos
antónio sérgio senawww.senaeng.com : : soluções em electrónica e microcontroladores+351.967033209 20
movwf PCLATH ;move valor de W para PCLATH
movf offset, w ;move valor de OFFSET para o W
call tabela ;chama a subrotina da tabela, para converter
fi m goto fi m
;---------------------------
org 0x02fd ;endereco onde estah a TABELA
; org 0x01fe
tabela
addwf PCL, f ;adiciona W ao Program Counter - Contador de Programa
retlw ‘s’ ;caracter ASCII “s”
retlw ‘e’
retlw ‘n’
retlw ‘a’
retlw ‘e’
retlw ‘n’
retlw ‘g’
;---------------------------
end
Exem
plo 7
microcontroladores PIC Exemplos Práticos
antónio sérgio senawww.senaeng.com : : soluções em electrónica e microcontroladores+351.967033209 21
Endereçamento Indirecto da RAM
Este programa faz a exemplifi cação do endereçamento indirecto da memória RAM.
Código fonte do programa;#################################################################################
;
; Este programa faz a exemplifi cação do endereçamento indirecto da memória RAM
;
; v1.0 01/02/2008 PIC16F886
;
; Autor: António Sérgio Sena, www.senaeng.com
;
;#################################################################################
processor 16F886 ;confi gura o tipo de CPU usado
radix hex ;pre-defi nicao do tipo de valores numericos usados
include “P16F886.inc” ;inclui pre-defi nicoes do processador
;---------------------------
inicio ;INICIO do programa
movlw 0x20 ;carrega W com 0x20
movwf FSR ;coloca ponteiro na primeira posicao de RAM
volta
movlw 0x01 ;carrega W com 0x01
movwf INDF ;move de W para INDF
incf FSR, f ;incrementa ponteiro de posicao de RAM
goto volta ;retorna ao INICIO
;---------------------------
end ;fi m de programa
Exem
plo 8
microcontroladores PIC Exemplos Práticos
antónio sérgio senawww.senaeng.com : : soluções em electrónica e microcontroladores+351.967033209 22
Endereçamento Indirecto da RAM, 2
Este programa faz a limpeza da RAM, através do endereçamento indirecto
Código fonte do programa;#################################################################################
;
; Este programa faz a limpeza da RAM, através do endereçamento indirecto
;
; v1.0 01/02/2008 PIC16F886
;
; Autor: António Sérgio Sena, www.senaeng.com
;
;#################################################################################
processor 16F886 ;confi gura o tipo de CPU usado
radix hex ;pre-defi nicao do tipo de valores numericos usados
include “P16F886.inc” ;inclui pre-defi nicoes do processador
;---------------------------
inicio ;INICIO do programa
movlw 0x20 ;carrega W com 0x20
movwf FSR ;coloca ponteiro na primeira posição de RAM a ser usada
volta
clrf INDF ;limpa registo INDF, registo na RAM endereçado pelo FSR
incf FSR, f ;incrementa ponteiro de posição na RAM
;As quatro linhas seguintes, verifi cam se chegou ao fi m do banco de RAM.
;Subtrai o número correspondente à ultima posicao de RAM, e verifi ca se
; o bit Z (zero) do registo de STATUS foi alterado
movlw 0x70 ;carrega W com 0x70
subwf FSR, w ;subtrai valor em W ao FSR
btfss STATUS, Z ;testa se o resultado é igual a 0
goto volta ;ainda não
Exem
plo 9
microcontroladores PIC Exemplos Práticos
antónio sérgio senawww.senaeng.com : : soluções em electrónica e microcontroladores+351.967033209 23
;sim, é igual a 0
fi m goto fi m ;ciclo infi nito...
;---------------------------
end ;fi m de programa
Exem
plo 9
microcontroladores PIC Exemplos Práticos
antónio sérgio senawww.senaeng.com : : soluções em electrónica e microcontroladores+351.967033209 24
Rotinas de atraso, Temporizadores
Este programa faz um atraso de 1ms por rotinas de software.
Código fonte do programa;#################################################################################
;
; Este programa faz um atraso de 1ms por software
;
; v1.0 01/02/2008 PIC16F886
;
; Autor: António Sérgio Sena, www.senaeng.com
;
;#################################################################################
processor 16F886 ;confi gura o tipo de CPU usado
radix hex ;pre-defi nicao do tipo de valores numericos usados
include “P16F886.inc” ;inclui pre-defi nicoes do processador
;---------------------------
temp equ 0x20 ;defi ne endereco 0x20 com o nome de TEMP
;---------------------------
inicio
call atraso_500u ;chama rotina de atraso
call atraso_500u ;chama rotina de atraso
goto inicio ;faz temporizacao de novo
;---------------------------
atraso_500u
movlw 0xA5 ;carrega W com o valor 0xA5
movwf temp ;move valor em W para TEMP
decfsz temp, f ;decrementa TEMP em uma unidade, coloca resultado em TEMP
;e salta a instrucao seguinte, se o resultado for zero
goto $-1
Exem
plo 10
microcontroladores PIC Exemplos Práticos
antónio sérgio senawww.senaeng.com : : soluções em electrónica e microcontroladores+351.967033209 25
return ;sai fora da rotina de ATRASO
;---------------------------
end
Exem
plo 10
microcontroladores PIC Exemplos Práticos
antónio sérgio senawww.senaeng.com : : soluções em electrónica e microcontroladores+351.967033209 26
Rotinas de atraso, Temporizadores, 2
Este programa inverte todos os pinos da porta B, a cada 100ms. Faz o uso de temporizações por rotinas de software.
Esquema eléctrico
Exem
plo 11
microcontroladores PIC Exemplos Práticos
antónio sérgio senawww.senaeng.com : : soluções em electrónica e microcontroladores+351.967033209 27
Código fonte do programa;#################################################################################;; Este programa inverte todos os pinos da porta B, a cada 100ms;; v1.0 01/02/2008 PIC16F886;; Autor: António Sérgio Sena, www.senaeng.com;;#################################################################################
processor 16F886 ;confi gura o tipo de CPU usado radix hex ;pre-defi nicao do tipo de valores numericos usados include “P16F886.inc” ;inclui pre-defi nicoes do processador
__confi g _CONFIG1, _DEBUG_OFF & _LVP_OFF & _FCMEN_OFF & _IESO_OFF & _BOR_OFF & _CPD_OFF & _CP_OFF & _MCLRE_ON & _PWRTE_ON & _WDT_OFF & _INTRC_OSC_NOCLKOUT __confi g _CONFIG2, _WRT_OFF & _BOR40V
;---------------------------
temp equ 0x20 ;defi ne endereco 0x20 com o nome de TEMPtemp2 equ 0x21 ;defi ne endereco 0x21 com o nome de TEMP2
;---------------------------
inicio
;confi gura toda a porta A para entrada/saida DIGITAL banksel ANSEL ;muda para o banco onde está o registo ANSEL clrf ANSEL ;limpa o registo ANSEL clrf ANSELH ;limpa o registo ANSELH
;confi gura portas A e B como entradas/saidas banksel TRISA ;muda para banco onde está o registo TRISA
movlw 0x00 ;carrega W com 0x00, todos pinos porta A como saida movwf TRISA ;move de W para TRISA movlw 0x00 ;carrega W com 0x00, todos pinos porta A como saida movwf TRISB ;move de W para TRISB movlw 0x00 ;carrega W com 0x00, todos pinos porta C como saida movwf TRISC ;move de W para TRISC
banksel PORTA ;muda para banco onde está o registo PORTA
clrf PORTB ;desactiva todos os drivers de saída da porta B
Exem
plo 11
microcontroladores PIC Exemplos Práticos
antónio sérgio senawww.senaeng.com : : soluções em electrónica e microcontroladores+351.967033209 28
repete
movlw 0xFF ;carrega W com valor de 0xFF
xorwf PORTB, f ;inverte porta B (XOR, OU Exclusivo com o W)
call atraso_100m ;chama rotina de atraso
goto repete ;faz temporizacao de novo
;---------------------------
atraso_100m
movlw 0xC7 ;carrega W com o valor 0xC7
movwf temp2 ;move valor em W para TEMP
call atraso_500u ;
decfsz temp2, f ;decrementa TEMP em uma unidade, coloca resultado em TEMP
;e salta a instrucao seguinte, se o resultado for zero
goto $-2 ; salta para duas instrucoes anteriores
return ;sai fora da rotina de ATRASO
;---------------------------
atraso_500u
movlw 0xA5 ;carrega W com o valor 0xA5 f8
movwf temp ;move valor em W para TEMP
decfsz temp, f ;decrementa TEMP em uma unidade, coloca resultado em TEMP
;e salta a instrucao seguinte, se o resultado for zero
goto $-1 ;salta para uma instrucao anterior
return ;sai fora da rotina de ATRASO
;---------------------------
end
Exem
plo 11
microcontroladores PIC Exemplos Práticos
antónio sérgio senawww.senaeng.com : : soluções em electrónica e microcontroladores+351.967033209 29
Rotinas de atraso, Temporizadores, 3
Este programa inverte todos os pinos da porta B, a cada 100ms.Fas uso do TMR0 para gerar as temporizações.
Esquema eléctrico
Exem
plo 12
microcontroladores PIC Exemplos Práticos
antónio sérgio senawww.senaeng.com : : soluções em electrónica e microcontroladores+351.967033209 30
Código fonte do programa;#################################################################################
;
; Este programa inverte todos os pinos da porta B, a cada 100ms controlados
; pelo TMR0
;
; v1.0 01/02/2008 PIC16F886
;
; Autor: António Sérgio Sena, www.senaeng.com
;
;#################################################################################
processor 16F886 ;confi gura o tipo de CPU usado
radix hex ;pre-defi nicao do tipo de valores numericos usados
include “P16F886.inc” ;inclui pre-defi nicoes do processador
__confi g _CONFIG1, _DEBUG_OFF & _LVP_OFF & _FCMEN_OFF & _IESO_OFF & _BOR_OFF &
_CPD_OFF & _CP_OFF & _MCLRE_ON & _PWRTE_ON & _WDT_OFF & _INTRC_OSC_NOCLKOUT
__confi g _CONFIG2, _WRT_OFF & _BOR40V
;---------------------------
temp equ 0x20 ;defi ne endereco 0x20 com o nome de TEMP
temp2 equ 0x21 ;defi ne endereco 0x21 com o nome de TEMP2
;---------------------------
;confi gura toda a porta A para entrada/saida DIGITAL
banksel ANSEL ;muda para o banco onde está o registo ANSEL
clrf ANSEL ;limpa o registo ANSEL
clrf ANSELH ;limpa o registo ANSELH
;confi gura portas A e B como entradas/saidas
banksel TRISA ;muda para banco onde está o registo TRISA
movlw 0x00 ;carrega W como 0x00, todos pinos porta A como saida
movwf TRISA ;move de W para TRISA
movlw 0x00 ;carrega W como 0x00, todos pinos porta A como saida
movwf TRISB ;move de W para TRISB
movlw 0x00 ;carrega W com 0x00, todos pinos porta C como saida
movwf TRISC ;move de W para TRISC
movlw b’00000111’ ;carrega valor para W
movwf OPTION_REG ;move de W para registo OPTION
Exem
plo 12
microcontroladores PIC Exemplos Práticos
antónio sérgio senawww.senaeng.com : : soluções em electrónica e microcontroladores+351.967033209 31
clrf OSCCON ;comuta oscilador interno para 31kHz
banksel PORTA ;muda para banco onde está o registo PORTA
clrf PORTB ;desactiva todos os drivers de saída da porta B
inicio
;implementar ~250ms de temporizacao com o TMR0, com 256 de pre-divisao
movlw 0xF8 ;valor de contagem para fazer os ~250ms
movwf TMR0 ;carrega esse valor para o TMRO
btfss INTCON, 2 ;verifi ca se TMR0 chegou ao fi m, pelo bit 2 do INTCON, TMR0 overfl ow
goto $-1 ;ciclo até TMR0 chegar ao fi m
bcf INTCON, 2 ;limpa fl ag de TMR0 overfl ow
movlw 0xFF ;carrega W com 0xFF
xorwf PORTB, f ;inverte porta B (XOR, OU Exclusivo com o W)
goto inicio ;faz temporização de novo
;---------------------------
end
Exem
plo 12
microcontroladores PIC Exemplos Práticos
antónio sérgio senawww.senaeng.com : : soluções em electrónica e microcontroladores+351.967033209 32
Contador
Este programa faz contagem binária na porta B, incrementando a cada 500ms.Fas uso de rotinas de software, para gerar as temporizações.
Fluxograma do programa
Exem
plo 13
microcontroladores PIC Exemplos Práticos
antónio sérgio senawww.senaeng.com : : soluções em electrónica e microcontroladores+351.967033209 33
Esquema eléctrico
Exem
plo 13
microcontroladores PIC Exemplos Práticos
antónio sérgio senawww.senaeng.com : : soluções em electrónica e microcontroladores+351.967033209 34
Código fonte do programa;#################################################################################;; Este programa faz contagem binária na porta B, incrementando a cada 500ms;; v1.0 01/02/2008 PIC16F886;; Autor: António Sérgio Sena, www.senaeng.com;;#################################################################################
processor 16F886 ;confi gura o tipo de CPU usado radix hex ;pre-defi nicao do tipo de valores numericos usados include “P16F886.inc” ;inclui pre-defi nicoes do processador
__confi g _CONFIG1, _DEBUG_OFF & _LVP_OFF & _FCMEN_OFF & _IESO_OFF & _BOR_OFF & _CPD_OFF & _CP_OFF & _MCLRE_ON & _PWRTE_ON & _WDT_OFF & _INTRC_OSC_NOCLKOUT __confi g _CONFIG2, _WRT_OFF & _BOR40V
;---------------------------
temp equ 0x20 ;defi ne endereco 0x20 com o nome de TEMPtemp2 equ 0x21 ;defi ne endereco 0x21 com o nome de TEMP2temp3 equ 0x22 ;defi ne endereco 0x22 com o nome de TEMP3
;---------------------------
org 0x0000
;confi gura toda a porta A para entrada/saida DIGITAL banksel ANSEL ;muda para o banco onde está o registo ANSEL clrf ANSEL ;limpa o registo ANSEL clrf ANSELH ;limpa o registo ANSELH
;confi gura portas A e B como entradas/saidas banksel TRISA ;muda para banco onde está o registo TRISA
movlw 0x00 ;carrega W como 0x00 movwf TRISA ;move de W para TRISA movlw 0x00 ;carrega W como 0x00 movwf TRISB ;move de W para TRISB movlw 0x00 ;carrega W com 0x00, todos pinos porta C como saida movwf TRISC ;move de W para TRISC
banksel PORTA ;muda para banco onde está o registo PORTA
clrf temp3 ;limpa registo contador
Exem
plo 13
microcontroladores PIC Exemplos Práticos
antónio sérgio senawww.senaeng.com : : soluções em electrónica e microcontroladores+351.967033209 35
inicio movf temp3, w ;carrega W com valor de TEMP3 movwf PORTB ;move valor de W para porta B ;incrementa e mostra a cada 500ms call atraso_100m ;faz atraso de 100ms call atraso_100m ;faz atraso de 100ms call atraso_100m ;faz atraso de 100ms call atraso_100m ;faz atraso de 100ms call atraso_100m ;faz atraso de 100ms incf temp3, f ;incrementa TEMP3 em uma unidade, e coloca o resultado em TEMP3
goto inicio ;faz temporizacao de novo
;---------------------------
atraso_100m movlw 0xC3 ;carrega W com o valor 0xC3 movwf temp2 ;move valor em W para TEMP
call atraso_500u ; decfsz temp2, f ;decrementa TEMP em uma unidade, coloca resultado em TEMP ;e salta a instrucao seguinte, se o resultado for zero goto $-2
return ;sai fora da rotina de ATRASO
;---------------------------
atraso_500u movlw 0x28 ;carrega W com o valor 0x28 movwf temp ;move valor em W para TEMP
decfsz temp, f ;decrementa TEMP em uma unidade, coloca resultado em TEMP ;e salta a instrucao seguinte, se o resultado for zero goto $-1 ; return ;sai fora da rotina de ATRASO
;---------------------------
end
Exem
plo 13
microcontroladores PIC Exemplos Práticos
antónio sérgio senawww.senaeng.com : : soluções em electrónica e microcontroladores+351.967033209 36
Contador, 2
Este programa faz contagem binária na porta B, incrementando a cada pulso externo que chega ao TMR0 pelo pino RA4.
Esquema eléctrico
Exem
plo 14
microcontroladores PIC Exemplos Práticos
antónio sérgio senawww.senaeng.com : : soluções em electrónica e microcontroladores+351.967033209 37
Código fonte do programa;#################################################################################
;
; Este programa faz contagem binária na porta B, incrementando a cada pulso
; externo que chega ao TMR0 pelo pino RA4.
;
; v1.0 01/02/2008 PIC16F886
;
; Autor: António Sérgio Sena, www.senaeng.com
;
;#################################################################################
processor 16F886 ;confi gura o tipo de CPU usado
radix hex ;pre-defi nicao do tipo de valores numericos usados
include “P16F886.inc” ;inclui pre-defi nicoes do processador
__confi g _CONFIG1, _DEBUG_OFF & _LVP_OFF & _FCMEN_OFF & _IESO_OFF & _BOR_OFF &
_CPD_OFF & _CP_OFF & _MCLRE_ON & _PWRTE_ON & _WDT_OFF & _INTRC_OSC_NOCLKOUT
__confi g _CONFIG2, _WRT_OFF & _BOR40V
;---------------------------
org 0x0000
;confi gura toda a porta A para entrada/saida DIGITAL
banksel ANSEL ;muda para o banco onde está o registo ANSEL
clrf ANSEL ;limpa o registo ANSEL
clrf ANSELH ;limpa o registo ANSELH
;confi gura portas A e B como entradas/saidas
banksel TRISA ;muda para banco onde está o registo TRISA
movlw 0x10 ;carrega W como 0x10, RA4 como entrada
movwf TRISA ;move de W para TRISA
movlw 0x00 ;carrega W como 0x00, todos os pinos como saida
movwf TRISB ;move de W para TRISB
movlw 0x00 ;carrega W com 0x00, todos pinos porta C como saida
movwf TRISC ;move de W para TRISC
movlw b’00111000’ ;carrega valor para W
movwf OPTION_REG ;move de W para registo OPTION
banksel PORTA ;muda para banco onde está o registo PORTA
clrf TMR0 ;limpa contador do TMR0
Exem
plo 14
microcontroladores PIC Exemplos Práticos
antónio sérgio senawww.senaeng.com : : soluções em electrónica e microcontroladores+351.967033209 38
inicio
movf TMR0, w ;carrega W com valor de TMR0
movwf PORTB ;move valor de W para porta B
goto inicio ;faz temporizacao de novo
;---------------------------
end
Exem
plo 14
microcontroladores PIC Exemplos Práticos
antónio sérgio senawww.senaeng.com : : soluções em electrónica e microcontroladores+351.967033209 39
Contador, 3
Este programa faz contagem binária na porta B, incrementando a cada pulso externo que chega ao TMR0 pelo pino RA4.Quando atinge o valor de 100, limpa o contador TMR0, e começa do início (zero).
Fluxograma do programa
Exem
plo 15
microcontroladores PIC Exemplos Práticos
antónio sérgio senawww.senaeng.com : : soluções em electrónica e microcontroladores+351.967033209 40
Código fonte do programa;#################################################################################
;
; Este programa faz contagem binária na porta B, incrementando a cada pulso
; externo que chega ao TMR0 pelo pino RA4.
; Quando atinge o valor de 100, limpa o contador TMR0, e começa de novo.
;
; v1.0 01/02/2008 PIC16F886
;
; Autor: António Sérgio Sena, www.senaeng.com
;
;#################################################################################
processor 16F886 ;confi gura o tipo de CPU usado
radix hex ;pre-defi nicao do tipo de valores numericos usados
include “P16F886.inc” ;inclui pre-defi nicoes do processador
__confi g _CONFIG1, _DEBUG_OFF & _LVP_OFF & _FCMEN_OFF & _IESO_OFF & _BOR_OFF &
_CPD_OFF & _CP_OFF & _MCLRE_ON & _PWRTE_ON & _WDT_OFF & _INTRC_OSC_NOCLKOUT
__confi g _CONFIG2, _WRT_OFF & _BOR40V
;---------------------------
org 0x0000
;confi gura toda a porta A para entrada/saida DIGITAL
banksel ANSEL ;muda para o banco onde está o registo ANSEL
clrf ANSEL ;limpa o registo ANSEL
clrf ANSELH ;limpa o registo ANSELH
;confi gura portas A e B como entradas/saidas
banksel TRISA ;muda para banco onde está o registo TRISA
movlw 0x10 ;carrega W como 0x10, RA4 como entrada
movwf TRISA ;move de W para TRISA
movlw 0x00 ;carrega W como 0x00, todos os pinos como saida
movwf TRISB ;move de W para TRISB
movlw 0x00 ;carrega W com 0x00, todos pinos porta C como saida
movwf TRISC ;move de W para TRISC
movlw b’00111000’ ;carrega valor para W
movwf OPTION_REG ;move de W para registo OPTION
Exem
plo 15
microcontroladores PIC Exemplos Práticos
antónio sérgio senawww.senaeng.com : : soluções em electrónica e microcontroladores+351.967033209 41
banksel PORTA ;muda para banco onde está o registo PORTA
limpar
clrf TMR0 ;limpa contador do TMR0
inicio
movf TMR0, w ;carrega W com valor do TMR0
movwf PORTB ;move valor de W para porta B
;com o resultado do carregamento do W, o bit Z do STATUS poderá ser alterado,
; que indica se a operação foi resultado ZERO, ou não
sublw .100 ;testar se é maior que 100
btfsc STATUS, 2 ;o resultado foi 0 ?
goto limpar ; sim
goto inicio ;nao, continua a visualização e testes
;---------------------------
end
Exem
plo 15
microcontroladores PIC Exemplos Práticos
antónio sérgio senawww.senaeng.com : : soluções em electrónica e microcontroladores+351.967033209 42
Conversão de valores, Tabelas, 7-segmentos
Este programa faz a conversão de um número binário, para o mesmo poder ser visualisado num mostrador de 7-segmentos.
Esquema eléctrico
Exem
plo 16
microcontroladores PIC Exemplos Práticos
antónio sérgio senawww.senaeng.com : : soluções em electrónica e microcontroladores+351.967033209 43
Código fonte do programa;#################################################################################
;
; Este programa faz a conversão de um número binário, para o mesmo poder
; ser visualisado num mostrador de 7-segmentos
;
; v1.0 01/02/2008 PIC16F886
;
; Autor: António Sérgio Sena, www.senaeng.com
;
;#################################################################################
processor 16F886 ;confi gura o tipo de CPU usado
radix hex ;pre-defi nicao do tipo de valores numericos usados
include “P16F886.inc” ;inclui pre-defi nicoes do processador
__confi g _CONFIG1, _DEBUG_OFF & _LVP_OFF & _FCMEN_OFF & _IESO_OFF & _BOR_OFF &
_CPD_OFF & _CP_OFF & _MCLRE_ON & _PWRTE_ON & _WDT_OFF & _INTRC_OSC_NOCLKOUT
__confi g _CONFIG2, _WRT_OFF & _BOR40V
;---------------------------
org 0x0000
;confi gura toda a porta A para entrada/saida DIGITAL
banksel ANSEL ;muda para o banco onde está o registo ANSEL
clrf ANSEL ;limpa o registo ANSEL
clrf ANSELH ;limpa o registo ANSELH
;confi gura portas A e B como entradas/saidas
banksel TRISA ;muda para banco onde está o registo TRISA
movlw 0x10 ;carrega W como 0x10, RA4 como entrada
movwf TRISA ;move de W para TRISA
movlw 0x00 ;carrega W como 0x00, todos os pinos como saida
movwf TRISB ;move de W para TRISB
movlw 0x00 ;carrega W com 0x00, todos pinos porta C como saida
movwf TRISC ;move de W para TRISC
banksel PORTA ;muda para banco onde está o registo PORTA
inicio
Exem
plo 16
microcontroladores PIC Exemplos Práticos
antónio sérgio senawww.senaeng.com : : soluções em electrónica e microcontroladores+351.967033209 44
bsf PORTA, 0 ;activa RA0, 7-segmento 1
movlw 0x0b ;carrega valor numerico
call tabela ;chama tabela com o valor a ler
movwf PORTB ;carrega na porta B
goto inicio ;ciclo infi nito
;---------------------------
tabela
addwf PCL,f ;tabela de conversao para 7-segmentos
retlw b’00111111’ ;0
retlw b’00000110’ ;1
retlw b’01011011’ ;2
retlw b’01001111’ ;3
retlw b’01100110’ ;4
retlw b’01101101’ ;5
retlw b’01111101’ ;6
retlw b’00000111’ ;7
retlw b’01111111’ ;8
retlw b’01101111’ ;9
retlw b’01110111’ ;a
retlw b’01111100’ ;b
retlw b’01011000’ ;c
retlw b’01011110’ ;d
retlw b’01111001’ ;e
retlw b’01110001’ ;f
retlw 0
;---------------------------
end
Exem
plo 16
microcontroladores PIC Exemplos Práticos
antónio sérgio senawww.senaeng.com : : soluções em electrónica e microcontroladores+351.967033209 45
Conversão de valores, Tabelas, 2
Este programa faz a conversão de um número binário, para o mesmo poder ser visualisado num mostrador de 7-segmentos.
Faz contagem crescente de 0 a F, retornando a 0.
Esquema eléctrico
Exem
plo 17
microcontroladores PIC Exemplos Práticos
antónio sérgio senawww.senaeng.com : : soluções em electrónica e microcontroladores+351.967033209 46
Código fonte do programa;#################################################################################
;
; Este programa faz a conversão de um número binário, para o mesmo poder
; ser visualisado num mostrador de 7-segmentos
; Faz contagem crescente de 0 a F, retornando a 0.
;
; v1.0 01/02/2008 PIC16F886
;
; Autor: António Sérgio Sena, www.senaeng.com
;
;#################################################################################
processor 16F886 ;confi gura o tipo de CPU usado
radix hex ;pre-defi nicao do tipo de valores numericos usados
include “P16F886.inc” ;inclui pre-defi nicoes do processador
__confi g _CONFIG1, _DEBUG_OFF & _LVP_OFF & _FCMEN_OFF & _IESO_OFF & _BOR_OFF &
_CPD_OFF & _CP_OFF & _MCLRE_ON & _PWRTE_ON & _WDT_OFF & _INTRC_OSC_NOCLKOUT
__confi g _CONFIG2, _WRT_OFF & _BOR40V
;---------------------------
temp equ 0x20
temp2 equ 0x21
contador equ 0x22
;---------------------------
org 0x0000
;confi gura toda a porta A para entrada/saida DIGITAL
banksel ANSEL ;muda para o banco onde está o registo ANSEL
clrf ANSEL ;limpa o registo ANSEL
clrf ANSELH ;limpa o registo ANSELH
;confi gura portas A e B como entradas/saidas
banksel TRISA ;muda para banco onde está o registo TRISA
movlw 0x00 ;carrega W como 0x10
movwf TRISA ;move de W para TRISA
movlw 0x00 ;carrega W como 0x00, todos os pinos como saida
movwf TRISB ;move de W para TRISB
Exem
plo 17
microcontroladores PIC Exemplos Práticos
antónio sérgio senawww.senaeng.com : : soluções em electrónica e microcontroladores+351.967033209 47
movlw 0x00 ;carrega W com 0x00, todos pinos porta C como saida
movwf TRISC ;move de W para TRISC
banksel PORTA ;muda para banco onde está o registo PORTA
clrf PORTA ;desactiva todos os drivers da porta A
;---------------------------
inicio
bsf PORTA, 0 ;activa RA0, 7-segmento 1
clrf contador ;limpa registos temporarios
loop
movf contador, w ;carrega Contador para W
call tabela ;chama Tabela
iorlw 0
btfss STATUS, 2 ;testa se chegou ao fi m
goto mostra_no_display ;nao, mostra a conversao no mostrador 7segmentos
clrf contador ;limpa registos temporarios
goto loop ;faz contagem desde o inicio
mostra_no_display
movwf PORTB ;mostra no display
call atraso_100m ;faz um pequeno atraso
call atraso_100m ;faz um pequeno atraso
call atraso_100m ;faz um pequeno atraso
call atraso_100m ;faz um pequeno atraso
call atraso_100m ;faz um pequeno atraso
incf contador, f ;incrementa Contador
goto loop ;ciclo de amostragem
;---------------------------
tabela
addwf PCL,f ;tabela de conversao para 7-segmentos
retlw b’00111111’ ;0
retlw b’00000110’ ;1
Exem
plo 17
microcontroladores PIC Exemplos Práticos
antónio sérgio senawww.senaeng.com : : soluções em electrónica e microcontroladores+351.967033209 48
retlw b’01011011’ ;2
retlw b’01001111’ ;3
retlw b’01100110’ ;4
retlw b’01101101’ ;5
retlw b’01111101’ ;6
retlw b’00000111’ ;7
retlw b’01111111’ ;8
retlw b’01101111’ ;9
retlw b’01110111’ ;a
retlw b’01111100’ ;b
retlw b’01011000’ ;c
retlw b’01011110’ ;d
retlw b’01111001’ ;e
retlw b’01110001’ ;f
retlw 0
;---------------------------
atraso_100m
movlw 0xc5 ;carrega W com o valor 0xC5
movwf temp2 ;move valor em W para TEMP
call atraso_500u ;
decfsz temp2, f ;decrementa TEMP em uma unidade, coloca resultado em TEMP
;e salta a instrucao seguinte, se o resultado for zero
goto $-2
return ;sai fora da rotina de ATRASO
;---------------------------
atraso_500u
movlw 0xA5 ;carrega W com o valor 0xA0
movwf temp ;move valor em W para TEMP
decfsz temp, f ;decrementa TEMP em uma unidade, coloca resultado em TEMP
;e salta a instrucao seguinte, se o resultado for zero
goto $-1 ;
return ;sai fora da rotina de ATRASO
;---------------------------
end
Exem
plo 17
microcontroladores PIC Exemplos Práticos
antónio sérgio senawww.senaeng.com : : soluções em electrónica e microcontroladores+351.967033209 49
Conversão de valores, Tabelas, 3
Este programa faz a conversão de um número binário, para o mesmo poder ser visualisado num mostrador de 7-segmentos.Faz contagem crescente de 0 a F, retornando a 0.A contagem é feita com o TMR0 a receber pulsos externos por RA4.
Esquema eléctrico
Exem
plo 18
microcontroladores PIC Exemplos Práticos
antónio sérgio senawww.senaeng.com : : soluções em electrónica e microcontroladores+351.967033209 50
Código fonte do programa;#################################################################################
;
; Este programa faz a conversão de um número binário, para o mesmo poder
; ser visualisado num mostrador de 7-segmentos
; Faz contagem crescente de 0 a F, retornando a 0.
; A contagem é feita com o TMR0 a receber pulsos externos por RA4.
;
; v1.0 01/02/2008 PIC16F886
;
; Autor: António Sérgio Sena, www.senaeng.com
;
;#################################################################################
processor 16F886 ;confi gura o tipo de CPU usado
radix hex ;pre-defi nicao do tipo de valores numericos usados
include “P16F886.inc” ;inclui pre-defi nicoes do processador
__confi g _CONFIG1, _DEBUG_OFF & _LVP_OFF & _FCMEN_OFF & _IESO_OFF & _BOR_OFF &
_CPD_OFF & _CP_OFF & _MCLRE_ON & _PWRTE_ON & _WDT_OFF & _INTRC_OSC_NOCLKOUT
__confi g _CONFIG2, _WRT_OFF & _BOR40V
;---------------------------
org 0x0000
;confi gura toda a porta A para entrada/saida DIGITAL
banksel ANSEL ;muda para o banco onde está o registo ANSEL
clrf ANSEL ;limpa o registo ANSEL
clrf ANSELH ;limpa o registo ANSELH
;confi gura portas A e B como entradas/saidas
banksel TRISA ;muda para banco onde está o registo TRISA
movlw 0x10 ;carrega W como 0x10, RA4 entrada
movwf TRISA ;move de W para TRISA
movlw 0x00 ;carrega W como 0x00, todos os pinos como saida
movwf TRISB ;move de W para TRISB
movlw 0x00 ;carrega W com 0x00, todos pinos porta C como saida
movwf TRISC ;move de W para TRISC
movlw b’00111000’ ;carrega valor para W
movwf OPTION_REG ;move de W para registo OPTION
banksel PORTA ;muda para banco onde está o registo PORTA
Exem
plo 18
microcontroladores PIC Exemplos Práticos
antónio sérgio senawww.senaeng.com : : soluções em electrónica e microcontroladores+351.967033209 51
clrf PORTA ;desactiva todos os drivers da porta A
;---------------------------
inicio
bsf PORTA, 0 ;activa RA0, 7-segmento 1
clrf TMR0 ;limpa contador do TMR0
loop
movf TMR0, w ;carrega TMR0 para W
call tabela ;chama Tabela para converter
iorlw 0 ; OR de W com 0 (zero)
btfss STATUS, 2 ;testa se chegou ao fi m (testando a fl ag Z)
goto mostra_no_display ;nao, mostra no 7-segmentos
clrf TMR0 ;limpa contador do TMR0
goto loop ;faz contagem desde o inicio
mostra_no_display
movf TMR0, w ;carrega W com valor de TMR0
call tabela ;converte o valor na tabela
movwf PORTB ;move valor de W para porta B
goto loop ;ciclo de amostragem
;---------------------------
tabela
addwf PCL,f ;tabela de conversao para 7-segmentos
retlw b’00111111’ ;0
retlw b’00000110’ ;1
retlw b’01011011’ ;2
retlw b’01001111’ ;3
retlw b’01100110’ ;4
retlw b’01101101’ ;5
retlw b’01111101’ ;6
retlw b’00000111’ ;7
retlw b’01111111’ ;8
retlw b’01101111’ ;9
retlw 0
;---------------------------
end
Exem
plo 18
microcontroladores PIC Exemplos Práticos
antónio sérgio senawww.senaeng.com : : soluções em electrónica e microcontroladores+351.967033209 52
Conversão de valores, Tabelas, 4
Este programa faz a conversão de um número binário, para o mesmo poder ser visualisado num mostrador de 7-segmentos.São ligados quatro mostradores de 7-segmentos em paralelo, onde será usada a multiplexagem no tempo.Mostra quatro algarismos diferentes e estáticos.
Fluxograma do programa
Exem
plo 19
microcontroladores PIC Exemplos Práticos
antónio sérgio senawww.senaeng.com : : soluções em electrónica e microcontroladores+351.967033209 53
Esquema eléctrico
Exem
plo 19
microcontroladores PIC Exemplos Práticos
antónio sérgio senawww.senaeng.com : : soluções em electrónica e microcontroladores+351.967033209 54
Código fonte do programa;#################################################################################
;
; Este programa faz a conversão de um número binário, para o mesmo poder
; ser visualisado num mostrador de 7-segmentos
; São ligados quatro mostradores de 7-segmentos, onde será usada a
; multiplexagem no tempo.
; Mostra quatro algarismos diferentes e estáticos.
;
; v1.0 01/02/2008 PIC16F886
;
; Autor: António Sérgio Sena, www.senaeng.com
;
;#################################################################################
processor 16F886 ;confi gura o tipo de CPU usado
radix hex ;pre-defi nicao do tipo de valores numericos usados
include “P16F886.inc” ;inclui pre-defi nicoes do processador
__confi g _CONFIG1, _DEBUG_OFF & _LVP_OFF & _FCMEN_OFF & _IESO_OFF & _BOR_OFF &
_CPD_OFF & _CP_OFF & _MCLRE_ON & _PWRTE_ON & _WDT_OFF & _INTRC_OSC_NOCLKOUT
__confi g _CONFIG2, _WRT_OFF & _BOR40V
;---------------------------
temp equ 0x21 ;defi ne endereco 0x21 com o nome de TEMP
temp2 equ 0x22 ;defi ne endereco 0x22 com o nome de TEMP2
;---------------------------
org 0x0000
;confi gura toda a porta A para entrada/saida DIGITAL
banksel ANSEL ;muda para o banco onde está o registo ANSEL
clrf ANSEL ;limpa o registo ANSEL
clrf ANSELH ;limpa o registo ANSELH
;confi gura portas A e B como entradas/saidas
banksel TRISA ;muda para banco onde está o registo TRISA
movlw 0x00 ;carrega W como 0x00
movwf TRISA ;move de W para TRISA
movlw 0x00 ;carrega W como 0x00, todos os pinos como saida
movwf TRISB ;move de W para TRISB
Exem
plo 19
microcontroladores PIC Exemplos Práticos
antónio sérgio senawww.senaeng.com : : soluções em electrónica e microcontroladores+351.967033209 55
movlw 0x00 ;carrega W com 0x00, todos pinos porta C como saida
movwf TRISC ;move de W para TRISC
banksel PORTA ;muda para banco onde está o registo PORTA
inicio
;digito 1
clrf PORTA ;desliga displays
movlw 0x04 ;chama 4a posicao da tabela
call tabela
movwf PORTB ;carrega barramento porta B
bsf PORTA, 0 ;liga display 1
call atraso_5m
;digito 2
clrf PORTA ;desliga displays
movlw 0x03 ;chama 3a posicao da tabela
call tabela
movwf PORTB ;carrega barramento porta B
bsf PORTA, 1 ;liga display 2
call atraso_5m
;digito 3
clrf PORTA ;desliga disblays
movlw 0x02 ;chama 2a posicao da tabela
call tabela
movwf PORTB ;carrega barramento porta B
bsf PORTA, 2 ;liga display 1
call atraso_5m
;digito 4
clrf PORTA ;desliga disblays
movlw 0x01 ;chama 1a posicao da tabela
call tabela
movwf PORTB ;carrega barramento porta B
bsf PORTA, 3 ;liga display 2
call atraso_5m
goto inicio ;ciclo infi nito
;---------------------------
tabela
Exem
plo 19
microcontroladores PIC Exemplos Práticos
antónio sérgio senawww.senaeng.com : : soluções em electrónica e microcontroladores+351.967033209 56
addwf PCL,f ;tabela de conversao para 7-segmentos
retlw b’00111111’ ;0
retlw b’00000110’ ;1
retlw b’01011011’ ;2
retlw b’01001111’ ;3
retlw b’01100110’ ;4
retlw b’01101101’ ;5
retlw b’01111101’ ;6
retlw b’00000111’ ;7
retlw b’01111111’ ;8
retlw b’01101111’ ;9
retlw b’01110111’ ;a
retlw b’01111100’ ;b
retlw b’01011000’ ;c
retlw b’01011110’ ;d
retlw b’01111001’ ;e
retlw b’01110001’ ;f
retlw 0
;---------------------------
atraso_5m
movlw 0x0A ;carrega W com o valor 0x0A
movwf temp2 ;move valor em W para TEMP
call atraso_500u ;
decfsz temp2, f ;decrementa TEMP em uma unidade, coloca resultado em TEMP
;e salta a instrucao seguinte, se o resultado for zero
goto $-2
return ;sai fora da rotina de ATRASO
;---------------------------
atraso_500u
movlw 0xA5 ;carrega W com o valor 0xA5
movwf temp ;move valor em W para TEMP
decfsz temp, f ;decrementa TEMP em uma unidade, coloca resultado em TEMP
;e salta a instrucao seguinte, se o resultado for zero
goto $-1 ;
return ;sai fora da rotina de ATRASO
;---------------------------
end
Exem
plo 19
microcontroladores PIC Exemplos Práticos
antónio sérgio senawww.senaeng.com : : soluções em electrónica e microcontroladores+351.967033209 57
Conversão de valores, Tabelas, 5
Este programa faz a conversão de um número binário, para o mesmo poder ser visualisado num mostrador de 7-segmentos.São ligados quatro mostradores de 7-segmentos em paralelo, onde será usada a multiplexagem no tempo.Mostra contagem crescente de 0000 a 9999, retornando a 0000.
Esquema eléctrico
Exem
plo 20
microcontroladores PIC Exemplos Práticos
antónio sérgio senawww.senaeng.com : : soluções em electrónica e microcontroladores+351.967033209 58
Código fonte do programa;#################################################################################
;
; Este programa faz a conversão de um número binário, para o mesmo poder
; ser visualisado num mostrador de 7-segmentos.
; São ligados quatro mostradores de 7-segmentos, onde será usada a
; multiplexagem no tempo.
; Mostra contagem crescente de 0000 a 9999, retornando a 0000.
;
; v1.0 01/02/2008 PIC16F886
;
; Autor: António Sérgio Sena, www.senaeng.com
;
;#################################################################################
processor 16F886 ;confi gura o tipo de CPU usado
radix hex ;pre-defi nicao do tipo de valores numericos usados
include “P16F886.inc” ;inclui pre-defi nicoes do processador
__confi g _CONFIG1, _DEBUG_OFF & _LVP_OFF & _FCMEN_OFF & _IESO_OFF & _BOR_OFF &
_CPD_OFF & _CP_OFF & _MCLRE_ON & _PWRTE_ON & _WDT_OFF & _INTRC_OSC_NOCLKOUT
__confi g _CONFIG2, _WRT_OFF & _BOR40V
;---------------------------
CBLOCK 0x20
temp, temp2 ;variaveis usadas nos temporizadores
unidades, dezenas, centenas, milhares ;variaveis usadas para contador do digito
ENDC
;---------------------------
org 0x0000
;confi gura toda a porta A para entrada/saida DIGITAL
banksel ANSEL ;muda para o banco onde está o registo ANSEL
clrf ANSEL ;limpa o registo ANSEL
clrf ANSELH ;limpa o registo ANSELH
clrf PORTA ;desliga tristates da porta A
clrf PORTB ;desliga tristates da porta B
Exem
plo 20
microcontroladores PIC Exemplos Práticos
antónio sérgio senawww.senaeng.com : : soluções em electrónica e microcontroladores+351.967033209 59
;confi gura portas A e B como entradas/saidas
banksel TRISA ;muda para banco onde está o registo TRISA
movlw 0x00 ;carrega W com 0x00
movwf TRISA ;move de W para TRISA
movlw 0x00 ;carrega W com 0x00
movwf TRISB ;move de W para TRISB
movlw 0x00 ;carrega W com 0x00, todos pinos porta C como saida
movwf TRISC ;move de W para TRISC
banksel PORTA ;muda para banco onde está o registo PORTA
clrf PORTA ;desliga porta A
clrf PORTB ;desliga porta B
clrf unidades ;limpa variaveis
clrf dezenas
clrf centenas
clrf milhares
inicio
call mostra_digitos ;mostra contador nos digitos de 7-segmentos
incrementa_unidades
incf unidades, f ;incrementa a variavel das unidades
movf unidades, w ;carrega UNIDADES para o W
sublw .10 ;subtrai 10 ao W, para verifi car se incrementou para as dezenas
btfss STATUS, 2 ;testa a fl ag Z, verifi cando se houve resultado 0 aritmetico
goto inicio
clrf unidades
incrementa_dezenas
incf dezenas, f ;incrementa a variavel das dezenas
movf dezenas, w ;carrega DEZENAS para o W
sublw .10 ;subtrai 10 ao W, para verifi car se incrementou para as dezenas
btfss STATUS, 2 ;testa a fl ag Z, verifi cando se houve resultado 0 aritmetico
goto inicio
clrf dezenas
incrementa_centenas
incf centenas, f ;incrementa a variavel das centenas
movf centenas, w ;carrega CENTENAS para o W
sublw .10 ;subtrai 10 ao W, para verifi car se incrementou para as dezenas
Exem
plo 20
microcontroladores PIC Exemplos Práticos
antónio sérgio senawww.senaeng.com : : soluções em electrónica e microcontroladores+351.967033209 60
btfss STATUS, 2 ;testa a fl ag Z, verifi cando se houve resultado 0 aritmetico
goto inicio
clrf centenasincrementa_milhares
incf milhares, f ;incrementa a variavel dos milhares
movf milhares, w ;carrega MILHARES para o W
sublw .10 ;subtrai 10 ao W, para verifi car se incrementou para as dezenas
btfss STATUS, 2 ;testa a fl ag Z, verifi cando se houve resultado 0 aritmetico
goto inicio
clrf milhares
goto inicio ;ciclo infi nito
;---------------------------
tabela
addwf PCL,f ;tabela de conversao para 7-segmentos
retlw b’00111111’ ;0
retlw b’00000110’ ;1
retlw b’01011011’ ;2
retlw b’01001111’ ;3
retlw b’01100110’ ;4
retlw b’01101101’ ;5
retlw b’01111101’ ;6
retlw b’00000111’ ;7
retlw b’01111111’ ;8
retlw b’01101111’ ;9
retlw b’01110111’ ;a
retlw b’01111100’ ;b
retlw b’01011000’ ;c
retlw b’01011110’ ;d
retlw b’01111001’ ;e
retlw b’01110001’ ;f
retlw 0
;---------------------------
mostra_digitos ;mostra contador nos digitos de 7-segmentos
digito_1
clrf PORTA ;desliga dislays
movf unidades, w ;carrega valor das unidades
call tabela
movwf PORTB ;carrega barramento porta B
bsf PORTA, 0 ;liga display 1
Exem
plo 20
microcontroladores PIC Exemplos Práticos
antónio sérgio senawww.senaeng.com : : soluções em electrónica e microcontroladores+351.967033209 61
call atraso_5mdigito_2
clrf PORTA ;desliga dislays
movf dezenas, w ;carrega valor das dezenas
call tabela
movwf PORTB ;carrega barramento porta B
bsf PORTA, 1 ;liga display 2
call atraso_5m
digito_3
clrf PORTA ;desliga dislays
movf centenas, w ;carrega valor das centenas
call tabela
movwf PORTB ;carrega barramento porta B
bsf PORTA, 2 ;liga display 1
call atraso_5m
digito_4
clrf PORTA ;desliga dislays
movf milhares, w ;carrega valor dos milhares
call tabela
movwf PORTB ;carrega barramento porta B
bsf PORTA, 3 ;liga display 2
call atraso_5m
return
;---------------------------
atraso_5m
movlw 0x0A ;carrega W com o valor 0x0A
movwf temp2 ;move valor em W para TEMP
call atraso_500u ;
decfsz temp2, f ;decrementa TEMP em uma unidade, coloca resultado em TEMP
;e salta a instrucao seguinte, se o resultado for zero
goto $-2
Exem
plo 20
microcontroladores PIC Exemplos Práticos
antónio sérgio senawww.senaeng.com : : soluções em electrónica e microcontroladores+351.967033209 62
return ;sai fora da rotina de ATRASO
;---------------------------
atraso_500u
movlw 0xA5 ;carrega W com o valor 0xA5 movwf temp ;move valor
em W para TEMP
decfsz temp, f ;decrementa TEMP em uma unidade, coloca resultado em TEMP
;e salta a instrucao seguinte, se o resultado for zero
goto $-1 ;
return ;sai fora da rotina de ATRASO
;---------------------------
end
Exem
plo 20
microcontroladores PIC Exemplos Práticos
antónio sérgio senawww.senaeng.com : : soluções em electrónica e microcontroladores+351.967033209 63
Conversão de valores, Tabelas, 6
Este programa faz a conversão de um número binário, para o mesmo poder ser visualisado num mostrador de 7-segmentos.São ligados quatro mostradores de 7-segmentos, onde será usada a multiplexagem no tempo.Mostra contagem crescente de 0000 a 9999, retornando a 0000.A incrementação é feita com a ajuda de interrupções do TMR0.
Esquema eléctrico
Exem
plo 21
microcontroladores PIC Exemplos Práticos
antónio sérgio senawww.senaeng.com : : soluções em electrónica e microcontroladores+351.967033209 64
Código fonte do programa;#################################################################################;; Este programa faz a conversão de um número binário, para o mesmo poder; ser visualisado num mostrador de 7-segmentos.; São ligados quatro mostradores de 7-segmentos, onde será usada a ; multiplexagem no tempo.; Mostra contagem crescente de 0000 a 9999, retornando a 0000.; A incrementação é feita com a ajuda de interrupções do TMR0.;; v1.0 01/02/2008 PIC16F886;; Autor: António Sérgio Sena, www.senaeng.com;;#################################################################################
processor 16F886 ;confi gura o tipo de CPU usado radix hex ;pre-defi nicao do tipo de valores numericos usados include “P16F886.inc” ;inclui pre-defi nicoes do processador
__confi g _CONFIG1, _DEBUG_OFF & _LVP_OFF & _FCMEN_OFF & _IESO_OFF & _BOR_OFF & _CPD_OFF & _CP_OFF & _MCLRE_ON & _PWRTE_ON & _WDT_OFF & _INTRC_OSC_NOCLKOUT __confi g _CONFIG2, _WRT_OFF & _BOR40V
;---------------------------
CBLOCK 0x20 temp, temp2 ;variaveis usadas nos temporizadores w_temp, status_temp ;variaveis usadas para salvaguardar STATUS e W, ; quando se executa uma interrupcao unidades, dezenas, centenas, milhares ;variaveis usadas para contador do digito ENDC
;---------------------------
org 0x0000 ;vector de RESET
goto principal org 0x0004 ;vector de INTERRUPCAO
movwf w_temp ;guarda conteudo do W swapf STATUS, w ;guarda registo STATUS movwf status_temp ;
Exem
plo 21
microcontroladores PIC Exemplos Práticos
antónio sérgio senawww.senaeng.com : : soluções em electrónica e microcontroladores+351.967033209 65
call incrementa_contadores ;incrementa contadores em uma unidade movlw 0xFF ;carrega TMR0 com o valor maximo. Um impulso ; vai causar overfl ow e interrupcao movwf TMR0
swapf status_temp, w ;recarrega registo STATUS movwf STATUS swapf w_temp, f swapf w_temp, w ;recarrega W
bcf INTCON, 2 ;limpa fl ag de interrupcao por TMR0 retfi e ;sai da interrupcao ;--------------------------- org 0x0020
principal ;confi gura toda a porta A para entrada/saida DIGITAL banksel ANSEL ;muda para o banco onde está o registo ANSEL clrf ANSEL ;limpa o registo ANSEL clrf ANSELH ;limpa o registo ANSELH
clrf PORTA ;desliga tristates da porta A clrf PORTB ;desliga tristates da porta B ;confi gura portas A e B como entradas/saidas banksel TRISA ;muda para banco onde está o registo TRISA
movlw 0x10 ;carrega W com 0x10, RA4 movwf TRISA ;move de W para TRISA movlw 0x00 ;carrega W com 0x00 movwf TRISB ;move de W para TRISB movlw 0x00 ;carrega W com 0x00, todos pinos porta C como saida movwf TRISC ;move de W para TRISC
movlw b’00111000’ ;carrega valor para W movwf OPTION_REG ;move de W para registo OPTION
banksel PORTA ;muda para banco onde está o registo PORTA
clrf PORTA ;desliga porta A clrf PORTB ;desliga porta B movlw b’10100000’ ;Interrupcoes Gerais activas, interrupcao TMR0 activa movwf INTCON
clrf unidades ;limpa variaveis clrf dezenas clrf centenas
Exem
plo 21
microcontroladores PIC Exemplos Práticos
antónio sérgio senawww.senaeng.com : : soluções em electrónica e microcontroladores+351.967033209 66
clrf milhares
movlw 0xFF ;carrega TMR0 com o valor maximo. Um impulso vai causar ; overfl ow e interrupcao movwf TMR0
inicio call mostra_digitos ;mostra contador nos digitos de 7-segmentos
goto inicio ;ciclo infi nito
;---------------------------
tabela addwf PCL,f ;tabela de conversao para 7-segmentos retlw b’00111111’ ;0 retlw b’00000110’ ;1 retlw b’01011011’ ;2 retlw b’01001111’ ;3 retlw b’01100110’ ;4 retlw b’01101101’ ;5 retlw b’01111101’ ;6 retlw b’00000111’ ;7 retlw b’01111111’ ;8 retlw b’01101111’ ;9 retlw b’01110111’ ;a retlw b’01111100’ ;b retlw b’01011000’ ;c retlw b’01011110’ ;d retlw b’01111001’ ;e retlw b’01110001’ ;f retlw 0
;---------------------------
mostra_digitos ;mostra contador nos digitos de 7-segmentos
digito_1 clrf PORTA ;desliga displays movf unidades, w ;carrega valor das unidades call tabela movwf PORTB ;carrega barramento porta B bsf PORTA, 0 ;liga display 1
call atraso_5m
digito_2 clrf PORTA ;desliga displays movf dezenas, w ;carrega valor das dezenas call tabela movwf PORTB ;carrega barramento porta B
Exem
plo 21
microcontroladores PIC Exemplos Práticos
antónio sérgio senawww.senaeng.com : : soluções em electrónica e microcontroladores+351.967033209 67
bsf PORTA, 1 ;liga display 2
call atraso_5m
digito_3 clrf PORTA ;desliga displays movf centenas, w ;carrega valor das centenas call tabela movwf PORTB ;carrega barramento porta B bsf PORTA, 2 ;liga display 1
call atraso_5m
digito_4 clrf PORTA ;desliga displays movf milhares, w ;carrega valor dos milhares call tabela movwf PORTB ;carrega barramento porta B bsf PORTA, 3 ;liga display 2
call atraso_5m
return ;---------------------------
incrementa_contadoresincrementa_unidades incf unidades, f ;incrementa a variavel das unidades movf unidades, w ;carrega UNIDADES para o W sublw .10 ;subtrai 10 ao W, para verifi car se incrementou para as dezenas btfss STATUS, 2 ;testa a fl ag Z, verifi cando se houve resultado 0 aritmetico return clrf unidades incrementa_dezenas incf dezenas, f ;incrementa a variavel das dezenas movf dezenas, w ;carrega DEZENAS para o W sublw .10 ;subtrai 10 ao W, para verifi car se incrementou para ; as dezenas btfss STATUS, 2 ;testa a fl ag Z, verifi cando se houve resultado 0 aritmetico return clrf dezenas incrementa_centenas incf centenas, f ;incrementa a variavel das centenas movf centenas, w ;carrega CENTENAS para o W sublw .10 ;subtrai 10 ao W, para verifi car se incrementou para as dezenas
btfss STATUS, 2 ;testa a fl ag Z, verifi cando se houve resultado 0 aritmetico return clrf centenas
Exem
plo 21
microcontroladores PIC Exemplos Práticos
antónio sérgio senawww.senaeng.com : : soluções em electrónica e microcontroladores+351.967033209 68
incrementa_milhares incf milhares, f ;incrementa a variavel dos milhares movf milhares, w ;carrega MILHARES para o W sublw .10 ;subtrai 10 ao W, para verifi car se incrementou para as dezenas
btfss STATUS, 2 ;testa a fl ag Z, verifi cando se houve resultado 0 aritmetico return clrf milhares
return ;---------------------------
atraso_5m movlw 0x0A ;carrega W com o valor 0x0A movwf temp2 ;move valor em W para TEMP
call atraso_500u ; decfsz temp2, f ;decrementa TEMP em uma unidade, coloca resultado em TEMP ;e salta a instrucao seguinte, se o resultado for zero goto $-2
return ;sai fora da rotina de ATRASO
;---------------------------
atraso_500u movlw 0xA5 ;carrega W com o valor 0xA5 movwf temp ;move valor em W para TEMP
decfsz temp, f ;decrementa TEMP em uma unidade, coloca resultado em TEMP ;e salta a instrucao seguinte, se o resultado for zero goto $-1 ; return ;sai fora da rotina de ATRASO
;---------------------------
end
Exem
plo 21
microcontroladores PIC Exemplos Práticos
antónio sérgio senawww.senaeng.com : : soluções em electrónica e microcontroladores+351.967033209 69
PWM
Este programa usa o módulo de PWM, e exemplifi ca o mesmo com variação manual do duty-cycle.
Esquema eléctrico
Exem
plo 22
microcontroladores PIC Exemplos Práticos
antónio sérgio senawww.senaeng.com : : soluções em electrónica e microcontroladores+351.967033209 70
Código fonte do programa;#################################################################################
;
; Este programa usa o módulo de PWM, e exemplifi ca o mesmo com variação
; manual do duty-cycle
;
; v1.0 01/02/2008 PIC16F886
;
; Autor: António Sérgio Sena, www.senaeng.com
;
;#################################################################################
processor 16F886 ;confi gura o tipo de CPU usado
radix hex ;pre-defi nicao do tipo de valores numericos usados
include “P16F886.inc” ;inclui pre-defi nicoes do processador
__confi g _CONFIG1, _DEBUG_OFF & _LVP_OFF & _FCMEN_OFF & _IESO_OFF & _BOR_OFF &
_CPD_OFF & _CP_OFF & _MCLRE_ON & _PWRTE_ON & _WDT_OFF & _INTRC_OSC_NOCLKOUT
__confi g _CONFIG2, _WRT_OFF & _BOR40V
;---------------------------
org 0x0000
;confi gura toda a porta A para entrada/saida DIGITAL
banksel ANSEL ;muda para o banco onde está o registo ANSEL
clrf ANSEL ;limpa o registo ANSEL
clrf ANSELH ;limpa o registo ANSELH
clrf PORTA ;desliga tristates da porta A
clrf PORTB ;desliga tristates da porta B
clrf PORTC ;desliga tristates da porta C
;confi gura portas A e B como entradas/saidas
banksel TRISA ;muda para banco onde está o registo TRISA
movlw 0x00 ;carrega W com 0x00
movwf TRISA ;move de W para TRISA
movlw 0x00 ;carrega W com 0x00
movwf TRISB ;move de W para TRISB
movlw 0b00000100 ;RC2 como pino do PWM
movwf TRISC ;move de W para TRISC
movlw 0xFF ;periodo do PWM
movwf PR2
Exem
plo 22
microcontroladores PIC Exemplos Práticos
antónio sérgio senawww.senaeng.com : : soluções em electrónica e microcontroladores+351.967033209 71
banksel PORTA ;muda para banco onde está o registo PORTA
clrf PORTA ;desliga buffers da porta A
clrf PORTB ;desliga buffers da porta B
;confi gura modulo CCP para trabalhar em PWM
movlw 0x0F
movwf CCP1CON
;duty-cycle do PWM (periodo activo)
; movlw 0 ;100% activo
; movlw 0x33 ;80% activo
; movlw 0x7F ;50% activo
movlw 0xCC ;20% activo
; movlw 0xFF ;0% activo
movwf CCPR1L
;implementar ~240Hz de frequencia de PWM, com 16 de pré-divisão
movlw 0x07
movwf T2CON
programa_principal
goto $ ;ciclo infi nito, não sai daqui
;---------------------------
end
Exem
plo 22
microcontroladores PIC Exemplos Práticos
antónio sérgio senawww.senaeng.com : : soluções em electrónica e microcontroladores+351.967033209 72
PWM, 2
Este programa usa o módulo de PWM, e exemplifi ca o mesmo com variação automática e crescente do duty-cycle.
Esquema eléctrico
Exem
plo 23
microcontroladores PIC Exemplos Práticos
antónio sérgio senawww.senaeng.com : : soluções em electrónica e microcontroladores+351.967033209 73
Código fonte do programa;#################################################################################;; Este programa usa o módulo de PWM, e exemplifi ca o mesmo com variação; automática e crescente do duty-cycle;; v1.0 01/02/2008 PIC16F886;; Autor: António Sérgio Sena, www.senaeng.com;;#################################################################################
processor 16F886 ;confi gura o tipo de CPU usado radix hex ;pre-defi nicao do tipo de valores numericos usados include “P16F886.inc” ;inclui pre-defi nicoes do processador
__confi g _CONFIG1, _DEBUG_OFF & _LVP_OFF & _FCMEN_OFF & _IESO_OFF & _BOR_OFF & _CPD_OFF & _CP_OFF & _MCLRE_ON & _PWRTE_ON & _WDT_OFF & _INTRC_OSC_NOCLKOUT __confi g _CONFIG2, _WRT_OFF & _BOR40V
;---------------------------
temp equ 0x20temp2 equ 0x21
;---------------------------
org 0x0000
;confi gura toda a porta A para entrada/saida DIGITAL banksel ANSEL ;muda para o banco onde está o registo ANSEL clrf ANSEL ;limpa o registo ANSEL clrf ANSELH ;limpa o registo ANSELH
clrf PORTA ;desliga tristates da porta A clrf PORTB ;desliga tristates da porta B clrf PORTC ;desliga tristates da porta C ;confi gura portas A e B como entradas/saidas banksel TRISA ;muda para banco onde está o registo TRISA
movlw 0x00 ;carrega W com 0x00 movwf TRISA ;move de W para TRISA movlw 0x00 ;carrega W com 0x00 movwf TRISB ;move de W para TRISB movlw 0b00000100 ;RC2 como pino do PWM movwf TRISC ;move de W para TRISC
movlw 0xFF ;periodo do PWM movwf PR2
banksel PORTA ;muda para banco onde está o registo PORTA
Exem
plo 23
microcontroladores PIC Exemplos Práticos
antónio sérgio senawww.senaeng.com : : soluções em electrónica e microcontroladores+351.967033209 74
;confi gura modulo CCP para trabalhar em PWM movlw 0x0F movwf CCP1CON ;duty-cycle do PWM (periodo activo) movlw 0 ;100% activo; movlw 0x33 ;80% activo; movlw 0x7F ;50% activo; movlw 0xCC ;20% activo; movlw 0xFF ;0% activo movwf CCPR1L
;implementar ~240Hz de frequencia de PWM, com 16 de pré-divisão movlw 0x07 movwf T2CON
repete call atraso_20m ;faz atraso de 20ms
incf CCPR1L, f ;aumenta dutycycle do PWM, faz variar brilho do LED
goto repete ;ciclo infi nito
;---------------------------atraso_20m movlw 0x28 ;carrega W com o valor 0x20 movwf temp2 ;move valor em W para TEMP
call atraso_500u ; decfsz temp2, f ;decrementa TEMP em uma unidade, coloca resultado em TEMP ;e salta a instrucao seguinte, se o resultado for zero goto $-2
return ;sai fora da rotina de ATRASO
;---------------------------atraso_500u movlw 0xA5 ;carrega W com o valor 0xA5 movwf temp ;move valor em W para TEMP
decfsz temp, f ;decrementa TEMP em uma unidade, coloca resultado em TEMP ;e salta a instrucao seguinte, se o resultado for zero goto $-1 ; return ;sai fora da rotina de ATRASO
;---------------------------
end
Exem
plo 23
microcontroladores PIC Exemplos Práticos
antónio sérgio senawww.senaeng.com : : soluções em electrónica e microcontroladores+351.967033209 75
Interrupções
Este programa inverte os quatro pinos superiores da porta B, a cada pressão do interruptor no pino RB0. A função de inversão, é feita dentro da rotina de interrupção.
Esquema eléctrico
Exem
plo 24
microcontroladores PIC Exemplos Práticos
antónio sérgio senawww.senaeng.com : : soluções em electrónica e microcontroladores+351.967033209 76
Código fonte do programa;#################################################################################
;
; Este programa inverte os quatro pinos superiores da porta B, a cada pressão do
; interruptor no pino RB0.
; A função de inversão, é feita dentro da rotina de interrupção.
;
; v1.0 01/02/2008 PIC16F886
;
; Autor: António Sérgio Sena, www.senaeng.com
;
;#################################################################################
processor 16F886 ;confi gura o tipo de CPU usado
radix hex ;pre-defi nicao do tipo de valores numericos usados
include “P16F886.inc” ;inclui pre-defi nicoes do processador
__confi g _CONFIG1, _DEBUG_OFF & _LVP_OFF & _FCMEN_OFF & _IESO_OFF & _BOR_OFF &
_CPD_OFF & _CP_OFF & _MCLRE_ON & _PWRTE_ON & _WDT_OFF & _INTRC_OSC_NOCLKOUT
__confi g _CONFIG2, _WRT_OFF & _BOR40V
;---------------------------
org 0x0000 ;vector de RESET
goto inicio
;---------
org 0x0004 ;vector de INTERRUPCAO
movlw 0xF0 ;carrega W com valor de 0xF0
xorwf PORTB, f ;inverte pinos da porta B com um OU-EXCLUSIVO
bcf INTCON, 1 ;limpa fl ag de interrupcao causada por RB0/INT
retfi e ;sai da interrupcao
;---------------------------
org 0x0020 ;inicio do programa
inicio
;confi gura toda a porta A para entrada/saida DIGITAL
Exem
plo 24
microcontroladores PIC Exemplos Práticos
antónio sérgio senawww.senaeng.com : : soluções em electrónica e microcontroladores+351.967033209 77
banksel ANSEL ;muda para o banco onde está o registo ANSEL
clrf ANSEL ;limpa o registo ANSEL, todas as portas digitais
clrf ANSELH ;limpa o registo ANSELH, todas as portas digitais
;confi gura portas A e B como entradas/saidas
banksel TRISA ;muda para banco onde está o registo TRISA
movlw 0x00 ;carrega W com 0x00
movwf TRISA ;move de W para TRISA
movlw 0x01 ;carrega W com 0x01, RB0 como entrada
movwf TRISB ;move de W para TRISB
movlw 0x00 ;carrega W com 0x00
movwf TRISC ;move de W para TRISC
movlw b’10001110’ ;confi gura o oscilador interno para 31KHz
andwf OSCCON
clrf OPTION_REG ;pull-ups na porta B activos, interrupcao no fl anco-descendente do RB0/INT
banksel PORTA ;muda para banco onde está o registo PORTA
movlw b’10010000’ ;Interrupcoes Gerais activas, interrupcao RB0/INT activa
movwf INTCON
repete
goto repete ;ciclo infi nito
;---------------------------
end
Exem
plo 24
microcontroladores PIC Exemplos Práticos
antónio sérgio senawww.senaeng.com : : soluções em electrónica e microcontroladores+351.967033209 78
Interrupções, 2
Este programa inverte os pinos da porta B, a cada interrupção do TMR0. O TMR0 está programado para contar 250ms, e a cada overfl ow, gera uma interrupção.
Esquema eléctrico
Exem
plo 25
microcontroladores PIC Exemplos Práticos
antónio sérgio senawww.senaeng.com : : soluções em electrónica e microcontroladores+351.967033209 79
Código fonte do programa;#################################################################################
;
; Este programa inverte os pinos da porta B, a cada interrupção do TMR0.
; O TMR0 está programado para contar 250ms, e a cada overfl ow, gera uma interrupção.
;
; v1.0 01/02/2008 PIC16F886
;
; Autor: António Sérgio Sena, www.senaeng.com
;
;#################################################################################
processor 16F886 ;confi gura o tipo de CPU usado
radix hex ;pre-defi nicao do tipo de valores numericos usados
include “P16F886.inc” ;inclui pre-defi nicoes do processador
__confi g _CONFIG1, _DEBUG_OFF & _LVP_OFF & _FCMEN_OFF & _IESO_OFF & _BOR_OFF &
_CPD_OFF & _CP_OFF & _MCLRE_ON & _PWRTE_ON & _WDT_OFF & _INTRC_OSC_NOCLKOUT
__confi g _CONFIG2, _WRT_OFF & _BOR40V
;---------------------------
org 0x0000 ;vector de RESET
goto inicio
;---------
org 0x0004 ;vector de INTERRUPCAO
movlw 0xFF ;carrega W com valor de 0xFF
xorwf PORTB, f ;inverte porta B bit-a-bit com o OU-EXCLUSIVO (XOR)
;implementar ~250ms de temporizacao com o TMR0 (com 256 de pre-divisao)
movlw 0xF6 ;valor de contagem para fazer os ~250ms
movwf TMR0 ;carrega esse valor para o TMRO
bcf INTCON, 2 ;limpa fl ag de interrupcao por TMR0
retfi e ;sai da interrupcao
;---------------------------
org 0x0020 ;inicio do programa
Exem
plo 25
microcontroladores PIC Exemplos Práticos
antónio sérgio senawww.senaeng.com : : soluções em electrónica e microcontroladores+351.967033209 80
inicio
clrf PORTA ;limpa tristate da porta A
clrf PORTB ;limpa tristate da porta B
;confi gura toda a porta A para entrada/saida DIGITAL
banksel ANSEL ;muda para o banco onde está o registo ANSEL
clrf ANSEL ;limpa o registo ANSEL
clrf ANSELH ;limpa o registo ANSELH
;confi gura portas A e B como entradas/saidas
banksel TRISA ;muda para banco onde está o registo TRISA
clrf TRISA ;TRISA toda como saida
clrf TRISB ;TRISB toda como saida
clrf TRISC ;TRISC toda como saida
movlw b’10000111’ ;TMR0 com 1:256 e incrementado pelo clock interno
movwf OPTION_REG
movlw b’10001110’ ;confi gura o oscilador interno para 31KHz
andwf OSCCON
banksel PORTA ;muda para banco onde está o registo PORTA
clrf PORTA ;desliga porta A
clrf PORTB ;desliga porta B
movlw b’10100000’ ;Interrupcoes Gerais activas, interrupcao TMR0 activa
movwf INTCON
;implementar ~250ms de temporizacao com o TMR0, com 256 de pre-divisao
movlw 0xF8 ;valor de contagem para fazer os ~250ms
movwf TMR0 ;carrega esse valor para o TMRO
repete
goto repete ;ciclo infi nito
;---------------------------
end
Exem
plo 25
microcontroladores PIC Exemplos Práticos
antónio sérgio senawww.senaeng.com : : soluções em electrónica e microcontroladores+351.967033209 81
LCD
Este programa escreve um caracter no mostrador LCD
Esquema eléctrico
Exem
plo 26
microcontroladores PIC Exemplos Práticos
antónio sérgio senawww.senaeng.com : : soluções em electrónica e microcontroladores+351.967033209 82
Código fonte do programa;*************************************************************
;
; Este programa escreve um caracter no LCD
;
; v1.0 01/02/2008 PIC16F886
;
; Autor: António Sérgio Sena, www.senaeng.com
;
;*************************************************************
processor 16F886 ;confi gura o tipo de CPU usado
radix hex ;pre-defi nicao do tipo de valores numericos usados
include “P16F886.inc” ;inclui pre-defi nicoes do processador
__confi g _CONFIG1, _DEBUG_OFF & _LVP_OFF & _FCMEN_OFF & _IESO_OFF & _BOR_OFF &
_CPD_OFF & _CP_OFF & _MCLRE_ON & _PWRTE_ON & _WDT_OFF & _INTRC_OSC_NOCLKOUT
__confi g _CONFIG2, _WRT_OFF & _BOR40V
;---------------------------
org 0x0000
goto start
org 0x0020 ;inicio do programa
start
clrf PORTA ;limpa tristate da porta A
clrf PORTB ;limpa tristate da porta B
clrf PORTC ;limpa tristate da porta C
;confi gura toda a porta A para entrada/saida DIGITAL
banksel ANSEL ;muda para o banco onde está o registo ANSEL
clrf ANSEL ;limpa o registo ANSEL
clrf ANSELH ;limpa o registo ANSELH
;confi gura portas A e B como entradas/saidas
banksel TRISA ;muda para banco onde está o registo TRISA
clrf TRISA ;porta A toda como saida
clrf TRISB ;porta B toda como saida
clrf TRISC ;porta C toda como saida
Exem
plo 26
microcontroladores PIC Exemplos Práticos
antónio sérgio senawww.senaeng.com : : soluções em electrónica e microcontroladores+351.967033209 83
clrf OPTION_REG ;limpa registo OPTION
banksel PORTA ;muda para banco onde está o registo PORTA
inicio
call setup ;inicializa LCD
movlw ‘a’ ;carrega W com valor ASCII “a”
call lcdout ;envia dados para o LCD
goto $ ;ciclo infi nito na mesma linha
;---------------------------
include “usar_lcd.asm” ;inclui biblioteca do LCD
;---------------------------
end
Exem
plo 26
microcontroladores PIC Exemplos Práticos
antónio sérgio senawww.senaeng.com : : soluções em electrónica e microcontroladores+351.967033209 84
LCD, 2
Este programa escreve duas frases diferentes, em cada linha do LCD.
Esquema eléctrico
Exem
plo 27
microcontroladores PIC Exemplos Práticos
antónio sérgio senawww.senaeng.com : : soluções em electrónica e microcontroladores+351.967033209 85
Código fonte do programa;*************************************************************;; Este programa escreve uma frase diferente, em cada linha do LCD;; v1.0 01/02/2008 PIC16F886;; Autor: António Sérgio Sena, www.senaeng.com;;*************************************************************
processor 16F886 ;confi gura o tipo de CPU usado radix hex ;pre-defi nicao do tipo de valores numericos usados include “P16F886.inc” ;inclui pre-defi nicoes do processador
__confi g _CONFIG1, _DEBUG_OFF & _LVP_OFF & _FCMEN_OFF & _IESO_OFF & _BOR_OFF & _CPD_OFF & _CP_OFF & _MCLRE_ON & _PWRTE_ON & _WDT_OFF & _INTRC_OSC_NOCLKOUT __confi g _CONFIG2, _WRT_OFF & _BOR40V
;---------------------------
temp equ 0x20 ;defi ne endereco 0x20 com o nome de TEMPtemp2 equ 0x21temp3 equ 0x22
;---------------------------
org 0x0000
goto principal
tabela addwf PCL, F ;tabela com frase para escrever no LCD dt “Primeira frase”, 0
tabela2 addwf PCL, F ;tabela com frase para escrever no LCD dt “Segunda frase”, 0
org 0x0030
principal clrf PORTA ;limpa tristate da porta A clrf PORTB ;limpa tristate da porta B clrf PORTC ;limpa tristate da porta C
Exem
plo 27
microcontroladores PIC Exemplos Práticos
antónio sérgio senawww.senaeng.com : : soluções em electrónica e microcontroladores+351.967033209 86
;confi gura toda a porta A para entrada/saida DIGITAL banksel ANSEL ;muda para o banco onde está o registo ANSEL clrf ANSEL ;limpa o registo ANSEL clrf ANSELH ;limpa o registo ANSELH
;confi gura portas A e B como entradas/saidas banksel TRISA ;muda para banco onde está o registo TRISA clrf TRISA ;porta A toda como saida clrf TRISB ;porta B toda como saida clrf TRISC ;porta C toda como saida
clrf OPTION_REG ;limpa registo OPTION banksel PORTA ;muda para banco onde está o registo PORTA
inicio call setup ;inicializa e limpa LCD
clrf temp ;limpa registo de contagem
linha1 movf temp, w ;carrega registo Temp para W call tabela ;chama tabela iorlw 0 btfss STATUS, 2 ;testa se chegou ao fi m da tabela goto out ;envia byte para LCD goto linha2 ;escreve a segunda linhaout call lcdout ;envia dados para o LCD incf temp, f ;incrementa para nova posicao goto linha1 ;salta para carregamento de Temp para W
linha2 call atraso_100m ;espera meio-segundo call atraso_100m call atraso_100m call atraso_100m call atraso_100m
; call del_lcd ;limpa LCD; call atraso_100m call lcd201 ;posiciona cursor na linha 2, primeira coluna call atraso_100m
Exem
plo 27
microcontroladores PIC Exemplos Práticos
antónio sérgio senawww.senaeng.com : : soluções em electrónica e microcontroladores+351.967033209 87
clrf temp ;limpa registo de contagem
repete2 movf temp, w ;carrega registo Temp para W call tabela2 ;chama tabela iorlw 0 btfss STATUS, 2 ;testa se chegou ao fi m da mesma goto out2 ;envia byte para LCD goto $ ;ciclo infi nito, fi ca nesta posicaoout2 call lcdout ;envia dados para o LCD incf temp, f ;incrementa para nova posicao goto repete2 ;salta para carregamento de Temp para W
;---------------------------
include “usar_lcd.asm” ;inclui fi cheiro de uso e confi guracao do LCD
;---------------------------
atraso_100m movlw 0xc7 ;carrega W com o valor 0xFF movwf temp2 ;move valor em W para TEMP
call atraso_500u ;
decfsz temp2, f ;decrementa TEMP em uma unidade, coloca resultado em TEMP ;e salta a instrucao seguinte, se o resultado for zero goto $-2 ;
return ;sai fora da rotina de ATRASO
;---------------------------
atraso_500u movlw 0xa5 ;carrega W com o valor 0xFF movwf temp3 ;move valor em W para TEMP
decfsz temp3, f ;decrementa TEMP em uma unidade, coloca resultado em TEMP ;e salta a instrucao seguinte, se o resultado for zero goto $-1 ; return ;sai fora da rotina de ATRASO
;---------------------------
end
Exem
plo 27
microcontroladores PIC Exemplos Práticos
antónio sérgio senawww.senaeng.com : : soluções em electrónica e microcontroladores+351.967033209 88
LCD, 3
Este programa testa três entradas, e escreve no LCD qual das entradas está activa.
Esquema eléctrico
Exem
plo 28
microcontroladores PIC Exemplos Práticos
antónio sérgio senawww.senaeng.com : : soluções em electrónica e microcontroladores+351.967033209 89
Código fonte do programa;*************************************************************;; Este programa testa três entradas, e escreve no LCD; qual das entradas está activa;; v1.0 01/02/2008 PIC16F886;; Autor: António Sérgio Sena, www.senaeng.com;;*************************************************************
processor 16F886 ;confi gura o tipo de CPU usado radix hex ;pre-defi nicao do tipo de valores numericos usados include “P16F886.inc” ;inclui pre-defi nicoes do processador
__confi g _CONFIG1, _DEBUG_OFF & _LVP_OFF & _FCMEN_OFF & _IESO_OFF & _BOR_OFF & _CPD_OFF & _CP_OFF & _MCLRE_ON & _PWRTE_ON & _WDT_OFF & _INTRC_OSC_NOCLKOUT __confi g _CONFIG2, _WRT_OFF & _BOR40V
;---------------------------
temp equ 0x20 ;defi ne endereco 0x20 com o nome de TEMPtemp2 equ 0x21temp3 equ 0x22
;---------------------------
org 0x0000
goto principal
tabela_RA4 addwf PCL, F ;tabela com frase para escrever no LCD dt “RA4”, 0tabela_RA6 addwf PCL, F ;tabela com frase para escrever no LCD dt “RA6”, 0tabela_RA7 addwf PCL, F ;tabela com frase para escrever no LCD dt “RA7”, 0
org 0x0020
Exem
plo 28
microcontroladores PIC Exemplos Práticos
antónio sérgio senawww.senaeng.com : : soluções em electrónica e microcontroladores+351.967033209 90
principal
principal clrf PORTA ;limpa tristate da porta A clrf PORTB ;limpa tristate da porta B clrf PORTC ;limpa tristate da porta C
;confi gura toda a porta A para entrada/saida DIGITAL banksel ANSEL ;muda para o banco onde está o registo ANSEL clrf ANSEL ;limpa o registo ANSEL clrf ANSELH ;limpa o registo ANSELH
;confi gura portas A e B como entradas/saidas banksel TRISA ;muda para banco onde está o registo TRISA movlw 0xD0 ;carrega W com 0xD0 movwf TRISA ;move de W para TRISA clrf TRISB ;porta B toda como saida clrf TRISC ;porta C toda como saida
clrf OPTION_REG ;limpa registo OPTION banksel PORTA ;muda para banco onde está o registo PORTA
inicio
call setup ;inicializa LCD
testes
testa_RA4 btfss PORTA, 4 ;testa se a tecla foi premida goto mostra_RA4testa_RA6 btfss PORTA, 6 ;testa se a tecla foi premida goto mostra_RA6testa_RA7 btfss PORTA, 7 ;testa se a tecla foi premida goto mostra_RA7
goto testes ;faz novo ciclo de testes nas teclas
;---------------------------
Exem
plo 28
microcontroladores PIC Exemplos Práticos
antónio sérgio senawww.senaeng.com : : soluções em electrónica e microcontroladores+351.967033209 91
mostra_RA4 btfss PORTA, 4 ;espera ate que a tecla seja largada goto $-1
call del_lcd ;limpa LCD antes de mostrar algo call atraso_5m clrf temp ;limpa registo de contagemrepete movf temp, w ;carrega registo Temp para W call tabela_RA4 ;chama tabela iorlw 0 btfss STATUS, 2 ;testa se chegou ao fi m da mesma goto mostra ;envia byte para LCD goto testes ;volta para o ciclo de testes das teclasmostra call lcdout ;envia dados para o LCD incf temp, f ;incrementa para nova posicao goto repete ;salta para carregamento de Temp para W
;mostra_RA6 btfss PORTA, 6 ;espera ate que a tecla seja largada goto $-1
call del_lcd ;limpa LCD antes de mostrar algo call atraso_5m clrf temp ;limpa registo de contagemrepete2 movf temp, w ;carrega registo Temp para W call tabela_RA6 ;chama tabela iorlw 0 btfss STATUS,2 ;testa se chegou ao fi m da mesma goto mostra2 ;envia byte para LCD goto testes ;volta para o ciclo de testes das teclasmostra2 call lcdout ;envia dados para o LCD incf temp, f ;incrementa para nova posicao goto repete2 ;salta para carregamento de Temp para W
;mostra_RA7 btfss PORTA, 7 ;espera ate que a tecla seja largada goto $-1
call del_lcd ;limpa LCD antes de mostrar algo call atraso_5m clrf temp ;limpa registo de contagemrepete3 movf temp, w ;carrega registo Temp para W
Exem
plo 28
microcontroladores PIC Exemplos Práticos
antónio sérgio senawww.senaeng.com : : soluções em electrónica e microcontroladores+351.967033209 92
call tabela_RA7 ;chama tabela iorlw 0 btfss STATUS, 2 ;testa se chegou ao fi m da mesma goto mostra3 ;envia byte para LCD goto testes ;volta para o ciclo de testes das teclasmostra3 call lcdout ;envia dados para o LCD incf temp, f ;incrementa para nova posicao goto repete3 ;salta para carregamento de Temp para W
;---------------------------
include “usar_lcd.asm” ;inclui fi cheiro de uso e confi guracao do LCD
;---------------------------
atraso_5m movlw 0x0a movwf temp2 ;move valor em W para TEMP
call atraso_500u ; decfsz temp2, f ;decrementa TEMP em uma unidade, coloca resultado em TEMP ;e salta a instrucao seguinte, se o resultado for zero goto $-2
return ;sai fora da rotina de ATRASO
;---------------------------
atraso_500u movlw 0x28 ;carrega W com o valor 0xFF movwf temp3 ;move valor em W para TEMP
decfsz temp3, f ;decrementa TEMP em uma unidade, coloca resultado em TEMP ;e salta a instrucao seguinte, se o resultado for zero goto $-1 ; return ;sai fora da rotina de ATRASO
;---------------------------
end
Exem
plo 28
microcontroladores PIC Exemplos Práticos
antónio sérgio senawww.senaeng.com : : soluções em electrónica e microcontroladores+351.967033209 93
Biblioteca para o LCD
Este programa tem todas as confi gurações e funçoes de trabalho do mostrador LCD.
Código fonte do programa;*************************************************************;; Este programa é a biblioteca para o uso de LCD.;; v1.0 01/02/2008 PIC16F886;; Autor: António Sérgio Sena, www.senaeng.com;;*************************************************************
;*************************************************************;; Rotina de confi guracao, e uso, de LCD com controlador; HD44780 da Hitachi.;; Confi gurada para correr com oscilador de 4MHz.; Defi nicoes incluidas no programa.; Ambas as portas de dados e comandos podem ser defi nidas,; bem como os bits de RS e E.; ; Declarar registo de OPTION e INTCON.; Dentro do banco 1, limpar o registo OPTION.; O registo INTCON eh apenas usado pela rotina de LCD. Ignorar. ;; Funções usadas pelo programa:;; * setup -> confi gura o LCD, usando modo de 4-bits;; * lcd101 -> posiciona cursor na 1a linha, 1a posicao; Restantes rotinas sao iguais, apenas muda; a linha e a posicao;; * lcdout -> transfere para o LCD, o byte que se encontra; no acumulador;; * del_lcd -> limpa o LCD, e retorna ao inicio;;*************************************************************
microcontroladores PIC Exemplos Práticos
antónio sérgio senawww.senaeng.com : : soluções em electrónica e microcontroladores+351.967033209 94
;*************************************************************; defi nicoes;*************************************************************
e equ 1 ;linha E do LCDrs equ 0 ;linha RS do LCDporta_comando equ PORTA ;porta de comandosporta_dados equ PORTB ;porta de dados
loopa equ 0x60loopb equ 0x61store equ 0x62rsline equ 0x63clkcnt equ 0x64
;*************************************************************; rotinas de actualizacao do LCD;*************************************************************
del_lcd movlw 0x01 ;limpa LCD e retorna ao inicio goto lcdcmdlcd208 movlw b’11000111’ ;posiciona 2a linha, 8a posicao goto lcdcmdlcd204 movlw b’11000011’ ;posiciona 2a linha, 4a posicao goto lcdcmdlcd202 movlw b’11000001’ ;posiciona 2a linha, 2a posicao goto lcdcmdlcd201 movlw b’11000000’ ;posiciona 2a linha, 1a posicao goto lcdcmdlcd104 movlw b’10000011’ ;posiciona 1a linha, 4a posicao goto lcdcmdlcd101 movlw b’10000000’ ;posiciona 1a linha, 1a posicao
lcdcmd bcf porta_comando, rs ;limpa pino RS - activa comandos do LCD lcdout movwf store ;guarda dados em registo temporario
movlw d’40’ ;atraso entre bytes enviados para o LCD movwf loopadelay decfsz loopa, f ;atraso goto delay
call mandar ;manda 4bits altos swapf store, f call mandar ;manda 4bits baixos bsf porta_comando, rs ;activa pino RS - activa dados para o LCD
microcontroladores PIC Exemplos Práticos
antónio sérgio senawww.senaeng.com : : soluções em electrónica e microcontroladores+351.967033209 95
return mandar ;carrega e manda 4bits movf store, w andlw 0xF0 ;AND com 0xF0, 4bits altos da porta B movwf porta_dados ;carrega o byte na porta B bsf porta_comando, e bcf porta_comando, e ;envia
return
;*************************************************************; rotina de confi guracao do LCD;*************************************************************
setup call pausit ;rotina de atraso
clrf loopb ;limpa registo de looplcdset movf loopb, w ;carrega offset para o acumulador call tablcd ;busca instrucao call lcdcmd ;envia instrucao para o LCD
incf loopb, f ;incrementa loop btfss loopb, 3 ;ultima instrucao enviada ?? goto lcdset ;nao
call pausit ;atraso
return ;fi m da rotina de confi guracao
pausit movlw d’20’ ;confi guracao de atraso movwf clkcnt
bcf INTCON, 2 ;limpa fl ag de interrupcaopause btfss INTCON, 2 ;temporizador chegou ao fi m ?? goto pause ;nao bcf INTCON, 2 ;sim
decfsz clkcnt, f ;decrementa loop, = 0 ?? goto pause ;nao
return ;sim, sai
microcontroladores PIC Exemplos Práticos
antónio sérgio senawww.senaeng.com : : soluções em electrónica e microcontroladores+351.967033209 96
;*************************************************************; tabela para confi guracao do LCD;*************************************************************tablcd addwf PCL,f ;adiciona offset ao Program Counter retlw b’00110011’ ;inicializa LCD - 1o byte retlw b’00110011’ ;2o byte (4x no total) retlw b’00101100’ ;confi gura para operacao 4-bit & 2 linhas retlw b’00101100’ ;confi gura para operacao 4-bit & 2 linhas retlw b’00000110’ ;incrementa endereco, a cada byte recebido retlw b’00001100’ ;display on, cursor off, pisca off retlw b’00000001’ ;limpa LCD retlw b’00000010’ ;volta a 1a posicao, cursor & ram a zero ;fi m de tabela de confi guracao
Exem
plo 28
microcontroladores PIC Exemplos Práticos
antónio sérgio senawww.senaeng.com : : soluções em electrónica e microcontroladores+351.967033209 97
EUSART - Porta Série
Este programa envia pela USART do PIC, a cada ~200ms, um caracter “a”.
Esquema eléctrico
Exem
plo 29
microcontroladores PIC Exemplos Práticos
antónio sérgio senawww.senaeng.com : : soluções em electrónica e microcontroladores+351.967033209 98
Código fonte do programa;#################################################################################
;
; Este programa envia pela USART do PIC, a cada ~200ms, um caracter “a”.
;
; v1.0 01/10/2003
;
; Autor: António Sérgio Sena, www.senaeng.com
;
;#################################################################################
processor 16F886 ;confi gura o tipo de CPU usado
radix hex ;pre-defi nicao do tipo de valores numericos usados
include “P16F886.inc” ;inclui pre-defi nicoes do processador
__confi g _CONFIG1, _DEBUG_OFF & _LVP_OFF & _FCMEN_OFF & _IESO_OFF & _BOR_OFF &
_CPD_OFF & _CP_OFF & _MCLRE_ON & _PWRTE_ON & _WDT_OFF & _INTRC_OSC_NOCLKOUT
__confi g _CONFIG2, _WRT_OFF & _BOR40V
;---------------------------
temp equ 0x20 ;defi ne endereco 0x20 com o nome de TEMP
temp2 equ 0x21 ;defi ne endereco 0x21 com o nome de TEMP2
;---------------------------
org 0x0000
;confi gura toda a porta A para entrada/saida DIGITAL
banksel ANSEL ;muda para o banco onde está o registo ANSEL
clrf ANSEL ;limpa o registo ANSEL
clrf ANSELH ;limpa o registo ANSELH
;confi gura portas A e B como entradas/saidas
banksel TRISA ;muda para banco onde está o registo TRISA
movlw 0x00 ;carrega W como 0x00
movwf TRISA ;move de W para TRISA
movlw 0x06 ;carrega W como 0x06
movwf TRISB ;move de W para TRISB
clrf TRISC
movlw b’00100100’ ;liga TX da USART, liga alta velocidade
movwf TXSTA ;
Exem
plo 29
microcontroladores PIC Exemplos Práticos
antónio sérgio senawww.senaeng.com : : soluções em electrónica e microcontroladores+351.967033209 99
movlw .25 ;gerador de velocidade :: 9600bps - 25 ; 19k2bps - 12 movwf SPBRG
banksel PORTA ;muda para banco onde está o registo PORTA
bsf RCSTA, 7 ;LIGA USART
inicio movlw ‘a’ ;carrega W com ASCII “a” movwf TXREG ;manda para porta serie nop ;1 ciclo de espera
btfss PIR1, 4 ;testa se acabou de mandar byte goto $-1
call atraso_100m ;atrasa durante ~200ms call atraso_100m ;
goto inicio ;faz novo ciclo
;---------------------------
atraso_100m movlw 0xC6 ;carrega W com o valor 0xC6 movwf temp2 ;move valor em W para TEMP
call atraso_500u ; decfsz temp2, f ;decrementa TEMP em uma unidade, coloca resultado em TEMP ;e salta a instrucao seguinte, se o resultado for zero goto $-2
return ;sai fora da rotina de ATRASO
;---------------------------
atraso_500u movlw 0xA5 ;carrega W com o valor 0xA5 movwf temp ;move valor em W para TEMP
decfsz temp, f ;decrementa TEMP em uma unidade, coloca resultado em TEMP ;e salta a instrucao seguinte, se o resultado for zero goto $-1 ; return ;sai fora da rotina de ATRASO
;---------------------------
end
Exem
plo 29
microcontroladores PIC Exemplos Práticos
antónio sérgio senawww.senaeng.com : : soluções em electrónica e microcontroladores+351.967033209 100
EUSART - Porta Série, 2
Este programa envia pela USART do PIC, a cada ~200ms, uma frase completa.
Esquema eléctrico
Exem
plo 30
microcontroladores PIC Exemplos Práticos
antónio sérgio senawww.senaeng.com : : soluções em electrónica e microcontroladores+351.967033209 101
Código fonte do programa;#################################################################################
;
; Este programa envia pela USART do PIC, a cada ~500ms, uma frase completa.
;
; v1.0 01/02/2008 PIC16F886
;
; Autor: António Sérgio Sena, www.senaeng.com
;
;#################################################################################
processor 16F886 ;confi gura o tipo de CPU usado
radix hex ;pre-defi nicao do tipo de valores numericos usados
include “P16F886.inc” ;inclui pre-defi nicoes do processador
__confi g _CONFIG1, _DEBUG_OFF & _LVP_OFF & _FCMEN_OFF & _IESO_OFF & _BOR_OFF &
_CPD_OFF & _CP_OFF & _MCLRE_ON & _PWRTE_ON & _WDT_OFF & _INTRC_OSC_NOCLKOUT
__confi g _CONFIG2, _WRT_OFF & _BOR40V
;---------------------------
temp equ 0x20 ;defi ne endereco 0x20 com o nome de TEMP
temp2 equ 0x21 ;defi ne endereco 0x21 com o nome de TEMP2
temp3 equ 0x22 ;defi ne endereco 0x22 com o nome de TEMP3
;---------------------------
org 0x0000
;confi gura toda a porta A para entrada/saida DIGITAL
banksel ANSEL ;muda para o banco onde está o registo ANSEL
clrf ANSEL ;limpa o registo ANSEL
clrf ANSELH ;limpa o registo ANSELH
clrf PORTA ;desliga porta antes de confi gurar
clrf PORTB ;desliga porta antes de confi gurar
;confi gura portas A e B como entradas/saidas
banksel TRISA ;muda para banco onde está o registo TRISA
movlw 0x00 ;carrega W como 0x00
movwf TRISA ;move de W para TRISA
movlw 0x06 ;carrega W como 0x06 0000 0110
movwf TRISB ;move de W para TRISB
Exem
plo 30
microcontroladores PIC Exemplos Práticos
antónio sérgio senawww.senaeng.com : : soluções em electrónica e microcontroladores+351.967033209 102
clrf TRISC
movlw b’00100100’ ;liga TX da USART, liga alta velocidade
movwf TXSTA ;
movlw .25 ;gerador de velocidade :: 9600bps - 25 ; 19k2bps - 12
movwf SPBRG
banksel PORTA ;muda para banco onde está o registo PORTA
bsf RCSTA, 7 ;LIGA USART
inicio
clrf temp3 ;limpa contador para tabela
call atraso_100m ;faz um atraso de ~500ms
call atraso_100m ;
call atraso_100m ;
call atraso_100m ;
call atraso_100m ;
volta
movf temp3, w ;carrega W com valor de TEMP3
call tabela ;chama tabela
iorlw 0 ;testa se chegou ao fi m da mesma
btfsc STATUS, 2
goto inicio ;acaba programa, faz ciclo infi nito
movwf TXREG ;manda para porta serie
nop ; aguarda um momento
btfss PIR1, 4 ;testa se acabou de mandar byte
goto $-1 ;nao
incf temp3, f ;incrementa contador para tabela
goto volta ;manda outro caracter
;---------------------------
tabela
addwf PCL, f
dt “Experiencia PIC e USART” ;frase a mandar pela porta serie
dt 0x0A, 0x0D, 0 ;comandos ASCII equivalentes de: nova linha
;---------------------------
Exem
plo 30
microcontroladores PIC Exemplos Práticos
antónio sérgio senawww.senaeng.com : : soluções em electrónica e microcontroladores+351.967033209 103
atraso_100m
movlw 0xC6 ;carrega W com o valor 0xC6
movwf temp2 ;move valor em W para TEMP
call atraso_500u ;
decfsz temp2, f ;decrementa TEMP em uma unidade, coloca resultado em TEMP
;e salta a instrucao seguinte, se o resultado for zero
goto $-2
return ;sai fora da rotina de ATRASO
;---------------------------
atraso_500u
movlw 0xA5 ;carrega W com o valor 0xA5
movwf temp ;move valor em W para TEMP
decfsz temp, f ;decrementa TEMP em uma unidade, coloca resultado em TEMP
;e salta a instrucao seguinte, se o resultado for zero
goto $-1 ;
return ;sai fora da rotina de ATRASO
;---------------------------
end
Exem
plo 30
microcontroladores PIC Exemplos Práticos
antónio sérgio senawww.senaeng.com : : soluções em electrónica e microcontroladores+351.967033209 104
EUSART - Porta Série, 3
Este programa envia pela USART do PIC, uma frase completa, de cada vez que se carrega no botão no pino RA0.Após carregar no botão, há uma espera de ~500ms, e depois é feito o envio.
Esquema eléctrico
Exem
plo 31
microcontroladores PIC Exemplos Práticos
antónio sérgio senawww.senaeng.com : : soluções em electrónica e microcontroladores+351.967033209 105
Código fonte do programa;#################################################################################
;
; Este programa envia pela USART do PIC, uma frase completa, de cada vez que
; se carrega no botão no pino RA0.
; Após carregar no botão, há uma espera de ~500ms, e depois é feito o envio.
;
; v1.0 01/02/2008 PIC16F886
;
; Autor: António Sérgio Sena, www.senaeng.com
;
;#################################################################################
processor 16F886 ;confi gura o tipo de CPU usado
radix hex ;pre-defi nicao do tipo de valores numericos usados
include “P16F886.inc” ;inclui pre-defi nicoes do processador
__confi g _CONFIG1, _DEBUG_OFF & _LVP_OFF & _FCMEN_OFF & _IESO_OFF & _BOR_OFF &
_CPD_OFF & _CP_OFF & _MCLRE_ON & _PWRTE_ON & _WDT_OFF & _INTRC_OSC_NOCLKOUT
__confi g _CONFIG2, _WRT_OFF & _BOR40V
;---------------------------
temp equ 0x20 ;defi ne endereco 0x20 com o nome de TEMP
temp2 equ 0x21 ;defi ne endereco 0x21 com o nome de TEMP2
temp3 equ 0x22 ;defi ne endereco 0x22 com o nome de TEMP3
;---------------------------
org 0x0000
;confi gura toda a porta A para entrada/saida DIGITAL
banksel ANSEL ;muda para o banco onde está o registo ANSEL
clrf ANSEL ;limpa o registo ANSEL
clrf ANSELH ;limpa o registo ANSELH
clrf PORTA ;desliga porta antes de confi gurar
clrf PORTB ;desliga porta antes de confi gurar
;confi gura portas A e B como entradas/saidas
banksel TRISA ;muda para banco onde está o registo TRISA
movlw 0x01 ;carrega W como 0x01, RA0 como entrada
movwf TRISA ;move de W para TRISA
Exem
plo 31
microcontroladores PIC Exemplos Práticos
antónio sérgio senawww.senaeng.com : : soluções em electrónica e microcontroladores+351.967033209 106
movlw 0x06 ;carrega W como 0x06 0b0000.0110
movwf TRISB ;move de W para TRISB
clrf TRISC
movlw b’00100100’ ;liga TX da USART, liga alta velocidade
movwf TXSTA ;
movlw .25 ;gerador de velocidade :: 9600bps - 25 ; 19k2bps - 12
movwf SPBRG
banksel PORTA ;muda para banco onde está o registo PORTA
bsf RCSTA, 7 ;LIGA USART
inicio
btfsc PORTA, 0 ;testa se RA0 estah premido
goto inicio ;nao
;sim
clrf temp3 ;limpa contador para tabela
call atraso_100m ;faz um atraso de ~500ms
call atraso_100m ;
call atraso_100m ;
call atraso_100m ;
call atraso_100m ;
volta
movf temp3, w ;carrega W com valor de TEMP3
call tabela ;chama tabela
iorlw 0 ;testa se chegou ao fi m da mesma
btfsc STATUS, 2
goto inicio ;acaba programa, faz ciclo infi nito
movwf TXREG ;manda para porta serie
nop ; aguarda um momento
btfss PIR1, 4 ;testa se acabou de mandar byte
goto $-1 ;nao
incf temp3, f ;incrementa contador para tabela
goto volta ;manda outro caracter
Exem
plo 31
microcontroladores PIC Exemplos Práticos
antónio sérgio senawww.senaeng.com : : soluções em electrónica e microcontroladores+351.967033209 107
;---------------------------
tabela
addwf PCL, f ;frase a mandar pela porta serie
dt “Experiencia com tecla RA0 do PIC, e USART”
dt 0x0A, 0x0D, 0 ;ASCII equivalente de nova linha
;---------------------------
atraso_100m
movlw 0xC6 ;carrega W com o valor 0xC6
movwf temp2 ;move valor em W para TEMP
call atraso_500u ;
decfsz temp2, f ;decrementa TEMP em uma unidade, coloca resultado em TEMP
;e salta a instrucao seguinte, se o resultado for zero
goto $-2
return ;sai fora da rotina de ATRASO
;---------------------------
atraso_500u
movlw 0xA5 ;carrega W com o valor 0xA5
movwf temp ;move valor em W para TEMP
decfsz temp, f ;decrementa TEMP em uma unidade, coloca resultado em TEMP
;e salta a instrucao seguinte, se o resultado for zero
goto $-1 ;
return ;sai fora da rotina de ATRASO
;---------------------------
end
Exem
plo 31
microcontroladores PIC Exemplos Práticos
antónio sérgio senawww.senaeng.com : : soluções em electrónica e microcontroladores+351.967033209 108
EUSART - Porta Série, 4
Este programa mostra no LCD, os bytes que são recebidos pela USART.
Esquema eléctrico
Exem
plo 32
microcontroladores PIC Exemplos Práticos
antónio sérgio senawww.senaeng.com : : soluções em electrónica e microcontroladores+351.967033209 109
Código fonte do programa;;#################################################################################
;
; Este programa mostra no LCD, os bytes que são recebidos pela USART.
;
; v1.0 01/02/2008 PIC16F886
;
; Autor: António Sérgio Sena, www.senaeng.com
;
;#################################################################################
processor 16F886 ;confi gura o tipo de CPU usado
radix hex ;pre-defi nicao do tipo de valores numericos usados
include “P16F886.inc” ;inclui pre-defi nicoes do processador
__confi g _CONFIG1, _DEBUG_OFF & _LVP_OFF & _FCMEN_OFF & _IESO_OFF & _BOR_OFF &
_CPD_OFF & _CP_OFF & _MCLRE_ON & _PWRTE_ON & _WDT_OFF & _INTRC_OSC_NOCLKOUT
__confi g _CONFIG2, _WRT_OFF & _BOR40V
;---------------------------
temp equ 0x20 ;defi ne endereco 0x20 com o nome de TEMP
;---------------------------
org 0x0000
goto principal
org 0x0030
principal
;confi gura toda a porta A para entrada/saida DIGITAL
banksel ANSEL ;muda para o banco onde está o registo ANSEL
clrf ANSEL ;limpa o registo ANSEL
clrf ANSELH ;limpa o registo ANSELH
clrf PORTA ;desliga porta antes de confi gurar
clrf PORTB ;desliga porta antes de confi gurar
;confi gura portas A e B como entradas/saidas
banksel TRISA ;muda para banco onde está o registo TRISA
Exem
plo 32
microcontroladores PIC Exemplos Práticos
antónio sérgio senawww.senaeng.com : : soluções em electrónica e microcontroladores+351.967033209 110
clrf TRISA ;porta A toda como saida
movlw 0x06 ;carrega W com 0x06, RB1/RB2 para a porta serie
movwf TRISB ;move de W para TRISB
clrf OPTION_REG ;limpa registo OPTION
bsf TXSTA, 2 ;liga gerador de timing da USART para alta velocidade
movlw .25 ;gerador de velocidade :: 9k6bps - 25 ; 19k2bps - 12
movwf SPBRG
banksel PORTA ;muda para banco onde está o registo PORTA
movlw b’10010000’ ;liga USART, liga RX da USART,
movwf RCSTA ; liga alta velocidade do gerador baud rate
inicio
call setup ;inicializa e limpa LCD
movf RCREG, w ;carrega W com byte recebido pela porta serie, limpeza antes de iniciar recepcao
repete
btfss PIR1, 5 ;testa se recebeu byte pela porta serie
goto $-1 ;nao
nop ;compasso de espera, um ciclo de relógio
movf RCREG, w ;carrega W com byte recebido pela porta serie
call lcdout ;envia dados para o LCD
goto repete ;volta ao inicio do programa
;---------------------------
include “usar_lcd.asm” ;inclui fi cheiro de uso e confi guracao do LCD
;---------------------------
end
Exem
plo 32
microcontroladores PIC Exemplos Práticos
antónio sérgio senawww.senaeng.com : : soluções em electrónica e microcontroladores+351.967033209 111
Comparadores
Este programa activa/desactiva os pinos da porta B, consoante a saída do Comparador.O comparador tem uma entrada de sinal externo, e uma entrada de Tensão de Referência.A saída está disponivel apenas internamente.
Esquema eléctrico
Exem
plo 33
microcontroladores PIC Exemplos Práticos
antónio sérgio senawww.senaeng.com : : soluções em electrónica e microcontroladores+351.967033209 112
Código fonte do programa;#################################################################################
;
; Este programa activa/desactiva os pinos da porta B, consoante a saída
; do Comparador.
; O comparador tem uma entrada de sinal, e uma entrada de Tensão de Referência.
; A saída está disponivel apenas internamente.
;
; v1.0 01/02/2008 PIC16F886
;
; Autor: António Sérgio Sena, www.senaeng.com
;
;#################################################################################
processor 16F886 ;confi gura o tipo de CPU usado
radix hex ;pre-defi nicao do tipo de valores numericos usados
include “P16F886.inc” ;inclui pre-defi nicoes do processador
__confi g _CONFIG1, _DEBUG_OFF & _LVP_OFF & _FCMEN_OFF & _IESO_OFF & _BOR_OFF &
_CPD_OFF & _CP_OFF & _MCLRE_ON & _PWRTE_ON & _WDT_OFF & _INTRC_OSC_NOCLKOUT
__confi g _CONFIG2, _WRT_OFF & _BOR40V
;---------------------------
org 0x0000
banksel PORTA ;muda para o banco onde está o registo PORTA
clrf PORTA ;desliga buffers da porta antes de confi gurar
clrf PORTB ;desliga buffers da porta antes de confi gurar
clrf PORTC ;desliga buffers da porta antes de confi gurar
;confi gura toda a porta A para entrada/saida DIGITAL
banksel ANSEL ;muda para o banco onde está o registo ANSEL
movlw b’00001001’
movwf ANSEL ;Confi gura os pinos RA0 e RA3 como entradas do comparador
clrf ANSELH ;limpa o registo ANSELH
;confi gura portas A e B como entradas/saidas
banksel TRISA ;muda para banco onde está o registo TRISA
movlw 0b00001001 ;carrega W como 0x06
movwf TRISA ;move de W para TRISA
movlw 0x00 ;carrega W como 0x00
Exem
plo 33
microcontroladores PIC Exemplos Práticos
antónio sérgio senawww.senaeng.com : : soluções em electrónica e microcontroladores+351.967033209 113
movwf TRISB ;move de W para TRISB
movlw 0x00 ;
movwf TRISC ;porta C só com saídas
banksel CM1CON0 ;muda para o banco onde está o registo CM1CON0, confi guração do Comparador
movlw b’1000000’ ;Confi gura comparador 1 com duas entradas externas, e com a saída
movwf CM1CON0 ; disponivel apenas internamente
inicio
banksel CM1CON0 ;muda para banco onde está o registo CM1CON0
btfss CM1CON0, C1OUT ;verifi ca se o Comparador tem saida activa
goto limpar_portb ;limpa porta B
btfss CM1CON0, C1OUT ; re-verifi ca se o Comparador tem saida activa
goto inicio
banksel PORTB ;muda para banco onde está o registo PORTB
movlw 0xFF
movwf PORTB ;liga porta B por completo
goto inicio ;ciclo infi nito
limpar_portb
banksel PORTB ;muda para banco onde está o registo PORTB
clrf PORTB ;limpa porta B
goto inicio ;ciclo infi nito
;---------------------------
end
Exem
plo 33
microcontroladores PIC Exemplos Práticos
antónio sérgio senawww.senaeng.com : : soluções em electrónica e microcontroladores+351.967033209 114
Comparadores, 2
Este programa activa/desactiva os pinos da porta B, consoante a saída do Comparador.O comparador tem uma entrada de sinal, e a Tensão de Referência é interna.A saída está disponivel apenas internamente.
Esquema eléctrico
Exem
plo 34
microcontroladores PIC Exemplos Práticos
antónio sérgio senawww.senaeng.com : : soluções em electrónica e microcontroladores+351.967033209 115
Código fonte do programa;#################################################################################
;
; Este programa activa/desactiva os pinos da porta B, consoante a saída
; do Comparador.
; O comparador tem uma entrada de sinal, e a Tensão de Referência é interna.
; A saída do comparador está disponivel apenas internamente.
;
; v1.0 01/02/2008 PIC16F886
;
; Autor: António Sérgio Sena, www.senaeng.com
;
;#################################################################################
processor 16F886 ;confi gura o tipo de CPU usado
radix hex ;pre-defi nicao do tipo de valores numericos usados
include “P16F886.inc” ;inclui pre-defi nicoes do processador
__confi g _CONFIG1, _DEBUG_OFF & _LVP_OFF & _FCMEN_OFF & _IESO_OFF & _BOR_OFF &
_CPD_OFF & _CP_OFF & _MCLRE_ON & _PWRTE_ON & _WDT_OFF & _INTRC_OSC_NOCLKOUT
__confi g _CONFIG2, _WRT_OFF & _BOR40V
;---------------------------
org 0x0000
banksel PORTA ;muda para o banco onde está o registo PORTA
clrf PORTA ;desliga buffers da porta antes de confi gurar
clrf PORTB ;desliga buffers da porta antes de confi gurar
clrf PORTC ;desliga buffers da porta antes de confi gurar
;confi gura toda a porta A para entrada/saida DIGITAL
banksel ANSEL ;muda para o banco onde está o registo ANSEL
movlw b’00000001’
movwf ANSEL ;Confi gura os pinos RA0 e RA3 como entradas do comparador
clrf ANSELH ;limpa o registo ANSELH
banksel CM1CON0 ;muda para o banco onde está o registo CM1CON0, confi guração do Comparador
movlw b’1000000’ ;Confi gura comparador 1 com duas entradas externas, e com a saída
movwf CM1CON0 ; disponivel apenas internamente
movlw b’0010000’ ;Confi gura comparador 1 para usar a Fonte de Tensão de Referência Interna
movwf CM2CON1
;confi gura portas A e B como entradas/saidas
Exem
plo 34
microcontroladores PIC Exemplos Práticos
antónio sérgio senawww.senaeng.com : : soluções em electrónica e microcontroladores+351.967033209 116
banksel TRISA ;muda para banco onde está o registo TRISA
movlw b’00000001’ ;carrega W como 0x06, pin RA0 entrada
movwf TRISA ;move de W para TRISA
movlw 0x00 ;carrega W como 0x00
movwf TRISB ;move de W para TRISB
movlw 0x00 ;carrega W como 0x00
movwf TRISC ;move de W para TRISC
movlw b’10100110’ ;Tensao de Referencia a ~1.25V, apenas disponivel internamente
movwf VRCON
banksel PORTA ;muda para banco onde está o registo PORTA
inicio
banksel CM1CON0 ;muda para banco onde está o registo CM1CON0
btfss CM1CON0, C1OUT ;verifi ca se o Comparador tem saida activa
goto limpar_portb ;limpa porta B
btfss CM1CON0, C1OUT ; re-verifi ca se o Comparador tem saida activa
goto inicio
banksel PORTB ;muda para banco onde está o registo PORTB
movlw 0xFF
movwf PORTB ;liga porta B por completo
goto inicio ;ciclo infi nito
limpar_portb
banksel PORTB ;muda para banco onde está o registo PORTB
clrf PORTB ;limpa porta B
goto inicio ;ciclo infi nito
;---------------------------
end
Exem
plo 34
microcontroladores PIC Exemplos Práticos
antónio sérgio senawww.senaeng.com : : soluções em electrónica e microcontroladores+351.967033209 117
Conversor A/D
Este programa disponibiliza o resultado da conversão Analógica/Digital, na porta B.
Esquema eléctrico
Exem
plo 35
microcontroladores PIC Exemplos Práticos
antónio sérgio senawww.senaeng.com : : soluções em electrónica e microcontroladores+351.967033209 118
Código fonte do programa;#################################################################################;; Este programa disponibiliza o resultado da conversão A/D, na porta B;; v1.0 01/02/2008 PIC16F886;; Autor: António Sérgio Sena, www.senaeng.com;;#################################################################################
processor 16F886 ;confi gura o tipo de CPU usado radix hex ;pre-defi nicao do tipo de valores numericos usados include “P16F886.inc” ;inclui pre-defi nicoes do processador
__confi g _CONFIG1, _DEBUG_OFF & _LVP_OFF & _FCMEN_OFF & _IESO_OFF & _BOR_OFF & _CPD_OFF & _CP_OFF & _MCLRE_ON & _PWRTE_ON & _WDT_OFF & _INTRC_OSC_NOCLKOUT __confi g _CONFIG2, _WRT_OFF & _BOR40V
;---------------------------
org 0x0000 goto start
org 0x0020start
banksel PORTA ;muda para o banco onde está o registo PORTA clrf PORTA ;desliga buffers da porta antes de confi gurar clrf PORTB ;desliga buffers da porta antes de confi gurar clrf PORTC ;desliga buffers da porta antes de confi gurar
;confi gura toda a porta A para entrada/saida DIGITAL banksel ANSEL ;muda para o banco onde está o registo ANSEL movlw b’00000001’ movwf ANSEL ;Confi gura os pinos RA0 e RA3 como entradas do comparador clrf ANSELH ;limpa o registo ANSELH
;confi gura portas A e B como entradas/saidas banksel TRISA ;muda para banco onde está o registo TRISA movlw b’00000001’ ;RA0 como entrada, restantes como saídas
Exem
plo 35
microcontroladores PIC Exemplos Práticos
antónio sérgio senawww.senaeng.com : : soluções em electrónica e microcontroladores+351.967033209 119
movwf TRISA ;move de W para TRISA clrf TRISB ;porta B toda como saida clrf TRISC ;porta C toda como saida
movlw b’00000000’ ;resultado justifi cado à esquerda, e movwf ADCON1 ; usadas tensões de referência internas
banksel ADCON0 ;muda para o banco onde está o registo ADCON0 movlw b’11000001’ ;usa clock de conversão RC, escolhe canal AN0, e liga o ADC movwf ADCON0
inicio
bsf ADCON0, GO ;dá inicio à conversão AD
btfsc ADCON0, GO ;já terminou a conversão? goto $-1 ; não
movf ADRESH, w ; sim, coloca resultado no W movwf PORTB ;mostra resultado ADC na porta B
goto inicio ;ciclo infi nito
;---------------------------
end
Exem
plo 35
microcontroladores PIC Exemplos Práticos
antónio sérgio senawww.senaeng.com : : soluções em electrónica e microcontroladores+351.967033209 120
Conversor A/D, 2
Este programa disponibiliza o resultado da conversão Analógica/Digital, no mostrador de 7-segmentos.
Esquema eléctrico
Exem
plo 36
microcontroladores PIC Exemplos Práticos
antónio sérgio senawww.senaeng.com : : soluções em electrónica e microcontroladores+351.967033209 121
Código fonte do programa;#################################################################################;; Este programa mostra o resultado da conversão A/D, no display de 7-segmentos;; v1.0 01/02/2008 PIC16F886;; Autor: António Sérgio Sena, www.senaeng.com;;#################################################################################
processor 16F886 ;confi gura o tipo de CPU usado radix hex ;pre-defi nicao do tipo de valores numericos usados include “P16F886.inc” ;inclui pre-defi nicoes do processador
__confi g _CONFIG1, _DEBUG_OFF & _LVP_OFF & _FCMEN_OFF & _IESO_OFF & _BOR_OFF & _CPD_OFF & _CP_OFF & _MCLRE_ON & _PWRTE_ON & _WDT_OFF & _INTRC_OSC_NOCLKOUT __confi g _CONFIG2, _WRT_OFF & _BOR40V
;---------------------------
CBLOCK 0x20 temp, temp2 ;variaveis usadas nos temporizadores unidades, dezenas, centenas, milhares ;variaveis usadas para contador do digito
resultado ;para o conversor BCD ENDC
;---------------------------
org 0x0000 goto start
org 0x0020start
banksel PORTA ;muda para o banco onde está o registo PORTA clrf PORTA ;desliga buffers da porta antes de confi gurar clrf PORTB ;desliga buffers da porta antes de confi gurar clrf PORTC ;desliga buffers da porta antes de confi gurar
Exem
plo 36
microcontroladores PIC Exemplos Práticos
antónio sérgio senawww.senaeng.com : : soluções em electrónica e microcontroladores+351.967033209 122
;confi gura toda a porta A para entrada/saida DIGITAL banksel ANSEL ;muda para o banco onde está o registo ANSEL movlw b’00000001’ movwf ANSEL ;Confi gura os pinos RA0 e RA3 como entradas do comparador clrf ANSELH ;limpa o registo ANSELH
;confi gura portas A e B como entradas/saidas banksel TRISA ;muda para banco onde está o registo TRISA movlw b’00000001’ ;RA0 como entrada, restantes como saídas movwf TRISA ;move de W para TRISA clrf TRISB ;porta B toda como saida clrf TRISC ;porta C toda como saida
movlw b’00000000’ ;resultado justifi cado à esquerda, e movwf ADCON1 ; usadas tensões de referência internas
banksel ADCON0 ;muda para o banco onde está o registo ADCON0 movlw b’11000001’ ;usa clock de conversão RC, escolhe canal AN0, e liga o ADC movwf ADCON0
inicio
bsf ADCON0, GO ;dá inicio à conversão AD btfsc ADCON0, GO ;já terminou a conversão? goto $-1 ; não movf ADRESH, w ; sim, coloca resultado no W call converte_para_BCD ;converte o valor do ADC, para um número BCD ; que se possa visualizar nos 7-segmentos
call mostra_digitos ;mostra contador nos digitos de 7-segmentos
goto inicio ;ciclo infi nito
;---------------------------
tabela addwf PCL,f ;tabela de conversao para 7-segmentos retlw b’00111111’ ;0 retlw b’00000110’ ;1 retlw b’01011011’ ;2 retlw b’01001111’ ;3 retlw b’01100110’ ;4 retlw b’01101101’ ;5 retlw b’01111101’ ;6 retlw b’00000111’ ;7 retlw b’01111111’ ;8
Exem
plo 36
microcontroladores PIC Exemplos Práticos
antónio sérgio senawww.senaeng.com : : soluções em electrónica e microcontroladores+351.967033209 123
retlw b’01101111’ ;9 retlw b’01110111’ ;a retlw b’01111100’ ;b retlw b’01011000’ ;c retlw b’01011110’ ;d retlw b’01111001’ ;e retlw b’01110001’ ;f retlw 0
;---------------------------
mostra_digitos ;mostra contador nos digitos de 7-segmentos
digito_1 clrf PORTC ;desliga displays movf unidades, w ;carrega valor das unidades call tabela movwf PORTB ;carrega barramento porta B bsf PORTC, 0 ;liga display 1
call atraso_5m
digito_2 clrf PORTC ;desliga displays movf dezenas, w ;carrega valor das dezenas call tabela movwf PORTB ;carrega barramento porta B bsf PORTC, 1 ;liga display 2
call atraso_5m
digito_3 clrf PORTC ;desliga displays movf centenas, w ;carrega valor das centenas call tabela movwf PORTB ;carrega barramento porta B bsf PORTC, 2 ;liga display 1
call atraso_5m
return ;---------------------------
converte_para_BCD ;função que converte um número binário, para três registos BCD
movwf resultado ;guarda o valor a ser convertido
clrf unidades ;limpa registos fi nais clrf dezenas clrf centenas
Exem
plo 36
microcontroladores PIC Exemplos Práticos
antónio sérgio senawww.senaeng.com : : soluções em electrónica e microcontroladores+351.967033209 124
clrf milhares
sub100 movlw d’100’ subwf resultado, f ;subtrai 100 btfss STATUS, C ;menor que 0? goto outsub100 ; não incf centenas, f ; sim, incrementa uma centena goto sub100 ;volta a fazeroutsub100 movlw d’100’ addwf resultado, f ;soma 100 bcf STATUS, C
sub10 movlw d’10’ subwf resultado, f ;subtrai 10 btfss STATUS, C ;menor que 0? goto outsub10 ; não incf dezenas, f ; sim, incrementa uma dezena goto sub10 ;volta a fazeroutsub10 movlw d’10’ addwf resultado, f ;soma 10 bcf STATUS, C
sub1 movlw 0x01 subwf resultado, f ;subtrai 1 btfss STATUS, C ;menor que 0? goto outsub1 ; não incf unidades, f ; sim, incrementa uma unidade goto sub1 ;volta a fazeroutsub1 incf resultado, f ;soma 1 bcf STATUS, C
return
;---------------------------
atraso_5m movlw 0x0A ;carrega W com o valor 0x0A movwf temp2 ;move valor em W para TEMP
call atraso_500u ; decfsz temp2, f ;decrementa TEMP em uma unidade, coloca resultado em TEMP ;e salta a instrucao seguinte, se o resultado for zero goto $-2
Exem
plo 36
microcontroladores PIC Exemplos Práticos
antónio sérgio senawww.senaeng.com : : soluções em electrónica e microcontroladores+351.967033209 125
return ;sai fora da rotina de ATRASO
;---------------------------
atraso_500u movlw 0xA5 ;carrega W com o valor 0xA5 movwf temp ;move valor em W para TEMP
decfsz temp, f ;decrementa TEMP em uma unidade, coloca resultado em TEMP ;e salta a instrucao seguinte, se o resultado for zero goto $-1 ; return ;sai fora da rotina de ATRASO
;---------------------------
end
Exem
plo 36
microcontroladores PIC Exemplos Práticos
antónio sérgio senawww.senaeng.com : : soluções em electrónica e microcontroladores+351.967033209 126
antónio sérgio sena
www.senaeng.com : : soluções em electrónica
+351.967033209
CONTACTOS
António Sérgio Sena, B.Eng.
asena@senaeng.com
www.senaeng.com :: soluções em electrónica e microcontroladores
info@senaeng.com
+351.967033209+351.236215256 (fax)
top related