pic16f84a interrompre problème

R

richwms

Guest
J'ai un problème avec le code d'interruption dans mon programme.La première fois que je jette une interruption switch, tout fonctionne bien.Cependant, quand je jette le passage une deuxième fois, l'interruption ne se produit pas.What am I missing?Toute aide serait grandement appréciée.

Voici le code assembleur:
;************************************************* *********************
; Ce fichier est un modèle de code de base pour le montage de génération de code *
; Sur la PICmicro PIC16F84A.Ce fichier contient le code de base *
,
La construction de blocs à bâtir.*
*;
; Si les interruptions ne sont pas utilisés tous les codes présentés entre le ORG *
; 0x004 directive et l'étiquette principale peut être enlevé.En outre *
; Affectations de la variable «w_temp» et «status_temp« peut *
; Être supprimés.*
*;
; Se référer à la MPASM Guide
de l'utilisateur pour obtenir des informations supplémentaires sur les *
; Caractéristiques de l'assembleur (Document DS33014).*
*;
; Se référer à la fiche de données de PICmicro supplémentaires *
; Informations sur le jeu d'instructions.*
*;
; Fichier modèle assemblé avec MPLAB V4.00.00 et MPASM V2.20.12.*
*;
;************************************************* *********************
*;
; Nom du fichier: contraption.asm *
; Date: 11.26.2008 *
, Version: 1.0 *
, Auteur: Richard Williams *
*;
;************************************************* *********************

liste p = 16F84A; liste de directive visant à définir processeur
#
include <p16F84A.inc>; processeur spécifique la définition des variables

__CONFIG _CP_OFF & _WDT_OFF & _PWRTE_ON & _RC_OSC

; '__CONFIG «Directive est utilisée pour intégrer les données de configuration de l'intérieur. Asm fichier.
; Les étiquettes ci-après la directive se trouvent dans les. Fichier inc.
; Voir fiche technique pour plus d'informations sur la configuration mot.

ERRORLEVEL -302

org 0x00;
C'est là que nous venons sur le pouvoir en place et de réinitialisation

;******************* SETUP CONSTANTES *******************

INTCON EQU 0x0B; Interrupt Control Register

PORTB EQU 0x06; Port B enregistrer l'adresse

PORTA EQU 0x05; Port Un registre adresse

TRISA EQU 0x85; Trisa inscrire l'adresse

TRISB EQU 0x86; TrisB inscrire l'adresse

ÉTAT EQU 0x03; Etat enregistrer l'adresse

COUNT1 EQU 0x0C; Ce sera notre comptage variable

COUNT2 EQU 0x0D; Ce sera notre comptage variable

COUNT3 EQU 0x0E; Ce sera notre comptage variable

COUNT4 EQU 0x0F; Ce sera notre comptage variable

W_TEMP EQU 0x10; temporaire pour stocker w registre

S_TEMP EQU 0x11; temporaire pour stocker registre d'état

goto main; Aller sur l'interruption de l'adresse

ROUTINE INTERRUPTION ;*************** ***************

org 0x04;
C'est là que les points PC sur une interruption

movwf W_TEMP; Store w enregistrer dans un emplacement temporaire

movfw STATUS; Store statut registre w

movwf S_TEMP; Store w registre de l'état des locaux temporaires

movlw 01h; Set B2 bobine

Délai d'appel

movlw 02h; Set A1 bobine

Délai d'appel

movlw 04h; Set A2 bobine

Délai d'appel

movlw 08h; Set B1 bobine

Délai d'appel

movfw S_TEMP; Store statut temporaire au registre w

movwf STATUS; Store w inscrire dans registre d'état

movfw W_TEMP; w Restauration de la valeur avant l'interruption

bsf INTCON, 4; INTE - RB0 Interrupt Enable (1 = activé)

bcf INTCON, 1; Clair ce drapeau pour permettre à davantage de interrupts

retfie; Sortez de la routine d'interruption

