Ir ao conteúdo

Pisca leds com interrupção em assembly


MClane

Posts recomendados

Postado

Bom dia pessoal sou novo aqui no fórum e gostaria de uma ajuda

de vocês.

Estava fazendo os programas sem interrupção, mas aí foi abordado esse

assunto em aula e estou tendo algumas dificuldades.

Colocarei o enunciado do exercício abaixo e logo após minha tentativa.

Considerando o microcontrolador PIC16F690 e três botões do tipo “push button”, faça um fluxograma e o respectivo programa em Assembly, de modo que ao pressionar-se o botão 1 conectado no pino RA0 pela primeira vez liga o led 1 conectado no pino RB4 como pisca-pisca a uma frequência de 1Hz durante 8s. Se durante este tempo houver novo pressionamento do botão 1 desliga o led 1 e o processo finaliza. O botão 2, conectado no pino RA2, ao ser pressionado liga o led 2 conectado no pino RB5. Um novo pressionamento neste botão desligará o led 2. O botão 3 resseta o sistema em caso de travamento deste.

Obs.: 1) A frequência do oscilador é de 4MHz, obtida a partir do oscilador interno do microcontrolador;

2) A temporização deverá ser executada através de laços de repetição;

3) A detecção do pressionamento dos botões deverá ser executada através de interrupção por mudança de nível no botão 1 e interrupção externa no botão 2.

se



#INCLUDE <P16F690.INC>
__CONFIG _CP_OFF & _CPD_OFF & _BOR_OFF & _PWRTE_ON & _WDT_OFF & _INTRC_OSC_NOCLKOUT & _MCLRE_ON & _FCMEN_OFF & _IESO_OFF



CBLOCK 0X20
TEMP1
TEMP2
TEMP3
CONT8
CONT82
ENDC

#DEFINE BT1 PORTA,0
#DEFINE BT2 PORTA,2
#DEFINE LED1 PORTB,4
#DEFINE LED2 PORTB,5

ORG 0X00
GOTO INI

ORG 0X04
BTFSS INTCON,RABIF ;FOI INT POR MUD. NÍVEL?
GOTO INT_EXT

BANKSEL IOCA
BCF IOCA,0 ;PARA DESABILITAR RABIF

BANKSEL PORTA
MOVF PORTA,F
BCF INTCON,RABIF
BTFSC BT1 ;BT1 ESTÁ PRESSIONADO?FAZ UM FILTRO NO BOTAO2 PARA CONFIRMAR SE FOI MESMO ELE
RETFIE ;NÃO, ENTÃO RETORNA DA INTERRUPÇÃO
GOTO ROTINALED1 ;MANDA PARA A ROTINA QUE FAZ O PROCESSO DE PISCAR O LED E AGUARDAR 8SEG NA FREQ DETERMINADA
GOTO INT_EXT ;ENTRA

RETFIE



INT_EXT
BCF INTCON,INTE
BCF INTCON,INTF
BTFSC BT2 ;FAZ UM FILTRO NO BOTAO2 PARA CONFIRMAR SE FOI MESMO ELE
RETFIE ;NÃO, ENTÃO RETORNA DA INTERRUPCAO
GOTO ROTINALED2 ;MANDA PARA A ROTINA QUE FAZ O PROCESSO DE PISCAR O LED E AGUARDAR 8SEG NA FREQ DETERMINADA
RETFIE



ROTINALED1

BTFSS BT1 ;BOTÃO ESTÁ PRESSIONADO?
GOTO $-.1
MOVLW .8
MOVWF CONT8

LIGADESLIGA1

