Explorer les Livres électroniques
Catégories
Explorer les Livres audio
Catégories
Explorer les Magazines
Catégories
Explorer les Documents
Catégories
Christian Dupaty
Professeur de génie électrique
Académie d’Aix-Marseille
christian.dupaty@ac-aix-marseille.fr
PIC18Fxxxx - ressources
cours PICs 2 / 53
PIC18Fxxxx - ressources
- Architecture HARVARD
- Horloge max de 40 MHz par multiplication interne avec PLL (avec quartz 10MHz)
- PIC18F avec rom programme FLASH
- Programmation et debug sur cible (In-Circuit Serial Programming, In-Circuit debug, perte de RB6, RB7)
- Chaque instruction sur 2 octets
- Mémoire EEPROM à accès aléatoire (sauvegarde de données)
- TIMERS : Microchip appelle TIMER des compteurs
- Capture : permet la mesure de temps
- Compare : permet la production de signaux rectangulaires
- SPI : communications séries synchrones sans protocole logiciel
- I2C : standard Philips, communications séries synchrones avec protocole logiciel
- USART : communication séries asynchrones (RS232 et RS485)
- CAN : convertisseur analogique numérique à 10 entrées multiplexées
Le PIC18 possède une multiplication 8x8 matérielle, extrêmement rapide (100nS à 1uS) ce qui lui
confère des possiblités de DSP particulièrement utiles pour le traitement numérique du signal
cours PICs 3 / 53
PIC18Fxxxx - ressources
Le principe du flux de données en pipeline permet un temps d’exécution sur 1 cycle d’horloge
Exemple :
T CY0 TCY1 TCY2 TCY3 TCY4 TCY5
1. MOVLW 55h Fetch 1 Execute 1
2. MOVWF PORTB Fetch 2 Execute 2
3. BRA SUB_1 Fetch 3 Execute 3
4. BSF PORTA, BIT3 (force un NOP) Fetch 4 vide (NOP)
5. Instruction @ l’addresse SUB_1 Fetch SUB_1 Execute SUB_1
cours PICs 4 / 53
PIC18Fxxxx - ressources
2. Choix de l’horloge
1. LP Quartz faible puissance
2. XT Quartz ou oscillateur externe
3. HS Quartz ou oscillateur externe rapide
4. HS + PLL (F x 4)
Types Fréquences C1 C2
LP 200kHz 15 pF 15 pF
XT 200 kHz 47-68pF 47-68 pF
1.0MHz 15 pF 15 pF
4.0MHz 15 pF 15 pF
HS 4.0 MHz 15 pF 15 pF
8.0MHz 15-33 pF 15-33 pF
20.0MHz 15-33pF 15-33 pF
Remarque : le type d’oscillateur doit être déclaré dans la MPLAB dans le menu configure->
configuration bits
cours PICs 5 / 53
PIC18Fxxxx - ressources
INT RC-CLOCKOUT on RA6, PORT on RA7 : l’horloge interne sort sur RA6, RA7 est un port //
INT RC-Port on RA6, Port on RA7 : RA6 et RA7 sont des ports //
Il est possible de ne pas utiliser MPLAB pour gérer les bits de configuration mais une directive du C18
(dans ce cas cocher « Configuration Bits set in code »)
En C18 :
#pragma config OSC = INTIO7 //pour INTRC-OSC2 as Clock Out, OSC1 as RA7
#pragma config OSC = INTIO67 //pour INTRC-OSC2 as RA6, OSC1 as RA7
#pragma config WDT = OFF //pour watch dog timer disable
#pragma config LVP = OFF //pour low voltage program disable
cours PICs 6 / 53
PIC18Fxxxx - ressources
Les bits IRCF de OSCCON permettent de choisir la fréquence de base (31KHz à 8MHz). (1MHz par
défaut)
Les bits TUN de OSCTUNE permettent d’ajuster la fréquence interne (en cas de variation de
température par exemple)
Le bit PLLEN de OSCTUNE permet d’activer la PLL qui multipliera par quatre la fréquence de base
(donc max 32MHz), désactivée par défaut)
Les bits SCS de OSCCON permettre de choisir la source de l’horloge des périphériques et du CPU du
PIC. (Interne par défaut)
Les bits OSTS et IOFC de OSCCON permettent de connaître l’état de l’horloge (active, stable …)
cours PICs 7 / 53
PIC18Fxxxx - ressources
3. RESET RESET -
EXTERNE
Les différentes sources de l’interruption RESET
cours PICs 8 / 53
PIC18Fxxxx - ressources
4. Organisation mémoire
Les PIC18 sont à architecture HAVARD. Les espaces mémoires programmes et données (appelés
registres, les registres des périphériques sont appelés registres spéciaux) sont distincts. Ceci implique
la création d’instructions et de processus différents pour l’accès données en ROM et en RAM.
Adresses Adresses
20 bits 11 bits
cours PICs 9 / 53
PIC18Fxxxx - ressources
Attention on ne peut écrire dans la mémoire FLASH que des blocs de 64 octets, pour cela il faut
écrire dans une zone de RAM appelée « Holding Register », puis exécuter une procédure d’écriture
en ROM FLASH relativement complexe. Il est recommandé de placer les données à conserver de
manière permanente en EEPROM
cours PICs 10 / 53
PIC18Fxxxx - ressources
cours PICs 11 / 53
PIC18Fxxxx - ressources
cours PICs 12 / 53
PIC18Fxxxx - ressources
cours PICs 13 / 53
PIC18Fxxxx - ressources
6. Registres internes
ADR REGISTRE Bit 7 Bit 6 Bit 5 Bit 4 Bit 3 Bit 2 Bit 1 Bit 0 Value on POR page
FFFh TOSU — — — Top-of-Stack upper Byte (TOS<20:16>) ---0 0000 37
FFEh TOSH Top-of-Stack High Byte (TOS<15:8>) 0000 0000 37
FFDh TOSL Top-of-Stack Low Byte (TOS<7:0>) 0000 0000 37
FFCh STKPTR STKFUL STKUNF — Return Stack Pointer 00-0 0000 38
FFBh PCLATU — — — Holding Register for PC<20:16> 0 0000 39
FFAh PCLATH Holding Register for PC<15:8> 0000 0000 39
FF9h PCL PC Low Byte (PC<7:0>) 0000 0000 39
FF8h TBLPTRU — — bit21 Program Memory Table Pointer Upper Byte (TBLPTR<20:16>) --00 0000 58
FF7h TBLPTRH Program Memory Table Pointer High Byte (TBLPTR<15:8>) 0000 0000 58
FF6h TBLPTRL Program Memory Table Pointer Low Byte (TBLPTR<7:0>) 0000 0000 58
FF5h TABLAT Program Memory Table Latch 0000 0000 58
FF4h PRODH Product Register High Byte xxxx xxxx 69
FF3h PRODL Product Register Low Byte xxxx xxxx 69
PEIE/GI
FF2h INTCON GIE/GIEH
EL
TMR0IE INT0IE RBIE TMR0IF INT0IF RBIF 0000 000x 73
INTED
FF1h INTCON2 RBPU G0
INTEDG1 INTEDG2 — TMR0IP — RBIP 1111 -1-1 74
FF0h INTCON3 INT2IP INT1IP — INT2IE INT1IE — INT2IF INT1IF 11-0 0-00 75
FEFh INDF0 Uses contents of FSR0 to address data memory - value of FSR0 not changed n/a 50
FEEh POSTINC0 Uses contents of FSR0 to address data memory - value of FSR0 post-incremented n/a 50
FEDh POSTDEC0 Uses contents of FSR0 to address data memory - value of FSR0 post-decremented n/a 50
FECh PREINC0 Uses contents of FSR0 to address data memory - value of FSR0 pre-incremented n/a 50
FEBh PLUSW0 value of FSR0 offset by value in WREG n/a 50
FEAh FSR0H — — — — Indirect Data Memory Address Pointer 0 High Byte xxxx 50
FE9h FSR0L Indirect Data Memory Address Pointer 0 Low Byte xxxx xxxx 50
FE8h WREG Working Register xxxx xxxx n/a
FE7h INDF1 Uses contents of FSR1 to address data memory - value of FSR1 not changed n/a 50
FE6h POSTINC1 Uses contents of FSR1 to address data memory - value of FSR1 post-incremented n/a 50
FE5h POSTDEC1 Uses contents of FSR1 to address data memory - value of FSR1 post-decremented n/a 50
FE4h PREINC1 Uses contents of FSR1 to address data memory - value of FSR1 pre-incremented n/a 50
FE3h PLUSW1 value of FSR1 offset by value in WREG
FE2h FSR1H — — — — Indirect Data Memory Address Pointer 1 High Byte xxxx 50
FE1h FSR1L Indirect Data Memory Address Pointer 1 Low Byte xxxx xxxx 50
FE0h BSR — — — — Bank Select Register 0000 49
FDFh INDF2 Uses contents of FSR2 to address data memory - value of FSR2 not changed n/a 50
FDEh POSTINC2 Uses contents of FSR2 to address data memory - value of FSR2 post-incremented n/a 50
FDDh POSTDEC2 Uses contents of FSR2 to address data memory - value of FSR2 post-decremented n/a 50
FDCh PREINC2 Uses contents of FSR2 to address data memory - value of FSR2 pre-incremented n/a 50
FDBh PLUSW2 value of FSR2 offset by value in WREG n/a 50
FDAh FSR2H — — — — Indirect Data Memory Address Pointer 2 High Byte xxxx 50
FD9h FSR2L Indirect Data Memory Address Pointer 2 Low Byte xxxx xxxx 50
FD8h STATUS — — — N OV Z DC C x xxxx 52
FD7h TMR0H Timer0 Register High Byte 0000 0000 103
FD6h TMR0L Timer0 Register Low Byte xxxx xxxx 103
FD5h T0CON TMR0ON T08BIT T0CS T0SE PSA T0PS2 T0PS1 T0PS0 1111 1111 101
FD4h
FD3h OSCCON — — — — — — — SCS 0 21
FD2h LVDCON — — IRVST LVDEN LVDL3 LVDL2 LVDL1 LVDL0 --00 0101 189
FD1h WDTCON — — — — — — — SWDTE 0 201
FD0h RCON IPEN — — RI TO PD POR BOR 0--1 11qq 53, 28,
FCFh TMR1H Timer1 Register High Byte xxxx xxxx 105
FCEh TMR1L Timer1 Register Low Byte xxxx xxxx 105
FCDh T1CON RD16 — T1CKPS1 T1CKPS0 T1OSCEN T1SYNC TMR1CS TMR1ON 0-00 0000 105
FCCh TMR2 Timer2 Register 0000 0000 109
FCBh PR2 Timer2 Period Register 1111 1111 110
TOUTPS TMR2O
FCAh T2CON —
3
TOUTPS2 TOUTPS1 TOUTPS0
N
T2CKPS1 T2CKPS0 -000 0000 109
cours PICs 14 / 53
PIC18Fxxxx - ressources
SSP Address C Slave Mode. SSP Baud Rate Reload Register in I2C Master
FC8h SSPADD Register in I2 Mode.
0000 0000 132
FC4h ADRESH A/D Result Register High Byte xxxx xxxx 185
FC3h ADRESL A/D Result Register Low Byte xxxx xxxx 185
FC2h ADCON0 ADCS1 ADCS0 CHS2 CHS1 CHS0 GO/DONE — ADON 0000 00-0 179
FC1h ADCON1 ADFM ADCS2 — — PCFG3 PCFG2 PCFG1 PCFG0 00-- 0000 180
FC0h
FBFh CCPR1H Capture/Compare/PWM Register1 High Byte xxxx xxxx 119
FBEh CCPR1L Capture/Compare/PWM Register1 Low Byte xxxx xxxx 119,
FBDh CCP1CON — — DC1B1 DC1B0 CCP1M3 CCP1M2 CCP1M1 CCP1M0 --00 0000 115
119,
FBCh CCPR2H Capture/Compare/PWM Register2 High Byte xxxx xxxx
121
119,
FBBh CCPR2L Capture/Compare/PWM Register2 Low Byte xxxx xxxx
121
FBAh CCP2CON — — DC2B1 DC2B0 CCP2M3 CCP2M2 CCP2M1 CCP2M0 --00 0000 115
FB4h – FB9h
FB3h TMR3H Timer3 Register High Byte xxxx xxxx 111
FB2h TMR3L Timer3 Register Low Byte xxxx xxxx 111
FB1h T3CON RD16 T3CCP2 T3CKPS1 T3CKPS0 T3CCP1 T3SYNC TMR3CS TMR3ON 0000 0000 111
FB0h
FAFh SPBRG USART1 Baud Rate Generator 0000 0000 166,
FAEh RCREG USART1 Receive Register 0000 0000 172
FADh TXREG USART1 Transmit Register 0000 0000 170,
FACh TXSTA CSRC TX9 TXEN SYNC — BRGH TRMT TX9D 0000 -010 164
FABh RCSTA SPEN RX9 SREN CREN ADDEN FERR OERR RX9D 0000 000x 165
FAAh
FA9h EEADR Data EEPROM Address Register 0000 0000 65, 68
FA8h EEDATA Data EEPROM Data Register 0000 0000 68
FA7h EECON2 Data EEPROM Control Register 2 (not a physical register) 65, 68
FA6h EECON1 EEPGD CFGS — FREE WRERR WREN WR RD xx-0 x000 66
FA3h – FA5h
FA2h IPR2 — — — EEIP BCLIP LVDIP TMR3IP CCP2IP 1 1111 81
FA1h PIR2 — — — EEIF BCLIF LVDIF TMR3IF CCP2IF 0 0000 77
FA0h PIE2 — — — EEIE BCLIE LVDIE TMR3IE CCP2IE 0 0000 79
F9Fh IPR1 PSPIP ADIP RCIP TXIP SSPIP CCP1IP TMR2IP TMR1IP 1111 1111 80
F9Eh PIR1 PSPIF ADIF RCIF TXIF SSPIF CCP1IF TMR2IF TMR1IF 0000 0000 76
F9Dh PIE1 PSPIE ADIE RCIE TXIE SSPIE CCP1IE TMR2IE TMR1IE 0000 0000 78
F97h – F9Ch
F96h TRISE IBF OBF IBOV PSPMODE — Data Direction bits for PORTE 0000 -111 96
F95h TRISD Data Direction Control Register for PORTD 1111 1111 94
F94h TRISC Data Direction Control Register for PORTC 1111 1111 91
F93h TRISB Data Direction Control Register for PORTB 1111 1111 88
F92h TRISA — TRISA6 Data Direction Control Register for PORTA -111 1111 85
F8Eh – F91h
Read PORTE Data Latch, Write
F8Dh LATE — — — — —
PORTE Data Latch
-xxx 97
F8Ch LATD Read PORTD Data Latch, Write PORTD Data Latch xxxx xxxx 93
F8Bh LATC Read PORTC Data Latch, Write PORTC Data Latch xxxx xxxx 91
F8Ah LATB Read PORTB Data Latch, Write PORTB Data Latch xxxx xxxx 88
F89h LATA — LATA6 Read PORTA Data Latch, Write PORTA Data Latch -xxx xxxx 85
F85h – F88h
F84h PORTE Read PORTE pins, Write PORTE Data Latch -000 97
F83h PORTD Read PORTD pins, Write PORTD Data Latch xxxx xxxx 93
F82h PORTC Read PORTC pins, Write PORTC Data Latch xxxx xxxx 91
F81h PORTB Read PORTB pins, Write PORTB Data Latch xxxx xxxx 88
F80h PORTA — RA6 Read PORTA pins, Write PORTA Data Latch -x0x 0000 85
cours PICs 15 / 53
PIC18Fxxxx - ressources
7. Interruptions
IPEN : interrupt priority enable. Cette fonction peut être désactivée pour avoir une compatibilité
logicielle avec l’unité centrale PIC16. Si IPEN est à 1, chaque source d’interruption peut être
configurée comme prioritaire ou non (entre autres : registres IPR1 et IPR2). Si elle est prioritaire, une
autre source d’interruption sera prise en compte seulement à la fin de l’interruption prioritaire.
GEIH : global interrupt enable high (validation des interruptions prioritaires, adresse 0x0008)
GEIL : global interrupt enable low (validation des interruptions non prioritaires, adresse 0x0018)
Chaque source d’interruption possède
-un bit d’autorisation E (enable) ce bit doit être à 1 pour valider l’interruption
-un bit d’état F (flag) qui indique s’il y a eu ou non un événement
Exemple : Pour utiliser l’interruption générée lors du débordement du TIMER0 il faut
-mettre INT0IE à 1 -mettre GEIH ou GEIL à 1
L’interruption est déclanchée lors du débordement, il faut OBLIGATOIREMENT remettre INT0IF à 0
avant de ressortir de l’interruption, sinon elle reste active.
Débordement
(Overflow)
CLK TIMER 0 INTOIF
&
16 bits 1
INTOIE &
Interruption
RAZ par 1 vers adresse
TMR0IP 0x0008n
logiciel
1
GIEH
cours PICs 16 / 53
PIC18Fxxxx - ressources
PIR2 (0xFA1): Ecriture EEPROM / Bus collision / Faible VDD / TIMER3/ CCP2
— — — EEIF BCLIF LVDIF TMR3IF CCP2IF
EEIF: Data EEPROM/FLASH Write Operation Interrupt Flag bit
1 indique une fin d’écriture
BCLIF: Bus Collision Interrupt Flag bit
1 indique qu’une collision s’est produite
LVDIF: Low Voltage Detect Interrupt Flag bit
1 indique une détection de faible tension
TMR3IF: TMR3 Overflow Interrupt Flag bit
1 indique un débordement sur TMR3
CCP2IF: CCPx Interrupt Flag bit
Idem PIR1 ci dessus
cours PICs 17 / 53
PIC18Fxxxx - ressources
cours PICs 18 / 53
PIC18Fxxxx - ressources
cours PICs 19 / 53
PIC18Fxxxx - ressources
8. Jeu d’instructions
Toutes les opérations arithmétiques et logiques et les échanges de données entre registre passent
par le registre de travail W.
Exemple : ADDWF, cette instruction ajoute le contenu W à un registre F.
ADDWF 50h,0,0 ; ajoute W au registre 50h, le résultat est dans W, ACCES RAM uniquement
ADDWF 50h,0,0 ; ajoute W au registre 50h, le résultat est dans 50h
ADDWF 50h,0,1 ; ajoute W au registre 50h, le résultat est dans W, Bank spécifiée par BSR
Le PIC18 possède une multiplication 8x8 matérielle, extrêmement rapide et particulièrement utile pour
le traitement numérique du signal, cette fonction est appellée par l’instruction MULWF f,a.
L’assembleur :
En plus du jeux d’instruction l’assembleur Microchip possède de nombreuses directives, une directive
ne génère pas de code machine.
Exemples :
List : permet de définir le processeur cible ex : list p=18F452
#include : ajouter un fichier ex : #include <p18F452.inc> (<> indique le répertoire par défaut)
#define : comme en C c’est une définition, remplacement d’un texte par un autre avant assemblage
equ : équivalence entre un texte et une valeur numérique
cblock / endc : pour la réservation mémoire de données
org : origine pour spécifier l’adresse d’assemblage
end : fin du programme
;************************************************************************
RESET
(DEBUT)
SP IT TIMER2 ;Clignotement d’une LED sur PB0 (tempo par IT avec TIMER2
:(d’après Bigonoff) Q=4Mhz, t=1uS
;************************************************************************
list p=18F452 ; Définition de processeur pour l'assembleur
RB0 en sortie,
push-pull tictac -- #include <p18F452.inc> ; fichier de défintion pour PIC18
initialise tictac #define LED TRISB,0 ; LED de sortie
tictac equ d'124'
;VARIABLES
CONFIG TIMER2 cblock 0x20 ; Début de la zone (0x20 à 0x6F)
PRE, POST tictac=125
tictac = 0 compteur : 1 ; compteur de passages dans tmr2 (1 octet)
diviseur , PR2 pour (125*4ms)
IT 4ms endc ; Fin de la zone
;DEMARRAGE SUR RESET
org 0x000
goto init
Aurise IT TIMER2 ; SOUS PROGRAMME D’INTERRUPTION TMR2
PB0=/PB0
et globale
; Un passage dans cette routine tous les 32*125*1µs = 4ms.
org 0x0008 ; adresse d'interruption prioritaire
decfsz compteur,f ; décrémenter compteur d'IT
goto attend ; pas 0, ne rien faire
Nerien faire
movlw tictac ; recharge le compteur d'IT
movwf compteur
efface drapeau IT movlw B'00000001' ; inverser LED
TIMER2
xorwf PORTB,f
attend bcf PIR1,TMR2IF ; effacer flag interupt tmr2
retfie ; retour d'interruption
retour d'IT
; INITIALISATIONS
init bcf LED ; RB0 en sortie
bsf INTCON2,7 ; Pas de R pull up sur PORTB
movlw tictac ; le tmr2 compte jusque (124+1)*32*1µs = 4ms
movwf PR2 ; dans PR2
movlw B'00101110' ; postdiviseur à 2,prédiviseur à 16,timer ON
movwf T2CON ; dans registre de contrôle TIMER2
movlw tictac+1 ; pour 125 passages dans tmr2 = 125*4ms = 500ms
movwf compteur ; dans compteur de passage interruption
bsf PIE1,TMR2IE ; autorise IT sur TIMER2
bsf INTCON,GIE ; valider interruptions
bsf INTCON,GIEL
; PROGRAMME PRINCIPAL
debut goto debut ; boucle sans fin (l'IT est asynchrone)
END ; fin de programme
cours PICs 20 / 53
PIC18Fxxxx - ressources
Très important ce registre indique quel a été le type de résultat de l’instruction précédente. Il est utilisé
entre autre par les instructions de branchement cionditionnel.
N si négatif
OV s’il y a eu un débordement dans une opération en complément à 2
Z : si le résultat est nul
DC : demi retenue (le bit4 est passé à 1)
C : s’il y a eu une retenue (résultat supérieur à 0xFF)
Le jeux d’instructions
Champ Description
a RAM access bit
a = 0: RAM location in Access RAM (BSR register is ignored)
a = 1: RAM bank is specified by BSR register
bbb Bit address within an 8-bit file register (0 to 7)
BSR Bank Select Register. Used to select the current RAM bank.
d Destination select bit;
d = 0: store result in WREG,
d = 1: store result in file register f.
dest Destination either the WREG register or the specified register file location
f 8-bit Register file address (0x00 to 0xFF)
fs 12-bit Register file address (0x000 to 0xFFF). This is the source address.
fd 12-bit Register file address (0x000 to 0xFFF). This is the destination address.
k Literal field, constant data or label (may be either an 8-bit, 12-bit or a 20-bit value)
label Label name
mm The mode of the TBLPTR register for the Table Read and Table Write instructions Only used
* with Table Read and Table Write instructions:
*+ No Change to register (such as TBLPTR with Table reads and writes)
*- Post-Increment register (such as TBLPTR with Table reads and writes)
+* Post-Decrement register (such as TBLPTR with Table reads and writes)
Pre-Increment register (such as TBLPTR with Table reads and writes)
n The relative address (2’s complement number) for relative branch instructions, or the direct
address for Call/ Branch and Return instructions
PRODH Product of Multiply high byte
PRODL Product of Multiply low byte
* Fast Call / Return mode select bit.
s = 0: do not update into/from shadow registers
s = 1: certain registers loaded into/from shadow registers (Fast mode)
u Unused or Unchanged
WREG Working register (accumulator)
x The assembler will generate code with x = 0. It is the recommended form of use for compatibility
with all
Microchip software tools.
TBLPTR 21-bit Table Pointer (points to a Program Memory location)
TABLAT 8-bit Table Latch
TOS Top-of-Stack
PC Program Counter
PCL Program Counter Low Byte
PCH Program Counter High Byte
PCLATH Program Counter High Byte Latch
PCLATU Program Counter Upper Byte Latch
GIE Global Interrupt Enable bit
WDT Watchdog Timer
TO Time-out bit
PD Power-down bit
C, DC, Z, OV, N ALU status bits Carry, Digit Carry, Zero, Overflow, Negative
[] Optional
() Contents
Assigned to
<> Register bit field
In the set of
italics User defined term (font is courier)
cours PICs 21 / 53
PIC18Fxxxx - ressources
cours PICs 22 / 53
PIC18Fxxxx - ressources
RETFIE s Return from interrupt enable 2 0000 0000 0001 000s GIE/GIEH,
PEIE/GIEL
RETLW k Return with literal in WREG 2 0000 1100 kkkk kkkk None
RETURN s Return from Subroutine 2 0000 0000 0001 001s None
SLEEP — Go into standby mode 1 0000 0000 0000 0011 TO, PD
LITERAL OPERATIONS
ADDLW k Add literal and WREG 1 0000 1111 kkkk kkkk C, DC, Z, OV, N
ANDLW k AND literal with WREG 1 0000 1011 kkkk kkkk Z, N
IORLW k Inclusive OR literal with WREG 1 0000 1001 kkkk kkkk Z, N
LFSR f, k Move literal (12-bit) 2nd word 2 1110 1110 00ff kkkk None
to FSRx 1st word 1111 0000 kkkk kkkk
MOVLB k Move literal to BSR<3:0> 1 0000 0001 0000 kkkk None
MOVLW k Move literal to WREG 1 0000 1110 kkkk kkkk None
MULLW k Multiply literal with WREG 1 0000 1101 kkkk kkkk None
RETLW k Return with literal in WREG 2 0000 1100 kkkk kkkk None
SUBLW k Subtract WREG from literal 1 0000 1000 kkkk kkkk C, DC, Z, OV, N
XORLW k Exclusive OR literal with WREG 1 0000 1010 kkkk kkkk Z, N
DATA MEMORY PROGRAM MEMORY OPERATIONS
TBLRD* Table Read 2 0000 0000 0000 1000 None
TBLRD*+ Table Read with post-increment 0000 0000 0000 1001 None
TBLRD*- Table Read with post-decrement 0000 0000 0000 1010 None
TBLRD+* Table Read with pre-increment 0000 0000 0000 1011 None
TBLWT* Table Write 2 (5) 0000 0000 0000 1100 None
TBLWT*+ Table Write with post-increment 0000 0000 0000 1101 None
TBLWT*- Table Write with post-decrement 0000 0000 0000 1110 None
TBLWT+* Table Write with pre-increment 0000 0000 0000 1111 None
cours PICs 23 / 53
PIC18Fxxxx - ressources
9. Ports parallèles
Exemple : PORTB
Exemple
CLRF PORTB ; Initialize PORTB by
; clearing output
; data latches
CLRF LATB ;Alternate method
; to clear output
; data latches
MOVLW 0xCF ; Value used to
; initialize data
; direction
MOVWF TRISB ; Set RB<3:0> as inputs
; RB<5:4> as outputs
; RB<7:6> as inputs
#include <p18f452.h>
void main(void)
{
char a=0,b=0x55 ;
PORTB=0 ;
TRISB=0b11110000 ;
a=PORTB ;
PORTB=b ;
While(1) ;
}
Chaque port à ses particularités, seules celle du PORTB sont détaillées ici. (voir data sheet)
Particularités du PORTB
Les broches peuvent être configurées en Drain-Ouvert RBPU INTCON2<7> (INTCON2bits.RBPU)
Un changement sur l’un des bits PB4 à PB7 peut déclancher une interruption (gestion d’un clavier par
exemple) RBIF (INTCON<0>). (INTCONbits.RBIF), ce drapeau DOIT être effacé dans le sous
programme d’interruption.
cours PICs 24 / 53
PIC18Fxxxx - ressources
void main(void)
{
float res;
// CAN on. CLOCK=FOSC/2. CANAL0 (RA)
// seul AN0 est activé
// VREF+=VDD VREF-=VSS
ADCON0=1;
ADCON1=0x8E;
while(1){
// déclenche SOC
ADCON0bits.GO_DONE=1;
// attend EOC
while(ADCON0bits.GO_DONE);
// calcule la tension
res=(float)ADRES*q;
}
}
REGISTRE ADCON0
7 6 5 4 3 2 1 0
ADCS1 ADCS0 CHS2 CHS1 CHS0 GO/DONE — ADON
REGISTRE ADCON1
7 6 5 4 3 2 1 0
ADFM ADCS2 — — PCFG3 PCFG2 PCFG1 PCFG0
ADFM: Format du résultat (sur 16 bits)
1 = justification à droite, les 6 bits de poids fort d’ADRESH sont à 0.
0 = justification à gauche, les 6 bits de poids faible d’ADRESL sont à 0.
ADCS2: selection de l’horloge (voir tableau)
PCFG<3:0> AN7 AN6 AN5 AN4 AN3 AN2 AN1 AN0 VREF+ VREF- C/R
0000 A A A A A A A A VDD VSS 8/00
0001 A A A A VREF+ A A A AN3 VSS 7/1
0010 D D D A A A A A VDD VSS 5/0
0011 D D D A VREF+ A A A AN3 VSS 4/1
0100 D D D D A D A A VDD VSS 3/0
0101 D D D D VREF+ D A A AN3 VSS 2/1
011x D D D D D D D D — — 0/0
1000 A A A A VREF+ VREF- A A AN3 AN2 6/2
1001 D D A A A A A A VDD VSS 6/0
1010 D D A A VREF+ A A A AN3 VSS 5/1
1011 D D A A VREF+ VREF- A A AN3 AN2 4/2
1100 D D D A VREF+ VREF- A A AN3 AN2 3/2
1101 D D D D VREF+ VREF- A A AN3 AN2 2/2
1110 D D D D D D D A VDD VSS 1/0
1111 D D D D VREF+ VREF- D A AN3 AN2 1/2
cours PICs 25 / 53
PIC18Fxxxx - ressources
cours PICs 26 / 53
PIC18Fxxxx - ressources
12. TIMER0
Mode 8 bits
Mode 16 bits
REGISTRE T0CON
7 6 5 4 3 2 1 0
TMR0ON T08BIT T0CS T0SE PSA T0PS2 T0PS1 T0PS0
TMR0ON: activation
1 = Active Timer0
0 = Stoppe Timer0
T08BIT: 8/16 bits // Demo pour TMER0
1 = Timer0 est un compteur 8-bits #include <p18f452.h> //pour LCD
0 = Timer0 est un compteur 16-bits
// sous programme d'interruption
T0CS: sélection de l’horloge
#pragma interrupt itcomp
1 = compte les fronts sur T0CKI #pragma code interruption=0x8
0 = compte les fronts sur l’horloge interne (CLKOUT) void itcomp(void)
T0SE: front détecté {
1 = compte sur front descendant sur T0CKI PORTB^=0x01; // bascule PB0
0 = compte sur front montant sur T0CKI INTCONbits.TMR0IF=0;
PSA: Pré diviser }
#pragma code
1 = pas de pré diviseur.
0 = Le pré diviseur est activé void main(void)
T0PS2:T0PS0: Pré Division de l’horloge {
111 = 1:256 TRISB=0xFE; // PB0 en sortie
110 = 1:128 // active Timer 16bits sur CLKOUT
101 = 1:64 // prediviseur 1/8
100 = 1:32 // avec Q=4MHz, CLK=1uS
// IT toutes les 1*8*65536= 524mS
011 = 1:16
T0CON=0b10000010;
010 = 1:8 INTCONbits.TMR0IE=1;// autorise IT débordement
001 = 1:4 RCONbits.IPEN=1;// Interruption prioritaires
000 = 1:2 INTCONbits.GIE=1;
While(1); // ne rien faire
Pour utiliser l’interruption : }
TMR0F dans INTCON <5> (drapeau d’interruption)
TMR0E dans INTCON <2> (validation de l’interruption)
cours PICs 27 / 53
PIC18Fxxxx - ressources
13. TIMER1
REGISTRE T1CON
7 6 5 4 3 2 1 0
RD16 — T1CKPS1 T1CKPS0 T1OSCEN T1SYNC TMR1CS TMR1ON
Remarques :
En plaçant un quartz de 32.768KHz sur T1OS, il est possible d’obtenir une base de temps de 1S.
Validation de l’IT de débordement par PIE1 <TMR1IE>
Drapeau d’IT PIR1<TMR1IF>
cours PICs 28 / 53
PIC18Fxxxx - ressources
14. TIMER2
REGISTRE TCON2
7 6 5 4 3 2 1 0
— TOUTPS3 TOUTPS2 TOUTPS1 TOUTPS0 TMR2ON T2CKPS1 T2CKPS0
TOUTPS3:TOUTPS0: Postdiviseur
0000 = 1:1
0001 = 1:2
1111 = 1:16 // Demo pour TMR2
TMR2ON: Validation Timer2 #include <p18f452.h> //pour LCD
1 = Timer2 activé
// sous programme d'interruption
0 = Timer2 désactivé #pragma interrupt itcomp
T2CKPS1:T2CKPS0: Prédiviseur #pragma code interruption=0x8
00 = 1:1 void itcomp(void)
01 = 1:4 {static char tictac=7;
1x = 1 :16 if (!tictac--)
{
tictac=15; // environ 500mS
Validation de l’IT de débordement par PIE1 PORTB^=0x01; // bascule PB0
<TMR2IE> ]
Drapeau d’IT PIR1<TMR2IF> PIR1.TMR2IF=0;
TMR2 et PR2 sont des registres 8 bits. Lorsqu’il y }
#pragma code
a égalité TMR2IF est mis à 1 et TMR2 à 0x00
TM2R peut servir d’horloge pour le mode PWM ou void main(void)
pour les communications synchrones (TMR2 {
output). TRISB=0xFE; // PB0 en sortie
// active Timer2
// prediviseur 1/16 post 1/16
// avec Q=4MHz, CLK=1uS
// IT toutes les T=1*16*16*125 = 32 mS
PR2=125;
TCON2=0b01111110;
PIE1.TMR2IE=1;// autorise IT débordement
RCONbits.IPEN=1;// Interruption prioritaires
INTCONbits.GIE=1;
While(1); // ne rien faire
}
cours PICs 29 / 53
PIC18Fxxxx - ressources
15. TIMER3
REGISTRE TCON3
7 6 5 4 3 2 1 0
RD16 T3CCP2 T3CKPS1 T3CKPS0 T3CCP1 T3SYNC TMR3CS TMR3ON
cours PICs 30 / 53
PIC18Fxxxx - ressources
16. Capture/Compare/PWM
16.1. CAPTURE
La fonction capture permet de mesurer la durée d’une impulsion haute ou basse ou la période d’un
signa rectangulaire. Le résultat est le nombre d’impulsions d’horloge entre deux fronts. Connaissant la
période de l’horloge on en déduit un temps.
Il existe deux modules de capture CCP1 et CCP2. Lorsque que l’événement asynchrone attendu sur
la broche CCP se produit un TIMER est recopié dans le registre CCPR
REGISTRE CCP1CON/CCP2CON
7 6 5 4 3 2 1 0
— — DCxB1 DCxB0 CCPxM3 CCPxM2 CCPxM1 CCPxM0
DCxB1:DCxB0: PWM rapport cyclique bit1 et bit0
Ces bits ne sont pas utilisés en mode capture/compare. Ils représentent les deux LSB du rapport cyclique (10bits)
de la fonction PWM, les bits de poids forts se trouve dans CCPRxL. Ces bits ne sont pas utilisés en mode
capture/compare
CCPxM3:CCPxM0: Choix du mode CCPx
0000 = Capture/Compare/PWM désactivé
0001 = Réservé
0010 = comparaison , la sortie bascule lors de l’égalité (CCPxIF is à 1)
0011 = Réservé
0100 = capture sur front descendant
0101 = capture sur front montant
0110 = capture les 4 fronts descendants
0111 = capture tous les 4 front montants
1000 = comparaison, CCPx est initialisée à 0 et passe à 1 lors de l’égalité TMRx / CCPRx, CCPIF est mis à1
1001 = comparaison, CCPx est initialisée à 1 et passe à 0 lors de l’égalité TMRx / CCPRx, CCPIF est mis à1
1010 = comparaison, lors de l’égalité TMRx / CCPRx, CCPIF est mis à1, CCPx n’est pas modifié
1011 = comparaison, déclenche un « special event » CCPIF est mis à1
11xx = mode PWM
Validation de l’IT de capture pour CCP1 par PIE1 <CCP1IE>
Drapeau d’IT PIR1<CCP1IF>
Validation de l’IT de capture pour CCP2 par PIE2 <CCP2IE>
Drapeau d’IT PIR2<CCP2IF>
cours PICs 31 / 53
PIC18Fxxxx - ressources
Division par
1, 2, 4, 8 Compteur 16 bits
E (TIMER1) TMR1IE
(N)
E= Q/4 Interruption
&
Division TMR1IF
CCP par Débordement
1, 4, 16 RAZ logiciel
RAZ logiciel
Registre 16 bits
CCPF
CCPR
Détection
de front
Interruption
&
CCPI
T=D*E/N
cours PICs 32 / 53
PIC18Fxxxx - ressources
16.2. COMPARE
La fonction compare permet de produire des « durées », impulsions hautes ou basses calibrées ou
des signaux rectangulaires périodiques. On place dans CCPR le nombre d’impulsions à compter par
TIMER. A chaque coïncidence TIMER/CCPR la broche CCP évolue en fonction de la configuration,
une interruption est générée, TIMER est remis à zéro.
Il existe deux modules de comparaison CCP1 et CCP2
Lors de l’égalité entre un compteur TMR et un registre CCPR, une action est déclanchée sur la broche
CCP correspondante
REGISTRE CCP1CON/CCP2CON
7 6 5 4 3 2 1 0
— — DCxB1 DCxB0 CCPxM3 CCPxM2 CCPxM1 CCPxM0
DCxB1:DCxB0: PWM rapport cyclique bit1 et bit0
Ces bits ne sont pas utilisés en mode capture/compare. Ils représentent les deux LSB du rapport cyclique (10bits)
de la fonction PWM, les bits de poids forts se trouve dans CCPRxL. Ces bits ne sont pas utilisés en mode
capture/compare
CCPxM3:CCPxM0: Choix du mode CCPx
0000 = Capture/Compare/PWM désactivé
0001 = Réservé
0010 = comparaison , la sortie bascule lors de l’égalité (CCPxIF is à 1)
0011 = Réservé
0100 = capture sur front descendant
0101 = capture sur front montant
0110 = capture les 4 fronts descendants
0111 = capture tous les 4 front montants
1000 = comparaison, CCPx est initialisée à 0 et passe à 1 lors de l’égalité TMRx / CCPRx, CCPIF est mis à1
1001 = comparaison, CCPx est initialisée à 1 et passe à 0 lors de l’égalité TMRx / CCPRx, CCPIF est mis à1
1010 = comparaison, lors de l’égalité TMRx / CCPRx, CCPIF est mis à1, CCPx n’est pas modifié
1011 = comparaison, déclenche un « special event » CCPIF est mis à1
11xx = mode PWM
Validation de l’IT de comparaison pour CCP1 par PIE1 <CCP1IE>
Drapeau d’IT PIR1<CCP1IF>
Validation de l’IT de comparaison pour CCP2 par PIE2 <CCP2IE>
Drapeau d’IT PIR2<CCP2IF>
cours PICs 33 / 53
PIC18Fxxxx - ressources
Division par
E 1, 2,4,8 (N)
E= Q/4
E/N
Compteur 16 bits
RAZ TIMER1 TMR1IE
Interruption
&
TMR1IF
Débordement
RAZ logiciel
RAZ logiciel
Comparateur 16
bits Action pré Broche
CCPF configurée CCPx
TMER1=CCPR
Registre 16 bits
CCPR
Interruption
&
CCPI
cours PICs 34 / 53
PIC18Fxxxx - ressources
16.3. PWM
La modulation de largeur d’impulsion (ou de rapport cyclique) est courement utilisée dans la
commande des hacheurs (pour commander un moteur à courant continu par exemple).
La sortie CPP1 peut être configurée en PWM (TRISC<2> =0).
TMR2 cadence le processus, CCPR1 représente la durée de l’état haut et PR2 la période voir
configuration de CCP1CON/CCP2CON (page 22)
th
Rapport cyclique
η= th/T
CCP1=0
Lorsque TMR2=PR2
CCP1=1
TMR2=0
CCPR1H=CCPR1L
Lorsque TMR2=CCPR1H
CCP1=0
Lorsque TMR2=PR2
Etc…
Exemples :
Fréquence PWM 2.44kHz 9.77kHz 39.06kHz 156.25kHz 312.50kHz 416.67kHz
Prédiviseur (1,4,16) 16 4 1 1 1 1
Valeur PR2 0xFF 0xFF 0xFF 0x3F 0x1F 0x17
Résolution Max bits) 14 12 10 8 7 6.58
FOSC
log ---------
FPWM
Résolution(PWM) en bits = -------------------
log(2)
cours PICs 35 / 53
PIC18Fxxxx - ressources
Le chien de garde est activé en mettant à 1 le bit 0 du registre WDTCON (SWDTEN) ou par WDTEN
de CONFIG2H si la configuration de départ n’a pas activée le chien de garde (voir configuration sur
MPLAB).
REGISTRE CONFIG2H
7 6 5 4 3 2 1 0
— — — — WDTPS2 WDTPS1 WDTPS0 WDTEN
Les bits WDTPS2-WDTPS0 représente le rapport de division de la sortie WDT TIMER (1 à 8)
Après activation le chien de garde doit être réinitialisé avant la génération du Time-Out qui provoque
un RESET.
Les instructions assembleur « clrwdt » et « sleep » remettent le TIMER à 0.
cours PICs 36 / 53
PIC18Fxxxx - ressources
Start D7 D6 D5 D4 D3 D2 D1 D0 P Stop
Parité paire : le bit de parité est positionné pour que l’ensemble des bits de donnée et le bit de parité
représente un nombre de bits à 1 pair
Parité impaire : le bit de parité est positionné pour que l’ensemble des bits de donnée et le bit de
parité représente un nombre de bits à 1 impair
Dans ce type de transmission l’horloge de transmission est comprise dans le signal, le bit de start est
utilisé par le récepteur pour se synchroniser avec l’émetteur. Cependant les deux horloges de
transmission et de réception sont au départ très proche
L’horloge de réception possède une fréquence multiple de celle de transmission (en général x16 ou
x64)
Dans le cas d’une division par 16 :
Lors de la réception du front descendant du bit de start, l’USART attend 8 tops d’horloge, le circuit
reçoit alors théoriquement le milieu du bit de start, l’USART attend ensuite 16 tops d’horloge, le circuit
reçoit alors le milieu de D7 et lit ce bit, l’USART attend ensuite 16 tops etc. L’horloge du récepteur est
donc resynchronisée lors de la réception de chaque caractère.
START D7
16 tops d’horloge
Horloge
RX
récepteur
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30
L’horloge RX (réception) doit donc toujours être supérieure à celle de TX (transmission). En réalité les
deux horloges sont identiques et TX est divisé dans l’USART pour produire la vitesse de transmission
souhaité.
cours PICs 37 / 53
PIC18Fxxxx - ressources
USART : Transmission
USART : Réception
cours PICs 38 / 53
PIC18Fxxxx - ressources
Registres généraux
TXSTA : Registre d’état et de contrôle des émissions
7 6 5 4 3 2 1 0
CSRC TX9 TXEN SYNC SENDB BRGH TRMT TX9D
CSRC: Clock Source Select bit
Non utilisé en mode asynchrone
1 = mode maitre (horloge générée en interne depuis BRG)
0 = mode esclave (horloge externe)
TX9: 1 = transmission sur 9 bits
0 = transmission sur 8 bits
TXEN: 1 = transmissions activées
0 = transmissions désactivées
SYNC: USART Mode Select bit
1 = mode synchrone
0 = mode asynchrone
SENDB : Send Break Character bit
Mode asynchrone :
1 = Emet le caractère Break lors de la prochaine transmission (RAZ automatique)
0 = Fin de transmission du caractère Break
Inutilisé en mode synchrone
BRGH: High Baud Rate Select bit
Mode asynchrone :
1 = grande vitesse
0 = petite vitesse
Inutilisé en mode synchrone
TRMT: Transmit Shift Register Status bit
1 = registre de transmission TSR vide
0 = registre de transmission TSR plein
TX9D: 9th bit of Transmit Data
Peut être une adresse, une donnée ou un bit de parité
cours PICs 39 / 53
PIC18Fxxxx - ressources
Exemple en C18 :
Emetteur activé, transmission sur 8bits mode asynchrone, pas de Break.
Active le port série, récepteur activé sur 8 bits,
TXSTA = 0b00100000;
RCSTA = 0b10010000;
PIE1bits.TXIE=0; // IT en emission désactivée
PIE1bits.RCIE=1; // IT en reception activée (si nécessaire)
PIR1bits.TXIF=0; // efface drapeau transmission
PIR1bits.RCIF=0; // efface drapeau reception
Générateur de BAUD.
Le générateur de BAUD (BRG) repose sur un comptage de l’horloge Fosc (à ne pas confondre avec
Fcycle=Fosc/4)
BRG peut être un compteur 8 bits ou 16 bits
BAUDCONbits.BRG16=1 ; // compteur 16 bits
Le bit BRGH (TXSTA) permet d’activer ou non le pre-divideur sur BRG
TXSTAbits.BRGH=0; // BRG lent
Exemple : Pour un PIC avec FOSC=32Mhz et une vitesse de transmission souhaitée de 9600 Bauds,
mode 8 bits (BRG16=0) , avec prediviseur (BRGH=0)
BAUDCONbits.BRG16=0;
TXSTAbits.BRGH=0;
SPBRGH= 0x00; // ligne inutile ici puisque BRG est sur 8 bits
SPBRG = 51;
cours PICs 40 / 53
PIC18Fxxxx - ressources
cours PICs 41 / 53
PIC18Fxxxx - ressources
cours PICs 42 / 53
PIC18Fxxxx - ressources
cours PICs 43 / 53
PIC18Fxxxx - ressources
cours PICs 44 / 53
PIC18Fxxxx - ressources
Exemple : timing d’un CNA MAXIM 12bits MAX539, les bits sont
transmis lors du front montant de SCLK (horloge du maitre, ici un
P18Fxx2). Le CNA attend deux octets consécutifs avant de les placer
dans son tampion de sortie (4 bits de poid fort à 0)
cours PICs 45 / 53
PIC18Fxxxx - ressources
0 = pas d’écrassement
SSPEN: Synchronous Serial Port Enable bit
1 = Active le port série et configure SCK, SDO, SDI, et SS comme des broches de port série SPI
attention, les broches doivent être correctement configurée en entrée ou en sortie (TRISA et TRISC)
0 = Désactive la fonction SPI
CKP: Clock Polarity Select bit
1 = au repos l’horloge est à l’état haut
0 = au repos l’horloge est à l’état bas
SSPM3:SSPM0: Synchronous Serial Port Mode Select bits
0101 = SPI mode esclave , horloge = SCK , /SS est désactivé et peut être utilisée en E/S
0100 = SPI mode esclave , horloge = SCK , un niveau bas sur /SS est necessaire pour autoriser la réception
0011 = SPI mode maitre , horloge = sortie de TMR2 /2
0010 = SPI mode maitre , horloge = FOSC/64
0001 = SPI mode maitre , horloge = FOSC/16
0000 = SPI mode maitre , horloge = FOSC/4
cours PICs 46 / 53
PIC18Fxxxx - ressources
Les communications en mode I2C contrairement au mode SPI n’utilise que deux fils
(SCL et SDA pour horloge et données), l’horloge est unique (donc synchrone) et générée
par un maitre . Les données transitent sur un seul fil en émission et en réception. Il peut
y avoir plusieurs interfaces I2C sur un même fil de donnée avec une hologe synchrone
commune. La contrepartie est la necessité d’un protocole de communication.
Interface électrique :
Au repos données et hologe (SDA et SCL) sont à l’état haut grâce à deux résistances de rappel (Rp) .
Un état « actif » est donc un zéro électrique. Ce procédé permet d’éviter les courts circuits électriques
au cas ou deux périphériques voudraient prendre le ligne de donnée en même temps.
Le protocole I2C :
Emission d’un bit
cours PICs 47 / 53
PIC18Fxxxx - ressources
cours PICs 48 / 53
PIC18Fxxxx - ressources
cours PICs 49 / 53
PIC18Fxxxx - ressources
Le module MSSP (ci contre) utilise 6 registre pour contrôler les opération communues aux mode
I2C maitre et esclave (le registre SSPSR n’est pas accéssible)
SSPBUF contient la donnée à emttre ou la donnée reçue.
SSPADD contient l’adresse I2C du P18Fxx2
FSCL(2)
FCY FCY*2 BRG Value (2 Rollovers of BRG)
(1)
10 MHz 20 MHz 19h 400 kHz
10 MHz 20 MHz 20h 312.5 kHz
10 MHz 20 MHz 3Fh 100 kHz
(1)
4 MHz 8 MHz 0Ah 400 kHz
4 MHz 8 MHz 0Dh 308 kHz
4 MHz 8 MHz 28h 100 kHz
(1)
1 MHz 2 MHz 03h 333 kHz
1 MHz 2 MHz 0Ah 100kHz
(1)
1 MHz 2 MHz 00h 1 MHz
cours PICs 50 / 53
PIC18Fxxxx - ressources
cours PICs 51 / 53
PIC18Fxxxx - ressources
cours PICs 52 / 53
PIC18Fxxxx - ressources
Notes personnelles
cours PICs 53 / 53