Vous êtes sur la page 1sur 2

TP SP1 PIC18

Objectifs : Mise en œuvre du bus SPI d’un P18F2620


Mise en oeuvre d’un ADC 12bits MCP4821 (interface SPI)
A partir de : DataSheet P18F2620, MCP4821, MPLAB 8.x, PROTEUS/ISIS 7.4x

Ci-dessous le schéma structurel d’un montage mettant en œuvre un P18F2620 et un MCP4821


La sortie de l’ADC est reliée à l’oscilloscope du simulateur ISIS.

U1 VDD
2 11
RA0/AN0/C1IN- RC0/T1OSO/T13CKI
3 12
RA1/AN1/C2IN- RC1/T1OSI/CCP2B U2
4 13
RA2/AN2/C2IN+/VREF-/CVREF RC2/CCP1
5 14 3 8 VS
RA3/AN3/C1IN+/VREF+ RC3/SCK/SCL SCK VOUTA A
6 15 2
RA4/T0CLKI/C1OUT RC4/SDI/SDA CS
7 16 4
RA5/AN4/SS/HLVDIN/C2OUT RC5/SDO SDI B
10 17 5 6
RA6/OSC2/CLKO RC6/TX/CK LDAC SHDN
9 18
RA7/OSC1/CLKI RC7/RX/DT C
MCP4821
21
RB0/AN12/INT0/FLT0 D
22
RB1/AN10/INT1
23
RB2/AN8/INT2
24
RB3/AN9/CCP2A
25
RB4/AN11/KBI0 VSS
26
RB5/KBI1/PGM
27
RB6//KBI2/PGC VDD
28 1
RB7/KBI3/PGD RE3/MCLR/VPP
PIC18F2620

R9
10k

R10

VDD
VSS VDD
VDD 10k
5
4
3
2
1

C2
100nF
J1 VSS
VSS
J4
1
VSS ICD2
C1 2
100nF
CONN-SIL2
VSS

VSS

1) Justifier le câblage entre le uC et l’ADC (SCK, /CS, SDI)


2) Justifier le câblage des broches /LDAC et /SHDN du MCP4821
3) Configurer un projet dans MPLAB :
Compilateur C18
Debugger ISIS
Cible : P18F2620 en mode horloge interne (TOSC=32MHz, TCycle=8MHz)
4) On désire réaliser un programme produisant des rampes de tensions sur VS

Le fichier source ci-après est à compléter (remplacer les ??????)


C.Dupaty 11/2009 Page 1
TP SP1 PIC18

// init_horloge_interne.c doit être compilé dans le même projet


#include <p18f2620.h>
#define CS PORTCbits.RC2
#define TRIS_CS TRISCbits.TRISC2

void initSPI_emission(void) // initialisise SPI sur PIC18


{
DDRCbits. ???=0; //SCK en sortie
DDRCbits. ???=0; //SDO en sortie
SSPSTAT=0b????????; //echantillonne au milieu de la donnée, sur front montant
SSPCON1=0b????????; // active SPI MASTER, IDLE=0, clock=FOSC/4
PIR1bits.SSPIF=0; // efface drapeau d'emission SSPIF
TRIS_CS=0 ; // signal CS
CS= ?; // niveau de repos de CS
}

void emet_SPI(unsigned int n) // envoie synchro, pouls et spo2


{
unsigned char forts,faibles;
forts=n>>8; // recupere poids forts
faibles=n|0x0F; // recupere poids faibles
CS=0; // debut transmission
forts|=0b????????; // Sortie MCP4821 activee G=2
// forts|=0b????????; // Sortie MCP4821 activee G=1
SSPBUF=forts;
while(!PIR1bits.SSPIF); // attend la fin de l'émission
PIR1bits.SSPIF=0;
SSPBUF=faibles; // emmision
while(!PIR1bits.SSPIF); // attend la fin de l'émission
PIR1bits.SSPIF=0;
CS=1; // fin transmission, d=buffer en sortie du MCP4821
}

void main(void)
{unsigned int a;

init_horloge_interne();
initSPI_emission();
while(1) // demo, generateur de rampes
{
for (a=0;a<=????;??)
{
emet_SPI(a);
}
}
}

C.Dupaty 11/2009 Page 2