BSF LED1
MOVLW .2
MOVWF TEMP1
MOVLW .250
MOVWF TEMP2
MOVLW .250
MOVWF TEMP3
DECFSZ TEMP3,F
GOTO $-.1
DECFSZ TEMP2,F
GOTO $-.5
DECFSZ TEMP1,F
GOTO $-.9
BCF LED1
MOVLW .2
MOVWF TEMP1
MOVLW .250
MOVWF TEMP2
MOVLW .250
MOVWF TEMP3
DECFSZ TEMP3,F
GOTO $-.1
DECFSZ TEMP2,F
GOTO $-.5
DECFSZ TEMP1,F
GOTO $-.9
BTFSC BT1
GOTO $+.3
BCF LED1
NOP
DECFSZ CONT8
GOTO LIGADESLIGA1
BCF LED1
RETFIE

ROTINALED2

BTFSS BT2 ;BOTÃO ESTÁ PRESSIONADO?
GOTO $-.1
MOVLW .8
MOVWF CONT82

LIGADESLIGA2

BSF LED2
MOVLW .2
MOVWF TEMP1
MOVLW .250
MOVWF TEMP2
MOVLW .250
MOVWF TEMP3
DECFSZ TEMP3,F
GOTO $-.1
DECFSZ TEMP2,F
GOTO $-.5
DECFSZ TEMP1,F
GOTO $-.9
BCF LED2
MOVLW .2
MOVWF TEMP1
MOVLW .250
MOVWF TEMP2
MOVLW .250
MOVWF TEMP3
DECFSZ TEMP3,F
GOTO $-.1
DECFSZ TEMP2,F
GOTO $-.5
DECFSZ TEMP1,F
GOTO $-.9
BTFSC BT2
GOTO $+.3
BCF LED2
NOP
DECFSZ CONT82
GOTO LIGADESLIGA2
BCF LED2
RETFIE

INI
BANKSEL ANSEL
CLRF ANSEL
CLRF ANSELH

BANKSEL TRISA
MOVLW B'00001101'
MOVWF TRISA
CLRF TRISB
CLRF TRISC
BCF OPTION_REG,INTEDG ;SELECIONA BORDA DE DESCIDA P/INT EXT
BCF OPTION_REG,NOT_RABPU ;HABILITA PULL-UPS INTERNOS
BSF IOCA,0 ;HABILITA FLAG INTERRUPÇÃO MUD. NÍVEL (RABIF)

BANKSEL PORTA
CLRF PORTB
MOVF PORTA,F
BCF INTCON,RABIF
BSF INTCON,RABIE ;HABILITA INTERRUPÇÃO DE MUD. DE NÍVEL
BSF INTCON,INTE ;HABILITA INTERRUPÇÃO EXTERNA
BSF INTCON,GIE ;HABILITA INTERRUPÇÕES GLOBAIS


END




#include <p16f690.inc>
__config _cp_off & _cpd_off & _bor_off & _pwrte_on & _wdt_off & _intrc_osc_noclkout & _mclre_on & _fcmen_off & _ieso_off



cblock 0x20
temp1
temp2
temp3
cont8
cont82
endc

#define bt1 porta,0
#define bt2 porta,2
#define led1 portb,4
#define led2 portb,5

org 0x00
goto ini

org 0x04
btfss intcon,rabif ;foi int por mud. NÍvel?
Goto int_ext

banksel ioca
bcf ioca,0 ;para desabilitar rabif

banksel porta
movf porta,f
bcf intcon,rabif
btfsc bt1 ;bt1 estÁ pressionado?faz um filtro no botao2 para confirmar se foi mesmo ele
retfie ;nÃo, entÃo retorna da interrupÇÃo
goto rotinaled1 ;manda para a rotina que faz o processo de piscar o led e aguardar 8seg na freq determinada
goto int_ext ;entra

retfie



int_ext
bcf intcon,inte
bcf intcon,intf
btfsc bt2 ;faz um filtro no botao2 para confirmar se foi mesmo ele
retfie ;nÃo, entÃo retorna da interrupcao
goto rotinaled2 ;manda para a rotina que faz o processo de piscar o led e aguardar 8seg na freq determinada
retfie



