Mesure de la p´ eriode d’horloge du bus SPI.
E. Carry, J.-M Friedt, 11 mars 2020´
Connexion internet interdite, t´el´ephones portables interdits, communications interdites, r´eflexion autoris´ee.
Supports de cours `a 172.20.133.70
Nous nous proposons de g´en´erer un signal d’horloge pour cadencer le bus SPI et de v´erifier sa p´eriode par la mesure sur un timer.
Nous proposons trois fonctions .cqui fournissent chacune certaines fonctionnalit´es n´ecessaires `a un programme fonctionnel. En particulier,input capture.cstocke dans une variableresla valeur du compteur lors du d´eclenchement d’un ´ev´enement.
1. Identifier sur le sch´ema de l’Olimexino32U4 les broches sur lesquelles l’horloge SPI et l’entr´ee timer sont connect´ees. Quelles sont-elles ? brancher un cˆable entre ces deux broches. On notera que sur le connecteur UEXT, la broche connect´ee `a une empreinte carr´ee est la broche 1, et la nomenclature suit une ligne longue impaire et une ligne longue paire.
4.7k
100nF
100nF
DVCC
20pF
20pF
4.7k 4.7k
100nF
BH10R ATMEGA32U4-AU
1uF/10V
100nF 100nF AVCC
16.000MHz/SMD5x3.2/12pF
Close Close Close
3.3V_E
IRLML6402
1uF/10V 100k
10k 0R(Board_Mounted)
3.3V_E 3.3V_E 3.3V_E
5V_USB
DVCC
NA NA DVCC DVCC
Close R13
C4 C1
C8
C9
R12 R11
C10
UEXT
1 2
3 4
5 6
7 8
9 10
U1
INT6/AIN0/PE6 1 2 UVCC
3 D- 4 D+
5 UGND 6 UCAP 7 VBUS
PB0/SS/PCINT0 8 PB1/PCINT1/SCLK 9 PB2/PDI/PCINT2/MOSI 10 PB3/PDO/PCINT3/MISO 11
PB7/PCINT7/OC0A/OC1C/#RTS 12
#RESET 13
14 VCC
15 GND
XTAL2 16
XTAL1 17
PD0/OC0B/SCL/INT0 18
PD1/SDA/INT1 19
PD2/RXD1/INT2 20
PD3/TXD1/INT3 21
PD5/XCK1/CTS 22
23 GND 24 AVCC
PD4/ICP1/ADC8 25
PD6/T1/#OC4D/ADC9 26
PD7/T0/OC4D/ADC10 27
PB4/PCINT4/ADC11 28 PB5/PCINT5/OC1A/#OC4B/ADC12 29 PB6/PCINT6/OC1B/OC4B/ADC13 30 PC6/OC3A/#OC4A 31 PC7/ICP3/CLK0/OC4A 32
PE2/#HWB 33 34 VCC
35 GND
PF7/ADC7/TDI 36 PF6/ADC6/TDO 37 PF5/ADC5/TMSPF4/ADC4/TCKPF1/ADC1PF0/ADC0 38394041 AREF 42
43 GND 44 AVCC
C2 C3 C5
GND GND
Q1
21
R11_E 2
1
R12_E 2
1
R13_E FET3
C19 R20
R21 R19
R22 R23
2 1
FET3_E RESET AREF
#HWB
XTAL1 XTAL2 D+D-
D1(TXD) D1(TXD)
D3(SCL) D3(SCL)
D14(MISO)
D14(MISO)
D15(SCK)
D15(SCK)
D16(MOSI)
D16(MOSI)
D2(SDA) D2(SDA)
D0(RXD) D0(RXD)
TXLED
D7(LED1)
D17(RXLED)
D13(UEXT_#CS)
D13(UEXT_#CS) A0A1 A2A3 A4A5
D4
D5
D6
D9(LED2) D10D11 D12
D8(UEXT_PWR_E)
D8(UEXT_PWR_E)
UEXT
GS D
0R
2. Proposer un Makefile qui automatise la compilation et l’´edition de lien des programmes pour fournir un ex´ecutable fonctionnel. On s’interdira ´evidemment de fusionner les trois programmes en un unique code source mais conserverons la structure de compilation s´epar´ee. Flasher le microcontrˆoleur.
3. Observer `a l’oscilloscope la p´eriode du signal d’horloge de SPI : quelle est-elle. Est-elle en accord avec vos attentes `a la lecture des programmes fournis.
4. L’interruption input capture.c m´emorise le compteur au moment d’une transition sur la broche associ´ee.
Modifier input capture.c afin de m´emoriser les transitions cons´ecutives de l’horloge lors de l’´emission d’un octet sur bus SPI. Combien de mot m´emorisons nous ? sur combien de bits est stock´e chaque mot ?
5. Un compteur aura pu servir `a m´emoriser la case m´emoire contenant la derni`ere mesure : exporter cette variable versmain.c(comment faire ?) et tester cette variable pour afficher, dans la boucle infinie demain.c, les mesures obtenues par le timer.
6. D´emontrer l’affichage de ces mesures dans le logiciel ad´equat ex´ecut´e sur le PC. On pourra fournir le r´esultat sous la forme
1A6E 1A5E 1A4E 1A3E 1A2E 1A1E 1A0E 19FE 2963 2973 2983 2993 29A3 29B3 29C3 29D3 ...
7. Analyser la sortie que vous observez : est-elle coh´erente avec vos attentes ? Expliquez/justifiez.
8. La r´esolution de la mesure est m´ediocre. Comment l’am´eliorer ? D´emontrer.
9. Pourquoi cette m´ethode de mesure ne permet pas de d´etecter la d´erive de fr´equence du quartz caden¸cant le microcontrˆoleur ?
10. Comment modifier le montage pour mesurer la d´erive en fr´equence du quartz ?
1. Timer3 donc ICP3 est connect´e `a D13. SCK de SPI est sur D15 qui n’est accessible qu’au travers de la broche 9 de UEXT.
2. Le Makefile est au minimum de la forme TARGET=main
CPU=atmega32u4
CFLAGS=-mmcu=$(CPU) -Os -Wall -I../../include -I../VirtualSerial/ -I../lufa-LUFA-140928 \ -DF_USB=16000000UL -DF_CPU=16000000UL -Os -std=gnu99
all: $(TARGET).out
$(TARGET).out: $(TARGET).o spi.o input_capture.o
avr-gcc $(CFLAGS) -L../../../../../platforms/Atmega32/VirtualSerial -o $(TARGET).out \
$(TARGET).o spi.o input_capture.o -lVirtualSerial avr-objcopy -O ihex $(TARGET).out $(TARGET).hex
$(TARGET).o: $(TARGET).c
avr-gcc $(CFLAGS) -c $(TARGET).c spi.o: spi.c
avr-gcc $(CFLAGS) -c spi.c input_capture.o: input_capture.c avr-gcc $(CFLAGS) -c input_capture.c 3. Exemple de capture d’´ecran :
La p´eriode est 8 µs en accord avec l’horloge (16 MHz) divis´ee par 128.
4. Un octet transmis sur SPI induit 8 transitions d’horloge sur SPI, donc nous rempla¸consresparres[8]. Nous d´efinissons un indice qui indique quelle case doit ˆetre remplie. La solution est donc
volatile short res[8];
volatile int indice;
ISR(TIMER3_CAPT_vect) {if (indice<8)
{res[indice] = ICR3; indice++;}
}
Chaque mot du timer 3 est stock´e sur 16 bits, en accord avec la taille de l’accumulateur du compteur.
5. Dansmain.c: extern int indice;
extern short res[8];
void transmit_data(uint8_t data) {char buffer[2];
buffer[0]=data;buffer[1]=0;
fputs(buffer, &USBSerialStream);
}
void write_char(unsigned char c)
{if ((c>>4)>9) transmit_data((c>>4)-10+’A’); else transmit_data((c>>4)+’0’);
if ((c&0x0f)>9) transmit_data((c&0x0f)-10+’A’); else transmit_data((c&0x0f)+’0’);
}
void write_short(unsigned short s) {write_char(s>>8);
write_char(s&0xff);
}
int main(void) { int k;
indice=0;
[...]
USBCON=0;
while(1)
{ _delay_ms(1000);
sd_raw_send_byte(0x00); // emettre une trame SPI if (indice==8)
{for (k=0;k<8;k++)
{write_short(res[k]); transmit_data(0x20); } transmit_data(0x0A); transmit_data(0x0D);
indice=0;
}
CDC_Device_ReceiveByte(&VirtualSerial_CDC_Interface);
CDC_Device_USBTask(&VirtualSerial_CDC_Interface);
USB_USBTask();
} }
Nous avons donc export´eindiceen pr´efixant sa d´eclaration deextern.
6. Le r´esultat est, sousminicom:
1A6E 1A5E 1A4E 1A3E 1A2E 1A1E 1A0E 19FE 2963 2973 2983 2993 29A3 29B3 29C3 29D3 6D3A 6D4A 6D5A 6D6A 6D7A 6D8A 6D9A 6DAA 48B5 48A5 4895 4885 4875 4865 4855 4845 04E1 04D1 04C1 04B1 04A1 0491 0481 0471 3EF6 3F06 3F16 3F26 3F36 3F46 3F56 3F66 772C 771C 770C 76FC 76EC 76DC 76CC 76BC
7. Les valeurs s’incr´ementent le long de chaque ligne de 0x10, soit 16. Il s’agit bien du ratio entre le pre-scale caden¸cant SPI (/128) et le pre-scaler caden¸cant le timer (/8).
8. Am´elioration de la r´esolution en r´eduisant le pre-scaler de 8 `a 1 sur le timer. Dans ce cas 55BE 553E 54BE 543E 53BE 533E 52BE 523E
2AC6 2A46 29C6 2946 28C6 2846 27C6 2746 000C 0074 00F4 0174 01F4 0274 02F4 0374 2AAC 2B2C 2BAC 2C2C 2CAC 2D2C 2DAC 2E2C
et cette fois le timer s’incr´emente de 128 entre deux mesures, soit 0x80. En effet (premi`ere ligne) 0x30+0x80=0xB0 (puisque 3+8=11=0xb) qui est bien la valeur observ´ee.
9. Le mˆeme quartz cadence les deux p´eriph´eriques dont la contribution de sa d´erive est ´elimin´ee dans cette mesure relative.
10. D´eclencherinput capturepar une source externe stables de temps, e.g. 1-PPS de GPS.