Moderadores: andre_luis, 51, guest2003, Renie
;*********************************** dimmer digital***************************************
;
; diogo franscisco da silva 25/04/2009
; este projeto em um dimmer digital com display de sete segmento onde sera indicado
; a potencia que a onda sera controlada via disparo do pic.
;
;******************************************************************************************
;***********************************descriçoes das portas**********************************
; rb0 saida bcd a
; rb1 saida bcd b
; rb2 saida bcd c
; rb3 saida bcd d
; rb4 entrada entrada do sincronismo
; rb5 entrada chave prog
; rb6 entrada chave menos
; rb7 entrada chave mais
;
; ra0 saida display unidade
; ra1 saida display dezena
; ra2 saida display centena
; ra3 saida rele
; ra4 (saida disparo?)
;********************************************************************************************
;*********************************configuraçoes do pic***************************************
radix hex
list p=16f84a
#include <p16f84A.inc>
__config _xt_osc & _cp_off & _wdt_off & _pwrte_on
;*********************************************************************************************
;**********************************registradores de uso geral*********************************
cblock 0x0c
tempograva
unidade
dezena
centena
controle
delaychave
somadez
auxisoma
TEMPODIMMER
grave
dado
auxizera
endc
;**********************************************************************************************
;***********************************definiçoes*************************************************
#define duni porta,0 ;saida que controla display unidade
#define ddez porta,1 ;saida que controla display dezena
#define dcen porta,2 ;saida que controla display centena
#define rele porta,3 ;saida que controla o rele
#define sinc portb,4 ;entrada do sincronismo 60 Hz
#define ch_up portb,7 ;chave que aumenta valor da potencia
#define ch_don portb,6 ;chave diminui o valor da potencia
#define prog portb,5 ;chave de programaçao
;***********************************************************************************************
;*************************************inicializaçao dos port************************************
org 0x00 ;endereço inicial do banco de memoria
bcf status,rp0 ;seleciona o banco 0
clrf portb ;limpa o portb
clrf porta ;limpa o porta
bsf status,rp0 ;seleciona o banco 1
movlw 0xf0 ;carrega com 11110000
movwf trisb ;0000 saidas 1111 entradas
movlw 0x00 ;carrega com 00000
movwf trisa ;00000 saidas
movlw 0x01 ;prescaler 1:4, tmr0,pull up habilitado
movwf option_reg ;definicoes
movlw 0x00 ;carrega com 00000000*****************
movwf intcon ;nenhuma interrupçao sera tratada
bcf status,rp0 ;seleciona o banco 0
;**************************************************************************************************
;*************************************************************************************************
;gravaçao da memoreia com os valores do dimmer
movlw 0xf0
movwf tempograva
varreprog
nop
btfsc prog ;botao prog ta pressionado?
goto naoprog ;ele naum esta pressionado
decfsz tempograva,f ;dec variavel
goto varreprog ;volta ver a chave
goto cleareg ;limpa registradore s da memoria
;****************************************************************************************************
;neste ponto e onde vai ser limpado o banco de memoria para aa gravaçao dos registradores
cleareg
movlw 0x40 ;carrega com 64 referente as posiçoes de memoria
movwf auxizera ;registrador que auxilia na limpeza da memoria
escram
bcf status,rp0 ;banco 0
bcf eecon1,eeif ;zera o flag da eprom
clrf dado ;limpa dado
movf auxizera,w ;endereço da memoria
call grava ;rotina que grava a ram
decfsz auxizera,f
goto escram
bcf status,rp0 ;banco 0
bcf eecon1,eeif ;zera o flag da eprom
clrf dado ;limpa dado
movf auxizera,w ;endereço da memoria
call grava ;rotina que grava a ram
call le_ram ;ler os dados da memoria
goto principal ;inicio do programa
;............................................................................................................
le_ram
movlw 0x01
call le
movwf unidade
movlw 0x02
call le
movwf dezena
movlw 0x03
call le
movwf centena
movlw 0x04
call le
movwf grave
return
le
Movwf EEADR ;EEADR (endereço da eeprom)
Bsf STATUS,RP0 ;banco 1 onde está o EECON1
Bsf EECON1,RD ;inicia a leitura, leva um ciclo de
nop ;máquina
Bcf STATUS,RP0 ;volto ao banco 0 onde está o EEDATA
Movf EEDATA,W ;W=EEDATA( w= 10H eeprom )
return)))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))
;grava na memoria valores
grava
Movwf EEADR ;EEADR (endereço da eeprom)
Movf dado,w ;w
Movwf EEDATA ;EEDATA(dado a ser gravado)
Bsf STATUS,RP0 ;banco 1 onde está o EECON1
bsf EECON1,WREN ;Habilita a escrita na EEPROM
movlw 0x55 ;W=55H
movwf EECON2 ;EECON2 = 55H
movlw 0xAA ;W=AAH
movwf EECON2 ;EECON2 = AAH
bsf EECON1,WR ;WR=1 (inicia a gravação)
bsf EECON1,WREN ;desabilita a escrita na EEPROM
espera
btfss EECON1,EEIF ;testa flag de término de gravação
goto espera ;EEIF=0 então espera terminar
bcf EECON1,EEIF ;EEIF=1 então zera o flag p/ próximo
;uso
Bcf STATUS,RP0 ;volto ao banco 0
return
;_____________________))))))))))))))))))))________________))))))))))))))))))))))))_____________________))))))))
naoprog
btfss grave,0 ;ve se e a primeira ves que limpa banco da memoria
goto cleareg ;aki limpa a memoria
call le_ram
goto principal
;000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
;*****************************************zeramentodas variaveis***********************************
principal
clrf auxisoma
clrf tempodimmer
; clrf unidade
; clrf dezena
; clrf centena
clrf controle
clrf delaychave
goto inicio
;*****************************************************************************************************
;******************************************inicio do programa*****************************************
inicio
call atual1 ;aqui vai para rotina atualizar display multiplexado
inicio1
call atual ;aqui vai para rotina atualizar display multiplexado
call chave ;aqui vai para subrotina testa chave incremento e decremento
call chaveprog ;testa pra ver se pode começar a controlar onda
goto inicio1
;******************************************************************************************************
;**************************************dimmer**********************************************************
;aki começao controle de potencia do dimmer os displays seram todos apagados para facilitar o controle
;da onda,
dimmer
bcf duni ;apaga display unidade
bcf ddez ;apaga display dezena
bcf dcen ;apaga display centena
;00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
bsf grave,0 ;seta bit de zeramento da memoria
bcf status,rp0 ;banco 0
bcf eecon1,eeif ;zera o flag da eprom
movf unidade,w ;valor programado
movwf dado ;coloca valor em dado
movlw 0x01 ;endereço 1 da memoria
call grava ;rotina que grava
bcf status,rp0 ;banco 0
movf dezena,w ;valor programado
movwf dado ;coloca valor em dado
movlw 0x02 ;endereço 2 da memoria
call grava ;rotina que grava
bcf status,rp0 ;banco 0
movf centena,w ;valor programado
movwf dado ;coloca valor em dado
movlw 0x03 ;endereço 3 da memoria
call grava ;rotina que grava
bcf status,rp0 ;banco 0
movf grave,w ;valor programado
movwf dado ;coloca valor em dado
movlw 0x04 ;endereço 3 da memoria
call grava ;rotina que grava
call le_ram
;00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
movlw 0xfa ;carrega com 255 em decimal
movwf delaychave ;coloca o valor no registrador espera 1ms para começar a rotina
nop
decfsz delaychave,f ;decrementa e zero
goto $-2 ;volta decrementa
goto conta ;somar os registradores
;¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨
conta
clrf somadez ;limpa
clrf auxisoma ;limpa
clrw ;limpa w
movf centena,w ;coloca o valor em w
xorlw 0x01 ;compara se e 1
btfss status,z ;e 1?
goto somaini ;busca no banco de memoria o valor correspondente
movlw 0x64 ;carrega com 100
movwf auxisoma ;crrega 100
goto valordimmer ;busca no banco de memoria o valor
somaini
movlw 0x0a
movwf somadez ;coloca valor 10
soma
clrw ;limpa w
movf dezena,w ;coloca valor de dezena em w ex:9
addwf auxisoma,f ;guarda o valor em f; 0+9........90
decfsz somadez,f ;e igual a zero
goto soma ;ainda naum
movf unidade,w ;coloca unidade em w
addwf auxisoma,f ;soma unidade com dezena 90 +9
goto valordimmer
;_______________________________________________________________________________________________________
;aqui inicia a conversao do display para o tempo de disparo do dimmer
valordimmer
call veonda ;espera sinal pra sincronismo
call timerpera ;aki oprograma cria um atrasopara deposi começar o disparo
call converte ;aki trata tempo que vaio ser disparado o dimmer
btfsc prog ;botao pra sai do modo dimmer
goto valordimmer
nsolto
btfsc prog
goto vbsolto
goto nsolto
vbsolto
goto inicio1
;¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨*************************************************)))))))))))))))))))))))))))))))))veonda_______________________________________________________________________
veonda
naoe
btfsc sinc ;a onda e zero?
goto naoe
goto sime
sime
btfss sinc
goto sime ;aqui a onda naum foi a 1
return ;aqui e onda foi 1
;%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
timerpera
movlw 0x64 ;carrega com 100 *****************
movwf tempodimmer
naoacabo
nop
decfsz tempodimmer,f ;decrementa
goto naoacabo ;naum acabou tempo de 1 ms
return
;*****************************************************&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&*******************
;converte o valor do registrador para procurar o valor na tabela de tempo
;tamanho pulso de atraso de cada disparo
converte
movf auxisoma,w
sublw 0x65 ;carrega com 101
movwf tempodimmer ;subtrai 101 do registrador
voltala
bcf intcon,t0if ;limpa flag
movlw 0xf0 ;243 (240)**********************************
movwf tmr0
btfss intcon,t0if ;testa pra ver se tem interrupçao
goto $-1
decfsz tempodimmer,f ;e zero
goto voltala ;naum
;tempo de 300us para disparo da onda
bsf rele ;ativa disparo dimmer
bcf intcon,t0if ;reseta bit
movlw 0xb4 ;carrega com 1oo000000 75
movwf tmr0 ;carrega timer
btfss intcon,t0if
goto $-1
bcf rele ;desliga saida
bcf intcon,t0if
return
;******************************************************************************************************
;**************************************inicia chave prog***********************************************
;aqui entra o modo de operaçao para ver se a chave prog esta acionada para funcionamento do dimmer
chaveprog
movlw 0x64 ;carrega com 100 em decimal
movwf delaychave ;coloca o valor no registrador
vchaveprog
btfsc prog ; a chave prog esta pressionada ?
return ;volta para o programa principal
decfsz delaychave,f ;decrementa o registrador anti ruido da chave
goto vchaveprog ;volta pois nao acabou o tempo
vchavednovo
btfss prog ;chave esta solta?
goto perai ;vai atualizar display quando a chave naum esta solta
goto dimmer ;aqui vai começar usar o dimmer
perai
call atual ;atualiza display
goto vchavednovo
;*************************************atualiza display multiplexado************************************
atual
btfss intcon,t0if ;houve interrupçao?
return ;nao houve interrupçao volta para rotina principal
btfss controle,0 ; e um trata display unidade
goto testa ;testa dezena
goto atual1 ;trata unidade
testa
btfss controle,1 ;e um trata display dezena
goto testa1 ;testa o proximo bit
goto dez ;vai tratar dezena
testa1
btfss controle,2 ; e um trata display centena
goto atual ;*******indica qu e houve erro
goto cen ;trata display centena
atual1
bcf controle,0 ;apaga o bit e indica que vai atualizar dezena
bcf dcen ;apaga display centena
bcf ddez ;apaga display dezena
bsf controle,1 ;seta o bit e indica que vai atualizar a dezena
movf unidade,w ;coloca o valor em w
movwf portb ;coloca o valor no portb
bsf duni ;seleciona display unidade
goto timer ;tempo para multiplexaçao
dez bcf controle,1 ;apaga bit pois ja passou por ai
bcf duni
bcf dcen
bsf controle,2 ;seta o bit e indica que vai atualizar a centena
movf dezena,w ;coloca o valor em w
movwf portb ;coloca o valor no portb
bsf ddez ;seleciona display dezena
goto timer ;tempo para multiplexaçao
cen
bcf controle,2
bcf duni
bcf ddez
bsf controle,0 ;seta o bit e indica que vai atualizar a unidade
movf centena,w ;coloca o valor em w
movwf portb ;coloca o valor no portb
bsf dcen ;seleciona display centena
goto timer ;tempo para multiplexaçao
;*****************************************************************************************************
;********************************************timer****************************************************
timer
bcf intcon,t0if ;zera flag do tmr0
clrf tmr0 ;limpa o registrador tmr0
movlw 0x05 ;carrega com 5
movwf tmr0 ;inicia timmer com 5
return ;volta a rotina principal
;********************************************************************************************************
;********************************************chave*******************************************************
;aqui nessa subrotina vai ser excecutado os teste das chave up e donw para incremento e decremento do display
chave
movlw 0x64 ;carrega com 100 em decimal
movwf delaychave ;coloca o valor no registrador
chave1
btfsc ch_up ;a chave esta pressionada ?
goto vchave ;ve a chave donw
decfsz delaychave,f ;decrementa o registrador anti ruido da chave
goto chave1 ;volta pois nao acabou o tempo
chavsolta
btfss ch_up ;chave ta solta
goto atualch
goto incrementa ;incrementa o display
atualch
call atual
goto chavsolta
vchave
movlw 0x64 ;carrega com 100 em decimal
movwf delaychave ;coloca o valor no registrador
chave2
btfsc ch_don ;a chave e esta pressionada
return ;volta para o programa principal
decfsz delaychave,f ;decrementa o registrador anti ruido da chave
goto chave2 ;volta pois nao acabou o tempo
chavsolta1
btfss ch_don
goto atualch1
goto decrementa ;decrementa display
atualch1
call atual
goto chavsolta1
;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
incrementa
movf centena,w
xorlw 0x01 ;aqui verifica se o valor do display e cem pois ele eo maximo
btfss status,z ;e 100?
goto podeinc ;nao e 100
return ;volta ao programa principal
podeinc
incf unidade,f ;incrementa contagem
movf unidade,w
xorlw 0x0a ;compara ja passou de 9 ou seja e 10?
btfss status,z ;ve se a comparaçao houve estouro
goto fim
clrf unidade ;limpa unidade e incrementa dezena
incf dezena,f ;incrementa dezena
movf dezena,w ;coloca dezena em w
xorlw 0x0a ;compara ja passou de 9 ou seja e 10?
btfss status,z ;ve se a comparaçao houve estouro
goto fim
clrf dezena ;limpa dezena
incf centena,f ;incrementa centena
goto fim ;atualiza display
decrementa
movf unidade,w
btfss status,z
goto podedec
movf dezena,w
btfss status,z
goto podedec
movf centena,w
btfss status,z
goto podedec
return ;display encontra em 000 entao naum decrementa
podedec
movf unidade,w
xorlw 0x00
btfss status,z
goto dec_uni ;pode decrementar
movlw 0x09
movwf unidade
goto dec_dez
dec_uni
decf unidade,f ;decrementa unidade
;goto dec_dez
return
dec_dez
movf dezena,w
xorlw 0x00
btfss status,z
goto decdez ;pode decrementar
movlw 0x09
movwf dezena
goto dec_cen
decdez
decf dezena,f
;goto dec_cen
return
dec_cen
movf centena,w
xorlw 0x01
btfss status,z
return
decf centena,f
goto fim
fim
call atual ;atualiza display
return ;volta ao programa principal
;+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
end
Usuários navegando neste fórum: Bing [Bot] e 1 visitante