Répondre à la discussion
Affichage des résultats 1 à 9 sur 9

Programmation PIC16f84



  1. #1
    JohnElectronique

    Programmation PIC16f84


    ------

    Bonjour, je suis en train de programmer un pic 16f84a en assembleur avec le logiciel
    MPLAB IDE de la société Microship. Le but de mon programme, est simple (puisque je suis débutant
    dans la programmation des pic). Lu but est d'allumer et d'ateindre des LED branchées sur les sorties
    A1, A2, A3 (du port A du composant). J'ai donc pensé à réaliser une boucle mais elle ne marche pas.
    Voici mon code:

    LIST p=16F84 ; Définition de processeur
    #include <p16F84.inc> ; Définitions de variables

    __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. 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'0008' ; Valeur registre option
    ; Résistance pull-up ON
    ; Pas de préscaler

    ;***************************** ****************************** **********
    ; DEFINE *
    ;***************************** ****************************** **********

    #DEFINE LED PORTA,0 ; Led 1
    #DEFINE LED1 PORTA,1 ; Led 2
    #DEFINE LED2 PORTA,2 ; Led 3
    #DEFINE LED3 PORTA,3 ; Led 4
    #DEFINE BOUTON PORTB,2 ; bouton-poussoir




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

    org 0x000 ; Adresse de départ après reset
    goto init ; Adresse 0: initialiser

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

    init
    clrf PORTA ; Sorties portA à 0
    clrf PORTB ; sorties portB à 0
    clrf EEADR ; permet de diminuer la consommation
    bsf STATUS,RP0 ; sélectionner banque 1
    movlw OPTIONVAL ; charger masque
    movwf OPTION_REG ; initialiser registre option

    ; Effacer RAM
    ; ------------
    movlw 0x0c ; initialisation pointeur
    movwf FSR ; pointeur d'adressage indirec
    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

    ; initialisations spécifiques
    ; ---------------------------
    bcf LED ; LED en sortie (banque1)
    bcf LED1
    bcf LED2
    bcf LED3
    bcf STATUS,RP0 ; repasser banque 0
    goto start ; sauter au programme principal


    ;***************************** ****************************** **********
    ; DECLARATIONS DE VARIABLES *
    ;***************************** ****************************** **********

    CBLOCK 0x00C ; début de la zone variables

    cmpt1 : 1 ; compteur de boucles 1
    cmpt2 : 1 ; compteur de boucles 2
    cmpt3 : 1 ; compteur de boucles 3
    cmpt4: 1 ; compteur de boucles 4
    ENDC ; Fin de la zone

    ;***************************** ****************************** **********
    ; SOUS-ROUTINE DE TEMPORISATION *
    ;***************************** ****************************** **********
    ;---------------------------------------------------------------------
    ; Cette sous-routine introduit un retard de 500.000 µs.
    ; Elle ne reçoit aucun paramètre et n'en retourne aucun
    ;---------------------------------------------------------------------
    tempo
    movlw 2 ; pour 2 boucles
    movwf cmpt3 ; initialiser compteur3
    boucle3
    clrf cmpt2 ; effacer compteur2
    boucle2
    clrf cmpt1 ; effacer compteur1
    boucle1
    nop ; perdre 1 cycle
    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
    decfsz cmpt3,f ; si 0, décrémenter compteur 3
    goto boucle3 ; si cmpt3 pas 0, recommencer boucle2
    return ; retour de la sous-routine


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

    CLIGLED0 macro
    bsf PORTA, cmpt4
    call tempo
    bcf PORTA, cmpt4
    call tempo
    endm

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

    start
    movlw 4 ;on met 4 dans w
    movwf cmpt4 ; on met w dans cmpt4
    goto boucleLED

    boucleLED
    CLIGLED0
    decfsz cmpt4, f ;décrémente cmpt4 de 1 si cmpt4>0
    goto boucleLED
    goto start ; boucler

    END ; directive fin de programme




    Pourriez vous m'aider? Je pense que le problème se situe dans le programme principal et plus précisément
    dans la boucle boucleLED mais je n'en suis pastotalement sûr.
    Merci de votre aide...

    Jonathan

    -----

  2. Publicité
  3. #2
    freepicbasic

    Re : Programmation PIC16f84

    bsf PORTA, cmpt4
    ça ne fonctionne pas !

    il faut utiliser un mask et faire un AND et OR avec le port A
    ou alors une table de sauts pour traiter les 4 cas
    Mais le bit ne peut pas etre dans une variable il est écrit en dur.

    le HS me semble suspect aussi généralement c'est XT pour 4Mhz
    A+, pat

  4. #3
    JohnElectronique

    Re : Programmation PIC16f84

    Merci beaucoup pour ta réponse rapide.
    Par contre, lorsque tu dis qu'il faut faire des AND et OR c'est entre quoi et quoi? Je pense que c'est une question stupide mais je ne vois pas trop s'il faut le faire entre chaque sorties du PORTA ou avec autre chose.
    En faite pour le PIC16f84, dans la datasheet (page 56), on voit deux instructions logiques qui peuvent être intéressantes:
    ANDWF => AND W and f
    XORWF => Exclusive OR W with f

    Cela signifie donc qu'il faut faire une variable de masque et faire une opération logique avec les états des sorties de A?

    Merci

  5. #4
    freepicbasic

    Re : Programmation PIC16f84

    Citation Envoyé par JohnElectronique Voir le message
    Merci beaucoup pour ta réponse rapide.
    Par contre, lorsque tu dis qu'il faut faire des AND et OR c'est entre quoi et quoi? Je pense que c'est une question stupide mais je ne vois pas trop s'il faut le faire entre chaque sorties du PORTA ou avec autre chose.
    En faite pour le PIC16f84, dans la datasheet (page 56), on voit deux instructions logiques qui peuvent être intéressantes:
    ANDWF => AND W and f
    XORWF => Exclusive OR W with f

    Cela signifie donc qu'il faut faire une variable de masque et faire une opération logique avec les états des sorties de A?

    Merci
    oui c'est ça, et de préférence faire une image du port.
    La lecture ou une opération sur le port n'est pas trop recommandé , puis faire un movf vers le port.

    Xor fera un toogle d'un ou plusieurs bits.

    le AND devra se faire avec la valeur inversée
    exemple;
    OR 1 pour le bsf PORTA, 0
    et
    AND 0xFE pour le bcf PORTA, 0

    voir COMF ou xor 0xFF

    on peut gérer le mask avec un décalage
    si on a initialisé avec 1 et rlf le << du C
    si on a initialisé avec 0x80 et rrf le >> du C
    s'il s'agit d'une appli genre chenillard ou K2000
    A+, pat

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

    Re : Programmation PIC16f84

    A oui d'accord, donc si je comprends bien pour les masks, si pour allumer la LED1 j'aurais 00000001 et pour l'éteindre
    je fais 00000001|11111111=11111111
    ensuite je fais le ET 11111111&11111110=111111110 on remarque qu'elle sont toutes allumées sauf la 1. Donc je pense que c'est pareil pour les autres.
    Est-ce bien cela?
    Par contre comment réaliser un décalage type C (<< ou >>) en assembleur. Existe t'il une instruction de base?

    Merci

  8. #6
    freepicbasic

    Re : Programmation PIC16f84

    Citation Envoyé par JohnElectronique Voir le message
    A oui d'accord, donc si je comprends bien pour les masks, si pour allumer la LED1 j'aurais 00000001 et pour l'éteindre
    je fais 00000001|11111111=11111111
    ensuite je fais le ET 11111111&11111110=111111110 on remarque qu'elle sont toutes allumées sauf la 1. Donc je pense que c'est pareil pour les autres.
    Est-ce bien cela?
    Par contre comment réaliser un décalage type C (<< ou >>) en assembleur. Existe t'il une instruction de base?

    Merci
    non
    not 00000001 = 11111110

    ' reset bit
    movlw 1
    movwf mask
    COMF mask,w ' mask inversé dans W (COMF = fonction not)
    ANDWF image,f ' reseter le bit
    movf image,w ' mettre l'image sur le port
    movwf PORTA

    'set bit
    movlw 1
    IORLW image,f ' set le bit
    movf image,w
    movwf PORTA


    le decalage à droite
    bcf STATUS,c ' efface le carry de façon a ajouter un 0 et pas un 1
    RRF mask,f

    le decalage à gauche
    bcf STATUS,c
    RLF mask,f
    A+, pat

  9. Publicité
  10. #7
    JohnElectronique

    Re : Programmation PIC16f84

    Bonjour, oui le but de l'application est la réalisation d'un petit chenillard. Après étude des décalage, je m'en suis inspiré et j'ai réussi à réaliser le code suivant:

    INITIALISATION macro
    ; tous les bits du ports A sont a 0
    clrw
    movlw B'00000000'
    movwf TRISA
    clrw
    endm

    CLIGLED0 macro
    call tempo ; tempo 0.5s
    clrw ;efface w
    movf ledc, W ;on copie le contenu de ledc dans W
    movwf TRISA ;on envoi le contenu de ledc à TRISA
    ;ledc contient un octet et le bits contenant un 1 signifie que la led est allumée
    call tempo ;tempo 0.5s
    INITIALISATION ;extinction de la led (bits à 0) pour effectuer la seconde
    ;phase du clignotement
    movf ledc, W ; on remet le contenu de ledc dans w
    call tempo ; tempo 0.5s
    endm

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

    start ; début du programme principal
    movlw 4 ;met 4 dans w (initialisation)
    movwf cmpt4 ; met 4 dans cmpt4
    clrw ;effacement de w
    movlw B'00000001' ;initialisation de la première LED
    movwf ledc
    INITIALISATION ;mettre tous les bits à 0 pour l'initialisation

    boucleled ;on boucle 4 fois car la valeur du compteur de boucle cmpt4 est fixée à 4
    CLIGLED0 ;appel de la macro de clignotement
    RLF ledc, f ;decalage a gauche
    decfsz cmpt4, f ;décrémentation du compteur de boucle si !=0 sinon saut
    goto boucleled


    stop ; on ne fais plus rien car on veut excéuter juste 1 seule fois le programme
    NOP ; No Operation
    goto stop
    END ; directive fin de programme

    Il fonctionne bien peut-être à t'il besoin d'optimisations. Qu'en pensez vous?
    Merci pour votre aide

  11. #8
    freepicbasic

    Re : Programmation PIC16f84

    Code:
    INITIALISATION macro
    ; tous les bits du ports A sont a 0
    BSF	STATUS,RP0
    movlw B'00000000'
    movwf TRISA
    BCF	STATUS,RP0
    clrf PORTA
    endm
    
    CLIGLED0 macro
    call tempo ; tempo 0.5s
    movf ledc, W ;on copie le contenu de ledc dans W
    movwf TRISA ;on envoi le contenu de ledc à TRISA
    ;ledc contient un octet et le bits contenant un 1 signifie que la led est allumée
    call tempo ;tempo 0.5s
    	;extinction de la led (bits à 0) pour effectuer la seconde
    ;phase du clignotement
    clrf PORTA ; on remet le contenu de ledc dans w
    call tempo ; tempo 0.5s
    endm
    
    ;***************************** ****************************** **********
    ; PROGRAMME PRINCIPAL *
    ;***************************** ****************************** **********
    
    start ; début du programme principal
    INITIALISATION ;mettre tous les bits à 0 pour l'initialisation
    
    nextLine
    movlw 4 ;met 4 dans w (initialisation)
    movwf cmpt4 ; met 4 dans cmpt4
    movlw B'00000001' ;initialisation de la première LED
    movwf ledc
    
    boucleled ;on boucle 4 fois car la valeur du compteur de boucle cmpt4 est fixée à 4
    CLIGLED0 ;appel de la macro de clignotement
    RLF ledc, f ;decalage a gauche
    decfsz cmpt4, f ;décrémentation du compteur de boucle si !=0 sinon saut
    goto boucleled
    
    
    stop ; on ne fais plus rien car on veut excéuter juste 1 seule fois le programme
    NOP ; No Operation
    goto nextLine
    goto stop  ; pour 1 seule fois effacer la ligne dessus
    END ; directive fin de programme
    A+, pat

  12. #9
    JohnElectronique

    Re : Programmation PIC16f84

    Merci beaucoup de m'avoir aidé. Cela m'a permis d'acquérir un certains nombre de connaissance concernant les instruction assembleur de bases pour la programmation des pics...
    Je te souhaite une très bonne soirée.
    Merci encore...

    Jonathan

Discussions similaires

  1. Réponses: 25
    Dernier message: 03/07/2014, 08h36
  2. Pic16f84
    Par Crapsy dans le forum Électronique
    Réponses: 8
    Dernier message: 11/05/2010, 08h54
  3. programmation de feux tricolores en assembleur pour pic16f84
    Par solda39 dans le forum Électronique
    Réponses: 4
    Dernier message: 21/03/2009, 17h35
  4. programmation pic16f84
    Par vanhelsing69 dans le forum Électronique
    Réponses: 5
    Dernier message: 13/03/2007, 10h24
  5. programmation PIC16F84
    Par nkoghe12001 dans le forum Électronique
    Réponses: 1
    Dernier message: 24/06/2006, 00h19
Découvrez nos comparatifs produits sur l'informatique et les technologies.