Partage
  • Partager sur Facebook
  • Partager sur Twitter

pic16f84a probleme d'interruption

à l'aide

11 octobre 2015 à 4:54:19

bonjour tout le monde, je suis un débutant en programmation en assembleur les pic, je voulais faire clignoter les leds branchées sur les protA en les commandants par RB0/int, c a d , à chaque fois que je clique sur le bouton poussoire branché à rb0, les leds du portA clignotent 

voila mon programme , s'il vous plais veuillez m'indiquer où ce trouve le probleme , sachant que MPLAB ne signal aucune erreur 

list p=16f84a, f=inhx8m, r=dec
include "p16f84a.inc"
__CONFIG _CP_OFF & _XT_OSC & _PWRTE_ON & _WDT_OFF


optionval equ b'10000000'
intconmask equ b'10010000'
#DEFINE LED	PORTB,0	

cblock 0x00c
wtemp
statustemp
n1
n2
n3
val
endc


bank0 macro
bcf STATUS,RP0
endm

bank1 macro
bsf STATUS,RP0
endm


org 0x00
goto init


org 0x04

      movwf   wtemp  	; sauver registre W
	swapf	STATUS,w	; swap status avec résultat dans w
	movwf	statustemp





btfsc INTCON,T0IE
btfss INTCON,GIE
goto inte
call intt0
bcf INTCON,T0IF
goto restoreg

inte

btfsc INTCON,INTE
btfss INTCON,GIE
goto rbie
call intinte
bcf INTCON,INTF
goto restoreg

rbie

btfsc INTCON,RBIE
btfss INTCON,GIE
goto intpei
call intrbie
bcf INTCON,RBIF
goto restoreg

intpei

btfsc INTCON,EEIE
btfss INTCON,GIE
goto restoreg
call inteeie




restoreg

      movwf   wtemp  	; sauver registre W
	swapf	STATUS,w	; swap status avec résultat dans w
	movwf	statustemp

retfie

intt0
return

intinte
bank0

movlw 0xff
movwf PORTA
call tempo
movlw 0x00
movwf PORTA
call tempo
movlw 0xff
movwf PORTA
call tempo
movlw 0x00
movwf PORTA
call tempo
return

intrbie
return

inteeie
return


tempo

movlw 1
movwf n1
tempo1
movlw 0xff
movwf n2
tempo2
movlw 0xff
movwf n3
tempo3
decfsz n3
goto tempo3
decfsz n2
goto tempo2
decfsz n1
goto tempo1

return
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
init
bank1
movlw optionval
movwf OPTION_REG
movlw intconmask
movwf INTCON
bcf LED
clrf TRISA

bank0



start

movlw 0x1f
movwf PORTA



goto start
end





  • Partager sur Facebook
  • Partager sur Twitter
11 octobre 2015 à 5:14:56

les probleme rencontrés :

la led RA4 ne s'alume pas

quand j'appuie sur le bouton, rien ne se passe 

  • Partager sur Facebook
  • Partager sur Twitter
11 octobre 2015 à 10:58:34

L'assembleur, c'est bien beau (ou pas) mais pour être franc, je doute fort que quelqu'un ose se plonger dans ton code pour trouver l'erreur.

D'autant plus qu'il n'y a pratiquement aucun commentaire, rendu le code encore plus incompréhensible.

Je t'encourage vivement à développer en langage C (il existe des compilateurs pour pic16) ;)

  • Partager sur Facebook
  • Partager sur Twitter
11 octobre 2015 à 13:54:08

merci Lorrio pour votre remarque, mon but pour l'instant ce n'est pas de realiser des projets , mais d'apprendre l'assembleur et puis passer à la programmation en c que je maîtrise bien, donc je vais ajouter des commentaire à mon programme en espérant que quelqu'un m'aide à identifier où est le probleme
  • Partager sur Facebook
  • Partager sur Twitter
11 octobre 2015 à 14:02:18

Puisque tu maitrises le langage C, tu devrais peut-être développer ton code en C pour voir si il marche.

Si ça se trouves, c'est un mauvais câblage ou une mauvaise utilisations des registres et non une erreur de code qui est à l'origine du problème ;)

  • Partager sur Facebook
  • Partager sur Twitter
11 octobre 2015 à 14:58:01

mon programme avec commentaires :

