pic16f84a interromper problema

R

richwms

Guest
Eu tenho um problema com o código de interromper meu programa.A primeira vez que eu jogar interromper um interruptor, tudo funciona bem.No entanto, quando eu jogar o interruptor uma segunda vez, a interrupção não ocorre.O que estou ausente?Qualquer ajuda seria muito apreciada.

Aqui está o código assembly:
;************************************************* *********************
; Este arquivo é um modelo para a montagem básica código código geração *
; Sobre a PICmicro PIC16F84A.Este arquivo contém o código básico *
; Alicerces para assentar.*
*;
; Se interrupções não são utilizados todos os códigos apresentados entre o ORG *
; 0x004 directiva eo rótulo principal podem ser removidos.Além disso *
; Atribuições para a variável 'w_temp' e 'status_temp' pode *
; Ser removido.*
*;
; MPASM Consulte o manual do utilizador para obter informações adicionais sobre *
; Características da montadora (Documento DS33014).*
*;
; Consulte a respectiva ficha de PICmicro adicional *
; Informações sobre a instrução set.*
*;
; Modelo arquivo montado com MPLAB V4.00.00 e MPASM V2.20.12.*
*;
;************************************************* *********************
*;
; Filename: contraption.asm *
; Data: 11/26/2008 *
; Arquivo Versão: 1.0 *
; Autor: Richard Williams *
*;
;************************************************* *********************

list p = 16F84A; lista directiva para definir processador
#
include <p16F84A.inc>; processador variável específica definições

__CONFIG _CP_OFF & _WDT_OFF & _PWRTE_ON & _RC_OSC

»; __CONFIG« Directiva é utilizado para inserir os dados de configuração. Asm arquivo.
; O lables na sequência da directiva estão localizados nos respectivos. Inc arquivo.
; Ver respectiva ficha de informações adicionais sobre a configuração palavra.

Erro -302

org 0x00; Isto é onde nós vamos poder-se e redefinir

;******************* CONFIGURAR Constants *******************

INTCON EQU 0x0B; Interrupt Control Register

PORTB EQU 0x06; Porto B registrar endereço

PORTA EQU 0x05; Porta Um registo endereço

TRISA EQU 0x85; TrisA registrar endereço

TRISB EQU 0x86; TrisB registrar endereço

ESTADO EQU 0x03; Status registrar endereço

COUNT1 EQU 0x0c; Esta será a nossa contagem variável

COUNT2 EQU 0x0D; Esta será a nossa contagem variável

COUNT3 EQU 0x0E; Esta será a nossa contagem variável

COUNT4 EQU 0x0F; Esta será a nossa contagem variável

W_TEMP EQU 0x10; temporários para armazenar w registo

S_TEMP EQU 0x11; temporários para armazenar estado registo

goto principal; Ir interromper durante o endereço

;*************** Interromper ROTINA ***************

org 0x04; Isto é onde PC pontos sobre uma interrupção

movwf W_TEMP; Store w registrar em um local temporário

Situação movfw; Conservar no estado w registo

movwf S_TEMP; Store w registo em estado localização temporária

movlw 01h; Set B2 bobina

chamada Delay

movlw 02h; Set A1 bobina

chamada Delay

movlw 04h; Set A2 bobina

chamada Delay

movlw 08h; Set B1 bobina

chamada Delay

movfw S_TEMP; Store estatuto localização temporária no registo W

movwf STATUS; Store w registo em estado registo

movfw W_TEMP; Restaurar w ao valor antes de o interromper

BSF INTCON, 4; Integrado - rb0 Interrupt Enable (1 = activar)

BCF INTCON, 1; Limpar esta bandeira para permitir que mais interrompe

retfie; Saia da rotina interromper

Esta subrotina ;*************** controla a velocidade do motor A *************

Atraso movwf PORTA; Vire na próxima bobina em um automóvel

movlw 0fh

