segunda-feira, 26 de outubro de 2009

Micro-Projeto: Utilizando tempo de Carga de Capacitor...

Esse fim de semana estava estudando algumas aplicacoes para microcontroladores e me deparei com uma ideia que achei fantastica... em cima disso criei um micro-projeto para apresentar essa ideia...
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

7 comentários:

  1. Muito bom projeto..

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

    ResponderExcluir
  2. E ai blz?

    Parabé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!

    ResponderExcluir
  3. Antes de mais nada muito obrigado pelos elogios pessoal... É isso que me da vontade de continuar...

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

    ResponderExcluir
  4. Este comentário foi removido por um administrador do blog.

    ResponderExcluir
  5. 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.

    Em PICBASIC ficaria assim:

    variavel = POT pino, Escala
    X = POT PORTA.2, 100

    escala pode ser de 1 a 255

    ResponderExcluir
  6. 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.

    Em PICBASIC ficaria assim:

    variavel = POT pino, Escala
    X = POT PORTA.2, 100

    escala pode ser de 1 a 255

    ResponderExcluir
  7. interessante voce sempre escreve seus cuigs em asm. eu teno uma certa dificuldade em asm custumo escrever mais em C voce esta de parabens
    o projeto do quarto automatizado é bem interessante muito legal esta interface do controle com o sistema!!!!!!

    Danilo s. cabral

    ResponderExcluir