Ir ao conteúdo

Estou com problemas na simulação do Proteus...


Andask

Posts recomendados

Postado

Estou com alguns problemas na simulação do Proteus,

Interrupção externa através do RB0 não funciona.

Pelo que eu vi no livro que uso como referência para as configurações do PIC, teoricamente está correto o que eu fiz, mas como nunca trabalhei com interrupções, sou meio suspeito a falar disso.

Uma rotina de incremento através do RA0 também não é tratada corretamente no Proteus.

Seria algo assim, eu iria pressionar um botão, iria incrementar uma variável em 1, e iria atualizar o valor nos displays, se o botão continuasse apertado por 1 segundo, seria setado um flag.

No tratamento do botão tem um teste para esse flag, se ele estiver setado, no lugar de incrementar em 1, a variável seria incrementada em 5.

Eu acho que é mais fácil postar o código, pois, como eu vou disponibilizar na internet depois, eu comentei bem o fonte e tal.

O código não está acabado ainda, fiz apenas a checagem e tratamento de um botão.

Eu iria seguir o desenvolvimento mesmo com o Proteus não estando correto com o MPLab SIM, mas meu chefe vai querer ver no Proteus, então me quebrou as pernas.. uhAUHaUHa

Também vou postar aqui o esquema do projeto, os resistores para os displays e etc, eu só vou colocar na fase final do projeto, tem um cara responsável só pelo projeto do hardware, então o meu problema mesma é com o software.

Informações complementares:

MPLab versão 8.20

Proteus versão 7.4 SP3

;* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *

;* AUTOMATIZAÇÃO ESTUFA *

;* *

;* DESENVOLVIDO POR JOÃO LUIZ LORENCETTI *

;* *

;* VERSÃO: 2.0 DATA: 09/02/09 *

;* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *

;* DESCRIÇÃO DO ARQUIVO *

;*-----------------------------------------------------------------*

;* *

;*Programação de tempo de 1 à 99 minutos (Será exibido em 4 *

;*displays de 7 segmentos). *

;* *

;*Alarme para término da contagem de tempo (Quando a contagem de *

;*tempo for encerrada irá ser disparado um alarme para avisar o *

;*funcionário de que o tempo programado foi esgotado e que o *

;*carrinho deverá ser retirado da estufa). *

;* *

;*Alarme para abertura de porta durante contagem de tempo (Se *

;*durante a contagem de tempo a porta da estufa for aberta, a *

;*contagem de tempo irá ser pausada e um alarme irá ser ativado, *

;*quando a porta for fechada o alarme irá ser desligado e o tempo *

;*continuará a correr). *

;* *

;*Tempo mínimo para retirada do carrinho após contagem de tempo. *

;*(Para evitar que o funcionário só abra e feche a porta sem *

;*retirar o carrinho dedentro da estufa). *

;* *

;*Incremento e Decremento variável de tempo de 1 ou 5 minutos (Se *

;*o botão de programação de tempo permanecer pressionado por 1 *

;*segundo o incremento/decremento do tempo será realizado de 5 em *

;*5 minutos). *

;* *

;*Durante a contagem de tempo o valor informado nos displays será *

;*decrementado de 1 em 1 segundo. *

;* *

;* *

;* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *

;* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *

;* ARQUIVOS DE DEFINIÇÕES *

;* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *

#INCLUDE <P16F628A.INC> ;ARQUIVO PADRÃO MICROCHIP PARA 16F628A

__CONFIG _BODEN_ON & _CP_OFF & _PWRTE_ON & _WDT_OFF & _LVP_OFF & _MCLRE_ON & _HS_OSC

;* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *

;* PAGINAÇÃO DE MEMÓRIA *

;* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *

#DEFINE BANK0 BCF STATUS,RP0 ;SETA BANK 0 DE MEMÓRIA

#DEFINE BANK1 BSF STATUS,RP0 ;SETA BANK 1 DE MAMÓRIA

;* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *

;* VARIÁVEIS *

;* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *

CBLOCK 0x20 ;ENDEREÇO INICIAL DA MEMÓRIA DE USUÁRIO

STATUS_TEMP ;VARIÁVEL UTILIZADA NA INTERRUPÇÃO

W_TEMP ;VARIÁVEL UTILIZADA NA INTERRUPÇÃO

FLAGS ;VARIÁVEL UTILIZADA PARA AS FLAGS DO SISTEMA

MIN_ON ;VARIÁVEL QUE DETERMINARÁ O TEMPO ATÉ QUE O ALARME DISPARE

TEMP_VAR ;VARIÁVEL UTILIZADA NA ROTINA DE ATUALIZAÇÃO DOS DISPLAYS

FILTRO1 ;FILTRO UTILIZADO PARA DEBOUNCE DE BT_INC

FILTRO2 ;FILTRO UTILIZADO PARA DEBOUNCE DE BT_DEC

FILTRO3 ;FILTRO UTILIZADO PARA DEBOUNCE DE BT_GO

A1 ;VARIÁVEL UTILIZADA NO DELAY DE 0.5 SEGUNDOS

A2 ;VARIÁVEL UTILIZADA NO DELAY DE 0.5 SEGUNDOS

A3 ;VARIÁVEL UTILIZADA NO DELAY DE 0.5 SEGUNDOS

B1 ;VARIÁVEL UTILIZADA NO DELAY DE 1 SEGUNDO

B2 ;VARIÁVEL UTILIZADA NO DELAY DE 1 SEGUNDO

B3 ;VARIÁVEL UTILIZADA NO DELAY DE 1 SEGUNDO

ENDC ;FIM DO BLOCO DE MEMÓRIA

;* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *

;* CONSTANTES *

;* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *

#DEFINE FILTRO .255

;* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *

;* FLAGS INTERNOS *

;* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *

#DEFINE FLAG_BT_INC FLAGS,0 ;CONFIGURA BIT 0 COMO FLAG DO BT_INC

#DEFINE FLAG_BT_DEC FLAGS,1 ;CONFIGURA BIT 1 COMO FLAG DO BT_DEC

;* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *

;* ENTRADAS *

;* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *

#DEFINE BT_INC PORTA,0 ;CONFIGURA PINO RA0 COMO BOTÃO DE INCREMENTO

#DEFINE BT_DEC PORTA,1 ;CONFIGURA PINO RA1 COMO BOTÃO DE DECREMENTO

#DEFINE BT_GO PORTA,2 ;CONFIGURA PINO RA2 COMO BOTÃO DE INÍCIO

;* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *

;* SAÍDAS *

;* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *

#DEFINE PINO_UP.DOWN PORTB,1;CONFIGURA PINO RB1 PARA O PINO QUE CONTROLA O UP/DOWN DO VALOR DOS DISPLAYS

#DEFINE PINO_RESET PORTB,2 ;CONFIGURA PINO RB2 PARA O PINO QUE RESETA OS DISPLAYS

#DEFINE PINO_MIN PORTB,3 ;CONFIGURA PINO RB3 PARA O PINO QUE CONTROLA O DISPLAY DE MINUTO

#DEFINE BUZZER PORTB,5 ;CONFIGURA PINO RB5 PARA O BUZZER

;* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *

;* VETOR DE RESET *

;* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *

ORG 0x00 ;ENDEREÇO INICIAL DE PROCESSAMENTO

GOTO INICIO

;* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *

;* INÍCIO DA INTERRUPÇÃO *

;* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *

ORG 0x04 ;ENDEREÇO INICIAL DA INTERRUPÇÃO

MOVWF W_TEMP ;COPIA W PARA W_TEMP

SWAPF STATUS,W

MOVWF STATUS_TEMP ;COPIA STATUS PARA STATUS_TEMP

BTFSS INTCON,INTF ;TESTA SE A INTERRUPÇÃO FOI PROVOCADA PELA ABERTURA DA PORTA