movwf COUNT1

movlw 01h

movwf COUNT2

Loop1 decfsz COUNT1, 1

goto Loop1

decfsz COUNT2, 1

goto Loop1

regresso

;******************* Principal Programa *********************

principal

;******************* Configurar O Interrupt Registos ****

BSF INTCON, 7; GIE - Global interromper permitir (1 = activar)

BSF INTCON, 4; Integrado - rb0 Interrupt Enable (1 = activar)

BCF INTCON, 1; intf - Limpar Bandeira Bit Just In Case

;******************* Configurar O Ports ******************

BSF STATUS, 5; Switch ao Banco 1

movlw 0x01

movwf TRISB; rb0 Definir como entrada

movlw 0x10

movwf TRISA; Defina os primeiros 4 pinos no Porta como saída

BCF STATUS, 5; Volte ao Banco 0

movlw 01h; Set B2 bobina em um automóvel

chamada Delay

movlw 02h; Set A1 bobina

chamada Delay

movlw 04h; Set A2 bobina

chamada Delay

movlw 08h; Set B1 bobina

chamada Delay

Executar ;****************** Motor B Entre Interrompe ***********

Loop

movlw 02h; Set B2 bobina no motor B

chamada Delay2

movlw 04h; Set A1 bobina

chamada Delay2

movlw 08h; Set A2 bobina

chamada Delay2

movlw 10h; Set B1 bobina

chamada Delay2

goto Loop

Esta subrotina ;**************** controla a velocidade do motor B *************

Delay2 movwf PORTB; Vire na próxima bobina no motor B

movlw 0fh

movwf COUNT3

movlw 01h

movwf COUNT4

Loop2 decfsz COUNT3, 1

goto Loop2

decfsz COUNT4, 1

goto Loop2

regresso

efeito,
a Directiva "fim de progra

 
JużÂ na początku listopada Microsoft udostępnił wszystkim chętnym możliwość przetestowania wczesnej wersji Windows 10 o nazwie Technical Preview. Teraz pojawiła się informacja o spodziewanej dacie premiery kolejnej wersji o nazwie Windows 10 Consumer Preview.

Read more...
 
richwms, eu detectei algumas coisas em seu código que pode potencialmente tornar avaria.

Primeiro de tudo, você deve fazer um hábito quando codificação, a primeira criação de um módulo e só depois ativá-lo.Neste caso, primeiro limpe a interromper bandeiras, permitir interrupções específicas (rb0 no seu caso) e só depois definir o Global interromper permitir bit.Dessa forma, você deve evitar os resultados inesperados uma interrupção ocorrer antes de você terminar a criação destas empresas.

Além disso, se você não colocar algo como "BCF INTCON, GIE" como a primeira instrução em interromper a rotina, outra interrupção pode ocorrer enquanto você estiver em interromper a rotina.O problema com isto é o hardware
do MCU pilha.Se uma interrupção ocorre antes de o programa atinge RETFIE e, mais do que isso acontece algumas vezes, você é mais provável obter um stack overflow eo programa não irá funcionar bem em tudo.Então, meu conselho:

ORG 0x04
BCF INTCON, GIE
<save W register>
<save Situação register>
.... o seu código aqui ....
<restore Status>
<restore Wreg>
BCF INTCON, intf
RETFIE

(GIE é automaticamente reativá-la, juntamente com RETFIE instrução, por isso não precisa desperdiçar um ciclo de fazer tudo por conta própria)

Não se esqueça de que qualquer mudança ou botão tem normalmente uma "rejeição".Em outras palavras, não se dirigir imediatamente 0-1, os contactos poderão rejeição física contra si por um período muito curto de tempo.Um rápido MCU irá detectar isto como interromper vários pedidos.Você deve sempre fazer algum tipo de hardware (condensador) ou software debouncing antes de "responder" um botão.

 

Welcome to EDABoard.com

Sponsor

Back
Top