PIC16F687 - Projeto controle de temperatura

Olá pessoal,
muito obrigado por estar lendo o meu tópico.
Então, sou iniciante nessa área e estou fazendo um projeto pra faculdade para Controle de Temperatura de um ambiente.
Pelo computador será definido a temperatura minima e máxima do ambiente, e então será ligada a lampada para aquecer ou o cooler para ajudar a resfriar.
Bom, fiz a parte de configuração do código, aí para testar coloquei para ligar o Cooler e a Lampada através do comando BSF COOLER , BSF LAMPADA.
Mas no caso a Lampada fica acesa e o Cooler desligado. Já usei o comando BCF para desligar os 2, porém não muda nada.
Alguém pode me mostrar o erro?
Estou realizando os testes no Proteus, abaixo o código .ASM e o link para o projeto do proteus.
PROTEUS - http://www.4shared.com/file/B4TdYQxM/projeto.html
Código:
#INCLUDE <P16F687.INC>
;_CONFIG _BODEN_ON & _CP_OFF & _PWRTE_ON & _WDT_OFF & _LVP_OFF & _MCLRE_ON & _XT_OSC
; ENTRADAS E SAIDAS:
#DEFINE TRANS PORTB,5 ; Tx na portB pino 5
#DEFINE RECP PORTB,7 ; Rx na portB pino 7
#DEFINE SENSOR PORTA,0 ; Sensor na portA pino 0
#DEFINE LAMPADA PORTC,0 ; Lampada portA pino 3
#DEFINE COOLER PORTC,1 ; Cooler portA pino 4
;1 ?ACESO
; Definicoes de Variáveis: ver mapa de memória do PIC16F628A na pg. 16 do datasheet.
MIN EQU 0x73
MAX EQU 0x74
TEMPL EQU 0x75
TEMPH EQU 0x76
;VETOR DE RESET
ORG 0
GOTO INICIO ;DESVIA PARA INICIO
ORG 0x04
;================================================
BCF INTCON, GIE ; desliga GIE
BTFSC PIR1, RCIF ; testa qual interrupçao
CALL RECEBE0 ; chama a rotina correspondente
BTFSC PIR1, ADIF
CALL CONVERSAO
BSF INTCON, GIE ; religa GIE
retfie
;================================================
INICIO
BCF STATUS,RP0 ; Zera RP0
BCF STATUS,RP1 ; Zera RP1
BSF STATUS,RP1 ; Seta RP1, selecionando BANK 2
MOVLW B'00000001' ; Analógico RA0 e o restante digital
MOVWF ANSEL ; Move o valor acima para o registrador ANSEL
CLRF ANSELH ; Seta todos os IOs da PORTB para digitais
BCF STATUS,RP1 ; Zera RP1
BSF STATUS,RP0 ; Seta RP0, selecionando BANK 1
MOVLW B'11111111' ; define pino 0 como entrada e 3 e 4 como saida
MOVWF TRISA
MOVLW B'00100000' ; pino 7 como SAÍDA (TX) e pino 5 como ENTRADA (RX)
MOVWF TRISB
MOVLW 0X00 ; toda portC como saída
MOVWF TRISC
MOVLW B'10000000' ; sem TMR0
MOVWF OPTION_REG
MOVLW 0 ; Baud-rate assíncrono
MOVWF SPBRGH
MOVLW 0x19 ; Configuração da velocidade do band-rate - 2400, 4MHz, decimal 25, pagina 166 do data sheet
MOVWF SPBRG
BCF TXSTA,SYNC ; Assíncrono
BSF TXSTA,TXEN ; Transição habilitada
MOVLW 0x20 ; Só confirmando o que foi feito acima
MOVWF TXSTA
BCF STATUS,RP0 ; Volta para BANK0
BSF RCSTA,SPEN ; USART habilitada
BSF RCSTA,CREN ; Recepção contínua habilitade
; CONFIGURAÇÃO DO AD
BCF STATUS,RP0 ; Zera RP0
BCF STATUS,RP1 ; Zera RP1
BSF STATUS, RP0 ; vai para bank1
MOVLW B'01110000' ; Usa clock interno (seleçao digital/analogico automatico)
MOVWF ADCON1
BSF PIE1, RCIE ; Habilita interrupçao de RX
BSF PIE1, TXIE ; Habilita interrupçao de RX
BSF PIE1, ADIE ; Habilita a interrupção A/D
BANKSEL ADCON0 ; Seleciona banco 0
MOVLW B'01000001' ; Usa Clock Interno, Canal RA0, GODONE inical em 0, AD habiltado
MOVWF ADCON0
BCF PIR1, ADIF ; Limpa o bit interrupção A/D
BCF PIR1, RCIF ; Limpa o bit interrupção RX
BCF PIR1, TXIF ; Limpa o bit interrupção TX
BSF INTCON, PEIE ; Habilita as interrupções periféricas
BSF INTCON, GIE ; Habilita todas interrupções
BCF STATUS, RP0 ; Volta para bank0
; FIM CONFIGURAÇÃO DO AD
CLRF MIN ; Limpa registradores
CLRF MAX
CLRF W
CLRF TEMPL
CLRF TEMPH
;BCF COOLER ; Inicia Cooler desligado
;BCF LAMPADA ; Inicia Lampada desligada
;================================================
MAIN
BSF COOLER
BSF LAMPADA
MOVFW MAX ; valor de MAX em W
ADDLW 1 ; W = MAX + 1
SUBLW 1 ; W = (MAX + 1) - 1
BTFSS STATUS, Z ; Se for diferente de zero o resultado, a próxima linha é executada
BSF ADCON0, GO ; Dá inicio a conversão do sinal AD
GOTO MAIN
;================================================
RECEBE0 ; Testa se há algo em MIN, caso tenha, vai para RECEBE2
MOVFW MIN ; W = MIN
ADDLW 1 ; W = MIN + 1
SUBLW 1 ; W = (MIN + 1) - 1
BTFSC STATUS, Z ; Vai para RECEBE1 se MIN estiver vazio
CALL RECEBE1
BTFSS STATUS, Z ; Vai para RECEBE2 se MIN não estiver vazio
CALL RECEBE2
return
;================================================
RECEBE1
MOVFW RCREG ; valor de temperatura minima
MOVWF MIN
return
;================================================
RECEBE2
MOVFW RCREG ; valor de temperatura maxima
MOVWF MAX
return
;================================================
CONVERSAO
MOVFW ADRESH
MOVWF TEMPH ; 8 bits que correspondem diretamente a temperatura
MOVFW ADRESL
MOVWF TEMPL ; 2 bits menos significativos que podem ser usados para teste
return
;================================================
END
muito obrigado por estar lendo o meu tópico.
Então, sou iniciante nessa área e estou fazendo um projeto pra faculdade para Controle de Temperatura de um ambiente.
Pelo computador será definido a temperatura minima e máxima do ambiente, e então será ligada a lampada para aquecer ou o cooler para ajudar a resfriar.
Bom, fiz a parte de configuração do código, aí para testar coloquei para ligar o Cooler e a Lampada através do comando BSF COOLER , BSF LAMPADA.
Mas no caso a Lampada fica acesa e o Cooler desligado. Já usei o comando BCF para desligar os 2, porém não muda nada.
Alguém pode me mostrar o erro?
Estou realizando os testes no Proteus, abaixo o código .ASM e o link para o projeto do proteus.
PROTEUS - http://www.4shared.com/file/B4TdYQxM/projeto.html
Código:
#INCLUDE <P16F687.INC>
;_CONFIG _BODEN_ON & _CP_OFF & _PWRTE_ON & _WDT_OFF & _LVP_OFF & _MCLRE_ON & _XT_OSC
; ENTRADAS E SAIDAS:
#DEFINE TRANS PORTB,5 ; Tx na portB pino 5
#DEFINE RECP PORTB,7 ; Rx na portB pino 7
#DEFINE SENSOR PORTA,0 ; Sensor na portA pino 0
#DEFINE LAMPADA PORTC,0 ; Lampada portA pino 3
#DEFINE COOLER PORTC,1 ; Cooler portA pino 4
;1 ?ACESO
; Definicoes de Variáveis: ver mapa de memória do PIC16F628A na pg. 16 do datasheet.
MIN EQU 0x73
MAX EQU 0x74
TEMPL EQU 0x75
TEMPH EQU 0x76
;VETOR DE RESET
ORG 0
GOTO INICIO ;DESVIA PARA INICIO
ORG 0x04
;================================================
BCF INTCON, GIE ; desliga GIE
BTFSC PIR1, RCIF ; testa qual interrupçao
CALL RECEBE0 ; chama a rotina correspondente
BTFSC PIR1, ADIF
CALL CONVERSAO
BSF INTCON, GIE ; religa GIE
retfie
;================================================
INICIO
BCF STATUS,RP0 ; Zera RP0
BCF STATUS,RP1 ; Zera RP1
BSF STATUS,RP1 ; Seta RP1, selecionando BANK 2
MOVLW B'00000001' ; Analógico RA0 e o restante digital
MOVWF ANSEL ; Move o valor acima para o registrador ANSEL
CLRF ANSELH ; Seta todos os IOs da PORTB para digitais
BCF STATUS,RP1 ; Zera RP1
BSF STATUS,RP0 ; Seta RP0, selecionando BANK 1
MOVLW B'11111111' ; define pino 0 como entrada e 3 e 4 como saida
MOVWF TRISA
MOVLW B'00100000' ; pino 7 como SAÍDA (TX) e pino 5 como ENTRADA (RX)
MOVWF TRISB
MOVLW 0X00 ; toda portC como saída
MOVWF TRISC
MOVLW B'10000000' ; sem TMR0
MOVWF OPTION_REG
MOVLW 0 ; Baud-rate assíncrono
MOVWF SPBRGH
MOVLW 0x19 ; Configuração da velocidade do band-rate - 2400, 4MHz, decimal 25, pagina 166 do data sheet
MOVWF SPBRG
BCF TXSTA,SYNC ; Assíncrono
BSF TXSTA,TXEN ; Transição habilitada
MOVLW 0x20 ; Só confirmando o que foi feito acima
MOVWF TXSTA
BCF STATUS,RP0 ; Volta para BANK0
BSF RCSTA,SPEN ; USART habilitada
BSF RCSTA,CREN ; Recepção contínua habilitade
; CONFIGURAÇÃO DO AD
BCF STATUS,RP0 ; Zera RP0
BCF STATUS,RP1 ; Zera RP1
BSF STATUS, RP0 ; vai para bank1
MOVLW B'01110000' ; Usa clock interno (seleçao digital/analogico automatico)
MOVWF ADCON1
BSF PIE1, RCIE ; Habilita interrupçao de RX
BSF PIE1, TXIE ; Habilita interrupçao de RX
BSF PIE1, ADIE ; Habilita a interrupção A/D
BANKSEL ADCON0 ; Seleciona banco 0
MOVLW B'01000001' ; Usa Clock Interno, Canal RA0, GODONE inical em 0, AD habiltado
MOVWF ADCON0
BCF PIR1, ADIF ; Limpa o bit interrupção A/D
BCF PIR1, RCIF ; Limpa o bit interrupção RX
BCF PIR1, TXIF ; Limpa o bit interrupção TX
BSF INTCON, PEIE ; Habilita as interrupções periféricas
BSF INTCON, GIE ; Habilita todas interrupções
BCF STATUS, RP0 ; Volta para bank0
; FIM CONFIGURAÇÃO DO AD
CLRF MIN ; Limpa registradores
CLRF MAX
CLRF W
CLRF TEMPL
CLRF TEMPH
;BCF COOLER ; Inicia Cooler desligado
;BCF LAMPADA ; Inicia Lampada desligada
;================================================
MAIN
BSF COOLER
BSF LAMPADA
MOVFW MAX ; valor de MAX em W
ADDLW 1 ; W = MAX + 1
SUBLW 1 ; W = (MAX + 1) - 1
BTFSS STATUS, Z ; Se for diferente de zero o resultado, a próxima linha é executada
BSF ADCON0, GO ; Dá inicio a conversão do sinal AD
GOTO MAIN
;================================================
RECEBE0 ; Testa se há algo em MIN, caso tenha, vai para RECEBE2
MOVFW MIN ; W = MIN
ADDLW 1 ; W = MIN + 1
SUBLW 1 ; W = (MIN + 1) - 1
BTFSC STATUS, Z ; Vai para RECEBE1 se MIN estiver vazio
CALL RECEBE1
BTFSS STATUS, Z ; Vai para RECEBE2 se MIN não estiver vazio
CALL RECEBE2
return
;================================================
RECEBE1
MOVFW RCREG ; valor de temperatura minima
MOVWF MIN
return
;================================================
RECEBE2
MOVFW RCREG ; valor de temperatura maxima
MOVWF MAX
return
;================================================
CONVERSAO
MOVFW ADRESH
MOVWF TEMPH ; 8 bits que correspondem diretamente a temperatura
MOVFW ADRESL
MOVWF TEMPL ; 2 bits menos significativos que podem ser usados para teste
return
;================================================
END