Como de costume deixo um video aqui para voces darem uma olhada..
(pic utilizado: PIC16F628A)
Bom vamos ao que interessa:
O esquema utilizado foi o seguinte:
Como voces podem ver os pinos RB0,RB1,RB2,RB3,RB4,RB5,RB6 foram ligados no display de 7 segmentos, e dependendo do valor da resistencia no potenciometro, o mesmo ira apresentar um digito.
O pino RA5 foi ligado a uma chave para executar o master reset quando apertado... resetando todo o sistema.
e o mais famoso dos pinos é o RA2, local onde a magica acontece...heheheh
no codigo quando eu executo o comando "call c_limpa",o mesmo faz o pino Ra2 virar saida (output) e coloca o seu nivel logico em 0, garantindo assim que o capacitor seja totalmente descarregado...
logo em seguida executo o seguinte codigo "call c_verifica" onde la a primeira coisa a fazer é deixar o ra2 como imput novamente e logo em seguida ja comeco a roda o contador de tempo que fica analizando a o pino Ra2 ir para NL alto (5V) atraves dos comandos:
btfss porta,2 ;Verifica se o RA2 ja foi para NL =1
goto $-1 ;fica verificando ate ser estourado
enquando ele esta aqui verificando, o contador TMR0 esta rodando e toda vez que o mesmo estoura (passa de FFh para 00h), ocorre entao uma interrupcao que sera tratada no end 0004h onde la é incrementado o a parte mais significativa do countHI.
quando finalmente o pino ra2 for para NL alto, o TMR0 é armazenado em countLO...
apos isso conforme o valor de count LO e countHI um digito sera atribuido ao contador que sera apois isso colocado no display de 7 segmentos...
.....
Mas como o capacitor demora diferentes tempos para carregar?
Simples atraves do circuito RC serie...
Quando colocamos um resistor em serie com um capacitor o mesmo ira demorar um determinado tempo para se carregar:
Tcarga=R*C*ln(Ve/(Ve-Vc))
portanto para ter uma nocao mais ou menos do tempo que iria demorar eu utilizei o produto RC que eu queria (quando se faz R*C o valor encontrado representa o tempo necessario para o capaciotr carregar-se com 63% do valor da fonte...)
sabendo que iria utiliza um capacitor de 0.1uF montei a seguinte tabela abaixo:
( sabendo que o TMR0 conta de 0 a 255, pude verificar que o mesmo demora aproximadamente 275us para estourar, em cima disso criei uma logica...)
Como mostrado no video ao envez de utilizarmos um potenciomentro, podemos utilizar um LDR ou qualquer outra coisa que varia a sua resistencia de acordo com algum fator externo.. podendo assim modificar o tempo de carga do capacitor e gerar um dado referente ao mesmo...
Codigo em ASM (por causa da perda de formatacao coloquei o arquivo fonte no rapidshare):
http://rapidshare.com/files/298393643/codigo_v1_0_b.asm
;################################# - TITULO - ##########################
;# Display 7 Segs, ativado de acordo com o tempo de carga do capacitor#
;# Usando capacitor, potenciomentro, Resistencia,display de 7seg #
;# inicio do projeto : 24/10/2009 #
;# Pic utilizado 16f628A (possui 16pinos de I/O) #
;#######################################################################
; Definicoes de hardware
;----------------------------------------------------------------------=
; Mapa do Display (Catodo Comum) 1= acende 0=Apaga
;
; A
; ########
; # # pino12 RB6 --------A
; F # # B pino11 RB5 --------B
; # G # pino10 RB4 --------C
; # ###### # pino9 RB3 --------D
; # # pino8 RB2 --------E
; E # # C pino7 RB1 --------F
; # # pino6 RB0 --------G
; ########
; D
;
;
;Positivo do capacitor ligado no pino RA2 ---- pino 1 do pic
;
;VCC ligado no pino 14
;GND ligado no pino 5
;
;RA5 pino 4
;
;Portas livres : RA0,RA1,RA3,RA4,RA6,RA7,RB7
;
;------------------------- DIRETIVAS PARA O COMPILADOR -----------------
lIST P=16f628A
RADIX DEC ;Todo numero digitado ser interpretado como decimal
INCLUDE
__CONFIG _CP_OFF & _DATA_CP_OFF & _LVP_OFF & _BOREN_OFF & _MCLRE_ON & _WDT_OFF & _PWRTE_OFF & _INTOSC_OSC_NOCLKOUT
;----------------------- VARIAVEIS E EQUIVALENCIAS ---------------------
w_temp equ 0x23 ;Quando eu precisar de 2 valores
contador equ 0x24 ;contador que armazena o valor a ser mostrado no lcd
countLO equ 0x25
countHI equ 0x26
;------------------------------ ENDEREÇO 00000 ---------------------------------
org 0x0000
goto INICIO
;----------------------------- INTERRUPCAO -------------------------------------
org 0x0004
incf countHI
bcf intcon,T0IF
retfie
;----------------------- INICIALIZAÇÃO DO PROGRAMA ---------------------
INICIO
movlw 0x07 ;Desativa a opcao de comparadores nos pinos
movwf cmcon ;Ra0-Ra3 (datasheet pag63-64)que
bsf status,rp0 ;Vai para o banco 1 da RAM a'
clrf trisb ;Portb todo como OUTPUT
movlw 0xff
movwf trisa ;port A inteiro como INPUT
bsf option_reg,PSA ;prescale para o Timer0
;como o option_reg inteiro fica em nl=1 ao iniciar, o prescale esta para o wdt,
;que no caso nao sera utilizado.
bcf option_reg,T0CS ;utiliza o clock interno para fazer a contagem...
bcf status,rp0 ;Volta para o banco 0
clrf intcon ;todas as interrupcoes desativas
bsf intcon,T0IE ;Habilita a interrupacao do timer0
;-------------------------- PROGRAMA PRINCIPAL ----------------------------------
clrf contador ;zera o contador
principal
movf contador,w
call decodifica ;pega o valor a ser impresso no display que seja correspondente ao valor de contador
movwf portb ;atualiza display
call atualiza_contador ;vai ver a situacao do potenciometro
goto principal
;----------------------- Sub Rotina - Delay - ------------------------------------
atualiza_contador
call c_limpa ;garante que o capacitor tera 0V antes de comecar a carregar
call c_verifica ;atualiza os valor de countHI e countLO
movlw 0x08
subwf countHI,w ;countHI-9=>w
btfsc status,c ;Se o valor der negativo entao tudo bem pois c=0 entao pula a proxima linha
goto estouro_countHI
movf countHI,w ;joga o valor de countHI em w
call arruma_countHI
movwf contador ;
btfsc countLO,7 ;O TMR0 chegou ate a metade aproximadamente 128???
incf contador ;se sim entao soma uma no contador para ser atualizado corretamente
retlw 0x00 ;Retornapara o principal
estouro_countHi
movlw 0x10
movwf contador ;faz o countHi ficar obrigatoriamente com o valor 9
retlw 0x00
arruma_countHI
addwf PCL ;Faz com que o programa "Pule" para a linha
;com o codigo deseja
retlw 0x00
retlw 0x02
retlw 0x04
retlw 0x06
retlw 0x08
retlw 0x0A
retlw 0x0C
retlw 0x0E
c_verifica
bsf status,rp0 ;vai para o banco 1
movlw 0xff ;deixa o porta como imput
movwf trisa
bcf status,rp0 ;volta para banco 0
clrf countHI ;zera a parte mais significativa do Counter
clrf TMR0 ;zera o contador
bcf intcon,T0IF ;garante que o bit de estouro do timer0 esteja em 0 quando ativado as int.
bsf intcon,GIE ;incia interrupcao
btfss porta,2 ;Verifica se o RA2 ja foi para NL =1
goto $-1 ;fica verificando ate ser estourado
movf TMR0,w ;joga o valor de TMR0 para countLO
bcf intcon,GIE ;desabilita interrupcoes
btfsc intcon,GIE ;espera de fato a mesma ser concretizada
goto $-2
movwf countLO ;armazena a parte baixa do contador
retlw 0x00 ;volta zerando o w
c_limpa
bsf status,rp0 ;vai para banco 1
clrf trisa ;deixa o porta como saida
bcf status,rp0 ;volta para o banco0
clrf porta ;garante que o pino ligado ao capacitor va para 0 descarregando assim o capacitor
retlw 0x00 ;volta para a chamada principal com w=0
;------------------------------------------------------------
decodifica
addwf PCL ;Faz com que o programa "Pule" para a linha
;com o codigo deseja
; ABCDEFG
retlw B'01111110' ; 0
retlw B'00110000' ; 1
retlw B'01101101' ; 2
retlw B'01111001' ; 3
retlw B'00110011' ; 4
retlw B'01011011' ; 5
retlw B'01011111' ; 6
retlw B'01110000' ; 7
retlw B'01111111' ; 8
retlw B'01111011' ; 9
retlw B'01110111' ;A
retlw B'00011111' ;B
retlw B'01001110' ;C
retlw B'00111101' ;D
retlw B'01001111' ;E
retlw B'01000111' ;F
retlw B'00001000' ;_
;---------------------------- FIM --------------------------------
end
Muito bom projeto..
ResponderExcluirCaro amigo ... meus parabens ...
eu sou estudante de Tecnologia em Eletronica - Automação industrial e agora (5 semestre) me interecei muito sobre microcontroladores e estou tentando aprender um pouco ... espero trocar experiencias e aprendizado ...
Estou iniciando estudos com microcontroladores ... estou seguindo a aula do meu professor ... estou aprendendo a mecher com display 7 seg ...
Soh uma pergunta: vc usa qual software pra simular ? eu to usando o proteus ...
continue com o Blog ..
abraçooo...
E ai blz?
ResponderExcluirParabéns pelos projetos, no momento estou fazendo um projeto de TCC, estou utilizando o pic 16F628A. estou programando no picbasic pro, utilizando o proteus para simular e gravando o pic como icprog.
não conheço muito sobre pic, se você puder me ajudar eu agradeço, minha dúvida é a seguinte, fiz a programação e simulei no proteus, nele roda perfeito, mas após a gravação do pic, nao acontece nada, estou utilizando LCD 16X2, e o meu projeto é um separador e contador de moedas, sendo que o pic será utilizado somente para realizar a contagem das moedas.
Você poderia me ajudar? estou com um pouco de urgência
segue meu email: heltonpl@hotmail.com
Obrigado!
Antes de mais nada muito obrigado pelos elogios pessoal... É isso que me da vontade de continuar...
ResponderExcluirvou responder um de cada vez:
1)Bruce
Entao eu nao utilizo muito o programa de simulacao, na verdade fui conhecer o proteus hoje mesmo ehehhe ele é uma exelente alternativa para simular mas em alguns casos ele nao funciona muito bem... por exemplo esse micro-projeto mesmo que eu fiz nao roda direito no proteus mas na pratica esta 100% funcional...
O que eu custumo fazer é o seguinte:
Depois de escrito todo o codigo (asm) eu utilizo o proprio simulador linha a linha do mplab, usando para simular algum tipo de botao externo a parte de stimulus.. entao vou rodando linha a linha ate ter certeza que esta tudo bem.. depois quando eu gravo o pic praticamente ja esta tudo rolando...!!
Se quiser saber como funciona essa simulacao linha a linha no mplab eu posso ti explicar melhor,passar um site em portugues que explica, ou ate mesmo montar um video...
é só dar um toque..
2)helton
Entao helton olha sinceramente eu nao sei nada de basic, por enquanto to só em asm... mas posso ti ajudar sem problemas nenhum...
na hora de colocar no mundo real é onde os problemas acontecem eheheh
as vezes pode ser que vc nao esteja ligando todos os pinos corretamente, por exemplo esta esquecendo de ligar o vcc ou o terra ou o master reset em 5v caso o pino r5 estiver sendo usando para reset...
enfim pode ser varias coisas...
se quiser meu e-mail/msn é ticoso08@hotmail.com
eu consigo entrar soh de noite por conta da facu e do trampo...
mas ai e só gritar...
Este comentário foi removido por um administrador do blog.
ResponderExcluirParabens. muito legal mesmo, pois é feito em ASM. essa ideia sua é resumida em um comando chamado POT na linguagem - Proton Ide (PICBASIC). eu nao sei programar em ASM por isso utilizo o PICBASIC. entre no canal wanderlg do youtube pra gente trocar umas ideias.
ResponderExcluirEm PICBASIC ficaria assim:
variavel = POT pino, Escala
X = POT PORTA.2, 100
escala pode ser de 1 a 255
Parabens. muito legal mesmo, pois é feito em ASM. essa ideia sua é resumida em um comando chamado POT na linguagem - Proton Ide (PICBASIC). eu nao sei programar em ASM por isso utilizo o PICBASIC. entre no canal wanderlg do youtube pra gente trocar umas ideias.
ResponderExcluirEm PICBASIC ficaria assim:
variavel = POT pino, Escala
X = POT PORTA.2, 100
escala pode ser de 1 a 255
interessante voce sempre escreve seus cuigs em asm. eu teno uma certa dificuldade em asm custumo escrever mais em C voce esta de parabens
ResponderExcluiro projeto do quarto automatizado é bem interessante muito legal esta interface do controle com o sistema!!!!!!
Danilo s. cabral