[Programmation] Programmation PIC 16F84 (assembleur)
Répondre à la discussion
Affichage des résultats 1 à 18 sur 18

Programmation PIC 16F84 (assembleur)



  1. #1
    invitea3bb4ebc

    Programmation PIC 16F84 (assembleur)


    ------

    Salut,
    Je doit réaliser un programme pour un PIC 16F84 mais j'arrive pas du tout, le travail demandé est le suivant:
    Ecrire un programme assembleur pour le PIC 16F84, qui permet de lire sans arrêt un code qui provient des deux pattes RA0 et RA1, ensuite exécute suivant la valeur lue l'un des programmes suivants:
    • RA1 RA0 = 00: le pic doit réaliser l'allumage de 8 LEDs branchées sur les pattes de RB0 à RB7 consécutivement durant 0.5s.
    • RA0 RA1 = 01: le pic réalise l'allumage des 8 LEDs en temps pendant 1s puis extinction pendant 0.5s en boucle.
    • RA0 RA1 = 10: le pic doit allumer les led en clignotement en boucle une par une durant 2ms.
    • RA0 RA1 = 11: le pic doit allumer 2 LEDs puis les deux suivantes jusqu’à la dernière et reboucler.

    J'ai commencé par écrire ce code
    Code:
    LIST P=16f84
    INCLUDE"P16F84.INC"
    __CONFIG	_CP_OFF &_WDT_ON 
    BSF STATUS,RP0
    BSF TRISA,RA0
    BSF TRISA,RA1
    MOVLW B'00000000'
    MOVWF TRISB
    BCF STATUS,RP0
    CLRF PORTB
    MOVLW B'00001110'
    MOVWF OPTION_REG
    puis j'ai écrit ce sous programme qui normalement doit réaliser l'allumage consécutive des 8 LEDs pendant 0.5s, ca compile bien mais au niveau de la simulation ca marche pas
    Code:
    MOVLW B'00000001'
    MOVWF PORTB
    LOOP SLEEP
    	 RLF PORTB,1
    	 CLRWDT
    GOTO LOOP
    Merci de votre aide.

    -----

  2. #2
    antek

    Re : Programmation PIC 16F84 (assembleur)

    Commenter le programme , par exemple BSF STATUS,RP0 fait quoi ? ETC

    Je ne vois pas dans le code une lecture des entrées.

    Tu peux déjà faire des sous-programme pour les 4 cas d'allumage, et les tester de façon indépendantes.

  3. #3
    invite5637435c

    Re : Programmation PIC 16F84 (assembleur)

    Bonsoir,

    vous ne précisez pas la fréquence de travail de votre PIC et il faut apprendre aussi à commenter un code comme le précise antek.
    Vous devez utiliser le WD? Parce que là vous l'avez déclaré ON.

    Quand on débute en programmation il est souhaitable dans un premier temps de dessiner un ordinogramme (un flowchart) histoire de bien structurer les différentes séquences du programme à réaliser.
    Vous pouvez y introduire les différents registres qui seront appelés ainsi que les variables utilisées (en les initialisant c'est mieux )

  4. #4
    invitea3bb4ebc

    Re : Programmation PIC 16F84 (assembleur)

    Merci pour votre réponse,
    La fréquence du pic est 4 MHz
    J'ai activé le watchdog dans le but de l'utiliser comme un timer

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

    Re : Programmation PIC 16F84 (assembleur)

    Voici le programme commenté:
    Code:
    BSF STATUS,RP0 ;passage dans la bank1
    BSF TRISA,RA0 ;utiliser le port RA0 comme entrée
    BSF TRISA,RA1 ;utiliser le port RA1 comme entrée
    MOVLW B'00000000'
    MOVWF TRISB ;utilisation des ports RB0 jusqu'à RB7 comme des sorties
    BCF STATUS,RP0 ;passage dans la bank0
    CLRF PORTB ;m'assurer que toutes les led seront éteintes
    MOVLW B'00001110' 
    MOVWF OPTION_REG ;configurer le WD pour qu'il effectue un reset toutes les 1s environ
    Mon sous-programme:
    Code:
    MOVLW B'00000001' 
    MOVWF PORTB ;allumer la 1ere led
    LOOP SLEEP ;entrer en mode sleep (le µC se réveille si la temporisation du watchdog est dépassée et le programme reprend à l'instruction qui suit l'instruction SLEEP.)
    RLF PORTB,1 ;faire un decalage des bits vers la guache ==> la led suivante va s'allumer et la precedente va s'eteindre
    CLRWDT ;remise du compteur watchdog à zero
    GOTO LOOP
    Pour la lectures des entrées je n'ai pas trouvé un moyen de la faire encore j'essayé avec le code suivant mais ça marche pas:
    Code:
    TEST0 BTFSC PORTA,RA0 ;execture l'instruction suivante si RA0=1 sinon sauter a l'instruction qui suit
                GOTO TEST1
                GOTO TEST2
    TEST1 BTFSC PORTA,RA1 ;execture l'instruction suivante si RA1=1 sinon sauter a l'instruction qui suit
                GOTO ONE_ONE ;aller a la boucle du RA0 RA1 = 11
                GOTO ONE_ZERO ;aller a la boucle du RA0 RA1 = 10
    TEST2 BTFSC PORTA,RA1 ;execture l'instruction suivante si RA1=1 sinon sauter a l'instruction qui suit
                GOTO ZERO_ONE ;aller a la boucle du RA0 RA1 = 10
                GOTO ZERO_ZERO ;aller a la boucle du RA0 RA1 = 00
    J’espère que c'est clair maintenant

  7. #6
    antek

    Re : Programmation PIC 16F84 (assembleur)

    Citation Envoyé par Blue10 Voir le message
    J'ai activé le watchdog dans le but de l'utiliser comme un timer
    Le watchdog provoque un reset, non ? En tout cas ce n'est pas une bonne méthode.

  8. #7
    invitea3bb4ebc

    Re : Programmation PIC 16F84 (assembleur)

    Lorsque le watchdog déborde, (WDT TimeOut), deux situations sont possibles :
    • Si le PIC est en fonctionnement normal, le WDT time-out provoque un RESET. Ceci permet d’éviter de rester planté en cas de blocage du microcontrôleur par un processus indésirable non contrôlé
    • Si le PIC est en mode SLEEP, le WDT time-out provoque un WAKE-UP, l'exécution du programme continue normalement là où elle s'est arrêtée avant de rentrer en mode SLEEP. Cette situation est souvent exploitée pour réaliser des temporisations comme dans le cas de mon programme

  9. #8
    invite5637435c

    Re : Programmation PIC 16F84 (assembleur)

    Vous pouvez utiliser le watch-dog pour faire cela.
    Dès l'instant que celui-ci est rafraîchi pour ne pas se déclencher intempestivement il n'y aura pas de reset.

    Quand quelque chose ne fonctionne pas en programmation il faut démarrer simple.
    Compiler le programme qui fait juste clignoter une led sur une des sorties et dites ce que vous obtenez.
    (Le simulateur n'est pas une bonne pratique quand on débute).

  10. #9
    invite5637435c

    Re : Programmation PIC 16F84 (assembleur)

    Et faites voir aussi le schéma que vous avez fait.
    C'est quoi votre simulateur?

  11. #10
    invitea3bb4ebc

    Re : Programmation PIC 16F84 (assembleur)

    J'utilise le simulateur isis proteus, et j'ai réalisé le schéma suivant:
    Nom : mon_schéma.png
Affichages : 5814
Taille : 13,3 Ko

  12. #11
    antek

    Re : Programmation PIC 16F84 (assembleur)

    Le principe de votre programme est plein de défauts que j'essayerai d'expliquer demain.
    C'est un exercice imposé ?

    En attendant, vous pouvez jeter un œil sur cet excellent cours -> http://www.abcelectronique.com/bigonoff/

  13. #12
    invitea3bb4ebc

    Re : Programmation PIC 16F84 (assembleur)

    Merci pour votre réponse et pour le cours, oui c'est un exercice imposé.

  14. #13
    invite5637435c

    Re : Programmation PIC 16F84 (assembleur)

    Bien que ce soit un simulateur il faut mettre des résistances sur vos leds.
    Pour les BP il faut des résistances de tirage au Vcc, on ne laisse jamais en l'air des entrées (ou alors il faut activer les pull-up internes quand il y en a).
    Je suis en train de faire le code, je reviendrai une fois terminé.

  15. #14
    invite5637435c

    Re : Programmation PIC 16F84 (assembleur)

    Voici pour
    RA0 RA1 = 10: le pic doit allumer les led en clignotement en boucle une par une durant 2ms.


    Vous pouvez agir sur la vitesse en réglant la durée du WD:

    Code:
    ;**********************************************************************
    ;   PROGRAMME DE DEFILEMENT DE LEDS CONNECTEE SUR LE PORTB            *
    ;   D'UN PIC16F84A.                                                   *  
    ;                                                                     *
    ;**********************************************************************
    ;                                                                     *
    ;    NOM:      LED-CLI                                                *
    ;    Date:     30/12/2018                                             *
    ;    Version:  1.0                                                    *
    ;    Auteur:   HULK28                                                 *
    ;                                                                     *
    ;**********************************************************************
    ;                                                                     *
    ;    Fichier requis: P16F84A.inc                                      *
    ;                                                                     *
    ;**********************************************************************
    
    
        LIST      p=16F84A            ; Définition de processeur
        #include <p16F84A.inc>        ; Définitions de variables
       
        __CONFIG   _CP_OFF & _WDT_ON & _PWRTE_ON & _XT_OSC
    
    
    ;**********************************************************************
    ;***********                     macro                    *************
    ;**********************************************************************
    
    
    bank1    macro            ; passage en banque 1
            bsf STATUS,RP0 
            endm
    bank0    macro            ; passage en banque 0
            bcf STATUS,RP0
            endm
    
    
    ;**********************************************************************  
    ;*                         démarrage sur reset                     *
    ;**********************************************************************
    
    
        org 0x0000
        
    bank1
    
    
    MOVLW B'00000000'
    MOVWF TRISB ;utilisation des ports RB0 jusqu'à RB7 comme des sorties
    MOVLW B'10001110' 
    MOVWF OPTION_REG ;configurer le WD pour qu'il effectue un reset toutes les 1s environ
    
    
    bank0
    
    
    CLRF PORTB ;m'assurer que toutes les led seront éteintes
    CLRWDT ;remise du compteur watchdog à zero
    MOVLW B'00000001' 
    MOVWF PORTB ;allumer la 1ere led
    LOOP SLEEP ;entrer en mode sleep (le µC se réveille si la temporisation du watchdog est dépassée et le programme reprend à l'instruction qui suit l'instruction SLEEP.)
    RLF PORTB,1 ;faire un decalage des bits vers la guache ==> la led suivante va s'allumer et la precedente va s'eteindre
    CLRWDT ;remise du compteur watchdog à zero
    GOTO LOOP
    
    
    END             ; directive fin de programme
    Vous aviez fait une erreur de bank.
    Par contre je doute que vous puissiez faire fonctionner ce code sur un simulateur, ils n'aiment pas les fonctionnement avec le W

  16. #15
    invite5637435c

    Re : Programmation PIC 16F84 (assembleur)

    Comme le time out est dépassé je continue ici.

    Utiliser le WD est possible uniquement pour le coté didactique, dans l'usage ce n'est pas une bonne idée compte tenu que vous n'aurez pas de précision avec celui-ci.

    Dans mon programme vous verrez que j'utilise des macros, cela permet d'avoir un code plus lisible.
    Comme je le disais précédemment attention de bien utiliser les banks, OPTION_REG est accessible avec bank1 (comme pour TRISA et TRISB) pas bank0.
    Vous avez là une base, je vous laisse adapter comme vous voulez.
    Je vous conseille vraiment de faire tourner ces programmes sur une vraie maquette, le simulateur va vous introduire des impondérables et vous ne saurez plus où est le problème entre le code, le simulateur, windows etc.
    A+

  17. #16
    invite5637435c

    Re : Programmation PIC 16F84 (assembleur)

    Pour finir:

    comme vous avez des BP et qu'il faut des pull-up, il aurait été plus judicieux d'utiliser PORTB pour les brancher, PORTA n'ayant pas de pull-up interne sur ce µC.
    Dans votre schéma il faudra donc ajouter des pull-up sur les entrées de BP et n'oubliez pas d'ajouter aussi les résistances des leds.
    C'est pour cela que je déconseille l'usage du simulateur, dans la vraie vie vous auriez tué votre µC et vous vous en seriez souvenu.

  18. #17
    invitea3bb4ebc

    Re : Programmation PIC 16F84 (assembleur)

    Merci à tous ceux qui m'ont aidé, j'ai réussi finalement à écrire ce programme.

    Code:
    ;**********************************************************************
    ;   PROGRAMME DE DEFILEMENT DE LEDS CONNECTEE SUR LE PORTB            *
    ;   D'UN PIC16F84A.                                                   *  
    ;                                                                     *
    ;**********************************************************************
    ;                                                                     *
    ;    NOM:      LED-CLI                                                *
    ;    Date:     30/12/2018                                             *
    ;    Version:  1.0                                                    *
    ;    Auteur:   Blue10                                                 *
    ;                                                                     *
    ;**********************************************************************
    ;                                                                     *
    ;    Fichier requis: P16F84A.inc                                      *
    ;                                                                     *
    ;**********************************************************************
    
    
        LIST      p=16F84A            ; Définition de processeur
        #include <p16F84A.inc>        ; Définitions de variables
       
        __CONFIG   _CP_OFF & _WDT_ON & _PWRTE_ON & _XT_OSC
    
    
    ;**********************************************************************
    ;***********                     macro                    *************
    ;**********************************************************************
    
    
    bank1    macro            ; passage en banque 1
            bsf STATUS,RP0 
            endm
    bank0    macro            ; passage en banque 0
            bcf STATUS,RP0
            endm
    
    
    ;**********************************************************************  
    ;*                         démarrage sur reset                        *
    ;**********************************************************************
    
    
        org 0x0000
        
    bank1
    
    
    MOVLW B'00000000'
    MOVWF TRISB ;utilisation des ports RB0 jusqu'à RB7 comme des sorties
    MOVLW B'10001110' 
    MOVWF OPTION_REG ;configurer le WD pour qu'il effectue un wakeup toutes les 1s environ
    
    
    bank0
    
    BCF STATUS,C ;Clear the Carry bit
    CLRF PORTB ;m'assurer que toutes les led seront éteintes
    
    TEST0 BTFSC PORTA,RA0 ;execture l'instruction suivante si RA0=1 sinon sauter a l'instruction qui suit
                GOTO TEST1
                GOTO TEST2
    TEST1 BTFSC PORTA,RA1 ;execture l'instruction suivante si RA1=1 sinon sauter a l'instruction qui suit
                GOTO ONE_ONE ;aller a la boucle du RA0 RA1 = 11
                GOTO ONE_ZERO ;aller a la boucle du RA0 RA1 = 10
    TEST2 BTFSC PORTA,RA1 ;execture l'instruction suivante si RA1=1 sinon sauter a l'instruction qui suit
                GOTO ZERO_ONE ;aller a la boucle du RA0 RA1 = 10
                GOTO ZERO_ZERO ;aller a la boucle du RA0 RA1 = 00
    
    ;**********************************************************************
    ;*                         RA0 RA1 = 10                               *
    ;**********************************************************************
    ONE_ZERO
    	bank1
    	MOVLW B'10001100' 
    	MOVWF OPTION_REG;configurer le WD pour qu'il effectue un wakeup toutes les 0.2s environ
    	bank0
    	CLRWDT ;remise du compteur watchdog à zero
    	MOVLW B'00000001' 
    	MOVWF PORTB ;allumer la 1ere led
    LOOP10 SLEEP ;entrer en mode sleep (le µC se réveille si la temporisation du watchdog est dépassée et le programme reprend à l'instruction qui suit l'instruction SLEEP.)
    	RLF PORTB,1 ;faire un decalage des bits vers la guache ==> la led suivante va s'allumer et la precedente va s'eteindre
    	CLRWDT ;remise du compteur watchdog à zero
    BTFSC PORTA,RA0 ;retester la condition
    BTFSC PORTA,RA1
    GOTO TEST0
    GOTO LOOP10
    
    ;**********************************************************************
    ;*                         RA0 RA1 = 11                               *
    ;**********************************************************************
    ONE_ONE
    	CLRWDT ;remise du compteur watchdog à zero
    	MOVLW B'00000011' 
    	MOVWF PORTB ;allumer les 1ere leds
    LOOP11 SLEEP ;entrer en mode sleep (le µC se réveille si la temporisation du watchdog est dépassée et le programme reprend à l'instruction qui suit l'instruction SLEEP.)
    	RLF PORTB,1 ;faire un decalage des bits vers la guache ==> la led suivante va s'allumer et la precedente va s'eteindre
    	RLF PORTB,1 ;faire un decalage des bits vers la guache ==> la led suivante va s'allumer et la precedente va s'eteindre
    	CLRWDT ;remise du compteur watchdog à zero
    BTFSC PORTA,RA0 ;retester la condition
    BTFSS PORTA,RA1
    GOTO TEST0
    GOTO LOOP11
    
    ;**********************************************************************
    ;*                         RA0 RA1 = 01                               *
    ;**********************************************************************
    ZERO_ONE
    LOOP01
    	bank1
    	MOVLW B'10001110' 
    	MOVWF OPTION_REG;configurer le WD pour qu'il effectue un wakeup toutes les 1s environ
    	bank0
    	CLRWDT ;remise du compteur watchdog à zero
    	MOVLW B'11111111' 
    	MOVWF PORTB ;allumer les 1ere leds
    	SLEEP
    	CLRWDT
    	bank1
    	MOVLW B'10001101' 
    	MOVWF OPTION_REG;configurer le WD pour qu'il effectue un wakeup toutes les 0.5s environ
    	bank0
    	COMF PORTB,1
    	SLEEP ;entrer en mode sleep (le µC se réveille si la temporisation du watchdog est dépassée et le programme reprend à l'instruction qui suit l'instruction SLEEP.)
    	CLRWDT ;remise du compteur watchdog à zero
    BTFSS PORTA,RA0 ;retester la condition
    BTFSS PORTA,RA1
    GOTO TEST0
    GOTO LOOP01
    
    ;**********************************************************************
    ;*                         RA0 RA1 = 00                               *
    ;**********************************************************************
    ZERO_ZERO
    	bank1
    	MOVLW B'10001101' 
    	MOVWF OPTION_REG;configurer le WD pour qu'il effectue un wakeup toutes les 0.5s environ
    	bank0
    	CLRWDT ;remise du compteur watchdog à zero
    	MOVLW B'00000001' 
    	MOVWF PORTB ;allumer la 1ere led
    LOOP00 SLEEP ;entrer en mode sleep (le µC se réveille si la temporisation du watchdog est dépassée et le programme reprend à l'instruction qui suit l'instruction SLEEP.)
    	   RLF PORTB,1 ;faire un decalage des bits vers la guache ==> la led suivante va s'allumer et la precedente va s'eteindre
    	   CLRWDT ;remise du compteur watchdog à zero
    BTFSS PORTA,RA0 ;retester la condition
    BTFSC PORTA,RA1
    GOTO TEST0
    GOTO LOOP00
    
    END             ; directive fin de programme

  19. #18
    invite5637435c

    Re : Programmation PIC 16F84 (assembleur)

    Voici ce que cela donne sur mon simulateur:

    https://youtu.be/GUtaHWDsk7w

    vous avez bien avancé.

Discussions similaires

  1. [Programmation] programmation en assembleur
    Par invite93bab8f7 dans le forum Électronique
    Réponses: 2
    Dernier message: 19/02/2017, 00h08
  2. programmation assembleur
    Par invitea8e20780 dans le forum Programmation et langages, Algorithmique
    Réponses: 13
    Dernier message: 25/05/2014, 23h59
  3. génération de temporisation en assembleur pour pic 16F84
    Par inviteab10374f dans le forum Électronique
    Réponses: 0
    Dernier message: 23/05/2010, 20h46
  4. programmation des pics 16f84
    Par invitefccc715e dans le forum Électronique
    Réponses: 2
    Dernier message: 05/10/2008, 23h46
  5. [ Programmation PIC 16F84 (asm) ]
    Par invite49af6c4e dans le forum Électronique
    Réponses: 1
    Dernier message: 23/10/2003, 20h55
Dans la rubrique Tech de Futura, découvrez nos comparatifs produits sur l'informatique et les technologies : imprimantes laser couleur, casques audio, chaises gamer...