GOTO SAI_INT ;NÃO, SAI DA INTERRUPÇÃO

;SIM, TRATA A INTERRUPÇÃO

;* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *

;* ROTINA DE INTERRUPÇÃO *

;* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *

BSF BUZZER ;LIGA BUZZER

CALL DELAY_0.5 ;CHAMA ROTINA DE DELAY DE 0.5 SEGUNDOS

BCF BUZZER ;DESLIGA O BUZZER

CALL DELAY_0.5 ;CHAMA ROTINA DE DELAY DE 0.5 SEGUNDOS

BTFSC PORTB,0 ;RB0 ESTÁ EM 0? (PORTA DA ESTUFA FECHADA?)

GOTO $-5 ;NÃO, VAI PARA POSIÇÃO ATUAL -4 (BSF BUZZER)

;SIM, SAI DA ROTINA DE INTERRUPÇÃO

;* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *

;* ROTINA DE SAÍDA DA INTERRUPÇÃO *

;* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *

; OS VALORES DE "W" E "STATUS" DEVEM SER RECUPERADOS ANTES DE

; RETORNAR DA INTERRUPÇÃO

SAI_INT

BCF INTCON,INTF ;LIMPA FLAG DE INTERRUPÇÃO

SWAPF STATUS_TEMP,W

MOVWF STATUS ;MOVE STATUS_TEMP PARA STATUS

SWAPF W_TEMP,F

SWAPF W_TEMP,W ;MOVE W_TEMP PARA W

RETFIE

;* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *

;* ROTINAS E SUBROTINAS *

;* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *

DELAY_0.5 ;DELAY DE 0.5 SEGUNDOS, UTILIZADA NO BUZZER.

movlw 0x03

movwf A1

movlw 0x18

movwf A2

movlw 0x02

movwf A3

DELAY_0.5_0

decfsz A1, f

goto $+2

decfsz A2, f

goto $+2

decfsz A3, f

goto DELAY_0.5_0

goto $+1

return

;******************************************************************

DELAY_1S ;DELAY DE 1 SEGUNDO, UTILIZADA NO BT_INC

;DELAY = 1.000005 SEGUNDOS

movlw .7

movwf B1

movlw .179

movwf B2

movlw .2

movwf B3

DELAY_1S_0

BTFSS BT_INC ;BT_INC CONTINUA PRESSIONADO?

GOTO MAIN ;NÃO, VOLTA PARA MAIN

;SIM, CONTINUA COM O DELAY

decfsz B1, f

goto $+2

decfsz B2, f

goto $+2

decfsz B3, f

goto DELAY_1S_0

BSF FLAG_BT_INC ;BOTÃO CONTINUOU PRESS, SETA FLAG

GOTO TRATA_BT_INC;VAI PARA TRATAMENTO DE BT_INC

;******************************************************************

DELAY_1S_2 ;DELAY DE 1 SEGUNDO, UTILIZADA NO BT_INC

;DELAY = 1.000005 SEGUNDOS

movlw .7

movwf B1

movlw .179

movwf B2

movlw .2

movwf B3

DELAY_1S_0_2

BTFSS BT_DEC ;BT_INC CONTINUA PRESSIONADO?

GOTO MAIN ;NÃO, VOLTA PARA MAIN

;SIM, CONTINUA COM O DELAY

decfsz B1, f

goto $+2

decfsz B2, f

goto $+2

decfsz B3, f

goto DELAY_1S_0_2

BSF FLAG_BT_DEC ;BOTÃO CONTINUOU PRESS, SETA FLAG

GOTO TRATA_BT_DEC;VAI PARA TRATAMENTO DE BT_INC

;******************************************************************

ATUALIZA ;ATUALIZA VALOR DOS DISPLAYS

ADDLW .1

MOVWF TEMP_VAR ;TEMP_VAR NECESSITA TER 1 VALOR A MAIS PARA A ROTINA FUNCIONAR

ATUALIZA_1