rotinaled1

btfss bt1 ;botÃo estÁ pressionado?
Goto $-.1
movlw .8
movwf cont8

ligadesliga1

bsf led1
movlw .2
movwf temp1
movlw .250
movwf temp2
movlw .250
movwf temp3
decfsz temp3,f
goto $-.1
decfsz temp2,f
goto $-.5
decfsz temp1,f
goto $-.9
bcf led1
movlw .2
movwf temp1
movlw .250
movwf temp2
movlw .250
movwf temp3
decfsz temp3,f
goto $-.1
decfsz temp2,f
goto $-.5
decfsz temp1,f
goto $-.9
btfsc bt1
goto $+.3
bcf led1
nop
decfsz cont8
goto ligadesliga1
bcf led1
retfie

rotinaled2

btfss bt2 ;botÃo estÁ pressionado?
Goto $-.1
movlw .8
movwf cont82

ligadesliga2

bsf led2
movlw .2
movwf temp1
movlw .250
movwf temp2
movlw .250
movwf temp3
decfsz temp3,f
goto $-.1
decfsz temp2,f
goto $-.5
decfsz temp1,f
goto $-.9
bcf led2
movlw .2
movwf temp1
movlw .250
movwf temp2
movlw .250
movwf temp3
decfsz temp3,f
goto $-.1
decfsz temp2,f
goto $-.5
decfsz temp1,f
goto $-.9
btfsc bt2
goto $+.3
bcf led2
nop
decfsz cont82
goto ligadesliga2
bcf led2
retfie

ini
banksel ansel
clrf ansel
clrf anselh

banksel trisa
movlw b'00001101'
movwf trisa
clrf trisb
clrf trisc
bcf option_reg,intedg ;seleciona borda de descida p/int ext
bcf option_reg,not_rabpu ;habilita pull-ups internos
bsf ioca,0 ;habilita flag interrupÇÃo mud. NÍvel (rabif)

banksel porta
clrf portb
movf porta,f
bcf intcon,rabif
bsf intcon,rabie ;habilita interrupÇÃo de mud. De nÍvel
bsf intcon,inte ;habilita interrupÇÃo externa
bsf intcon,gie ;habilita interrupÇÕes globais


end


No momento assim como está o programa faz o seguinte:

Se apertado o botão 1 o led1 começa a piscar durante 8 seg, o mesmo ocorre

com o led 2 e o botão2. Só que se eu pressionar o botão antes do término

dos 8 seg o led não está indo para zero...

Gostaria da ajuda de vocês pessoal.

Volto a frisar que não tenho experiência com interrupções, então qualquer dica é muito bem vinda.

Postado

Na realidade já tenho essa apostila...

Mas acredito que vai ser de grande valia para outros integrantes do fórum.

Se alguém puder dar alguma dica, fico grato.

Postado
#include	<p16f690.inc>
__config _cp_off & _cpd_off & _bor_off & _pwrte_on & _wdt_off & _intrc_osc_noclkout & _mclre_on & _fcmen_off & _ieso_off

errorlevel -302

cblock 0x20
temp1
temp2
temp3
cont8
cont82
d1
d2
d3
endc

#define bt1 porta,0
#define bt2 porta,2
#define led1 portb,4
#define led2 portb,5
;.....................................................
Org 0x00
goto ini

