[Programmation] 2eme exercice de bigonoff "allumer/eteindre une LED avec un bouton poussoir" - pic16F84
Répondre à la discussion
Affichage des résultats 1 à 19 sur 19

2eme exercice de bigonoff "allumer/eteindre une LED avec un bouton poussoir" - pic16F84



  1. #1
    ogre31

    2eme exercice de bigonoff "allumer/eteindre une LED avec un bouton poussoir" - pic16F84


    ------

    Bonsoir,

    Ca concerne le 2eme exercice de bigonoff "allumer/eteindre une LED avec un bouton poussoir".
    Je n'arrive pas avoir le resultat .La LED s'allume au premier click mais ne s'eteind pas( simulation sur isis).
    Avec MPLAB, a l'appui sur le bouton 'fire high' l'interruption est appelée, le PORTA passe bien a 00000100 et se fige quelque soit le bouton fire clické , et pour ne pas dire de betise je joins le code original de bigonoff

    et ma simulation sur ISIS

    Code:
    ;**********************************************************************
    ;    Ce programme est un programme didactique destiné à monter        *
    ;    le fonctionnement des interruptions                              *
    ;                                                                     *
    ;**********************************************************************
    ;                                                                     *
    ;    NOM:       Interruption par bouton-poussoir sur RB0              *
    ;    Date:      13/02/2001                                            *
    ;    Version:   1.0                                                   *
    ;    Circuit:   Platine d'essais                                      *
    ;    Auteur:    Bigonoff                                              *
    ;                                                                     *
    ;**********************************************************************
    ;                                                                     *
    ;    Fichier requis: P16F84.inc                                       *
    ;                                                                     *
    ;                                                                     *
    ;                                                                     *
    ;**********************************************************************
    ;                                                                     *
    ;    Notes:  Ce programme transforme un bouton-poussoir en            *
    ;            télérupteur. Un pulse allume la LED, un autre            *
    ;            l'éteint                                                 *
    ;                                                                     *
    ;                                                                     *
    ;**********************************************************************
    
    
    	LIST      p=16F84            ; Définition de processeur
    	#include <p16F84.inc>        ; Définitions de constantes
    
    	__CONFIG   _CP_OFF & _WDT_OFF & _PWRTE_ON & _HS_OSC
    
    ; '__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	H'0000'	; Valeur registre option
                                    ; Résistance pull-up ON
                                    ; Interrupt flanc descendant RB0
    
    INTERMASK	EQU	H'0090' ; Masque d'interruption
                                    ; Interruptions sur RB0
    
    ;*********************************************************************
    ;                             DEFINE                                 *
    ;*********************************************************************
    
    #DEFINE	Bouton	PORTB , 0	; bouton poussoir
    #DEFINE LED	PORTA , 2	; LED
    
    
    ;*********************************************************************
    ;                             MACRO                                  *
    ;*********************************************************************
    
    BANK0	macro	
    	bcf	STATUS,RP0	; passer en banque 0
    	endm
    
    BANK1	macro
    	bsf	STATUS,RP0	; passer en banque1
    	endm
    
    
    ;*********************************************************************
    ;                   DECLARATIONS DE VARIABLES                        *
    ;*********************************************************************
    
    	CBLOCK 0x00C   		; début de la zone variables
    	w_temp :1		; Sauvegarde de W dans interruption
    	status_temp : 1		; Sauvegarde de STATUS dans interrupt
    	cmpt1 : 1		; compteur de boucles 1 dans tempo
    	cmpt2 : 1		; compteur de boucles 2 dans tempo
    	flags : 1		; un octet pour 8 flags
    				; réservons b0 pour le flag tempo
    				; b1 : libre
    				; b2 : libre
    				; b3 : libre
    				; b4 : libre
    				; b5 : libre
    				; b6 : libre
    				; b7 : libre
    
           	ENDC			; Fin de la zone                        
    
    #DEFINE	tempoF	flags , 0	; Définition du flag tempo
    
    ;**********************************************************************
    ;                      DEMARRAGE SUR RESET                            *
    ;**********************************************************************
    
    	org 0x000 		; Adresse de départ après reset
      	goto    init		; Adresse 0: initialiser
    
    ;**********************************************************************
    ;                     ROUTINE INTERRUPTION                            *
    ;**********************************************************************
    
    			;sauvegarder registres	
    			;---------------------
    	org 0x004		; adresse d'interruption
    	movwf   w_temp  	; sauver registre W
    	swapf	STATUS,w	; swap status avec résultat dans w
    	movwf	status_temp	; sauver status swappé
    
    
    	call	intrb0		; oui, traiter interrupt RB0
    
    			;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
    	retfie  		; return from interrupt
    
    ;**********************************************************************
    ;                     INTERRUPTION RB0/INT                            *
    ;**********************************************************************
    ;----------------------------------------------------------------------
    ; inverse le niveau de RA2 à chaque passage
    ; interdit toute nouvelle interruption
    ; valide le flag tempo
    ;----------------------------------------------------------------------
    intrb0
    	movlw	B'00000100'	; bit positionné = bit inversé
    	BANK0			; car on ne sait pas sur quelle banque
    				; on est dans une interruption (le
    				; programme principal peut avoir changé
    				; de banque. Ce n'est pas le cas ici,
    				; mais c'est une sage précaution
    	xorwf	PORTA , f	; inverser RA2	
    	bcf	INTCON , INTF	; effacer flag INT/RB0
    	bcf	INTCON , INTE	; interdire autre inter. RB0
    	bsf	tempoF		; positionner flag tempo
    	return			; fin d'interruption RB0/INT
    
    ;*********************************************************************
    ;                       INITIALISATIONS                              *
    ;*********************************************************************
    
    init
    	clrf	PORTA		; Sorties portA à 0
    	clrf	PORTB		; sorties portB à 0
    	BANK1			; passer banque1
    	clrf	EEADR		; permet de diminuer la consommation
    	movlw	OPTIONVAL	; charger masque
    	movwf	OPTION_REG	; initialiser registre option
    
    			; Effacer RAM
    			; ------------
    	movlw	0x0c		; initialisation pointeur
    	movwf	FSR		; pointeur d'adressage indirect
    init1
    	clrf	INDF		; effacer ram
    	incf	FSR,f		; pointer sur suivant
    	btfss	FSR,6		; tester si fin zone atteinte (>=40)
    	goto	init1		; non, boucler
    	btfss	FSR,4		; tester si fin zone atteinte (>=50)
    	goto	init1		; non, boucler
    
    			; configuer PORTS
    			; ---------------
    	bcf	LED		; RA2 en sortie (TRISA)
    
    	BANK0			; passer banque0
    	movlw	INTERMASK	; masque interruption
    	movwf	INTCON		; charger interrupt control
    	goto	start		; sauter programme principal
    
    ;*********************************************************************
    ;                      SOUS-ROUTINE DE TEMPORISATION                 *
    ;*********************************************************************
    ;---------------------------------------------------------------------
    ; Cette sous-routine introduit un retard
    ; Elle ne reçoit aucun paramètre et n'en retourne aucun
    ;---------------------------------------------------------------------
    tempo
    	clrf	cmpt2		; effacer compteur2
    boucle2
    	clrf	cmpt1		; effacer compteur1
    boucle1
    	decfsz	cmpt1 , f	; décrémenter compteur1
    	goto	boucle1		; si pas 0, boucler	
    	decfsz	cmpt2 , f	; si 0, décrémenter compteur 2
    	goto	boucle2		; si cmpt2 pas 0, recommencer boucle1
    	return			; retour de la sous-routine
    
    ;*********************************************************************
    ;                      PROGRAMME PRINCIPAL                           *
    ;*********************************************************************
    
    start
    	btfss	tempoF		; tester si tempo flag mis
    	goto	start		; non, attendre qu'il soit mis
    	call 	tempo		; oui, exécuter tempo
    	bcf	tempoF		; effacer flag tempo
    	bcf	INTCON , INTF	; effacer flag INT
    	bsf	INTCON , INTE	; remettre interrupts INT en service
    	goto start		; boucler
    	END 			; directive fin de programme
    Pièce jointe 326041Nom : Isis.JPG
Affichages : 3676
Taille : 30,5 Ko

    Merci

    -----
    Dernière modification par Antoane ; 30/10/2016 à 10h35. Motif: Déterrage > création d'une nouvelle discussion

  2. #2
    invite03481543

    Re : exercices sur le pic16f84

    Bonjour,

    elle est où la résistance qui limite le courant dans ta led?
    Et la résistance de pull-up pour le BP?

  3. #3
    adipie

    Re : exercices sur le pic16f84

    Citation Envoyé par HULK28 Voir le message
    Et la résistance de pull-up pour le BP?
    D'après Option Registre c'est une pull up interne.

  4. #4
    antek

    Re : exercices sur le pic16f84

    C'est quand même beaucoup plus formateur (puisqu'il s'agit de ça) de faire fonctionner une petite carte d'essai.

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

    Re : exercices sur le pic16f84

    Bonjour,
    je ne pense pas que c'est l’absence des résistances qui empêchent le code de tourner sur isis ?.
    Je vais quand même les mettre mais pas convaincu.
    Merci

  7. #6
    invite03481543

    Re : exercices sur le pic16f84

    C'est l'avantage du simulateur, tu risque pas de griller quelque chose
    Par contre pour bien apprendre c'est pas la meilleure méthode, c'est de tes erreurs que tu apprendras.
    Suis le conseil de antek.

  8. #7
    adipie

    Re : 2eme exercice de bigonoff "allumer/eteindre une LED avec un bouton poussoir" - pic16F84

    Et n'oublie pas de mettre la pin MCLR au +5V si tu câbles en réel.

  9. #8
    invite03481543

    Re : 2eme exercice de bigonoff "allumer/eteindre une LED avec un bouton poussoir" - pic16F84

    Bien vu adipie et également n'oublie pas de découpler ton alim du PIC avec un condensateur (au plus près) de 100nF~1µF.
    Bienvenue dans le monde réel.

  10. #9
    ogre31

    Re : 2eme exercice de bigonoff "allumer/eteindre une LED avec un bouton poussoir" - pic16F84

    Bonjour,
    Merci les uns et les autres pour vos conseils, et merci pour l’intérêt que vous avez porté a mes questions .

    En fait, c'est suite aux échecs sur la platine d'essai que je me suis fait assisté par le simulateur, d'abord de MPLAB puis isis.

    Pour le câblage,les résistances et les capa, "dans le monde réel" ,pas de soucis.
    Cependant j'aimerai bien que vous m'aidiez a trouver mon erreur ou l'erreur.De prime abord l'erreur dans le code est à exclure, puisque c'est celui de bigonoff .

    Merci pour votre patience.

  11. #10
    invite03481543

    Re : 2eme exercice de bigonoff "allumer/eteindre une LED avec un bouton poussoir" - pic16F84

    As-tu refais l'essai en complétant ton schéma sous Isis?
    ->Ajout du quartz à la valeur du prog de Bigonoff
    ->ajout de la liaison du MCLR à travers une 10K au +5V
    ->ajout de la résistance pour la led

    Fais déjà tout ça et reposte ton schéma corrigé et le code EXACT que tu injectes dans Isis.
    @+

  12. #11
    Antoane
    Responsable technique

    Re : 2eme exercice de bigonoff "allumer/eteindre une LED avec un bouton poussoir" - pic16F84

    Bonsoir,

    Je ne connais pas les pic et n'ai pas tout compris, mais :

    es-tu sûr que la simulation fonctionne bien en "real time" ?
    L'horloge en bas à gauche de l'écran qui compte le temps dans le référentiel de la simulation avance-t-elle aussi vite que le "vrai temps" (donné par ta montre, ton portable...) ?

    Si ma mémoire est bonne, il n'est normalement pas nécessaire de mettre le quartz pour faire fonctionner la simu sur isis, il faut et suffit d'indiquer la fréquence d'horloge dans les propriétés du composant.
    Dernière modification par Antoane ; 30/10/2016 à 18h25.
    Deux pattes c'est une diode, trois pattes c'est un transistor, quatre pattes c'est une vache.

  13. #12
    ogre31

    Re : 2eme exercice de bigonoff "allumer/eteindre une LED avec un bouton poussoir" - pic16F84

    Bonsoir,
    Exact Antoane.

    Voila ce que j'ai fais dans isis, dans le montage je n'ai laissé que le BP, résultat : le code fonctionne parfaitement, un click sur le BP RA2 passe au niveau haut (couleur rouge), un second click RA2 passe au niveau bas (couleur bleu).
    Mais on ajoutant une résistance et une LED comme ce qui a déjà été posté, la LED s'allume mais au second click elle ne s’éteint pas et RA2 dans les 2 cas reste grise.

    Je vais refaire mon montage sur platine et vous tiendrai au courant.

    Autre chose ,Je ne sais pas si nous somme dans le sujet ou devons nous créer un sujet pour isis.

    Merci

  14. #13
    Antoane
    Responsable technique

    Re : 2eme exercice de bigonoff "allumer/eteindre une LED avec un bouton poussoir" - pic16F84

    Mais on ajoutant une résistance et une LED comme ce qui a déjà été posté, la LED s'allume mais au second click elle ne s’éteint pas et RA2 dans les 2 cas reste grise.
    quelle valeur de résistance ?
    Peux-tu poster une copie d'écran ?
    Deux pattes c'est une diode, trois pattes c'est un transistor, quatre pattes c'est une vache.

  15. #14
    ogre31

    Re : 2eme exercice de bigonoff "allumer/eteindre une LED avec un bouton poussoir" - pic16F84

    Bonsoir,

    Rien a voir avec les résistances et leur valeur pour la simulation sur ISIS.
    L'astuce consistait a changer la propriété de la LED de Analog a Digital dans Model Type.
    La simulation dans ISIS fonctionne.

    Comment j'y suis arrivé, j'ai commencé par placer un voltmètre en parallèle avec la diode, après le 1° click la LED s'allume et le voltmetre indique 2.39V au lieu de 5V.En jetant un oiel sur les propriétés il y'avait le chois entre default, anolg et Digital.


    Mais ce n'est pas terminé pourtant parce qu’il faut que quelqu'un nous explique le pourquoi ??? .
    En attendant je vais bucher un peu de ce coté ...



    Merci a tous pour votre admirable patience

  16. #15
    Antoane
    Responsable technique

    Re : 2eme exercice de bigonoff "allumer/eteindre une LED avec un bouton poussoir" - pic16F84

    Bonjour,

    Parce qu'une led "digital" (qui est un model pour le logiciel, et non un composant réel) s'allume lorsqu'on lui fourni ce que le logiciel appelle un niveau haut (carré rouge) et s'éteint lorsque le niveau est bas (carré bleu).
    A l'opposé, une led "analogique" est un composant régit par un set d'équation, et en particulier une caractéristique courant-tension donnée (équation de Shockley : https://en.wikipedia.org/wiki/Shockley_diode_equation).

    Dans ton circuit utilisant une led "analogique" et pas de résistance, la tension de sortie est déterminée par les caractéristiques courant/tension de la led et de la sortie du µC. Une certaine valeur est choisie, qui ne correspond ni à un état haut ni à un état bas (carré gris). Il est alors possible que le logiciel ait du mal à faire changer l'état du port si celui-ci est déjà "gris" (c'est dit sans certitude).

    Avantage du modèle numérique : la simulation est bien plus rapide (en tous cas dans le cas de circuits complexes où le temps de simulation est déterminé par ces problèmes).
    En numérique : on résout le problème en ne cherchant que les état logiques (0/1) du circuit). C'est à 1 on allume, c'est à zéro on éteint.
    En analogique : il faut résoudre le set d'équations (loi des noeuds, des mailles, etc) pour déterminer les tensions et courants en chaque nœud du circuit. Suivant le courant calculé dans la led, on l'allume plus ou moins.
    Dernière modification par Antoane ; 31/10/2016 à 06h34.
    Deux pattes c'est une diode, trois pattes c'est un transistor, quatre pattes c'est une vache.

  17. #16
    invite03481543

    Re : 2eme exercice de bigonoff "allumer/eteindre une LED avec un bouton poussoir" - pic16F84

    Antoane a très bien résumé le problème.Et cet exemple démontre, si il était encore besoin, que d'apprendre sur un simulateur est une erreur dans l'ordre des apprentissages.On ne le dira jamais assez.

  18. #17
    invite03481543

    Re : 2eme exercice de bigonoff "allumer/eteindre une LED avec un bouton poussoir" - pic16F84

    En plus tu ne suis pas les conseils donnés ...ce qui rend les choses encore plus compliquées.

  19. #18
    ogre31

    Re : 2eme exercice de bigonoff "allumer/eteindre une LED avec un bouton poussoir" - pic16F84

    Bonsoir,

    HULK28: Vous etes dur avec moi

    Non je plaisante, j’apprécie énormément et votre aide et vos remarques et c'est grace a vous tous que j'avance, je ne vous remercierai jamais assez.

    Juste que le simulateur permet un aperçu rapide sur le résultat quand on a pas beaucoup de temps.
    Je suis tout a fait d'accord, que rien ne vaut un montage réel combien même une simple LED qui clignote.

    Merci beacoup

  20. #19
    antek

    Re : 2eme exercice de bigonoff "allumer/eteindre une LED avec un bouton poussoir" - pic16F84

    Ton programme définit un 16F84 et le schéma un 16F84A.
    Les différences sont subtiles.

Discussions similaires

  1. [Autre] [débutant] allumer/éteindre une led avec un bouton poussoir
    Par dorian09 dans le forum Électronique
    Réponses: 15
    Dernier message: 20/06/2016, 08h37
  2. [Autre] Un bouton poussoir pour allumer/éteindre
    Par SimonY53 dans le forum Électronique
    Réponses: 45
    Dernier message: 19/12/2015, 17h08
  3. Réponses: 30
    Dernier message: 05/12/2013, 22h10
  4. Allumer et éteindre une lampe avec un seul bouton
    Par invite6d7e1494 dans le forum Électronique
    Réponses: 15
    Dernier message: 30/01/2012, 15h00
  5. Bouton poussoir, Allumer et eteindre une led
    Par jojo86 dans le forum Électronique
    Réponses: 37
    Dernier message: 06/12/2008, 09h34
Découvrez nos comparatifs produits sur l'informatique et les technologies.