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