DECFSZ TEMP_VAR,F

GOTO ATUALIZA_2

RETURN

ATUALIZA_2

BSF PINO_MIN

BCF PINO_MIN

GOTO ATUALIZA_1

;* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *

;* INICIO DO PROGRAMA *

;* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *

INICIO

BANK0 ;ALTERA PARA O BANCO 0

MOVLW B'00000111'

MOVWF CMCON ;DEFINE O MODO DE OPERAÇÃO DO COMPARADOR ANALÓGICO

BANK1 ;ALTERA PARA O BANCO 1

MOVLW B'00000111'

MOVWF TRISA ;RA0, RA1 E RA2 COMO ENTRADA, RESTANTE COMO SAÍDA

MOVLW B'00000001'

MOVWF TRISB ;RB0 COMO ENTRADA, RESTANTE COMO SAÍDA

MOVLW B'11000100'

MOVWF OPTION_REG ;DEFINE OPÇÕES DE OPERAÇÃO

MOVLW B'10010000'

MOVWF INTCON ;HABILITA INTERRUPÇÃO EXTERNA

BANK0 ;RETORNA PARA O BANCO

;* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *

;* INICIALIZAÇÃO DO SISTEMA *

;* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *

BSF PINO_RESET ;RESETA OS DISPLAYS

BCF PINO_RESET ;DESLIDA O PINO DE RESET DOS DISPLAYS

;* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *

;* ROTINA PRINCIPAL *

;* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *

MAIN

CLRF FLAGS ;LIMPA AS FLAGS DO SISTEMA

MOVLW FILTRO ;MOVE .255 PARA O ACUMULADOR

MOVWF FILTRO1 ;MOVE .255 PARA O FILTRO DO BOTÃO BT_INC

MOVWF FILTRO2 ;MOVE .255 PARA O FILTRO DO BOTÃO BT_DEC

MOVWF FILTRO3 ;MOVE .255 PARA O FILTRO DO BOTÃO BT_GO

TESTA_BT_INC

BTFSS BT_INC ;BOTÃO BT_INC ESTÁ PRESSIONADO?

GOTO TESTA_BT_DEC;NÃO, VAI PARA TESTA_BT_DEC

DECFSZ FILTRO1,F ;SIM, DECREMENTA FILTRO, FILTRO ACABOU?

GOTO TESTA_BT_INC;NÃO, CONTINUA TESTANDO O BT_INC

GOTO TRATA_BT_INC;SIM, TRATA BT_INC COMO PRESSIONADO

TRATA_BT_INC

BTFSS FLAG_BT_INC ;BT_INC JÁ FOI PRESSIONADO DURANTE ROTINA DE 1 SEGUNDO?

GOTO INC_1 ;NÃO, VAI PARA INC_1

GOTO INC_5 ;SIM, VAI PARA INC_5

INC_1

MOVLW .1 ;MOVE 1 PARA WORK

ADDWF MIN_ON ;SOMA VALOR DE WORK AO VALOR DE MIN_ON

CALL ATUALIZA ;CHAMA A ROTINA DE ATUALIZAÇÃO DOS DISPLAYS

GOTO DELAY_1S ;TESTA SE BT_INC CONTINUA PRESS

INC_5

MOVLW .5 ;MOVE 5 PARA WORK

ADDWF MIN_ON ;SOMA VALOR DE WORK AO VALOR DE MIN_ON

CALL ATUALIZA ;CHAMA A ROTINA DE ATUALIZAÇÃO DOS DISPLAYS

GOTO DELAY_1S ;TESTA SE BT_INC CONTINUA PRESS

;-/-/-/-/-/-/-/-/-/-/-/-/-/ BOTÃO DE DECREMENTO /-/-/-/-/-/-/-/-/-/-/-/-/-

TESTA_BT_DEC

BTFSS BT_DEC ;BOTÃO BT_INC ESTÁ PRESSIONADO?

GOTO TESTA_BT_GO ;NÃO, VAI PARA TESTA_BT_GO

