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