Le programme ci-dessous devrait armer puis faire basculer la broche GPIO5 (broche 2) d'un PIC 12F675. Or rien ne se passe, même dans le simulateur de MPLAB, l'instruction
Code : Tout sélectionner
bsf PTDI
où PTDI est défini par
Code : Tout sélectionner
#DEFINE PTDI GPIO,5 ; commande du point décimal
est sans effet sur GPIO
Si quelqu'un peut me mettre sur la voie, merci d'avance
Code : Tout sélectionner
;**********************************************************************
; PROGRAMME DE CLIGNOTEMENT DU POINT DECIMAL D'UN TDS03160 *
; COMMANDE PAR UN PIC16F84. *
; *
;**********************************************************************
; *
; NOM: Test1 *
; Date: 15/11/2017 *
; Version: 1.0 *
; Circuit: Platine d'essais *
; Auteur: JJE *
; *
;**********************************************************************
; *
; Fichier requis: p12F675.inc *
; *
;**********************************************************************
; *
; Notes: Ce petit programme permet de faire clignoter une LED *
; sur le port A.2 à une fréquence de 1Hz *
; Ce programme fait partie de la leçon 6 des cours *
; *
;**********************************************************************
LIST p=PIC12F675 ; Définition du processeur
#INCLUDE <p12F675.inc> ; Définitions des 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. 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'81' ; bit 7 = 1 :GPIO pull-ups disabled
; bit 6 = 0 : sans objet
; bit 5 = 0 : internal cycle clock
; bit 4 = 0 : sans objet
; bit 3 = 0 : prescaler is assiogned to
; TIMER0 module
; bit 2-0 = 001 : prescaler rate 1:4
; cf page 14 du DataSheet
ANSELVAL EQU H'00' ; ADCS<2:0> = 000 sans objet
; ANS3: ANS0 = 000 pas d'entrée analogique
; cf page 46 du DataSheet
INTCONVAL EQU H'80' ; bit 7 = 1 : Enables unlasked interrupts
; bit 6 = 0 : disables all peripheral interrupts
; bit 5 = 0 : disables TMR0 interrupt
; bit 4 = 0 : disables GPIO port change interrupt
; bit 3-0 = 0 sans objet
; cf page 15 du DataSheet
TIMER0VAL EQU .9 ; valeur initial de TIMER0 pour obtenir
; une IT toutes les 10ms avec un
; prescaler à 4 et une fréquence de 4MH
Nb_ITVAL EQU .10 ; pour simuler unr IT toutes les 10ms
cmpt50VAL EQU .50 ; pour simuler une IT toutes les 500ms
;*********************************************************************
; DEFINE *
;*********************************************************************
#DEFINE PTDI GPIO,5 ; commande du point décimal
#DEFINE T0ITE INTCON,T0IE ; @ bit T0IE Timer 0 IT Enable bit
;*********************************************************************
; MACRO *
;*********************************************************************
BANK1 macro
bsf STATUS,RP0
endm
BANK0 macro
bcf STATUS,RP0
endm
PTDION macro
bsf PTDI
endm
PTDIOFF macro
bcf PTDI
endm
;*********************************************************************
; DECLARATIONS DE VARIABLES *
;*********************************************************************
CBLOCK 0x020 ; Début de la zone des variables
; sauvegardes pour l'IT
w_temp : 1 ; W
status_temp : 1 ; STATUS
Nb_IT : 1 ; compteur d'IT pour 10 ms
cmpt50 : 1 ; compteur pour 50 ms
ENDC ; Fin de la zone
;**********************************************************************
; 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
; interruption reçue toutes les 1ms
movwf w_temp ; 1 sauver registre W
swapf STATUS,w ; 2 swap status avec résultat dans w
movwf status_temp ; 3 sauver status swappé
BANK0
btfsc INTCON,T0IE ; 4/5 tester si interrupt timer autorisée
btfss INTCON,T0IF ; 5/6 oui, tester si interrupt timer en cours
goto int2 ; 7 non, c'est une autre interrupt
goto $+1 ; 9
bcf INTCON,T0IF ; 10 effacer flag interrupt timer
movlw TIMER0VAL ; 11
movwf TMR0 ; 12
; à ce moment, TIMER0 va compter 986 micro-cycles et reviendra au début de
; ce sous-programme de gestion des IT ce qui compte tenu des instructions
; qui précèdent et des deux non décomptées après l'initialisation de TMR0
; ammène bien à 1000 micro-cycles, soit 1000 microsecondes
call inttimer ; traiter interrupt timer
goto restorereg
int2 ; traitement éventuel des autres interruptions
nop
; restaurer registres
restorereg
swapf status_temp,w ; 2 swap ancien status, résultat dans w
movwf STATUS ; 3 restaurer status
swapf w_temp,f ; 4 Inversion L et H de l'ancien W
; sans modifier Z
swapf w_temp,w ; 5 Réinversion de L et H dans W
; W restauré sans modifier status
retfie ; 7 return from interrupt
;**********************************************************************
; INTERRUPTION TIMER 0
;**********************************************************************
; Cette routine est appelée toute le 1ms
inttimer
decfsz Nb_IT, f
return
; ici, on passe toutes les 10ms
; on réinitialise le compteur d'IT
movlw Nb_ITVAL
movwf Nb_IT
; on décrémente le compteur de passages
decfsz cmpt50, f
return
; ici on passe toutes les 500ms
; cette routine est appelée toutes les 500ms
; on réinitialise le compteur de passages
movlw cmpt50VAL
movwf cmpt50
; et on bascule l'état de GPIO5
movlw B'00100000'
xorwf GPIO,f
return ; 13
;*********************************************************************
; PROGRAMME PRINCIPAL *
;*********************************************************************
; Initialisations
; ---------------
init
clrf GPIO ; Sorties à 0
BANK1 ; sélectionner banque 1
movlw OPTIONVAL ; charger masque
movwf OPTION_REG ; initialiser registre option
clrf TRISIO ; GPIO tous les ports en sortie
movlw ANSELVAL
movwf ANSEL ; initialise ANSEL
BANK0
movlw INTCONVAL
movwf INTCON ; initialise INTCON
; Effacer RAM
; ------------
movlw 0x020 ; 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,5 ; tester si fin zone atteinte (>=50)
goto init1 ; non, boucler
; initialisations spécifiques
; ---------------------------
bsf PTDI ; Allume le point décimal
movlw Nb_ITVAL
movwf Nb_IT
movlw cmpt50VAL
movwf cmpt50
movlw TIMER0VAL
movwf TMR0
bsf INTCON,PEIE
bsf INTCON,T0IE ; autoriser l'IT Timer0
start
goto start ; boucle sans fin, le travail est fait sous IT
END ; directive fin de programme