Cette sous-routine ;*************** contrôle la vitesse du moteur A *************

Delay movwf PORTA; Tournez à la prochaine bobine dans un moteur

movlw 0FH

movwf COUNT1

movlw 01h

movwf COUNT2

Loop1 decfsz COUNT1, 1

goto Loop1

decfsz COUNT2, 1

goto Loop1

retour

;******************* Programme principal *********************

principal

;******************* Set Up The Interrupt registres ****

bsf INTCON, 7; GIE - Global interrompre permettre (1 = activé)

bsf INTCON, 4; INTE - RB0 Interrupt Enable (1 = activé)

bcf INTCON, 1; INTF - Clair Flag Bit Just In Case

Set Up ;******************* Les Ports ******************

bsf STATUS, 5; changer à la banque 1

movlw 0x01

movwf TRISB; Set RB0 en entrée

movlw 0x10

movwf TRISA; Set 4 pins de la première porte que sur la production

bcf STATUS, 5; Revenez à la Banque 0

movlw 01h; Set B2 bobine dans un moteur

Délai d'appel

movlw 02h; Set A1 bobine

Délai d'appel

movlw 04h; Set A2 bobine

Délai d'appel

movlw 08h; Set B1 bobine

Délai d'appel

;****************** Run Motor B Entre Interrupts ***********

Loop

movlw 02h; Set B2 bobine dans Motor B

appel Delay2

movlw 04h; Set A1 bobine

appel Delay2

movlw 08h; Set A2 bobine

appel Delay2

movlw 10h; Set B1 bobine

appel Delay2

goto Loop

Cette sous-routine ;**************** contrôle la vitesse du moteur B *************

Delay2 movwf PORTB; Tournez à la prochaine bobine dans Motor B

movlw 0FH

movwf COUNT3

movlw 01h

movwf COUNT4

Loop2 decfsz COUNT3, 1

goto Loop2

decfsz COUNT4, 1

goto Loop2

retour

fin,
la directive «fin de progra

 
richwms,
j'ai repéré un certain nombre de choses dans votre code qui pourrait faire défaut de fonctionnement.

Tout d'abord, vous devriez prendre l'habitude lors de codage, d'instaurer d'abord un module et ensuite l'activer.Dans ce cas, effacer la première interruption de drapeaux, de permettre des interruptions spécifiques (RB0 dans votre cas) et seulement ensuite permettre d'interrompre le Global bit.De cette façon, vous évitez les résultats inattendus devraient se produire une interruption avant de vous faire de sa mise en place.

Aussi, si vous ne mettez pas quelque chose comme "BCF INTCON, GIE" comme la première instruction dans la routine d'interruption, une autre interruption de mai se produire lorsque vous êtes dans la routine d'interruption.Le problème est le MCU
du matériel pile.Si une interruption survient avant que le programme atteint RETFIE, et cela se produit plus que quelques fois, vous êtes plus susceptibles d'obtenir un dépassement de pile et le programme ne fonctionne pas bien du tout.Donc, mon conseil:

ORG 0x04
BCF INTCON, GIE
<Save W register>
<Save ÉTAT register>
.... votre code ici ....
<restore Status>
<restore Wreg>
BCF INTCON, INTF
RETFIE

(GIE est automatiquement réactivé avec RETFIE instruction, donc pas besoin de perdre un cycle sur la façon de faire vous-même)

N'oubliez pas que tout interrupteur ou bouton-poussoir a habituellement un "rebond".En d'autres termes, elle
n'a pas immédiatement passer de 0 à 1, les contacts physiques mai rebondir contre eux pour une très courte période de temps.Un rapide MCU détecte ce que plusieurs demandes d'interruption.Vous devriez toujours faire une sorte de matériel (condensateur) ou des logiciels antirebond avant
de «répondre»
à la presse un bouton.

 

Welcome to EDABoard.com

Sponsor

Back
Top