org 0x04
btfss intcon,rabif ;foi int por mud. NÍvel?
Goto int_ext
banksel ioca
bcf ioca,0 ;para desabilitar rabif
banksel porta
movf porta,f
bcf intcon,rabif
btfsc bt1 ;bt1 estÁ pressionado?faz um filtro no botao2 para confirmar se foi mesmo ele
retfie ;nÃo, entÃo retorna da interrupÇÃo
goto rotinaled1 ;manda para a rotina que faz o processo de piscar o led e aguardar 8seg na freq determinada
goto int_ext ;entra
retfie
;..........................................................
Int_ext
bcf intcon,intf
btfsc bt2 ;faz um filtro no botao2 para confirmar se foi mesmo ele
retfie ;nÃo, entÃo retorna da interrupcao
goto rotinaled2 ;manda para a rotina que faz o processo de piscar o led e aguardar 8seg na freq determinada
retfie
;--------------------------------------
delay_01sec
movlw 0x07
movwf d1
movlw 0x2f
movwf d2
movlw 0x03
movwf d3
delay_0
decfsz d1, f
goto $+2
decfsz d2, f
goto $+2
decfsz d3, f
goto delay_0
goto $+1
goto $+1
goto $+1
return
;--------------------------------------
rotinaled1

; btfss bt1 ;botÃo estÁ pressionado?
; goto $-1
movlw .8
movwf cont8

ligadesliga1
bsf led1
call delay_01sec
bcf led1
call delay_01sec
decfsz cont8,f
goto ligadesliga1
retfie
;............................................................
Rotinaled2

; btfss bt2 ;botÃo estÁ pressionado?
; goto $-1
movlw .8
movwf cont82

ligadesliga2
bsf led2
call delay_01sec
bcf led2
call delay_01sec
decfsz cont82,f
goto ligadesliga2
retfie
;..................................................
Ini
banksel ansel
clrf ansel
clrf anselh

banksel trisa
movlw b'00001101'
movwf trisa
clrf trisb
clrf trisc
bcf option_reg,intedg ;seleciona borda de descida p/int ext
bcf option_reg,not_rabpu ;habilita pull-ups internos
bsf ioca,0 ;habilita flag interrupÇÃo mud. NÍvel (rabif)

banksel porta
clrf portb
movf porta,f
bcf intcon,rabif
bsf intcon,rabie ;habilita interrupÇÃo de mud. De nÍvel
bsf intcon,inte ;habilita interrupÇÃo externa
bsf intcon,gie ;habilita interrupÇÕes globais

;............................................
End

Postado



