Moderadores: andre_luis, 51, guest2003, Renie
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.
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
#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
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
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
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
Usuários navegando neste fórum: Nenhum usuário registrado e 1 visitante