leslie45
Messages postés61Date d'inscriptionvendredi 19 avril 2013StatutMembreDernière intervention10 juin 2016
-
5 mai 2014 à 17:21
bonjour à tous! j'aimerai afficher les résultats de la conversion analogique numérique du PIC 16F876. je me suis documenté et je suis encore débutante en ce qui concerne ce sujet et je n'arrive pas encore bien à cerner les notions des interruptions et des timers! voici mon code, quelqu'un peut m'aider svp!! je l'ai compilé, il n'y avait pas d'erreur mais j'arrive pas à avoir le résultat souhaité!
;***************************************************************************************
;* *
;* Réalisation d'une carte d'entrées/sorties analogiques pour banc de réglage *
;* *
;***************************************************************************************
;* *
;* NOM: projet.asm *
;* Date: 05/05/2014*
;* Auteurs:
;* *
;***************************************************************************************
;* *
;* Fichiers requis: P16F876.inc *
;* *
;***************************************************************************************
;* *
;* Notes: On utilise un oscillateur 4 MHz *
;* Les 12 bits de sortie sont disponibles après conversion numérique analogique sur le PORTC *
;***************************************************************************************
LIST p=16F876 ; Définition du processeur
#include <p16F876.inc> fichier include appel de la librairie
;les fichiers CONFIG
; _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
; _XT_OSC Oscillateur XT
__CONFIG _CP_OFF & _DEBUG_OFF & _WRT_ENABLE_OFF & _CPD_OFF & _LVP_OFF &
_BODEN_OFF & _PWRTE_ON & _WDT_OFF & _XT_OSC
;*********************************************************************************
; * ASSIGNATIONS SYSTEME *
;*********************************************************************************
; DIRECTION DES PORTS I/O, AFFECTATION DES E/S
; --------------------------------------------
; (1=entrée ; 0=sortie)
DIRPORTA EQU B'00000001' ; Direction PORTA (registre TRISA)
; RA0 : entrée analogique
; RA1 : N.C.
; RA2 : N.C.
; RA3 : N.C.
; RA4 : N.C.
; RA5 : N.C.
; on récupère le résultat de la conversion A->N
; dans les registres ADRESH (Bank0) et ADRESL (Bank1)
DIRPORTB EQU B'00000000' ; Direction PORTB
; RB0 : 2bits du bus de sortie
DIRPORTC EQU B'00000000' ; Direction PORTC
; RC0 à RC7 : 8 bits du bus de sortie
; REGISTRE ADCON1 (ANALOGIQUE/DIGITAL)
; -------------------------------------------------------------
ADCON1VAL EQU B'00001110' ; Registre ADCON1 (configuration du port A/D)
; PCFG = 1110 => 1 entrée analogique (RA0)
; ADFM = 0 => justification à gauche
; bit0 : PCFG0 : Port ConFiGuration control bit0
; bit1 : PCFG1 : Port ConFiGuration control bit1
; bit2 : PCFG2 : Port ConFiGuration control bit2
; bit3 : PCFG3 : Port ConFiGuration control bit3
; bit4 : Non implémenté
; bit5 : Non implémenté
; bit6 : Non implémenté
; bit7 : ADFM : A/D result ForMat select
;****************************************************************************
; VARIABLES ZONE COMMUNE *
;****************************************************************************
; Zone de 16 bytes
; -----------------------
CBLOCK 0x70 ; Début de la zone (0x70 à 0x7F)
w_temp : 1 ; Sauvegarde registre W
status_temp : 1 ; Sauvegarde registre STATUS
ENDC ; Fin de la zone
;****************************************************************************
;* DECLARATIONS DES VARIABLES *
;****************************************************************************
; Zone de 80 bytes
; ---------------------------------------------------------------------------
; Allocation de l_espace mémoire de la bank0 et déclaration des variables
CBLOCK 0x20 ; Début de la zone (0x20 à 0x6F)
menu : 1 ; pointeur de menu
cmpt1 : 1 ; compteur n°1
cmpt2 : 1 ; compteur n°2
resultConv : 1 ; résultat 8 bits de la conversion Analogique -> Numérique
resultConv2 : 1 ; ancien résultat 8 bits de la conversion Analogique -> Numérique
sourceInt : 1 ; source d_interruption
vartemp : 1 ; variable temporaire
vardigit : 1 ; variable de digit
varparam : 1 ; variable de paramètre
var1 : 1 ; variable n°1
var2 : 1 ; variable n°2
var3 : 1 ; variable n°3
ENDC ; Fin de la zone
;*************************************************************************
;* DEMARRAGE SUR RESET *
;*************************************************************************
org 0x000 ; Adresse de départ après reset
goto INIT ; Initialiser
;*************************************************************************
;* ROUTINE INTERRUPTION *
;*************************************************************************
;sauvegarder les 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é
BANK0 ; passer en banque0
; Test et appel des différentes interruptions
;-----------------------------------------------------
; Interruption convertisseur A/D
; ------------------------------
bsf STATUS , RP0 ; sélectionner banque1
btfss PIE1 , ADIE ; tester si interrupt autorisée
goto intsw4 ; non sauter
bcf STATUS , RP0 ; oui, sélectionner banque0
btfss PIR1 , ADIF ; tester si interrupt en cours
goto intsw4 ; non sauter
call intad ; oui, traiter interrupt
bcf PIR1 , ADIF ; effacer flag interupt
goto restorereg ; et fin d_interrupt
; Restaurer registres
RESTORE ; -----------------------
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 interruption
;*************************************************************************
;* INITIALISATIONS *
;*************************************************************************
INIT
; initialisation PORTS (banques 0 et 1)
; -------------------------------------------------
BANK0 ; sélectionner la banque0
clrf PORTA ; Sorties PORTA à 0
clrf PORTB ; Sorties PORTB à 0
clrf PORTC ; Sorties PORTC à 0
movlw ADCON0VAL ; Configuration du mode digital/analogique
movwf ADCON0 ; écriture dans le registre de contrôle A/D
bsf STATUS,RP0 ; sélectionner banque1
movlw ADCON1VAL ; PORTA en mode digital/analogique
movwf ADCON1 ; écriture dans le registre de contrôle A/D
movlw DIRPORTA ; Direction PORTA
movwf TRISA ; écriture dans le registre direction
movlw DIRPORTB ; Direction PORTB
movwf TRISB ; écriture dans le registre direction
movlw DIRPORTC ; Direction PORTC
movwf TRISC ; écriture dans le registre direction
; initialisation variables
; -----------------------------
clrf menu ; initialisation de « menu » pour qu'il pointe vers le menu général
clrf choixParam ; initialisation du de la variable de choix du paramètre à modifier
movlw 0x02
clrf resultConv ; initialisation de la variable de conversion A/N
goto START ; programme principal
;*****************************************************************
CONV
movf resultConv,w ; Chargement du resultat de la conversion precedente
movwf resultConv2 ; Stockage de l_ancien resultat de la conversion
; 1 - lancement du convertisseur : ADON = 1
; --------------------------------------------------------
bsf ADCON0,ADON
; 2 - attendre que l_acquisition soit effectuee (Tacq = 19.7 microsec)
; -------------------------------------------------------
movlw 0x07 ; nb de boucles
movwf cmpt1 ; initialiser compteur de boucles
LOOPACQ ; (LOOPACQ = 22 microsec pour cmpt1=x07 et osc=4MHz)
decfsz cmpt1,f ; decrementer le compteur de boucles
goto LOOPACQ ; if = 0 -> LOOPACQ
; 3 - demarrer la conversion en positionnant le bit GO du registre ADCON0
; ------------------------------------------------------------------------------------------------
bsf ADCON0,GO
; 4 - attendre que la conversion soit terminee (2Tad = 3.2 microsec)
; --------------------------------------------------------
movlw 0x01 ; nb de boucles
movwf cmpt1 ; initialiser compteur de boucles
LOOPAD ; (LOOPAD = 4 microsecs pour cmpt1=x01 et osc=4MHz)
decfsz cmpt1,f ; decrementer le compteur de boucles
goto LOOPAD ; if = 0 -> LOOPAD
; 5 - Lire le resultat de la conversion dans ADRESH
; ---------------------------------------------------------------
movf ADRESH,w ; Chargement du registre ADRESH
movwf resultConv ; Stockage des 8 bits du resultat de la conversion
return
;*********************************************************************************
;* PROGRAMME PRINCIPAL *
;*********************************************************************************
START
org 0x300
CALL CONV ; routine d_acquisition et de conversion du signal d_entrée analogique
; (une première acquisition est nécessaire
LOOP
CALL CONV ; routine d_acquisition et de conversion du signal d_entrée analogique
movwf PORTC ; Ecriture sur le PORTC des 8 bits du résultat de la conversion
goto LOOP
end