Debug build of project `C:\Users\usuario\Desktop\PASTA\EXE3\tentativaex32\exehe3\helly.mcp' started.
Language tool versions: MPASMWIN.exe v5.44, mplink.exe v4.42, mplib.exe v4.42
Preprocessor symbol `__DEBUG' is defined.
Sun Sep 09 11:08:44 2012
----------------------------------------------------------------------
Clean: Deleting intermediary and output files.
Clean: Deleted file "C:\Users\usuario\Desktop\PASTA\EXE3\tentativaex32\exehe3\helly.mcs".
Clean: Done.
Executing: "C:\Program Files\Microchip\MPASM Suite\MPASMWIN.exe" /q /p16F690 "he.asm" /l"he.lst" /e"he.err" /d__DEBUG=1
Error[113] C:\USERS\USUARIO\DESKTOP\PASTA\EXE3\TENTATIVAEX32\EXEHE3\HE.ASM 26 : Symbol not previously defined (intcon)
Error[113] C:\USERS\USUARIO\DESKTOP\PASTA\EXE3\TENTATIVAEX32\EXEHE3\HE.ASM 26 : Symbol not previously defined (rabif)
Error[113] C:\USERS\USUARIO\DESKTOP\PASTA\EXE3\TENTATIVAEX32\EXEHE3\HE.ASM 27 : Symbol not previously defined (int_ext)
Error[113] C:\USERS\USUARIO\DESKTOP\PASTA\EXE3\TENTATIVAEX32\EXEHE3\HE.ASM 28 : Symbol not previously defined (ioca)
Error[113] C:\USERS\USUARIO\DESKTOP\PASTA\EXE3\TENTATIVAEX32\EXEHE3\HE.ASM 29 : Symbol not previously defined (ioca)
Error[113] C:\USERS\USUARIO\DESKTOP\PASTA\EXE3\TENTATIVAEX32\EXEHE3\HE.ASM 30 : Symbol not previously defined (porta)
Error[113] C:\USERS\USUARIO\DESKTOP\PASTA\EXE3\TENTATIVAEX32\EXEHE3\HE.ASM 31 : Symbol not previously defined (porta)
Error[113] C:\USERS\USUARIO\DESKTOP\PASTA\EXE3\TENTATIVAEX32\EXEHE3\HE.ASM 32 : Symbol not previously defined (intcon)
Error[113] C:\USERS\USUARIO\DESKTOP\PASTA\EXE3\TENTATIVAEX32\EXEHE3\HE.ASM 32 : Symbol not previously defined (rabif)
Error[113] C:\USERS\USUARIO\DESKTOP\PASTA\EXE3\TENTATIVAEX32\EXEHE3\HE.ASM 33 : Symbol not previously defined (porta)
Error[113] C:\USERS\USUARIO\DESKTOP\PASTA\EXE3\TENTATIVAEX32\EXEHE3\HE.ASM 36 : Symbol not previously defined (int_ext)
Error[113] C:\USERS\USUARIO\DESKTOP\PASTA\EXE3\TENTATIVAEX32\EXEHE3\HE.ASM 40 : Symbol not previously defined (intcon)
Error[113] C:\USERS\USUARIO\DESKTOP\PASTA\EXE3\TENTATIVAEX32\EXEHE3\HE.ASM 40 : Symbol not previously defined (intf)
Error[113] C:\USERS\USUARIO\DESKTOP\PASTA\EXE3\TENTATIVAEX32\EXEHE3\HE.ASM 41 : Symbol not previously defined (porta)
Error[113] C:\USERS\USUARIO\DESKTOP\PASTA\EXE3\TENTATIVAEX32\EXEHE3\HE.ASM 43 : Symbol not previously defined (rotinaled2)
Error[113] C:\USERS\USUARIO\DESKTOP\PASTA\EXE3\TENTATIVAEX32\EXEHE3\HE.ASM 73 : Symbol not previously defined (portb)
Error[113] C:\USERS\USUARIO\DESKTOP\PASTA\EXE3\TENTATIVAEX32\EXEHE3\HE.ASM 75 : Symbol not previously defined (portb)
Error[113] C:\USERS\USUARIO\DESKTOP\PASTA\EXE3\TENTATIVAEX32\EXEHE3\HE.ASM 89 : Symbol not previously defined (portb)
Error[113] C:\USERS\USUARIO\DESKTOP\PASTA\EXE3\TENTATIVAEX32\EXEHE3\HE.ASM 91 : Symbol not previously defined (portb)
Error[113] C:\USERS\USUARIO\DESKTOP\PASTA\EXE3\TENTATIVAEX32\EXEHE3\HE.ASM 98 : Symbol not previously defined (ansel)
Error[113] C:\USERS\USUARIO\DESKTOP\PASTA\EXE3\TENTATIVAEX32\EXEHE3\HE.ASM 99 : Symbol not previously defined (ansel)
Error[113] C:\USERS\USUARIO\DESKTOP\PASTA\EXE3\TENTATIVAEX32\EXEHE3\HE.ASM 100 : Symbol not previously defined (anselh)
Error[113] C:\USERS\USUARIO\DESKTOP\PASTA\EXE3\TENTATIVAEX32\EXEHE3\HE.ASM 102 : Symbol not previously defined (trisa)
Error[113] C:\USERS\USUARIO\DESKTOP\PASTA\EXE3\TENTATIVAEX32\EXEHE3\HE.ASM 104 : Symbol not previously defined (trisa)
Error[113] C:\USERS\USUARIO\DESKTOP\PASTA\EXE3\TENTATIVAEX32\EXEHE3\HE.ASM 105 : Symbol not previously defined (trisb)
Error[113] C:\USERS\USUARIO\DESKTOP\PASTA\EXE3\TENTATIVAEX32\EXEHE3\HE.ASM 106 : Symbol not previously defined (trisc)
Error[113] C:\USERS\USUARIO\DESKTOP\PASTA\EXE3\TENTATIVAEX32\EXEHE3\HE.ASM 107 : Symbol not previously defined (option_reg)
Error[113] C:\USERS\USUARIO\DESKTOP\PASTA\EXE3\TENTATIVAEX32\EXEHE3\HE.ASM 107 : Symbol not previously defined (intedg)
Error[113] C:\USERS\USUARIO\DESKTOP\PASTA\EXE3\TENTATIVAEX32\EXEHE3\HE.ASM 108 : Symbol not previously defined (option_reg)
Error[113] C:\USERS\USUARIO\DESKTOP\PASTA\EXE3\TENTATIVAEX32\EXEHE3\HE.ASM 108 : Symbol not previously defined (not_rabpu)
Error[113] C:\USERS\USUARIO\DESKTOP\PASTA\EXE3\TENTATIVAEX32\EXEHE3\HE.ASM 109 : Symbol not previously defined (ioca)
Error[113] C:\USERS\USUARIO\DESKTOP\PASTA\EXE3\TENTATIVAEX32\EXEHE3\HE.ASM 111 : Symbol not previously defined (porta)
Error[113] C:\USERS\USUARIO\DESKTOP\PASTA\EXE3\TENTATIVAEX32\EXEHE3\HE.ASM 112 : Symbol not previously defined (portb)
Error[113] C:\USERS\USUARIO\DESKTOP\PASTA\EXE3\TENTATIVAEX32\EXEHE3\HE.ASM 113 : Symbol not previously defined (porta)
Error[113] C:\USERS\USUARIO\DESKTOP\PASTA\EXE3\TENTATIVAEX32\EXEHE3\HE.ASM 114 : Symbol not previously defined (intcon)
Error[113] C:\USERS\USUARIO\DESKTOP\PASTA\EXE3\TENTATIVAEX32\EXEHE3\HE.ASM 114 : Symbol not previously defined (rabif)
Error[113] C:\USERS\USUARIO\DESKTOP\PASTA\EXE3\TENTATIVAEX32\EXEHE3\HE.ASM 115 : Symbol not previously defined (intcon)
Error[113] C:\USERS\USUARIO\DESKTOP\PASTA\EXE3\TENTATIVAEX32\EXEHE3\HE.ASM 115 : Symbol not previously defined (rabie)
Error[113] C:\USERS\USUARIO\DESKTOP\PASTA\EXE3\TENTATIVAEX32\EXEHE3\HE.ASM 116 : Symbol not previously defined (intcon)
Error[113] C:\USERS\USUARIO\DESKTOP\PASTA\EXE3\TENTATIVAEX32\EXEHE3\HE.ASM 116 : Symbol not previously defined (inte)
Error[113] C:\USERS\USUARIO\DESKTOP\PASTA\EXE3\TENTATIVAEX32\EXEHE3\HE.ASM 117 : Symbol not previously defined (intcon)
Error[113] C:\USERS\USUARIO\DESKTOP\PASTA\EXE3\TENTATIVAEX32\EXEHE3\HE.ASM 117 : Symbol not previously defined (gie)
Halting build on first failure as requested.
----------------------------------------------------------------------
Debug build of project `C:\Users\usuario\Desktop\PASTA\EXE3\tentativaex32\exehe3\helly.mcp' failed.
Language tool versions: MPASMWIN.exe v5.44, mplink.exe v4.42, mplib.exe v4.42
Preprocessor symbol `__DEBUG' is defined.
Sun Sep 09 11:08:46 2012
----------------------------------------------------------------------
BUILD FAILED


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

Ebook grátis: Aprenda a ler resistores e capacitores!

EBOOK GRÁTIS!

CLIQUE AQUI E BAIXE AGORA MESMO!