Página 1 de 1

PIC16F687 - Projeto controle de temperatura

MensagemEnviado: 17 Nov 2010 15:10
por leafar28
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

MensagemEnviado: 17 Nov 2010 23:21
por Andre_Cruz
leafar28,

Você definiu "LAMPADA" e "COOLER" no PORTC, RC0 e RC1.
O PORTC é usado no módulo comparador interno do pic, que você não configurou ou eu dei uma olhada meia rápida e não vi, no datasheet página 94 informa como configurar o "COMPARADOR INTERNO", deslige o comparador, acredito que os pinos deveram responder aos comandos BSF e BCF.

Abraço

André Cruz

MensagemEnviado: 18 Nov 2010 00:02
por leafar28
Olá amigo,

Por padrão ele já está desativado.

é o Bit7 dos registradores CM1CON0 e CM2CON0.

Bom, por garantia adicionei os comandos abaixo:

BSF STATUS, RP1

BCF CM1CON0, C1ON
BCF CM2CON0, C2ON

BCF STATUS, RP1

Porém, não funcionou, a 'LAMPADA' continua aceso e o 'COOLER' apagado.

As duas mensagens a seguir apareceram no Proteus, não entendi o que elas significam:

>>> 'Loaded 108 program words and 0 data bytes'

>>> '(PIC16) PC=0x0009. Processador has been reset by watchdog timer expiring at time 9.216000'


Obrigado de qualquer forma, e se puder me explicar essas duas mensagens, ficarei muito agradecido.

Atenciosamente,

MensagemEnviado: 18 Nov 2010 07:23
por fabim
uai, a primeira mensagem ta falando proC, que você usou 108 words de programa e não usou nenhum byte da eeprom.

O segundo ta te avisando que o WDT, watch dog timer esta estourando e resetando o uC... Você deve desliga-lo!!!

hehe, faz tanto tempo que não programo em asm, que eu reconheço todos os comandos, mais fiquei perdidinho com o esqueleto estranho montado nesse exemplo.

MensagemEnviado: 18 Nov 2010 07:49
por MOR_AL
Dei uma rápida olhada. Posso estar enganado, mas verifique o seguinte no seu programinha. Algumas instruções estão incompatíveis com seus comentários:

#DEFINE LAMPADA PORTC,0 ; Lampada portA pino 3
#DEFINE COOLER PORTC,1 ; Cooler portA pino 4
...
MOVLW B'00000001' ; Analógico RA0 e o restante digital
MOVWF TRISx ?
...
BSF STATUS,RP0 ; Seta RP0, selecionando BANK 1
MOVLW B'11111111' ; define pino 0 como entrada e 3 e 4 como saida
MOVWF TRISA
...
MOR_AL

MensagemEnviado: 18 Nov 2010 11:09
por leafar28
uai, a primeira mensagem ta falando proC, que você usou 108 words de programa e não usou nenhum byte da eeprom.

O segundo ta te avisando que o WDT, watch dog timer esta estourando e resetando o uC... Você deve desliga-lo!!!

hehe, faz tanto tempo que não programo em asm, que eu reconheço todos os comandos, mais fiquei perdidinho com o esqueleto estranho montado nesse exemplo.


Olá fabim,

Obrigado pela resposta. O WDT é configurado no 'bits de configuração', certo? Bom, lá ele está desativado, acho que só será possível corrigir isso quando for fazer o teste fisico, pois por enquanto estou só no virtual (proteus). Bom, abaixo está o código completo, mas ainda continua com problema.

...

MOR_AL escreveu:Dei uma rápida olhada. Posso estar enganado, mas verifique o seguinte no seu programinha. Algumas instruções estão incompatíveis com seus comentários:

#DEFINE LAMPADA PORTC,0 ; Lampada portA pino 3
#DEFINE COOLER PORTC,1 ; Cooler portA pino 4
...
MOVLW B'00000001' ; Analógico RA0 e o restante digital
MOVWF TRISx ?
...
BSF STATUS,RP0 ; Seta RP0, selecionando BANK 1
MOVLW B'11111111' ; define pino 0 como entrada e 3 e 4 como saida
MOVWF TRISA
...
MOR_AL


Olá MOR_AL,

Quanto á primeira observação, é que eu mudei as portas e esqueci de mudar o comentário, mas no Proteus eu também modifiquei.

Na segunda observação o valor eu envio para ANSEL, e não para TRIS, como consta no código.

Quanto à útima obervasão, eu também esqueci de mudar o comentário.

Abaixo está o código completo e comentado corretamente.

Ao final da configuração, eu coloco os comandos BCF LAMPADA e BCF COOLER, porém continua a LAMPADA acesa e o COOLER apagado, ou seja, não estou conseguindo controlar as portas.

