Interrupt on change
Répondre à la discussion
Affichage des résultats 1 à 13 sur 13

Interrupt on change



  1. #1
    Qristoff
    Animateur Électronique

    Interrupt on change


    ------

    Salut à tous,
    Pour faire court, je n'arrive pas à paramétrer mon prgm en "interrupt on change" sur l'entrée RA4. le PRGM rentre en permanence dans la boucle d'intérruption alors qu'il n'y a pas d'action sur RA4.
    Lorsque je me met sur RA5 (IOCA sur RA5), ça marche impec. (le prgm rentre dans la routine d'inerruption par action sur le poussoir et en ressort...)

    - RA4 est la sortie Clkout qui est normalement désactivée par _INTRC_OSC_NOCLKOUT

    pour la partie config 16F690, j'ai:
    ; configuration des masques d'interruption
    Code:
    bsf STATUS,RP0 ; selectionne Register_bank 1
    bsf IOCA,4 ; selection de l'entrée RA4 pour interruption on change
    bcf STATUS,RP0 ; selectionne Register_bank 1
    movlw b'00001000'
    movwf INTCON
    Pour les infos générales:
    L'entrée RA4 est aussi une entrée ICSP mais j'ai débranché le Pickit2. sinon il y a un pull up avec un bouton poussoir à la masse. (ça marche en polling mais pas un interruption !)
    J'ai essayé avec RA0, RA1, pareil
    RA2 est une entrée ANA (LM35) qui fonctionne normalement
    RA3 c'est le MCLR (on y touche pas !)
    et quand je programme sur RA5 (IOCA,5), ça branche bien sur l'interrupion ! Quid !

    -----

  2. #2
    invite03481543

    Re : Interrupt on change

    Bonjour,

    je n'ai pas regardé la doc pour ce PIC mais il faudrait que tu regardes si cette entrée ne sert pas aussi en entrée trigger de Schmitt dans le module comparateur (C1OUT).
    Auquel cas il faut que tu désactives la fonction dans CMCON.

    Sinon, sans voir ton code, on ne peut pas dire grand chose de plus.
    @+

  3. #3
    Qristoff
    Animateur Électronique

    Re : Interrupt on change

    Salut Hulk,
    Pour l'instant ma routine d'interruption ne fait pas grand chose à par d'allumer une étoile (*) sur mon afficheur, cela permet de visualiser si je passe justement dans la routine et d'en sortir pour revenir au prgm principal.

    Le probléme est que sur RA5, l'interruption fonctionne bien aprés action sur le bouton S3 (l'étoile s'allume en passant dans la routine) puis le programme revient au prgm principal. Et ça ne marche pas sur RA0, RA1 et RA4 en changeant la valeur de IOCA.

    Ce qui est étrange, lorsque je maintiens l'entrée S3 à 0 pendant quelques secondes, le prgm sort de la routine et va au prgm principal. Lorsque je relache S3, il s'empresse de retourner dans la routine d'interruption. (pas glop !)

    Les entrées RA4 et RA5 sont différentes et j'ai l'impression d'oublier quelque chose dans la config du port A, mais quoi ?
    Voici un petit morceau de mon schéma.
    Images attachées Images attachées  

  4. #4
    Qristoff
    Animateur Électronique

    Re : Interrupt on change

    Citation Envoyé par HULK28 Voir le message
    Bonjour,

    je n'ai pas regardé la doc pour ce PIC mais il faudrait que tu regardes si cette entrée ne sert pas aussi en entrée trigger de Schmitt dans le module comparateur (C1OUT).
    Auquel cas il faut que tu désactives la fonction dans CMCON.

    Sinon, sans voir ton code, on ne peut pas dire grand chose de plus.
    @+
    Les entrées RA0,RA1 et RA2 sont des E/S pour les comparateurs mais pas RA4 ! J'ai vérifié les registres CM1CON, CM2CON, ils sont bien à 0

    L'entrée RA4 peut être au choix:
    - general purpose I/O
    - analog input for ADC
    - Timer1 gate input
    - a crystal/resonator connection
    - a clock output

    Lorsque je fait fonctionner l'entrée en polling, ça marche bien, par contre sur interruption, c'est moins bien !

  5. A voir en vidéo sur Futura
  6. #5
    Qristoff
    Animateur Électronique

    Re : Interrupt on change

    Voila le code de la routine,

    Code:
    ;**********************************************************************
    ; DEMARRAGE SUR RESET *
    ;*********************************************************************
    	org 0x000 ; Adresse de départ après reset
    	goto Initpic
    	org 0x004 ; Adresse de départ sur interuption
    	goto interup
    
    	#include "gestion_menus.inc"
    	#include "gestion_lcd.inc"
    	#include "gestion_DS1302.inc"
    
    
    ;**********************************************************************
    ; ROUTINE INTERRUPTION *
    ;**********************************************************************
    interup
    	;sauvegarder registres
    	movwf w_temp ; sauver registre W
    	swapf STATUS,w ; swap status avec résultat dans w
    	movwf status_temp ; sauver status swappé
    	
    	; switch vers différentes interrupts
    	
    	; traitement des interruptions
    	bcf INTCON,GIE		; on suspend les interruptions
    	bcf INTCON,RABIF	; on reinitialise le flag RABIF
    	;
    	movlw 0xD4		; on allume une étoile en bas à gauche de l'afficheur
    	call LCD_CMD	; pour indiquer qu'in passe dans la routien Interrupt
    	Aff '*'
    	call T1s
    	movlw 0xD4		
    	call LCD_CMD
    	Aff ' '
    	call LCD_L1
    
    fin_interrup
    	;restaurer registres
    	swapf status_temp,w ; swap ancien status, résultat dans w
    	movwf STATUS 		; restaurer status
    	swapf w_temp,f 		; Inversion L et H de l'ancien W
    						; sans modifier Z
    	swapf w_temp,w 		; Ré-inversion de L et H dans W
    						; W restauré sans modifier status
    						;
    	; on ré-active les interruptions
    	bsf INTCON,GIE		; on reactive les interruptions
    	retfie 				; return from interrupt

  7. #6
    invite03481543

    Re : Interrupt on change

    Qu'as-tu mis dans le registre OPTION_REG et ANSEL?
    Tu utilises le Timer1 dans ton appli?

  8. #7
    Qristoff
    Animateur Électronique

    Re : Interrupt on change

    Citation Envoyé par HULK28 Voir le message
    Qu'as-tu mis dans le registre OPTION_REG et ANSEL?
    Tu utilises le Timer1 dans ton appli?
    Pour ANSEL, je fais le tour et c'est pas ça ! et je n'utilise aucun des trois timer.
    Code:
    ;**************************************************************************
    ; CONFIGURATION *
    ;**************************************************************************
    	#include <p16F690.inc>
    	__config (_INTRC_OSC_NOCLKOUT & _WDT_OFF & _PWRTE_ON & _MCLRE_ON & _CP_OFF & _BOR_OFF & _IESO_OFF & _FCMEN_OFF)
    ;
    ; INTRC_OSC_NOCLKOUT  = Internal Clock, pas de sortie sur RA4
    ; WDT_OFF = Watchdog Off
    ; PWRTE_ON = power-up timer enable
    ; MCLRE_ON = MCLR (RA3) pin function enable
    ; CP_OFF = memory protection function disable
    ; IESO_OFF = two speed start-up function disable
    ; FCMEN_OFF = fail safe clock monitor is disable
    
    ;**************************************************************************
    ; ASSIGNATIONS *
    ;**************************************************************************
    ;CONFIGURATION DU REGISTRE OPTION [config choisie] voir page 27 datasheet 16F690
    ;	b7	RABPU: PORTA/PORTB Pull-up Enable bit
    ;		1=PORTA/PORTB pull-ups are disabled
    ;		0=PORTA/PORTB pull-ups are enabled by individual port latch values
    ;	b6=0/1 (INTEGD)	[0]	:	Interruption RA2 sur Front-Descendant/Front-Montant
    ;	b5=0/1 (TOCS)	[0]	:	Timer0 synchronisé par Horloge-Interne/Horloge-Externe (RA2)
    ;	b4=0/1 (TOSE)	[0]	:	Timer0 sensible sur Front-Montant/Front-Descendant de RA2
    ;	b3=0/1 (PSA)	[0]	:	Prédiviseur assigné au Watchdog (1) ou Timer0 (0)
    ;	b2=0/1 (PS2)	[1]	:	\
    ;	b1=0/1 (PS1)	[1]	:	| Valeur de prédivision 000 => 1:2   111 => 1:256  Timer0
    ;	b0=0/1 (PS0)	[1]	:	/						000 => 1:1   111 => 1:128  WatchDog
    
    OPTIONVAL  EQU b'10000111'
    ;
    CONF_PORTA EQU b'00111111'	; config E/S portA, RA0 à RA5 en entrées
    CONF_PORTB EQU b'00101111'	; config E/S portB, RB5 en entrées, RB4(DSio), RB6(DSck) et RB7(DSrst) en sortie
    CONF_PORTC EQU b'00000000'	; config E/S portC, RC0 à RC7 en sorties
    Par contre en simulation le bit T0IF claque mais T0IE n'est pas actif, donc l'interruption est bloqué, n'est ce pas ?
    Je suis sur Pickit2 sans debugger sur pic. (on y viendra peut être...)

    Merci de t'intéresser à mon cas

  9. #8
    invite03481543

    Re : Interrupt on change

    Je ne vois pas trop, le fait que tu utilises une entrée du PORTA en mesure analogique, doit peut-être jouer dans l'affaire.
    Perso j'aurais utilisé le portB pour les B.P et INTEDG afin de séparer les genres.
    Sinon pour faire un essai tu pourrrais peut-être dévalider le CAN et refaire un essai pour être certain que le CAN n'influence pas ce qui se passe lors de cette interruption.
    Il me semble que si un évènement survient sur le PORTA durant le traitement de RABIF, RABIF n'est pas pris en compte.
    A vérifier.

    Essaye de mettre tout le portA en Digital pour voir si cela persiste.
    @+

  10. #9
    invite03481543

    Re : Interrupt on change

    Une dernière piste, il n'est pas nécessaire de désactiver les interruptions en entrant dans l'interruption et de les réactiver en sortant, c'est fait automatiquement par le PIC (RETFIE) et proprement.


    En C cela donnerait:

    if( RABIF && RABIE ) {
    port_lu = PORTA; // on lit le PORTA pour récupérer le port détecté
    RABIF = 0; // on remet le flag à 0
    }

    Voilà ce que je peux t'en dire pour l'instant.
    @+

  11. #10
    Qristoff
    Animateur Électronique

    Re : Interrupt on change

    Effectivement, je vais essayer plusieurs config de port (tout digital est une bonne idée..) et essayer de dévalider le CAN pour debugger (j'en aurais besoin quand même un jour ou l'autre.)
    Pour la désactivation des interruptions, j'ai eu la remarque et je vais en tenir compte. Mais je ne pense pas que ce soit l'origine du probléme..
    J'ai tout vérifié:
    - le Ultra low power wake up sur le bus A, rien
    - programmation des pull-up, rien
    - entrée comparateur C1 & C2, rien
    - les gate de timer, rien
    C'est vraiment trés curieux.. d'autres me dirait, si ça marche sur RA5, passe sur RA5 ! mais ça ne fait pas avancer le ch'mill'blik !

  12. #11
    Qristoff
    Animateur Électronique

    Re : Interrupt on change

    ça y est, on a trouvé !
    Plutôt c'est les experts du forum ABC qui ont trouvé !
    Il faut lire ou écrire sur le port avant de ré-initialiser le flag, sinon il persiste !
    Par contre, je ne comprend toujours pas pourquoi ça le faisait sur une pin et pas sur l'autre !

  13. #12
    invite03481543

    Re : Interrupt on change

    Citation Envoyé par HULK28 Voir le message
    Une dernière piste, il n'est pas nécessaire de désactiver les interruptions en entrant dans l'interruption et de les réactiver en sortant, c'est fait automatiquement par le PIC (RETFIE) et proprement.


    En C cela donnerait:

    if( RABIF && RABIE ) {
    port_lu = PORTA; // on lit le PORTA pour récupérer le port détecté
    RABIF = 0; // on remet le flag à 0
    }

    Voilà ce que je peux t'en dire pour l'instant.
    @+
    Tu avais donc la réponse sur mon dernier post.

  14. #13
    Qristoff
    Animateur Électronique

    Re : Interrupt on change

    Citation Envoyé par HULK28 Voir le message
    Tu avais donc la réponse sur mon dernier post.
    C'est vrai, il n'y a pas plus aveugle que celui qui ne veut pas voir...
    Merci encore pour ton aide et à bientôt

Discussions similaires

  1. L'Holocène change de nom ? [mise a jour sur le statut de l'Anthropocene / T-K]
    Par invite57a9d589 dans le forum Géologie et Catastrophes naturelles
    Réponses: 23
    Dernier message: 25/03/2024, 12h01
  2. ntoskrnl.exe change
    Par invite03431c95 dans le forum Sécurité et malwares : désinfectez votre machine
    Réponses: 12
    Dernier message: 04/07/2007, 14h48
  3. problème interrupt. M/A Philips 20P4292
    Par doubleyou dans le forum Dépannage
    Réponses: 0
    Dernier message: 02/09/2006, 20h27
  4. [PM18] small change
    Par deep_turtle dans le forum Physique
    Réponses: 5
    Dernier message: 02/02/2006, 22h25
  5. Le climat change ? et alors !!
    Par invitec429429b dans le forum Changement climatique, a-t-on raison de s'inquiéter ?
    Réponses: 3
    Dernier message: 22/10/2005, 08h47
Découvrez nos comparatifs produits sur l'informatique et les technologies.