DECFSZ FILTRO2,F ;SIM, DECREMENTA FILTRO, FILTRO ACABOU?

GOTO TESTA_BT_DEC;NÃO, CONTINUA TESTANDO O BT_DEC

GOTO TRATA_BT_DEC;SIM, TRATA BT_DEC COMO PRESSIONADO

TRATA_BT_DEC

BTFSS FLAG_BT_DEC ;BT_DEC JÁ FOI PRESSIONADO DURANTE ROTINA DE 1 SEGUNDO?

GOTO DEC_1 ;SIM, VAI PARA INC_1

GOTO DEC_5 ;NÃO, VAI PARA INC_5

DEC_1

MOVLW .1 ;MOVE 1 PARA WORK

SUBWF MIN_ON ;SOMA VALOR DE WORK AO VALOR DE MIN_ON

BSF PINO_UP.DOWN;CADA PULSO PASSA A DECREMENTAR O VALOR DOS DISPLAYS

CALL ATUALIZA ;CHAMA A ROTINA DE ATUALIZAÇÃO DOS DISPLAYS

BCF PINO_UP.DOWN;VOLTA PINO_UP.DOWN AE ESTADO ORIGINAL, PULSO INCREMENTA VALOR DOS DISPLAYS

GOTO DELAY_1S_2 ;TESTA SE BT_INC CONTINUA PRESS

DEC_5

MOVLW .5 ;MOVE 5 PARA WORK

SUBWF MIN_ON ;SOMA VALOR DE WORK AO VALOR DE MIN_ON

BSF PINO_UP.DOWN;CADA PULSO PASSA A DECREMENTAR O VALOR DOS DISPLAYS

CALL ATUALIZA ;CHAMA A ROTINA DE ATUALIZAÇÃO DOS DISPLAYS

BCF PINO_UP.DOWN;VOLTA PINO_UP.DOWN AE ESTADO ORIGINAL, PULSO INCREMENTA VALOR DOS DISPLAYS

GOTO DELAY_1S_2 ;TESTA SE BT_INC CONTINUA PRESS

;-/-/-/-/-/-/-/-/-/-/-/-/-/ BOTÃO DE DECREMENTO /-/-/-/-/-/-/-/-/-/-/-/-/-

TESTA_BT_GO

BTFSS BT_GO ;BOTÃO BT_INC ESTÁ PRESSIONADO?

GOTO MAIN ;NÃO, VAI PARA ROTINA PRINCIPAL

DECFSZ FILTRO3,F ;SIM, DECREMENTA FILTRO, FILTRO ACABOU?

GOTO TESTA_BT_GO ;NÃO, CONTINUA TESTANDO O BT_INC

GOTO TRATA_BT_GO ;SIM, TRATA BT_INC COMO PRESSIONADO

TRATA_BT_GO

GOTO MAIN

;* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *

;* FIM DO PROGRAMA *

;* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *

END

post-429306-13884950451162_thumb.jpg

Postado

Up xD

Aproveitei e atualizei o código também.

E misteriosamente a interrupção externa que não funcionava, passou a funcionar (No MPLAB SIM, no Proteus nada funciona)....

Vai entender :S

  • Coordenador
Postado

Caso o autor do tópico necessite, o mesmo será reaberto, para isso deverá entrar em contato com a moderação solicitando o desbloqueio.

Arquivado

Este tópico foi arquivado e está fechado para novas respostas.

Sobre o Clube do Hardware

No ar desde 1996, o Clube do Hardware é uma das maiores, mais antigas e mais respeitadas comunidades sobre tecnologia do Brasil. Leia mais

Direitos autorais

Não permitimos a cópia ou reprodução do conteúdo do nosso site, fórum, newsletters e redes sociais, mesmo citando-se a fonte. Leia mais

×
×
  • Criar novo...

LANÇAMENTO!

eletronica2025-popup.jpg


CLIQUE AQUI E BAIXE AGORA MESMO!