Voici la base pour un 18F4525 qui utilise TMR0 en interruption toute les 100 milliseconde, incrémente une variable qui sera testé dans la boucle principale pour inverser le bit 1 du portB avec pour effet une led qui clignote
Code : Tout sélectionner
; descriptif du projet:
;********************************************************************
; essai de programation pic 18f4525
; led clignotante avec timer 0
;
;;********************************************************************
;
; Auteur : JMarc
; Version : 1.0
; Date : 2017
;
;*******************************************************************************
; Note:PIC 18F4525 par exemple
; led sur portB,1
; timer 0 toute les 100 ms si quartz 4 mega hertz
;
;*******************************************************************************
ERRORLEVEL-302
list p=18f4525 ;liste directive
#include "p18f4525.inc"
;=============================================================================
;-----------------------------------------------------------------------------
; Définissez vos choix ici
; Les commandes seront traitées par assemblage conditionnel
;-----------------------------------------------------------------------------
TYPEINT EQU 0 ; 0 pour interruptions classiques
; 1 pour interruptions avec priorité
;=============================================================================
; CONFIGURATIONS EN MODE NORMAL =
;=============================================================================
;-----------------------------------------------------------------------------
; Remplacer les paramètres proposés par une des alternatives possibles
; proposées entre parenthèses
; A partir de MPLAB7, la directive "CONFIG" remplace la directive "__CONFIG"
;-----------------------------------------------------------------------------
CONFIG OSC = HS ; Oscillateur principal (LP,XT,HS,RC,EC,ECIO,HSPLL,RCIO)
; CONFIG OSCS = OFF ; Oscillateur secondaire refusé (ON/OFF)
IFNDEF DEBUG
CONFIG PWRT = OFF ; Délai au démarrage (ON/OFF)
; CONFIG BOR = ON ; Reset si chute de tension (ON/OFF)
; CONFIG BORV = 42 ; Tension de reset en 1/10ème Volts (20,27,42,45)
CONFIG WDT = OFF ; Mise en service watchdog (ON/OFF)
CONFIG WDTPS = 128 ; Postdiviseur du watchdog (1,2,4,8,16,32,64,128)
; CONFIG STVR = ON ; Reset sur débordement de pile (ON/OFF)
CONFIG LVP = OFF ; Programmation basse tension autorisée (ON/OFF)
CONFIG DEBUG = OFF ; Debugger hors service (laisser sur OFF)
CONFIG CP0 = OFF ; code protection sur block 0 (ON/OFF)
CONFIG CP1 = OFF ; code protection sur block 1 (ON/OFF)
CONFIG CP2 = OFF ; code protection sur block 2 (ON/OFF)
; CONFIG CP3 = OFF ; code protection sur block 3 (ON/OFF)
CONFIG CPB = OFF ; code protection sur bootblock (ON/OFF)
CONFIG CPD = OFF ; Code protection sur eeprom (ON/OFF)
CONFIG WRT0 = OFF ; Protection écriture block 0 (ON/OFF)
CONFIG WRT1 = OFF ; Protection écriture block 1 (ON/OFF)
CONFIG WRT2 = OFF ; Protection écriture block 2 (ON/OFF)
; CONFIG WRT3 = OFF ; Protection écriture block 3 (ON/OFF)
CONFIG WRTB = OFF ; Protection écriture bootblock (ON/OFF)
CONFIG WRTC = OFF ; Protection écriture configurations (ON/OFF)
CONFIG WRTD = OFF ; Protection écriture zone eeprom (ON/OFF)
CONFIG EBTR0 = OFF ; protect. lecture de table block 0 (ON/OFF)
CONFIG EBTR1 = OFF ; protect. lecture de table block 1 (ON/OFF)
CONFIG EBTR2 = OFF ; protect. lecture de table block 2 (ON/OFF)
; CONFIG EBTR3 = OFF ; protect. lecture de table block 3 (ON/OFF)
CONFIG EBTRB = OFF ; protect. lecture de table bootblock (ON/OFF)
ENDIF
;=============================================================================
; VARIABLES ACCESS RAM =
;=============================================================================
; zone de 96 octets
; -----------------
CBLOCK 0x00 ; zone access ram de la banque 0
flags : 1 ; flags divers
; b0 : 1= erreur de vérification
local01 : 1 ; variable locale 1 (multi-usage)
local02 : 1 ; variable locale 2 (multi-usage)
local03 : 1 ; variable locale 3 (multi-usage)
;*********************************************************************
; DECLARATIONS DE VARIABLES *
;*********************************************************************
cmpt1 : 1 ; compteur de boucles 1
cmpt2 : 1 ; compteur de boucles 2
cmpt3 : 1 ; compteur de boucles 3
temptmr0 : 1 ; compteur TMR0
ENDC
;=============================================================================
; VARIABLES BANQUE 0 =
;=============================================================================
; zone de 160 octets, suite de l'access RAM
; -----------------------------------------
CBLOCK 0x60
fsr0_temp : 2 ; sauvegarde de FSR0 (2 registres)
ENDC
#DEFINE ERR_EEP flags,0 ; flag d'erreur de vérification eeprom
#DEFINE ERR_FLASH flags,0 ; flag d'erreur vérif flash (même)
;=============================================================================
; PROGRAMME =
;=============================================================================
; vecteur de reset
; ----------------
ORG 0x00
nop ; pour debugger
goto init ; sauter initialisation
;=============================================================================
; INTERRUPTION SIMPLE =
;=============================================================================
ORG 0x08 ; point de départ des interruptions simples
; sauvegardes supplémentaires
; ---------------------------
movff FSR0L,fsr0_temp ; sauver FSR0L (exemple)
movff FSR0H,fsr0_temp+1 ; et FSR0H
;traitement de l'interruption
;-----------------------------
btfss INTCON,TMR0IE ; tester si interrupts INT0 en service
bra inter2 ; non, test suivant
btfss INTCON,TMR0IF ; tester si flag INT0IF positionné
bra inter2 ; non, test suivant
incf temptmr0 ; +1 toute les 100 ms
bcf INTCON,TMR0IF ; effacer le flag (ou le faire dans traitinit0)
bra interrest ; et terminer par restauration
retfie FAST ; si pas de restauration, on peut sortir ici
; dans ce cas, effacer la ligne précédente
inter2
; mettre ici les interuptions a tester
; restaurations
; -------------
interrest
movff fsr0_temp,FSR0L ; restaurer FSR0L
movff fsr0_temp+1,FSR0H ; et FSR0H
retfie FAST ; retour avec restauration de
; WREG, BSR, et STATUS
;=============================================================================
; INITIALISATIONS =
;=============================================================================
;-----------------------------------------------------------------------------
; contient les initialisations exécutées lors d'un reset
; ----------------------------------------------------------------------------
init
; traiter mise sous tension du pic
; --------------------------------
initpor ; par exemple on efface la RAM banque 0
lfsr FSR0,0x00 ; pointer sur l'adresse 0
initpor1
clrf POSTINC0 ; effacer emplacement pointé, et incrément pointeur
btfss FSR0H,0 ; banque 0 terminée?
bra initpor1 ; poursuivre traitement
movlw 0x06 ; port A en mode numérique
movwf ADCON1 ; dans registre de contrôle
clrf PORTA ; effacement des ports
clrf PORTB
clrf TRISA ; ports en sortie
clrf TRISB
bsf PORTB,1 ; allumage de la led
; initialisation à toujours faire
; --------------------------------
; PLACER VOS INITIALISATIONS INITIALES ICI
; initialiser les interruptions
; ------------------------------
bsf INTCON2,INTEDG0 ; interrupt sur flanc montant (exemple)
bsf RCON,IPEN
bsf INTCON2,TMR0IP ; haute priorité
bcf INTCON,RBIF ; RB7 RB4
; xxxx ; initialiser les autres interruptions
bsf INTCON,GIE ; mettre toutes les interruptions en service.
bsf T0CON,T0PS2 ; TMR0 prédiviseur sur 256
bsf T0CON,T0PS1
bsf T0CON,T0PS0
BCF T0CON,T0CS ; tmr0 internal clock
bcf T0CON,PSA ; prescaler on
bsf T0CON,T0SE
bcf INTCON,INT0IF ; par sécurité
bsf INTCON,TMR0IE ; Interruptions TMR0 en service
bsf T0CON,TMR0ON ; mettre interrupts INT0 en service
;=============================================================================
; PROGRAMME PRINCIPAL =
;=============================================================================
main
MOVLW 0X0A ;on test si 10fois 100mS
SUBWF temptmr0,W
BTFSS STATUS,Z
bra main ;NON
CLRF temptmr0 ;OUI RAZ compteur temps et on decompte
movlw b'00000010' ; bit a inverser
xorwf PORTB,f
bra main ; fin du programme
END
la suite dans le prochain épisode