;**********************************************************************
;                                                                                                                   *
; Fait clignoter une LED                                                                                  *
;                                                                                                                   *
;**********************************************************************
;                                                                                                                   *
;    NOM: LED CLIGNOTANTE AVEC TIMER0                                                *
;                                                                                                                   *
;                                                                                                                   *
;**********************************************************************
;                                                                     *
;    Fichier requis: P16F84a.inc                                       *
;                                                                     *
;                                                                     *
;                                                                     *
;**********************************************************************
;                                                                     *
;    Notes: Utilisation didactique du boucle en mode interruption     *
;                                                                     *
;**********************************************************************
list p=16f84a, f=inhx8m, r=dec
include "p16f84a.inc"
__CONFIG _CP_OFF & _XT_OSC & _PWRTE_ON & _WDT_OFF

; '__CONFIG' précise les paramètres encodés dans le processeur au moment de
; la programmation du processeur. Les définitions sont dans le fichier include.
; Voici les valeurs et leurs définitions :
;	_CP_ON		Code protection ON : impossible de relire
;	_CP_OFF		Code protection OFF
;	_PWRTE_ON	Timer reset sur power on en service
;	_PWRTE_OFF	Timer reset hors-service
;	_WDT_ON		Watch-dog en service
;	_WDT_OFF	Watch-dog hors service
;	_LP_OSC		Oscillateur quartz basse vitesse
;	_XT_OSC		Oscillateur quartz moyenne vitesse
;	_HS_OSC		Oscillateur quartz grande vitesse
;	_RC_OSC		Oscillateur à réseau RC

;*********************************************************************
;                              ASSIGNATIONS                                                         *
;*********************************************************************

optionval equ b'10000000'         ; Valeur registre option
                                                ; Résistance pull-up OFF
                                                ; Préscaler timer à 256
intconmask equ b'10010000'      ;Interruptions sur rb0/int
   
#DEFINE interruptport 	PORTB,0	    
;*********************************************************************
;                   DECLARATIONS DE VARIABLES                                             *
;*********************************************************************

cblock 0x00c
wtemp
statustemp
n1
n2
n3
val
endc

;*********************************************************************
;                             MACRO                                                                         *
;*********************************************************************

bank0 macro
bcf STATUS,RP0
endm

bank1 macro
bsf STATUS,RP0
endm

;**********************************************************************
;                      DEMARRAGE SUR RESET                            *
;**********************************************************************

org 0x00
goto init

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

;sauvegarder registres	
;------------------------
org 0x04

      movwf   wtemp  	; sauver registre W
	swapf	STATUS,w	; swap status avec résultat dans w
	movwf	statustemp


; switch vers différentes interrupts
; inverser ordre pour modifier priorités
;  ----------------------------------------


btfsc INTCON,T0IE
btfss INTCON,GIE
goto inte
call intt0
bcf INTCON,T0IF
goto restoreg

inte

btfsc INTCON,INTE
btfss INTCON,GIE
goto rbie
call intinte
bcf INTCON,INTF
goto restoreg

rbie

btfsc INTCON,RBIE
btfss INTCON,GIE
goto intpei
call intrbie
bcf INTCON,RBIF
goto restoreg

intpei

btfsc INTCON,EEIE
btfss INTCON,GIE
goto restoreg
call inteeie




restoreg

      movwf   wtemp  	; sauver registre W
	swapf	STATUS,w	; swap status avec résultat dans w
	movwf	statustemp

retfie
;**********************************************************************
;                     INTERRUPTION TIMER 0                                                      *
;**********************************************************************
intt0
return
;**********************************************************************
;                     INTERRUPTION RB0/INT                                                      *
;**********************************************************************
intinte
bank0

movlw 0xff
movwf PORTA
call tempo
movlw 0x00
movwf PORTA
call tempo
movlw 0xff
movwf PORTA
call tempo
movlw 0x00
movwf PORTA
call tempo
return


;**********************************************************************
;                     INTERRUPTION RB0/RB4                            *
;**********************************************************************
intrbie
return			; fin d'interruption RB0/RB4
				; peut être remplacé par 
				; retlw pour retour code d'erreur

;**********************************************************************
;                     INTERRUPTION EEPROM                             *
;**********************************************************************
inteeie
return			; fin d'interruption eeprom
				; peut être remplacé par 
				; retlw pour retour code d'erreur


;*********************************************************************
;                       Fonction de temporisation                                                     *
;*********************************************************************
tempo  ; une temporisation de presque  deux secondes