....

Código: Selecionar todos
#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 PORTC 0
#DEFINE COOLER    PORTC,1     ; Cooler portC 1
                                         
; Definicoes de Variáveis: ver mapa de memória do PIC16F628A na pg. 16 do datasheet.
MIN        EQU   0x73
MAX     EQU   0x74

TEMPH    EQU   0x76
TEMPH1   EQU   0x77
MIN1     EQU   0x78



;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'  ; todos entrada
            MOVWF TRISA
           
         
         MOVLW B'00100000' ; pino 7 como SAÍDA (TX) e pino 5 como ENTRADA (RX)
            MOVWF TRISB
         
             MOVLW B'00000000'
             MOVWF TRISC

         MOVLW B'10000000'  ;
            MOVWF OPTION_REG
                    
         BCF   TXSTA,SYNC   ; Assíncrono      
            BSF   TXSTA,TXEN   ; Transição habilitada         

            MOVLW 0x20      ; Só confirmando o que foi feito acima
            MOVWF TXSTA

            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 STATUS,RP0 ; Volta para BANK0

            BSF  RCSTA,SPEN  ; USART habilitada 
            BSF  RCSTA,CREN  ; Recepção contínua habilitada   


; 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
      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


       
 MOVFW MAX  ; W = MAX
 ADDLW 1    ; W = MAX + 1
 SUBLW 1    ; W = 1 - (MAX + 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

 MOVFW TEMPH     ; W = TEMPH
 MOVWF TEMPH1    ; TEMPH1 = TEMPH
 MOVFW MIN        ; W = MIN
 SUBWF TEMPH1    ; TEMPH - MIN = TEMPH - W
 BTFSS STATUS, C ; Se CARRY for 0, então o resultado é negativo, logo TEMPH < MIN, portanto, liga a LAMPADA
 BSF LAMPADA
 
 MOVFW TEMPH   ; W = TEMPH
 MOVWF TEMPH1  ; TEMPH1 = TEMPH
 MOVFW MAX     ; W = MAX
 SUBWF TEMPH1  ; TEMPH - MAX
 BTFSC STATUS, C ; Se o CARRY for 1, então o resultado é positivo, logo TEMPH > MAX, portanto, deve-se ligar o Cooler
 CALL VERIFICA1
 

 
 GOTO MAIN


;================================================
RECEBE0 ; Testa se há algo em MIN, caso tenha, vai para RECEBE2
 MOVFW MIN  ; W = MIN
 ADDLW 1   ; W = MIN + 1
 CLRF STATUS
 MOVWF MIN1 ; MIN1 = W = MIN + 1
 MOVLW 1    ; W = 1
 SUBWF MIN1 ; MIN1 = MIN1 - W = MIN1 - 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
 ;================================================
VERIFICA1
 MOVFW TEMPH  ; W = TEMPH
 MOVWF TEMPH1 ; TEMPH1 = TEMPH
 MOVFW MAX    ; W = MAX
 SUBWF TEMPH1 ; TEMPH - MAX
 BTFSS STATUS, Z ; Se chegou aqui é por que CARRY = 1, porém temos 2 opções: TEMPH>MAX OU TEMPH=MAX,
 BSF COOLER  ; Testanto o flag Z, se Z=1 então TEMPH=MAX, logo, pula, mas se Z=0, então TEMPH>MAX, logo, liga o COOLER
 return

 END


Obrigado.

MensagemEnviado: 18 Nov 2010 17:28
por MOR_AL
eafar28.
Quando você altera o estado do cooler, ou da lâmpada, deve também alterar o estado da Lâmpada ou do Cooler. Eles são mutuamente exclusivos
Temperatura desejada > Temperatura monitorada - Cooler OFF E Lâmpada ON
Temperatura desejada < Temperatura monitorada - Cooler ON E Lâmpada OFF

Verifique se você está fazendo isso.
MOR_AL

MensagemEnviado: 18 Nov 2010 18:35
por leafar28
MOR_AL escreveu:eafar28.
Quando você altera o estado do cooler, ou da lâmpada, deve também alterar o estado da Lâmpada ou do Cooler. Eles são mutuamente exclusivos
Temperatura desejada > Temperatura monitorada - Cooler OFF E Lâmpada ON
Temperatura desejada < Temperatura monitorada - Cooler ON E Lâmpada OFF

Verifique se você está fazendo isso.
MOR_AL


Isso já está configurado, veja código abaixo:
Eu só coloquei BCF LAMPADA E BCF COOLER para ambos iniciarem desligados, pode observar que esse comando está antes do MAIN, logo, fica fora do GOTO MAIN.

Código: Selecionar todos
 MOVFW TEMPH     ; W = TEMPH
 MOVWF TEMPH1    ; TEMPH1 = TEMPH
 MOVFW MIN        ; W = MIN
 SUBWF TEMPH1    ; TEMPH - MIN = TEMPH - W
 BTFSS STATUS, C ; Se CARRY for 0, então o resultado é negativo, logo TEMPH < MIN, portanto, liga a LAMPADA
 BSF LAMPADA
 
 MOVFW TEMPH   ; W = TEMPH
 MOVWF TEMPH1  ; TEMPH1 = TEMPH
 MOVFW MAX     ; W = MAX
 SUBWF TEMPH1  ; TEMPH - MAX
 BTFSC STATUS, C ; Se o CARRY for 1, então o resultado é positivo, logo TEMPH > MAX, portanto, deve-se ligar o Cooler
 CALL VERIFICA1


Bom, hoje adquiri todos os componentes necessários; Amanha irei fazer a montagem e realizar os testes no laboratório da faculdade, então pela noite posto aqui os resultados.

Mas se alguém tiver achado algum problema, por gentileza, pode responder.

Atenciosamente,

Leafar28

MensagemEnviado: 18 Nov 2010 18:41
por leafar28
CONTINUAÇÃO DO POST ACIMA:

Percebi agora que eu não configurei para desligar quando chegar na temperatura desejada. Bom, irei corrigir isso agora mesmo.

PS.: Desculpe-me ter feito 2 posts seguidos, mas acho que não existe a opção de Editar post.

Atenciosamente,

Leafar28

MensagemEnviado: 18 Nov 2010 19:04
por MOR_AL
leafar28 escreveu:
MOR_AL escreveu:eafar28.
Quando você altera o estado do cooler, ou da lâmpada, deve também alterar o estado da Lâmpada ou do Cooler. Eles são mutuamente exclusivos
Temperatura desejada > Temperatura monitorada - Cooler OFF E Lâmpada ON
Temperatura desejada < Temperatura monitorada - Cooler ON E Lâmpada OFF

Verifique se você está fazendo isso.
MOR_AL


Isso já está configurado, veja código abaixo:
Eu só coloquei BCF LAMPADA E BCF COOLER para ambos iniciarem desligados, pode observar que esse comando está antes do MAIN, logo, fica fora do GOTO MAIN.

Código: Selecionar todos
 MOVFW TEMPH     ; W = TEMPH
 MOVWF TEMPH1    ; TEMPH1 = TEMPH
 MOVFW MIN        ; W = MIN
 SUBWF TEMPH1    ; TEMPH - MIN = TEMPH - W
 BTFSS STATUS, C ; Se CARRY for 0, então o resultado é negativo, logo TEMPH < MIN, portanto, liga a LAMPADA
 BSF LAMPADA
 
 MOVFW TEMPH   ; W = TEMPH
 MOVWF TEMPH1  ; TEMPH1 = TEMPH
 MOVFW MAX     ; W = MAX
 SUBWF TEMPH1  ; TEMPH - MAX
 BTFSC STATUS, C ; Se o CARRY for 1, então o resultado é positivo, logo TEMPH > MAX, portanto, deve-se ligar o Cooler
 CALL VERIFICA1


Bom, hoje adquiri todos os componentes necessários; Amanha irei fazer a montagem e realizar os testes no laboratório da faculdade, então pela noite posto aqui os resultados.

Mas se alguém tiver achado algum problema, por gentileza, pode responder.

Atenciosamente,

Leafar28


Desculpe mas ou eu não vi, ou você não entendeu minha postagem.
Eu disse que se você alterar um, tem que alterar o outro.
Exemplo.
Se tiver que ligar o cooler, TEM que desligar a Lâmpada ... e vice versa.
No seu exemplo acima, você Liga a Lâmpada mas não desliga o Cooler.
Tem que fazer isso SEMPRE que for comparar a temperatura desejada com a medida.
MOR_AL

MensagemEnviado: 18 Nov 2010 23:24
por leafar28
Olá MOR_AL,

já fiz as alterações necessárias referente ao que você disse.

Mas agora está aparecendo uma mensagem de erro no Proteus:

Attempt to write/read unimplemented memory location 0x001C ignored.

Olhando o programa da memória, no endereço 0x001C tem o comando "MOVLW 0x20"

Cara, tá cada vez mais complicado esse projeto, hehehe.

Valeu galera, lutando aqui pra ajeitar :)

MensagemEnviado: 19 Nov 2010 10:09
por Djalma Toledo Rodrigues
Vamos por partes:

Trisa e aciona os pinos de I/O diretamente.

Funcionou ?

DJ