Soucis code (asm) en interruption.
Répondre à la discussion
Affichage des résultats 1 à 21 sur 21

Soucis code (asm) en interruption.



  1. #1
    Laboum

    Soucis code (asm) en interruption.


    ------

    Bonjour à tous,

    Je souhaite faire une fonction Marche/Arrêt, provoquée via un B/P, par une interruption sur RB0
    Au premier appuie pas de soucis ça fonctionne sur Marche
    _Appel de l'anti rebond suivi d'un bip
    _L'irq se déroule normalement et modifie en conséquence la variable (test_on_off) dans le traitement
    le programme se déroule sans problème.

    Au deuxième appuie, le protocole de l'irq est valide, en tout cas en simulation sous MPLAB
    Mais pas de passage par l'anti rebond suivi du bip, le programme continuant son job, à partir de l'adresse qu'il a quitté à l'appel de l'irq

    Ma préoccupation, comment faire ?
    Pour que la variable (test_on_off) soit testé au deuxième passage comme ici dans le premier test
     Cliquez pour afficher

    ce qui permettrais l'arrêt.

    Cette séquence s’achèvera de toute façon, à l'issu du temps programmé pour le biais du Timer0

    -----

  2. #2
    Laboum

    Re : Soucis code (asm) en interruption.

    Programme:
    Code:
    ;**************************************************
    ;    Fichier requis: P16F84.inc                   *
    ;********************-------NOTES-----*************
    ; Ce programme permet de faire clignoter en alternance une 
    ; LED sur RA2 ou RA0, pendant un temps déterminé par le Timer0    
    ; RA3 délivre un bip de départ, activé par le B/P sur RB0 
    ; RA1 commande la led  ON/OFF 
    ; Un B/P sur RB0 commande manuellement l'arrêt
    ;*****************************************************
    	LIST      p=16F84A      ; Définition de processeur
    	#include <p16F84A.inc>  ; Définitions des constantes
        errorlevel   -302       ; Ajout pour éviter le message 
    	__CONFIG   _CP_OFF & _WDT_OFF & _PWRTE_ON & _HS_OSC  
                  
    ;**************************
    ; ASSIGNATIONS  pour IRQ  *
    ;**************************
    ;-----Configuration OPTION_REG ----
    OPTIONVAL  EQU  b'00000101' ; config. valeur, pour OPTION_REG = H'05'                        
    					
    ;--- Configuration INTCON --------  
    INTERMASK EQU  b'10010000'; Masque d'interruption b'10010000'
           
    ;***********
    ;  DEFINE  *
    ;***********
     #DEFINE led1 PORTA,0      ; RA0,(led1)rouge
     #DEFINE led_on_off PORTA,1 ; RA1,(led4)rouge(ON/OFF)
     #DEFINE led0 PORTA,2      ; RA2,(led0) rouge
     #DEFINE buzzer PORTA,3    ; RA3,(buzzer)sortie signal
     #DEFINE on_off PORTB,0    ; B/P (ON_OFF)bouton poussoir
    ;********************
    ;         MACRO    *
    ;********************
    ;-------- BANK0 -------
    BANK0 macro
    	bcf STATUS,RP0 ; passer banque0 
    	endm
    ;-------- BANK1 ------------
    BANK1 macro
    	bsf STATUS,RP0  ; passer banque1
    	endm
    ;******************************
    ;  DECLARATIONS DE VARIABLES *
    ;******************************
    	CBLOCK 0x00C    ; début de la zone variables B'0000 1100'= d'12'
    ;--- variables SAVE registre pour IRQ -------
    	w_temp:1        ; Sauvegarde du registre W
    	status_temp:1   ; Sauvegarde du registre STATUS
    ;--- variables temporisation ------------
    	cmpt1:1         ; compteur de boucle1
    	cmpt2:1         ; compteur de boucle2
    	cmpt3:1         ; compteur de boucle3
    	cmpt4:1         ; compteur de boucle4
    	durée_bip:1     ; contient la valeur de la tempo du bip
        test_on_off:1   ; compteur de passage (décide de l'arrêt)
    ;------ variables pour TMR0 -----
    	cmp1:1          ; comptage pour parvenir à la seconde
    	seconde:1       ; comptage des secondes 
        minute:1        ; comptage des minutes
    ;---- variables pour TMR0 tempscharge -----
    	tempscharge:1   ; contient le temps de charge
    ;---- registre de flags divers -----
    	flags:1 ; un octet pour 8 flags
    	ENDC 
    ;----- indentification du bit ------
     #DEFINE tempo_anti_rebond flags,0;    
    ;*************************
    ;   DEMARRAGE SUR RESET  *
    ;*************************
    	org 0x000     ; 
    	goto  init    ;
    ;***************************
    ;      ROUTINE INTERRUPTION 
    ;****************************
    ;---- sauvegarder registres ----
    	ORG 	0x004		; 
    	movwf	w_temp  	; 
    	swapf	STATUS,w	; 
    	movwf	status_temp	; 
    ;---prérequis pour l'IRQ INT/RB0 --
    	btfsc	INTCON,INTE	; 
    	btfss	INTCON,INTF	; 
    	goto 	intsw1		;
    	call	intrb0	    ;
    ;-- retour fin de l'IRQ INT/RB0 --
    	bcf	INTCON,INTF	 ; 
    	goto restorereg	 ; 
    ;-- Traitement IRQ timer0 -------
    intsw1
    	call inttimer ; 
    ;-- retour fin de l'IRQ TMR0 ---
    	bcf	INTCON,T0IF	; 
    
    ;--- RESTAURER REGISTRES ------
    restorereg
    	swapf	status_temp,w	; 
    	movwf   STATUS		; 
    	swapf   w_temp,f	; 
    	swapf   w_temp,w  	; 
    	retfie 			; 
    ;**********************
    ;   INITIALISATIONS   *
    ;**********************
    init  
        clrf PORTA       ; 
        clrf PORTB       ; 
    	BANK1            ; 
    	movlw OPTIONVAL  ; 
    	movwf OPTION_REG ; 
    ;---- Effacer RAM -----
    	movlw 0x00C   ; 
    	movwf FSR     ;
    init1             ; 
    	clrf INDF     ;
    	incf FSR,f    ; 
    	btfss FSR,6   ; 
    	goto init1    ;
        btfss FSR,4   ; 
    	goto  init1   ; 
    
    ;---initialisations spécifiques  ------
    ;--- Config.de TRISA ------------------
    	bcf led1       ; RA0 en sortie (led1)
    	bcf led_on_off ; RA1 en sortie (on_off )
    	bcf led0 	   ; RA2 en sortie (led0)
        bcf buzzer     ; RA3 en sortie ( buzzer)
     ;--- Config.de TRISB -----------------------
        bsf TRISB,3    ; RB3 en entrée (choix Tempo)
    	bsf TRISB,0    ; RB0 en entrée ( B_P_START)
    ;- Initialisation variables "durée du processus" pour TMR0 --
    	movlw   d'1'    ; d'1' charger dans W
    	movwf cmp1      ; et transferé dans la variable "cmp1"
    ;-- Initialisation "test_on_off" ----
    	movlw b'00000010'    ; pour d'2'
        movwf  test_on_off   ; initialiser test du "M_A" 
    ;-- Choix durée du processus ------
      BANK0
    	clrf tempscharge  ; RAZ de tempscharge
    	btfsc  PORTB,3   ; le swicth est-il a 0 ?
    	goto tempo1mn     ; NON  base de comptage  1 mn
    	goto tempo2mn   ; OUI  base de comptage  2 mn
    tempo1mn
    	movlw d'01'      ; OUI  base de comptage 1 mn
    	goto chargement  ; tempscharge
    tempo2mn
    	movlw  d'02'     ; NON  base de comptage 2 mn
    chargement
    	movwf tempscharge ; "tempscharge" = d'01'OU d'02'
    ;----initialisation IRQ ---
    	BANK0  ; BANK0 accés a INTCON 
    	movlw INTERMASK ; SEUL l'IRQ (RB0/INT) est activé
    	movwf INTCON    ; registre "INTCON" initialisé 
    	goto start      ; On VA au MAIN 
    ;***************************
    ;  Traitement IRQ  RB0/INT *
    ;***************************
    ;--- valide le flag tempo, pour appeler l'antirebond ----------
    intrb0  
    	BANK0            
        bsf tempo_anti_rebond ; bit0 du registre "flags"
        decf test_on_off,f  ; décrémenter "test_on_off"
        return              ;
    ;*********************
    ;  INTERRUPTION TMR0 *
    ;*********************
    ;-- décomptage TMR0 ------
    inttimer
    	decf cmp1,f       ;  
    	btfss STATUS,Z    ;  
    	return            ; 
    ;-- décomptage secondes ----
    	movlw  d'61'      ; 
    	movwf  cmp1       ; 
    	incf   seconde,f  ; 
    	movf   seconde,w  ; 
    	xorlw  d'60'      ; 
    	btfss  STATUS,Z   ; 
    	return            ; 
    ;-- décomptage minutes ----
    	clrf   seconde     ; 
    	incf   minute,f    ; 
    	movf   minute,w    ; 
    ;-- test de temps écoulé ----
    	subwf tempscharge,w  ; 
    	btfss STATUS,Z ; 
    	return ; 
    	goto   fin ;
    ;********************************************************
    ; TEMPORISATION du cycle de clignotement   leds de charge
    ;********************************************************
    tempo   
    ;-------
     
    	movwf cmpt3 ; 
    ;-- "boucle3" configuré ---     
    boucle3 		
    	clrf cmpt2 	;
    boucle2 		;
    	clrf cmpt1	;
    boucle1 		;
    
    	nop 	       ;
    	decfsz cmpt1,f ;
    	goto  boucle1  ;
    	decfsz cmpt2,f ;
    	goto  boucle2  ;
    	decfsz cmpt3,f ;          
    	goto  boucle3  ;          
    	return                   
    ;*******************
    ;  TEMPORISATION 1 *
    ;********************
    tempo1
    	movwf cmpt2   ; "cmpt2" chargé
    ;- "boucle_2" configuré ---
    boucle_2
    	clrf cmpt1      ;  
    boucle_1
    	decfsz cmpt1,f  ;  
    	goto boucle_1   ;  
    	decfsz cmpt2,f  ;  
    	goto   boucle_2 ;  
    	return          ;  
    ;**************************************
    ;-générateur tonalité ( bip temporisé) 
    ;************************************* 
    ;--- générateur son buzzer ---------- 
    sonbuzzer
        movlw d'250'    ; pour d'250' 
    	movwf durée_bip ; initialiser durée du "bip" 
    boucle_02
    	movlw d'50'     ; on charge d'50' dans W, (fixe la fréquence du "bip")
    	movwf  cmpt4    ; transfert dans "cmpt4"
    boucle_01
    	decfsz cmpt4,f  ; décrémenter compteur1
    	goto  boucle_01 ; si pas 0, boucler sur boucle_01
    ;- inversion de la sortie RA3 --------------------
    	movlw b'00001000'    ; chargé dans W pour inverser le bit RA3
    	xorwf PORTA,f        ; le niveau de RA3 est inversé 
    ;-- on décrémente la tempo du "bip" chargée a d'250' --------
    	decfsz durée_bip,f   ; on décrémente la tempo du bip
    ;------------------- test du temps du bip ------------------------
    	goto  boucle_02      ; sonbuzzer       
        return
    ;>>>>>>>>>>>>>>>>
    ;    MAIN               
    ;>>>>>>>>>>>>>>>> 
    start     ; label start
    ;-- Attente appuie sur B/P Start --------------------
    	btfss  tempo_anti_rebond    ; tester si tempo flag mis
    	goto   start        ; non, attendre qu'il soit mis
    ;-- B/P Start appuyé on VA à la tempo antirebond ---------------
    	movlw d'250'  ; détermine la durée de l'antirebond
    	call   tempo1       ; oui, exécuter tempo antirebond
    ;-- Retour de la tempo antirebond ------------------------
    	bcf    tempo_anti_rebond        ; effacer flag tempo Bit0 
    ;********************************
    ;-- générateur ( bip temporisé) -
    ;********************************
      call sonbuzzer
    ;****************************************
    ;-- retour "sonbuzzer"  ---------
    ;*** Test du registre "test_on_off" *****
    ;-------- permet de savoir, si il y a eût une demande d'arrêt manuel ------ 
        movf  test_on_off,w ; transfert du contenu de(test_on_off)dans W 
    	xorlw  d'00'        ; que l'on compare à d'00' 
    	btfss  STATUS,Z     ; test égalité 
    	goto charge
    	goto fin  
    ;******************************
    	BANK0
    ;--- validation IRQ sur TMR0 --
    charge
        clrf TMR0           ; 
    	bsf INTCON,5        ; 
    ;****************************
    ;-- activation  processus -----------------------
        bsf PORTA,1 ; RA1 passe a 1 = mise en route "led_on_off"
    ;--- La charge alternée, débute sur 2 sorties ----
    ;--- LED ON sur RA2 ------------------------------
    	bsf  led0   ; RA2 passe a 1= on allume led0 
    	movlw d'2'  ; on charge la valeur "d'2'" dans "W"
    	call tempo  ; on VA à la tempo de de 0.5s  
    	bcf   led0  ; RA2 passe a 0 = on éteint led0 
     	movlw d'2'  ; on charge la valeur"2" dans "W"
    	call tempo  ; on VA à la tempo de de 0.5s 
    	bsf  led1   ; RA0 passe a 1 = on allume led1 
    	movlw d'4'  ; on charge la valeur"4" dans "W"
    	call tempo  ; on VA à la tempo de de 0.5s 
    	bcf   led1  ; éteindre LED 
    	movlw d'4'  ; on charge la valeur"4" dans "W"
    	call tempo  ; on VA à la tempo de de 0.5s 
    	goto charge ;  
    ;************************
    ;----- FIN DE CHARGE ---
    ;***********************
    fin 
    	clrf PORTA  ; 
    	goto init   ;
    ;xxxxxxxxxxxxxxxxxx
    	END      ; 
    ;------------------
    ;-- Checksum 7A7E -
    ;xxxxxxxxxxxxxxxxxx
    Merci pour votre contribution

  3. #3
    jiherve

    Re : Soucis code (asm) en interruption.

    Bonsoir,
    Il me semble qu'il y a un truc bizarre dans ta sortie d'IT:
    Code:
    ;***************************
    ;      ROUTINE INTERRUPTION 
    ;****************************
    ;---- sauvegarder registres ----
    	ORG 	0x004		; 
    	movwf	w_temp  	; 
    	swapf	STATUS,w	; 
    	movwf	status_temp	; 
    ......
    ;--- RESTAURER REGISTRES ------
    restorereg
    	swapf	status_temp,w	; 
    	movwf   STATUS		; 
    	swapf   w_temp,f	;  ??????????
    	swapf   w_temp,w  	; 
    	retfie 			;
    l'électronique c'est pas du vaudou!

  4. #4
    Laboum

    Re : Soucis code (asm) en interruption.

    Bonsoir jiherve,

    Citation Envoyé par jiherve Voir le message
    Il me semble qu'il y a un truc bizarre dans ta sortie d'IT:
    Ah curieux....... pourtant c'est ce qui est préconisé à la page 30, de la data du 16F84A
    Code:
    PUSH
    	movwf w_temp		; Copy W to TEMP register,  
    	swapf status,  w 	; Swap status to be saved into W 
    	movwf status_temp	; Save status to STATUS_TEMP register 
    ISR : : 
    				; Interrupt Service Routine
    				; should configure Bank as required
    				
    POP
    	swapf  status_temp,w 	; Swap nibbles in STATUS_TEMP register
    				; and place result into W 
    	movwf   status		; Move W into STATUS register 
     			        ; (sets bank to original state) 
    	swapf   w_temp, f	; Swap nibbles in W_TEMP and place result in W_TEMP
    	swapf   w_temp, w	; Swap nibbles in W_TEMP and place result into W
    La question reste, comment peut-on à partir d'une IRQ, modifier le comportement d'un programme en cours ?
    Tout en sachant, que l'adresse du retour, est mémorisée avant l'exécution de l'IRQ.
    Bonne soirée
    Merci pour ton intervention

  5. A voir en vidéo sur Futura
  6. #5
    RISC

    Re : Soucis code (asm) en interruption.

    Salut Laboum,

    Une utilisation courante d'une interruption est d'incrémenter un compteur dans l'interruption ou de mettre à 1 un flag.
    Il suffit ensuite dans la boucle du programme principal de tester la valeur du compteur ou de tester le flag qui indique qu'une interruption à eu lieu.

    Tu connais sans doute le site de Bigonoff ?
    Il n'a pas son équivalent pour l'apprentissage de l'assembleur ;=)

    Tu peux aussi utiliser l'excellent site de Gooligum : http://www.gooligum.com.au/tutorials.html

    a+
    Dernière modification par RISC ; 09/10/2014 à 22h22.

  7. #6
    jiherve

    Re : Soucis code (asm) en interruption.

    Bonjour
    on peut très bien à partir d'une interruption modifier un programme en cours si :
    l'interruption utilise une ressource commune , registre ou case mémoire voire périphérique soit de façon explicite soit de façon implicite en utilisant une fonction commune;
    C'est la le gisement de 95% des problèmes de temps réel.
    JR
    l'électronique c'est pas du vaudou!

  8. #7
    DavidDB

    Re : Soucis code (asm) en interruption.

    Salut,

    Vérifie ton anti-rebonds, il ne me semble pas fonctionner correctement...

    Où traites-tu la variable "test_on_off" dans ton programme ?

    David.

  9. #8
    jiherve

    Re : Soucis code (asm) en interruption.

    Re
    effectivement il y a bien cette routine étonnante qui confirme le coté brouillon des PIC.
    JR
    l'électronique c'est pas du vaudou!

  10. #9
    Laboum

    Re : Soucis code (asm) en interruption.

    Bonjour à tous,

    Citation Envoyé par RISC Voir le message
    Une utilisation courante d'une interruption est d'incrémenter un compteur dans l'interruption
    C'est ce que je fait ici, en décrémentant ( test_on_off)
    Code:
    ;***************************
    ;  Traitement IRQ  RB0/INT *
    ;***************************
    ;--- valide le flag tempo, pour appeler l'antirebond ----------
    intrb0  
    	BANK0            
        bsf   tempo_anti_rebond   ; bit0 du registre "flags"
        decf   test_on_off,f     ; décrémenter "test_on_off"
        return              ;
    Il suffit ensuite dans la boucle du programme principal de tester la valeur du compteur ou de tester le flag qui indique qu'une interruption à eu lieu.
    C'est bien là que se situe mes lacunes ! mais comment concevoir cette boucle , qui donnera priorité à mon IT, alors mon Pic est occupé à faire clignoter mes leds.
    Tu connais sans doute le site de Bigonoff ?.
    Oui bien sur, mais entre la théorie et la pratique instinctive, c'est pas gagné !

    Citation Envoyé par jiherve Voir le message
    on peut très bien à partir d'une interruption modifier un programme en cours si :
    l'interruption utilise une ressource commune , registre
    N'est-ce pas le cas ici, pour ce registre "test_on_off" ?

    Citation Envoyé par DavidDB Voir le message
    Vérifie ton anti-rebonds, il ne me semble pas fonctionner correctement...
    Qu'est-ce qui te fait dire cela ? sous MPLAB le protocole semble se dérouler correctement, sur maquette pas de soucis, il faudra peut être que je rallonge le temps.
    Où traites-tu la variable "test_on_off" dans ton programme ?
    Dans le MAIN mais peut être pas au bon endroit ??
    Le soucis se situe au fait, que je voudrais bien repasser par cette routine, à l'issue de l'IT, qui a modifié le contenu de "test_on_off"
    Code:
    ;****************************************
    ;-- retour "sonbuzzer"  ---------
    ;*** Test du registre "test_on_off" *****
    ;-------- permet de savoir, si il y a eût une demande d'arrêt manuel ------ 
        movf  test_on_off,w ; transfert du contenu de(test_on_off)dans W 
    	xorlw  d'00'        ; que l'on compare à d'00' 
    	btfss  STATUS,Z     ; test égalité 
    	goto charge
    	goto fin
    Citation Envoyé par jiherve Voir le message
    effectivement il y a bien cette routine étonnante qui confirme le coté brouillon des PIC
    Ce serait pas plutôt, le coté brouillon de mon programme
    Merci à tous pour votre généreuse contribution
    A bientôt

  11. #10
    jiherve

    Re : Soucis code (asm) en interruption.

    Re
    par définition et construction une interruption à la priorité sur le "main".
    on peut avoir des variables partagées à condition qu'il n'y ait qu'un seul process pour écrire une variable particulière.
    JR
    l'électronique c'est pas du vaudou!

  12. #11
    RISC

    Re : Soucis code (asm) en interruption.

    Salut Laboum,

    Je pense que tu n'es pas encore clair avec le concept d'interruption.

    Quand il y a une demande d'interruption, si elle est autorisée par le programme, l'instruction en cours est terminée et le programme saute directement à l'interrution.
    Le temps de réaction est de quelques cycles. Une fois que l'interruption est finie, le programme principal reprend à l'instruction qui suit.

    C'est comme un coup de téléphone : tu ne sais pas quand il va sonner et tu décides de répondre ou pas quand cela sonne (interruption autorisée ou non).
    Après le coup de fil tu reprends ce que tu faisais ..si tu t'en souviens (la différence est que le PIC se souvient toujours ;=)

    a+
    Dernière modification par RISC ; 10/10/2014 à 15h22.

  13. #12
    Laboum

    Re : Soucis code (asm) en interruption.

    Bonjour RISC,

    Citation Envoyé par RISC Voir le message
    Quand il y a une demande d'interruption, si elle est autorisée par le programme, l'instruction en cours est terminée et le programme saute directement à l'interrution.
    Ce protocole est exécuté sans soucis, au départ, aussi bien sur la maquette que sous MPLAB, l'IT sur RB0 conduit au label (on)
    Le soucis c'est que je n'arrive pas sur maquette ou sous MPLAB a aller au label (off)
    Par contre en simu.MPLAB l'IT passe très bien et à la fin retourne à la tache, qu'il faisait avant l'IT, occultant le passage par l'antirebond et le bip et le test de demande d'arrêt.

    Contenu de (Stimulus) au moment ou se produit la deuxième interruption
    Code:
    0B   INTCON   0x32   0x32 50  00110010
    Les IT, RB0 et Timer sont autorisées, le flag INTF est positionné, indiquant que l'IT RB0 est en cours, a noter que l'IT du Timer0 est activée sur ma demande.

    Code:
     18    flags 0x01 0x01     1    00000001
    Mon flag d'appel à l'antirebond est bien positionné, mais comment l'exploiter ?
    Pour qu'il passe par la séquence :


    Tempo antirebond, suivi du bip, terminer par le test du "test_on_off",
    Code:
    ;**********************************************************************
    ;                      Traitement IRQ  RB0/INT                        *
    ;**********************************************************************
    ;---------- valide le flag tempo, pour appeler l'antirebond ----------
    intrb0  
    	BANK0            
        bsf tempo_anti_rebond  ; tempo_anti_rebond = bit0 du registre "flags"
        decf test_on_off,f  ; décrémenter "test_on_off"
        return              ; fin d'interruption RB0/INT 
    ;--------------- FIN du traitement IRQ  RB0/INT -----------------------
    qui a été modifié dans le passage de mon traitement de l'IT RB0


    Comment à la deuxième IT sur RBO repasser par cette phase de test ?
    Code:
     ;************** Test du registre "test_on_off" *****************************
    ;-------- permet de savoir, si il y a eût une demande d'arrêt manuel ------ 
        movf  test_on_off,w   ; transfert du contenu de(test_on_off)dans W 
    	xorlw  d'00'        ; que l'on compare à d'00' 
    	btfss  STATUS,Z     ; test égalité a d'00'
    	goto on             ; NON on déclenche le clignotement des leds (on)
    	goto off            ; OUI alors on arrête le clignotement des leds (off)
    qui logiquement devrait conduire au label (off)
    Code:
     off 
    	clrf PORTA  ; PORTA = b'0000 0000'
    
    	goto init     ;retour au label
    ;-------------------  une nouvelle IT sur RB0 est attendue pour (on) ---------
    J'espère ne pas être trop pénible, je répète maintes et maintes fois la même chose, pour tenter de me faire comprendre.
    A bientôt
    Dernière modification par Laboum ; 11/10/2014 à 07h35.

  14. #13
    RISC

    Re : Soucis code (asm) en interruption.

    Salut,

    Dans tous les cas le vrai hardware a toujours raison...Le simulateur TENTE de simuler la réalité mais possède un certain nombre de limitations...
    Ecrire un script en SCL qui simule les rebonds est déjà un projet en lui-même.
    NB : le SCL est le langage script pour stimuler les entrées du PIC avec tous types de signaux. Malheureusement il n'a jamais été documenté dans le détail...

    Quand a ce qui concerne le reste du programme, mon conseil est de faire du pas à pas sur le vrai hardware en affichant dans la watch window les variables de ton programme et en observant les registres W, status, et les file register.

    Personnellement, j'ai eu ma dose d'assembleur et je ne veux plus m'infliger cela que quand c'est pas obligatoire (instructions dsPIC spécialisées,...). Je pense que c'est aussi le cas de pas mal de personnes sur ce forum. Les cours de Bigonoff restent la référence en ce qui concerne l'assembleur. Je serai surpris que tu ne trouves pas un morceau d'assembleur qui traite d'un anti-rebonds.

    quel outil de debug utilises-tu ?
    Fais-tu du pas à pas ?
    Mets-tu des points d'arrêt ?

    a+
    Dernière modification par RISC ; 11/10/2014 à 10h04.

  15. #14
    Laboum

    Re : Soucis code (asm) en interruption.

    Bonjour RISC,

    Désolé de t'avoir exaspéré, avec mes questions idiotes et d'un autre temps.
    Je continue mes révisions, sur la base de tes conseils.
    Merci et au revoir

  16. #15
    RISC

    Re : Soucis code (asm) en interruption.

    Salut Laboum,

    Il m'en faut beaucoup plus ;=)
    L'opiniatreté et la patience sont la source de la progression en programmation.
    Toutefois, tu pourrais mettre cette énergie à apprendre le C et tu serais payé au centuple..
    Méfie toi des simulateurs...à un moment ou à un autre, le simulateur ne se comportera pas comme il devrait.
    Le vrai hardware reste la référence ;=)

    a+

  17. #16
    schmo

    Re : Soucis code (asm) en interruption.

    salut,

    Je résume pour voir si j'ai compris le problème:
    - Un bp branché sur RB0,
    - tu attends une action sur le BP (detection front sur RB0 + it pour set flag on_off),
    - tu lance une temporisation,
    - tu fais sonner ton buzzer,
    - tu test flag on_off (1)
    - si on:- clignotement LED pendant timer0 (à la fin de l'it timer0, Retour en début de programme..)
    - si off:- retour en début de programme..


    D'aprés ce que je vois le seul endroit ou tu test l'état on_off est en (1). Donc si une action sur Bp intervient pendant le clignotement LED, elle n'est pas traitée.... parce que tu repasse pas par le point (1) !Donc ton programme principal continu normalement jusqu'au bout..
    C'est pareil si tu appui 2 fois sur le Bp au début. il peut arriver que le flag on_off passe directement en off...

    Si tu veux arreter le clignotement des leds, il faut que tu y intercale des test sur le flag on_off dans les boucles pour detecter les actions Bp.

    Je vais réfléchir pour voir si il n'y a pas moyen de faire un truc du genre...

    Ah oui un autre conseil en passant: organise ton programme plus logiquement en regroupant les routines qui sont en relations.
    En général mes programmes sont organisés comme suit:
    - définitions matérielles
    - reservation RAM
    - routines it
    - routines utilisées par it
    - main
    - routines utilisées par main
    - etc...


    A+

  18. #17
    Laboum

    Re : Soucis code (asm) en interruption.

    Bonsoir schmo,

    Désolé je découvre tardivement ton message.
    Saches que je me suis sorti de la situation, par obstination.
    Je poursuis toujours la programmation.
    Je prend note de toutes tes remarques constructives.
    Grand Merci

  19. #18
    freepicbasic

    Re : Soucis code (asm) en interruption.

    Lorsque tu entre dans l'interruption;
    Tu dois tester toutes les interruptions que tu gère.
    Dans ton exemple tu gère seulement l'une ou l'autre !
    Conclusion;
    si les 2 arrivent ensemble, celle qui n'est pas traitée reste planté.

    Au sujet du swap c'est une instruction qui ne touche pas aux flags c'est pourquoi Microchip l'utilise pour sauver le W, une astuce spécifique à Microchip.
    un swap en 2 fois, sauve le registre en mémoire en le swappant et le réstistu au second coup.
    Il n'y a pas de stack sur les Pic, quand on a l'habitude des processeurs classiques , ça surprend...
    A+, pat

  20. #19
    Laboum

    Re : Soucis code (asm) en interruption.

    Bonjour freepicbasic,

    Citation Envoyé par freepicbasic Voir le message
    Lorsque tu entre dans l'interruption;
    Tu dois tester toutes les interruptions que tu gère.
    Dans ton exemple tu gère seulement l'une ou l'autre !
    Tout a fait d'accord, ce qui est le cas maintenant, alors que je n'avais pas compris comment gérer l'IT de RB0
    En outre mes initialisations sont embrouillées, au départ, je n'autorise que l'IT de RB0.
    Code:
    ;--- Configuration INTCON --------  
    INTERMASK EQU  b'10010000'; Masque d'interruption b'10010000'
    Pour n'autoriser l'IT du Timer, qu'a cette étape !
    Code:
    ;******************************
    BANK0
    ;--- validation IRQ sur TMR0 --
    charge
       clrf TMR0          ; RAZ du timer
       bsf INTCON,5     ; validation de l'IT du Timer par "TOIE"
    On peut très bien autoriser ou pas, des "IT", à certains moments du programme.
    C'est bien cela ?
    Au sujet du swap c'est une instruction qui ne touche pas aux flags c'est pourquoi Microchip l'utilise pour sauver le W, une astuce spécifique à Microchip.
    Je pense que ce coté c'est pigé, avec cette permutation de quartets.
    Je peux reposter le code final qui fonctionne, après l'avoir épuré.
    Merci d'avoir continué, cet échange instructif.

  21. #20
    freepicbasic

    Re : Soucis code (asm) en interruption.

    On peut très bien autoriser ou pas, des "IT", à certains moments du programme.
    C'est bien cela ?
    oui.
    les "enable" (INTE, RBIE, etc ...) sont fait pour ça !
    Mais attention à ne pas s'emmêller les pinceaux...
    Une int ratée et elle ne fonctionne plus.
    A+, pat

  22. #21
    Laboum

    Re : Soucis code (asm) en interruption.

    Bonsoir freepicbasic,

    Merci pour toutes ces précisions et précautions.
    Bonne soirée

Discussions similaires

  1. code vb 2008 pour code bouton eteindre ou allumer une lampe
    Par invite7c733226 dans le forum Programmation et langages, Algorithmique
    Réponses: 0
    Dernier message: 16/02/2013, 20h44
  2. PIC : interruption externe et interruption on change ?
    Par jlg_47 dans le forum Électronique
    Réponses: 10
    Dernier message: 09/04/2012, 12h41
  3. Un langage codé léger, 2 caractères non codé=1 caractère codé. Une solution?
    Par invite06e0b926 dans le forum Mathématiques du supérieur
    Réponses: 1
    Dernier message: 30/06/2010, 10h02
  4. [Brun] soucis installation clavier a code rts de somfy
    Par invitec7319f39 dans le forum Dépannage
    Réponses: 1
    Dernier message: 04/09/2008, 09h32
  5. Réponses: 6
    Dernier message: 03/03/2007, 15h23
Découvrez nos comparatifs produits sur l'informatique et les technologies.