movlw 1
movwf n1
tempo1
movlw 0xff
movwf n2
tempo2
movlw 0xff
movwf n3
tempo3
decfsz n3
goto tempo3
decfsz n2
goto tempo2
decfsz n1
goto tempo1

return


;*********************************************************************
;                       INITIALISATIONS                                                            *
;*********************************************************************

init
bank1
movlw optionval                ; charger masque
movwf OPTION_REG       ; initialiser registre option
movlw intconmask             ; charger masque
movwf INTCON               ;charger interrupt control
bcf interruptport             ; configurer rb0 comme une entrée
clrf TRISA                     ; PORTA est configuré comme sorties 

bank0                             ; accés à la banque 0


;*********************************************************************
;                      PROGRAMME PRINCIPAL                                                     *
;*********************************************************************

start

movlw 0x1f       ; allumer les cinq leds  de PORTA
movwf PORTA



goto start
end





  • Partager sur Facebook
  • Partager sur Twitter
11 octobre 2015 à 15:01:18

j ai bien mets un algorithme, normalement le programme doit fonctionner correctement , mais le fait qu'il ne fonctionne pas m'a poussé à se diriger vers ce fameux site web pour trouver ce qui me gène :/
  • Partager sur Facebook
  • Partager sur Twitter
11 octobre 2015 à 23:00:34

As-tu réalisé le câblage ou que de la simulation?

Il manque :

- des résistances de limitation de courant pour les LED

- une résistance de pull-up pour le BP

- une résistance sur MCLR

- un quartz pour l'oscillateur

De plus, RA4 est un drain ouvert, la LED doit être câblée entre VCC et RA4.

Après on parle de ton programme.

  • Partager sur Facebook
  • Partager sur Twitter
Le 25 juillet 2016, j'ai essayé une Ford Mustang.
12 octobre 2015 à 1:06:59

premierement je vous remercie monsieur de consacrer votre temps pour m'aider :)

c'est juste une simulation, avec isis on peut ignorer les manques que vous venez de citer 

  • Partager sur Facebook
  • Partager sur Twitter
12 octobre 2015 à 1:08:53

pour la ligne 218  , j'ai commis un erreur , je dois mettre bsf au lieu de bcf pour configurer RB0/int comme une entrée
  • Partager sur Facebook
  • Partager sur Twitter
12 octobre 2015 à 20:29:06

Tu ne peux pas ignorer le quartz même en simu.
  • Partager sur Facebook
  • Partager sur Twitter
Le 25 juillet 2016, j'ai essayé une Ford Mustang.
12 octobre 2015 à 20:30:00

Tu auras les mêmes remarques sur Futura et ce n'est pas moi qui les ferais mais je sais qui ...

-
Edité par Gérard68 12 octobre 2015 à 20:30:38

  • Partager sur Facebook
  • Partager sur Twitter
Le 25 juillet 2016, j'ai essayé une Ford Mustang.
12 octobre 2015 à 23:32:09

mais j'ai fait pas mal de simulation avec ISIS sans introduire le quartz et ç'a marché !

je pense que le problème réside au programme 

  • Partager sur Facebook
  • Partager sur Twitter
13 octobre 2015 à 20:16:48

La simulation n'est pas la vrai vie.

Pour t'en convaincre, tu câbles un µC sans quartz alors que tu l'as configuré dans le mot de config.

  • Partager sur Facebook
  • Partager sur Twitter
Le 25 juillet 2016, j'ai essayé une Ford Mustang.
4 janvier 2020 à 9:05:15

Bonjour,

Déterrage

Citation des règles générales du forum :

Avant de poster un message, vérifiez la date du sujet dans lequel vous comptiez intervenir.

Si le dernier message sur le sujet date de plus de deux mois, mieux vaut ne pas répondre.
En effet, le déterrage d'un sujet nuit au bon fonctionnement du forum, et l'informatique pouvant grandement changer en quelques mois il n'est donc que rarement pertinent de déterrer un vieux sujet.

Au lieu de déterrer un sujet il est préférable :

  • soit de contacter directement le membre voulu par messagerie privée en cliquant sur son pseudonyme pour accéder à sa page profil, puis sur le lien "Ecrire un message"
  • soit de créer un nouveau sujet décrivant votre propre contexte
  • ne pas répondre à un déterrage et le signaler à la modération

Je ferme ce sujet. En cas de désaccord, me contacter par MP.

  • Partager sur Facebook
  • Partager sur Twitter

Pas d'aide concernant le code par MP, le forum est là pour ça :)