Aller au contenu
  • Pas encore inscrit ?

    Pourquoi ne pas vous inscrire ? C'est simple, rapide et gratuit.
    Pour en savoir plus, lisez Les avantages de l'inscription... et la Charte de Zébulon.
    De plus, les messages que vous postez en tant qu'invité restent invisibles tant qu'un modérateur ne les a pas validés. Inscrivez-vous, ce sera un gain de temps pour tout le monde, vous, les helpeurs et les modérateurs ! :wink:

Programmation de PIC 16F877


Messages recommandés

Posté(e)

Oyo!

 

Pour ceux qui connaissent, j'essaie de programmer un PIC 16F877 pour qu'il vienne me lire une tension analogique et qu'il en fasse la convertion en numérique.

J'essaie avec le simulateur et le logiciel MPLAB mais ça ne fonctionne pas, une idée.

 

Mon programme.

;********************************************************************************

;          *

; Réalisation d'un programme permettant de lire une tension sur la broche *

; 0 du port A et d'afficher le résultat de la conversion  *

; analogique/numérique sur le port B    *

;          *

;********************************************************************************

;          *

; PROJET: exo0.pjt      *

; NOM: exo0.asm        *

; VERSION: 1.0        *

; AUTEUR: Lucié        *

;          *

;********************************************************************************

;                *

; FICHIER REQUIS: p16F877.inc            *

;                *

;********************************************************************************

LIST      p=16F877 ;définition du processeur

#include <p16F877.inc> ;fichier include

__CONFIG  _CP_OFF & _DEBUG_OFF & _WRT_ENABLE_OFF & _CPD_OFF & _LVP_OFF & _BODEN_OFF & _PWRTE_ON & _WDT_OFF & _HS_OSC

    ;_CP_OFF  pas de protection

    ;_DEBUG_OFF  RB6 et RB7 en utilisation normale

    ;_WRT_ENABLE_OFF le programme ne peut pas écrire dans la flash

    ;_CPD_OFF              mémoire EEprom déprotégée

    ;_LVP_OFF  RB3 en utilisation normale

    ; _BODEN_OFF  reset tension hors service

    ;_PWRTE_ON  démarrage temporisé

    ;_WDT_OFF  watchdog hors service

    ;_HS_OSC  oscillateur haute vitesse (20Mhz)

;********************************************************************************

;  MACRO      *

;********************************************************************************

BANK0 macro  ;passage en banque 0

bcf STATUS,RP0

bcf STATUS,RP1

endm  ;fin de la macro du passage en banque 0

BANK1 macro  ;passage en banque 0

bsf STATUS,RP0

bcf STATUS,RP1

endm  ;fin de la macro du passage en banque 1

BANK2 macro  ;passage en banque 2

bcf STATUS,RP0

bsf STATUS,RP1

endm  ;fin de la macro du passage en banque 2

BANK3 macro  ;passage en banque 3

bsf STATUS,RP0

bsf STATUS,RP1

endm  ;fin de la macro du passage en banque 3

;********************************************************************************

;  VARIABLES      *

;********************************************************************************

CBLOCK 0x70  ;début de la zone de variables (de 0x70 à 0x7F => 16 octets)

w_temp:1  ;variable servant à sauvergarder le registre W

status_temp:1  ;variable servant à sauvergarder le registre STATUS

ENDC  ;fin de la zone de variables

;********************************************************************************

;  DEMARRAGE SUR RESET    *

;********************************************************************************

org 0x0000  ;adresse de départ après un reset

  goto initialisation ;appel au programme d'initialisation

;********************************************************************************

;  ROUTINE D'INTERRUPTION    *

;********************************************************************************

org 0x0004  ;adresse d'interruption

movwf w_temp  ;sauvegarde le registre W

swapf STATUS,w ;swappe STATUS et met le résultat dans W

movwf status_temp ;sauvergarde STATUS swappé

swapf status_temp,w ;swappe le STATUS swappé pour qu'il reprenne sa valeur

movwf STATUS  ;restaure STATUS

swapf w_temp,f ;swappe (inverse les 4 MSB et les 4 LSB) le registre W

swapf w_temp,w ;reswappe le registre w et met la valeur dans W

retfie  ;retour d'interruption

;********************************************************************************

;  INITIALISATION      *

;********************************************************************************

initialisation

BANK0  ;sélection de la banque 0

clrf PORTB  ;met à 0 toutes les sorties du port B

clrf PORTD  ;met à 0 toutes les sorties du port D

BANK1  ;sélection de la banque 1

movlw B'00000001' ;définit b0 du port A en entrée

movwf TRISA  ;définit b0 du port A en entrée

clrf TRISB  ;définit le port B en sortie

clrf TRISD  ;définit le port D en sortie

movlw B'10000000' ;justification à droite, les 8 bits en entrées analogiques

movwf ADCON1  ;charge la valeur du registre1 de control de la conversion A/D

movlw B'10000111' ;résistance de pull-up inhibées, prédiviseur=1/256

movwf OPTION_REG ;charge la valeur du registre option

movlw B'01000000' ;autorisation des interruptions dûes aux périphéries

movwf INTCON  ;charge la valeur du registre d'interruption

movlw B'01000000' ;active les interruptions dûes au convertisseur A/D

movwf PIE1  ;charge la valeur du registre d'interruption des périphéries

clrf PIR1  ;efface les flags des interruptions

bsf INTCON,GIE ;valide les interruptions

goto start  ;appel au programme principal

;********************************************************************************

;  AQUISITION ANALOGIQUE    *

;********************************************************************************

aquisition

movlw B'00000001' ;diviseur par 2, sur le canal (b0 du port A), convertisseur ON

movwf ADCON0  ;charge la valeur du registre0 de control de la conversion A/D

nop  ;Fquartz=32kHz => Tquartz=31,25µs

nop  ;tempo de 62,5µs (2xnop)

bsf ADCON0,GO ;lancement de la convertion

boucle nop  ;boucle d'attente de fin de conversion

btfss PIR1,ADIF ;boucle d'attente de fin de conversion

goto boucle  ;boucle d'attente de fin de conversion

return

;********************************************************************************

;  PROGRAMME PRINCIPAL    *

;********************************************************************************

start

call aquisition ;appel au programme d'aquisition analogique

bcf ADCON0,ADON ;éteint le convertisseur

movlw ADRESL  ;lit la valeur après numérisation

movwf PORTB  ;applique la valeur de 8 bits sur le port B

goto start  ;permet de boucler

END  ;directive de fin de programme

 

Merci

Rejoindre la conversation

Vous pouvez publier maintenant et vous inscrire plus tard. Si vous avez un compte, connectez-vous maintenant pour publier avec votre compte.
Remarque : votre message nécessitera l’approbation d’un modérateur avant de pouvoir être visible.

Invité
Répondre à ce sujet…

×   Collé en tant que texte enrichi.   Coller en tant que texte brut à la place

  Seulement 75 émoticônes maximum sont autorisées.

×   Votre lien a été automatiquement intégré.   Afficher plutôt comme un lien

×   Votre contenu précédent a été rétabli.   Vider l’éditeur

×   Vous ne pouvez pas directement coller des images. Envoyez-les depuis votre ordinateur ou insérez-les depuis une URL.

  • En ligne récemment   0 membre est en ligne

    • Aucun utilisateur enregistré regarde cette page.
×
×
  • Créer...