;***************************************************************************** ; Ce fichier est la base de départ pour une programmation avec * ; le PIC 12F675. Il contient les informations de base pour * ; démarrer. * ; ecrit grace à Bigonoff par gilles.chevalerias@Ifrance.com * ;***************************************************************************** ; * ; NOM: * ; Date: * ; Version: * ; Circuit: * ; Auteur: * ; * ;***************************************************************************** ; * ; Fichier requis: P12F675.inc * ; * ; * ; * ;***************************************************************************** ; * ; Notes: * ; * ; * ; * ; * ;***************************************************************************** ERRORLEVEL -302 ; suppression du message bank select LIST p=12F675 ; Définition de processeur #include ; fichier include __CONFIG _CP_OFF & _CPD_OFF & _BODEN_OFF & _MCLRE_ON & _PWRTE_ON & _WDT_OFF & _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. ; Choisir une valeur par groupe. ; Voici les valeurs et leurs définitions : ; Protection du programme ; ----------------------- ;_CP_ON protection totale ;_CP_OFF Pas de protection ; Protection de la EEprom ; ----------------------- ;_CPD_ON Mémoire EEprom protégée ;_CPD_OFF Mémoire EEprom déprotégée ; Reset de la PIC si tension <4V ; ------------------------------ ; _BODEN_ON Reset tension en service ; Valide PWRTE_ON automatiquement ; _BODEN_OFF Reset tension hors service ;Utilisation de la pin MCLR ; ------------------------------ ;_MCLRE_ON GP3/MCLR est utilise pour le reset ; ;_MCLRE_OFF GP3/MCLR est utilise comme une entree/sortie ; 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 ; ----------- ;_INTRC_OSC_CLKOUT oscillateur interne clkout sur GP4 I/O sur GP5 (4MHz) ;_INTRC_OSC_NOCLKOUT oscillateur interne I/O sur GP4 et GP5 (4MHz) ;_EXTRC_OSC_NOCLKOUT signal clock fournit au pic sur GP5 par pont RC I/O sur GP4 ;_EXTRC_OSC_CLKOUT signal clock fournit au pic sur GP5 par pont RC clckout sur GP4 ;_EC_OSC signal clock fournit au pic sur GP5 I/O sur GP4 ;_LP_OSC Oscillateur basse vitesse (? doit être >= à 1.6us ; ANS3-ANS0 b3-b0 : selection des entrées analogiques utilisées ; : respectivement GP4-GP2-GP1-GP0 sans GP3, ; : si =1 entrée analogique sinon e/s numérique ; REGISTRE ADCON0 (controle l'ADC) ; ------------------------------------- ADCON0VAL EQU B'00000000' ; ; ADFM b7 : si=0 justification à gauche (utilisation facile en 8 bits moins de precision) ; si=1 justification à droite ; VCFG b6 : si=1 utilisation de GP1 en Vref ; si=0 utilisation de VDD en vref ; réservé b5 : réservé, laisser à 0 ; réservé b4 : réservé, laisser à 0 ; CHS1-CHS0 b3-2 : sélection de l'entrée à digitaliser ; 00=AN0, 01=AN1, 10=AN2, 11=AN3 ; GO/DONE b1 : si =1 Démarre une convertion (les comparaisons succesives) ; remis à 0 automatiquement ; ADON b0 : si=1 commence la charge du condensateur interne ; doit être fixé à 1 avant GO ; DIRECTION DES PORTS I/O ; ----------------------- DIRPORT EQU B'00111111' ; Direction PORT 6 I/O (1=entrée) ;***************************************************************************** ; ASSIGNATIONS PROGRAMME * ;***************************************************************************** ; exemple ; ------- ;MASQUE EQU H'00FF' ;***************************************************************************** ; DEFINE * ;***************************************************************************** ; exemple ; ------- ;#DEFINE LED1 PORTB,1 ; LED de sortie 1 ;***************************************************************************** ; MACRO * ;***************************************************************************** ; Changement de banques ; ---------------------- BANK0 macro ; passer en banque0 bcf STATUS,RP0 endm BANK1 macro ; passer en banque1 bsf STATUS,RP0 endm ; opérations en mémoire eeprom ; ----------------------------- REEPROM macro adeeprom ; lire eeprom (adresse dans adeeprom & résultat en w) movlw adeeprom ; charger adresse eeprom (passage de la valeur en litteral) ;movf adeeprom,w ; charger adresse eeprom (passage de la valeur par une variable) clrwdt ; reset watchdog BANK1 ; passer en banque1 movwf EEADR ; pointer sur adresse eeprom bsf EECON1,RD ; ordre de lecture movf EEDATA,w ; charger valeur lue BANK0 ; passer en banque0 endm WEEPROM macro addwrite ; la donnée se trouve dans W LOCAL loop BANK1 ; passer en banque1 movwf EEDATA ; placer data dans registre movlw addwrite ; charger adresse d'écriture (passage de la valeur en litteral) ;movf addwrite,w ; charger adresse d'écriture (passage de la valeur par une variable) movwf EEADR ; placer dans registre bsf EECON1 , WREN ; autoriser accès écriture bcf INTCON , GIE ; interdire interruptions movlw 0x55 ; charger 0x55 movwf EECON2 ; envoyer commande movlw 0xAA ; charger 0xAA movwf EECON2 ; envoyer commande bsf EECON1 , WR ; lancer cycle d'écriture bsf INTCON , GIE ; réautoriser interruptions loop btfsc EECON1 , WR ; tester si écriture terminée goto loop ; non, attendre bcf EECON1 , WREN ; verrouiller prochaine écriture BANK0 ; passer en banque0 endm ;***************************************************************************** ; VARIABLES ZONE COMMUNE * ;***************************************************************************** ; Zone de 64 bytes ; ---------------- CBLOCK 0x20 ; Début de la zone (0x20 à 0x5F) w_temp : 1 ; Sauvegarde registre W status_temp : 1 ; sauvegarde registre STATUS FSR_temp : 1 ; sauvegarde FSR (si indirect en interrupt) ENDC ;***************************************************************************** ; DEMARRAGE SUR RESET * ;***************************************************************************** org 0x000 ; Adresse de départ après reset goto init ; Initialiser ; //////////////////////////////////////////////////////////////////////////// ; I N T E R R U P T I O N S ; //////////////////////////////////////////////////////////////////////////// ;***************************************************************************** ; ROUTINE INTERRUPTION * ;***************************************************************************** ;----------------------------------------------------------------------------- ; Si on n'utilise pas l'adressage indirect dans les interrupts, on se passera ; de sauvegarder FSR ;----------------------------------------------------------------------------- ;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é movf FSR , w ; charger FSR movwf FSR_temp ; sauvegarder FSR BANK0 ; passer en banque0 ; switch vers différentes interrupts ; inverser ordre pour modifier priorités ; mais attention alors au test PEIE ; effacer les inutiles ;---------------------------------------- ; Interruption TMR0 ; ----------------- 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 inttmr0 ; oui, traiter interrupt tmr0 bcf INTCON,T0IF ; effacer flag interrupt tmr0 goto restorereg ; et fin d'interruption ; SUPPRIMER CETTE LIGNE POUR ; TRAITER PLUSIEURS INTERRUPT ; EN 1 SEULE FOIS ; Interruption GP2/INT ; -------------------- intsw1 btfsc INTCON,INTE ; tester si interrupt GP2/INT autorisée btfss INTCON,INTF ; oui, tester si interrupt GP2/INT en cours goto intsw2 ; non sauter au test suivant call intrgp2 ; oui, traiter interrupt GP2/INT bcf INTCON,INTF ; effacer flag interupt GP2/INT goto restorereg ; et fin d'interruption ; SUPPRIMER CETTE LIGNE POUR ; TRAITER PLUSIEURS INTERRUPT ; EN 1 SEULE FOIS ; interruption GPIO ; -------------------- intsw2 btfsc INTCON,GPIE ; tester si interrupt GPIO autorisée btfss INTCON,GPIF ; oui, tester si interrupt GPIO en cours goto intsw3 ; non sauter call intgpio ; oui, traiter interrupt GPIO bcf INTCON,GPIF ; effacer flag interupt GPIO goto restorereg ; et fin d'interrupt ; détection interruptions périphériques ; le test peut être supprimé si une seule ; interrupt est traitée à la fois ; -------------------------------------- intsw3 btfss INTCON,PEIE ; tester interruption périphérique autorisée goto restorereg ; non, fin d'interruption ; Interruption comparateurs ; ------------------------- intsw4 BANK1 ; sélectionner banque1 btfss PIE1,CMIE ; tester si interrupt autorisée goto intsw5 ; non sauter BANK0 ; oui, sélectionner banque0 btfss PIR1,CMIF ; oui, tester si interrupt en cours goto intsw5 ; non sauter call intcmp ; oui, traiter interrupt ; LE FLAG NE DOIT PAS ETRE REMIS A 0 ; C'EST L'ECRITURE DE TXREG QUI LE PROVOQUE goto restorereg ; et fin d'interrupt ; Interruption TMR1 ; ----------------- intsw5 BANK1 ; sélectionner banque1 btfss PIE1,TMR1IE ; tester si interrupt autorisée goto intswA ; non sauter BANK0 ; oui, sélectionner banque0 btfss PIR1,TMR1IF ; oui, tester si interrupt en cours goto intswA ; non sauter call inttmr1 ; oui, traiter interrupt bcf PIR1,TMR1IF ; effacer flag interupt goto restorereg ; et fin d'interrupt ; Interruption EEPROM ; ------------------- intswA BANK1 ; sélectionner banque1 btfss PIE1,EEIE ; tester si interrupt autorisée goto restorereg ; non sauter BANK0 ; oui, sélectionner banque0 btfss PIR1,EEIF ; oui, tester si interrupt en cours goto restorereg ; non sauter call inteprom ; oui, traiter interrupt bcf PIR1,EEIF ; effacer flag interupt goto restorereg ; et fin d'interrupt ;restaurer registres ;------------------- restorereg movf FSR_temp , w ; charger FSR sauvé movwf FSR ; restaurer FSR 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 * ;***************************************************************************** inttmr0 return ; fin d'interruption timer ; peut être remplacé par ; retlw pour retour code d'erreur ;***************************************************************************** ; INTERRUPTION GP2/INT * ;***************************************************************************** intrgp2 return ; fin d'interruption GP2/INT ; peut être remplacé par ; retlw pour retour code d'erreur ;***************************************************************************** ; INTERRUPTION GPIO * ;***************************************************************************** intgpio return ; fin d'interruption GPIO ; peut être remplacé par ; retlw pour retour code d'erreur ;**************************************************************************** ; INTERUPTION COMPARATEUR * ;**************************************************************************** intcmp return ; fin d'interruption ; peut être remplacé par ; retlw pour retour code d'erreur ;***************************************************************************** ; INTERRUPTION TIMER 1 * ;***************************************************************************** inttmr1 return ; fin d'interruption ; peut être remplacé par ; retlw pour retour code d'erreur ;***************************************************************************** ; INTERRUPTION EEPROM * ;***************************************************************************** inteprom return ; fin d'interruption ; peut être remplacé par ; retlw pour retour code d'erreur ; //////////////////////////////////////////////////////////////////////////// ; P R O G R A M M E ; //////////////////////////////////////////////////////////////////////////// ;***************************************************************************** ; INITIALISATIONS * ;***************************************************************************** init ; initialisation PORTS (banque 0 et 1) ; ------------------------------------ BANK0 ; sélectionner banque0 clrf GPIO ; Sorties PORT à 0 BANK1 ; passer en banque1 movlw DIRPORT ; Direction PORT movwf TRISIO ; écriture dans registre direction ; Registre d'options (banque 1) ; ----------------------------- movlw OPTIONVAL ; charger masque movwf OPTION_REG ; initialiser registre option ; Registre ANSEL (banque 1) ; ----------------------------- movlw ANSELVAL ; charger masque movwf ANSEL ; initialiser registre ANSEL ; registres interruptions (banque 1) ; ---------------------------------- movlw INTCONVAL ; charger valeur registre interruption movwf INTCON ; initialiser interruptions movlw PIE1VAL ; Initialiser registre movwf PIE1 ; interruptions périphériques 1 movlw VRCONVAL ; charger valeur registre interruption movwf VRCON ; initialiser interruptions movlw IOCVAL ; charger valeur registre interruption movwf IOC ; initialiser interruptions BANK0 ; sélectionner banque 0 movlw CMCONVAL ; charger valeur registre interruption movwf CMCON ; initialiser interruptions ; Registre ADCON0 (banque 0) ; ----------------------------- BANK0 ; sélection de banque0 movlw ADCON0VAL ; charger masque movwf ADCON0 ; initialiser registre ADCON0 ; Effacer RAM banque 0 ; --------------------- movlw 0x20 ; initialisation pointeur movwf FSR ; d'adressage indirect init1 clrf INDF ; effacer ram incf FSR,f ; pointer sur suivant btfss FSR,7 ; tester si fin zone atteinte (>5F) goto init1 ; non, boucler ; autoriser interruptions (banque 0) ; ---------------------------------- clrf PIR1 ; effacer flags 1 bsf INTCON,GIE ; valider interruptions goto start ; programme principal ;***************************************************************************** ; PROGRAMME PRINCIPAL * ;***************************************************************************** start clrwdt ; effacer watch dog goto start ; boucler END ; directive fin de programme