;********************************************************************** ; Ce fichier est la base de départ pour une programmation avec * ; le PIC 12F675. Il contient les informations de base pour * ; démarrer. * ; * ; Si les interruptions ne sont pas utilisées, supprimez les lignes * ; entre ORG 0x004 et l'étiquette init. De plus, les variables * ; w_temp et status_temp peuvent être supprimées. * ; * ;********************************************************************** ; * ; NOM: * ; Date: * ; Version: * ; Circuit: * ; Auteur: * ; * ;********************************************************************** ; * ; Fichier requis: P12F675.inc * ; * ; * ; * ;********************************************************************** ; * ; Notes: * ; * ; * ; * ; * ;********************************************************************** LIST p=12F675 ; Définition de processeur #include ; Définitions des constantes __CONFIG _CPD_OFF & _CP_OFF & _BODEN_OFF & _MCLRE_ON & _PWRTE_ON & _WDT_ON & _HS_OSC ; '__CONFIG' précise les paramètres encodés dans le processeur au moment de ; la programmation du processeur. Les définitions sont dans le fichier include. ; Voici les valeurs et leurs définitions : ; Protection de l'EEPROM ; ---------------------- ; _CPD_ON EEPROM protection ON ; _CPD_OFF EEPROM protection OFF ; Protection du programme ; ----------------------- ; _CP_ON Code protection ON : impossible de relire ; _CP_OFF Code protection OFF ; Reset du PIC si tension <4V ; --------------------------- ; _BODEN_ON Reset tension en service ; Valide PWRTE_ON automatiquement ; _BODEN_OFF Reset tension hors service ; Utilisation de GP3/MCLR ; ------------------- ; _MCLRE_ON GP3/MCLR joue le rôle de MCLR ; _MCLRE_OFF GP3/MCLR joue le rôle de GP3 (MCLR reliée en interne à VDD) ; Retard à la mise sous tension ; ----------------------------- ; _PWRTE_OFF Démarrage rapide ; _PWRTE_ON Démarrage temporisé ; Watchdog ; -------- ; _WDT_ON Watchdog en service ; _WDT_OFF Watchdog hors service ; Oscillateur ; ----------- ; _LP_OSC Oscillateur quartz basse vitesse ; _XT_OSC Oscillateur quartz moyenne vitesse ; _HS_OSC Oscillateur quartz grande vitesse ; _EC_OSC GP4/OSC2/CLKOUT mode E/S, GP5/OSC1/CLKIN mode CLKIN ; _INTRC_OSC_NOCLKOUT GP4/OSC2/CLKOUT mode E/S, GP5/OSC1/CLKIN mode E/S Oscillateur interne ; _INTRC_OSC_CLKOUT GP4/OSC2/CLKOUT mode CLKOUT, GP5/OSC1/CLKIN mode E/S Oscillateur interne ; _EXTRC_OSC_NOCLKOUT GP4/OSC2/CLKOUT mode E/S, GP5/OSC1/CLKIN mode oscillateur RC ; _EXTRC_OSC_CLKOUT GP4/OSC2/CLKOUT mode CLKOUT, GP5/OSC1/CLKIN mode oscillateur RC ;********************************************************************* ; ASSIGNATIONS * ;********************************************************************* ; REGISTRE OSCCAL (calibration oscillateur) ; ----------------------------------------- OSCCALVAL EQU B'10000000' ; Calibration de l'oscillateur interne ; b0-1 inutilisés ; '11111100' Frequence maximum ; '10000000' Frequence moyenne ; '00000000' Frequence minimum ; REGISTRE OPTION_REG (configuration) ; ----------------------------------- OPTIONVAL EQU B'00000000' ; GPPU b7 : 1= Résistance rappel +5V hors service ; INTEDG b6 : 1= Interrupt sur front montant de GP2 ; 0= Interrupt sur front descend. de GP2 ; TOCS b5 : 1= source clock = transition sur GP2 ; 0= horloge interne ; TOSE b4 : 1= Tmr0, Sélection front montant GP2 ; 0= Tmr0, Sélection front descendant GP2 ; PSA b3 : 1= Assignation prédiviseur sur Watchdog ; 0= Assignation prédiviseur sur Tmr0 ; PS2/PS0 b2/b0 valeur du prédiviseur ; 000 = 1/1 (watchdog) ou 1/2 (tmr0) ; 001 = 1/2 1/4 ; 010 = 1/4 1/8 ; 011 = 1/8 1/16 ; 100 = 1/16 1/32 ; 101 = 1/32 1/64 ; 110 = 1/64 1/128 ; 111 = 1/128 1/256 ; REGISTRE INTCON (contrôle interruptions standard) ; ------------------------------------------------- INTCONVAL EQU B'00000000' ; GIE b7 : 0= masque toutes les interruptions ; PEIE b6 : 0= masque toutes les interruptions périphériques ; T0IE b5 : 0= masque les interruptions tmr0 ; INTE b4 : 0= masque les interruptions GP2/Int ; GPIE b3 : 0= masque les interruptions GP0/GP5 ; T0IF b2 : flag tmr0 ; INTF b1 : flag GP2/Int ; GPIF b0 : flag interruption GP0/GP5 ; REGISTRE PIE1 (contrôle interruptions périphériques) ; ---------------------------------------------------- PIE1VAL EQU B'00000000' ; EEIE b7 : 0= masque interruption de fin d'écriture EEPROM ; ADIE b6 : 0= masque interruption convertisseur A/D ; b5 : inutilisé ; b4 : inutilisé ; CMIE b3 : 0= masque interruption comparateur ; b2 : inutilisé ; b1 : inutilisé ; TMR1IE b0 : 0= masque interruption débordement tmr1 ; REGISTRE WPU (pull-up) ; ---------------------- WPUVAL EQU B'00110111' ; b7 : inutilisé ; b6 : inutilisé ; b5 : 0= pull-up GP5 hors-service ; b4 : 0= pull-up GP4 hors-service ; b3 : inutilisé ; b2 : 0= pull-up GP2 hors-service ; b1 : 0= pull-up GP1 hors-service ; b0 : 0= pull-up GP0 hors-service ; REGISTRE IOC (contrôle interruptions detaillé) ; ---------------------------------------------- IOCVAL EQU B'00111111' ; b7 : inutilisé ; b6 : inutilisé ; b5 : 0= masque interruption sur GP5 ; b4 : 0= masque interruption sur GP4 ; b3 : 0= masque interruption sur GP3 ; b2 : 0= masque interruption sur GP2 ; b1 : 0= masque interruption sur GP1 ; b0 : 0= masque interruption sur GP0 ; REGISTRE ANSEL (ANALOGIQUE/DIGITAL) ; ----------------------------------- ANSELVAL EQU B'00001111' ; b7 : inutilisé ; b6-4 : Sélection de l'horloge de conversion ; b3 : 1= GP3 en mode analogique (AN3) ; b2 : 1= GP2 en mode analogique (AN2) ; b1 : 1= GP1 en mode analogique (AN1) ; b0 : 1= GP0 en mode analogique (AN0) ; REGISTRE CMCON (COMPARATEUR) ; ---------------------------- CMCONVAL EQU B'00000111' ; b7 : inutilisé ; b6 : 1= COUT = Vin+ > Vin- (inversé si Cinv = 1) ; b5 : inutilisé ; b4 : 1= Entrées inversées (Cinv) ; b3 : 1= Vin- connecté à Cin+, 0= à Cin- ; b2-0 : Modes de comparaison ; DIRECTION DU PORT I/O ; --------------------- DIRGP EQU B'00111111' ; Direction GP (1=entrée) ;********************************************************************* ; DEFINE * ;********************************************************************* ; exemple ; #DEFINE LED1 PORTB,1 ; LED de sortie 1 ;********************************************************************* ; MACRO * ;********************************************************************* BANK0 macro bcf STATUS,RP0 ; passer banque0 endm BANK1 macro bsf STATUS,RP0 ; passer banque1 endm READEE macro adeeprom ; lecture d'une adresse EEPROM bsf STATUS,RP0 ; passer en banque1 movlw adeeprom ; charger adresse eeprom movwf EEADR ; adresse à lire dans registre EEADR bsf EECON1,RD ; lancer la lecture EEPROM movf EEDATA,w ; charger valeur lue dans W bcf STATUS,RP0 ; repasser en banque0 endm ; fin de la macro WRITEE macro addwrite ; la donnée se trouve dans W LOCAL loop ; étiquette locale bsf STATUS,RP0 ; passer en banque1 movwf EEDATA ; placer data dans registre movf addwrite,w ; charger adresse d'écriture movwf EEADR ; placer dans registre loop bcf INTCON,GIE ; interdire interruptions btfsc INTCON,GIE ; tester si GIE bien à 0 goto loop ; non, recommencer bcf EECON1,EEIF ; effacer flag de fin d'écriture bsf EECON1,WREN ; autoriser accès écriture movlw 0x55 ; charger 0x55 movwf EECON2 ; envoyer commande movlw 0xAA ; charger 0xAA movwf EECON2 ; envoyer commande bsf EECON1,WR ; lancer cycle d'écriture bcf EECON1,WREN ; verrouiller prochaine écriture bsf INTCON,GIE ; réautoriser interruptions bcf STATUS,RP0 ; repasser en banque0 endm ;********************************************************************* ; DECLARATIONS DE VARIABLES * ;********************************************************************* CBLOCK 0x020 ; début de la zone variables w_temp :1 ; Sauvegarde du registre W status_temp : 1 ; Sauvegarde du registre STATUS ENDC ; Fin de la zone ;********************************************************************* ; DECLARATIONS DE LA ZONE EEPROM * ;********************************************************************* ; org 0x2100 ; adresse début zone eeprom ; DE 0x07 ; exemple de data ;#DEFINE eereload 0x00 ; adresse eeprom de la data ;********************************************************************** ; 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 movwf w_temp ; sauver registre W swapf STATUS,w ; swap status avec résultat dans w movwf status_temp ; sauver status swappé ; switch vers différentes interrupts ; inverser ordre pour modifier priorités ;---------------------------------------- btfsc INTCON,T0IE ; tester si interrupt timer autorisée btfss INTCON,T0IF ; oui, tester si interrupt timer en cours goto intsw1 ; non test suivant call inttimer ; oui, traiter interrupt timer bcf INTCON,T0IF ; effacer flag interrupt timer goto restorereg ; et fin d'interruption ; SUPPRIMER CETTE LIGNE POUR ; TRAITER PLUSIEURS INTERRUPT ; EN 1 SEULE FOIS intsw1 btfsc INTCON,INTE ; tester si interrupt GP2 autorisée btfss INTCON,INTF ; oui, tester si interrupt GP2 en cours goto intsw2 ; non sauter au test suivant call intgp2 ; oui, traiter interrupt GP2 bcf INTCON,INTF ; effacer flag interupt GP2 goto restorereg ; et fin d'interruption ; SUPPRIMER CETTE LIGNE POUR ; TRAITER PLUSIEURS INTERRUPT ; EN 1 SEULE FOIS intsw2 btfsc INTCON,GPIE ; tester si interrupt GP0/5 autorisée btfss INTCON,GPIF ; oui, tester si interrupt GP0/5 en cours goto intsw3 ; non sauter call intgp0 ; oui, traiter interrupt GP0/5 bcf INTCON,GPIF ; effacer flag interupt GP0/5 goto restorereg ; et fin d'interrupt ; SUPPRIMER CETTE LIGNE POUR ; TRAITER PLUSIEURS INTERRUPT ; EN 1 SEULE FOIS intsw3 BANK1 ; passer banque1 btfsc INTCON,EEIE ; tester si interrupt EEPROM autorisée btfss EECON1,EEIF ; oui,tester si interrupt EEPROM goto restorereg ; non sauter call inteep ; traiter interruption eeprom ;restaurer registres ;------------------- restorereg 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 interrupt ;********************************************************************** ; INTERRUPTION TIMER 0 * ;********************************************************************** inttimer return ; fin d'interruption timer ; peut être remplacé par ; retlw pour retour code d'erreur ;********************************************************************** ; INTERRUPTION RB0/INT * ;********************************************************************** intgp2 return ; fin d'interruption RB0/INT ; peut être remplacé par ; retlw pour retour code d'erreur ;********************************************************************** ; INTERRUPTION RB0/RB4 * ;********************************************************************** intgp0 return ; fin d'interruption RB0/RB4 ; peut être remplacé par ; retlw pour retour code d'erreur ;********************************************************************** ; INTERRUPTION EEPROM * ;********************************************************************** inteep return ; fin d'interruption eeprom ; peut être remplacé par ; retlw pour retour code d'erreur ;********************************************************************* ; INITIALISATIONS * ;********************************************************************* init clrf GPIO ; Sorties GPIO à 0 BANK1 ; passer banque1 clrf EEADR ; permet de diminuer la consommation movlw OSCCALVAL ; charger la valeur movwf OSCCAL ; pour calibrer l'oscillateur interne movlw OPTIONVAL ; charger masque movwf OPTION_REG ; initialiser registre option movlw PIE1VAL ; charger masque movwf PIE1 ; initialiser registre PIE1 movlw WPUVAL ; charger masque movwf WPU ; initialiser registre WPU movlw IOCVAL ; charger masque movwf IOC ; initialiser registre IOC movlw IOCVAL ; charger masque movwf IOC ; initialiser registre IOC movlw ANSELVAL ; charger masque movwf ANSEL ; initialiser registre ANSEL ; Effacer RAM ; ------------ movlw 0x20 ; initialisation pointeur movwf FSR ; pointeur d'adressage indirect 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 (>=60) goto init1 ; non, boucler movlw DIRGP ; Direction GP movwf TRISIO ; écriture dans registre direction BANK0 ; passer banque0 movlw CMCONVAL ; masque de comparaison movwf CMCON ; chager comparaison control movlw INTCONVAL ; masque interruption movwf INTCON ; charger interrupt control goto start ; sauter programme principal ;********************************************************************* ; PROGRAMME PRINCIPAL * ;********************************************************************* start clrwdt ; effacer watch dog goto start ; boucler END ; directive fin de programme