pourquoi l’usb?
DESCRIPTION
Pourquoi L’USB?. Vitesse. C’est un Bus. Présent sur tous les PC. Facilité pour l’utilisateur. … Mais difficulté pour le concepteur. Sommaire. Un microcontrôleur avec USB intégré: 68HC908JB8 Interface FT232 et microcontrôleur 68HC908AB32 Interface FT245 et PIC 16F873-20 - PowerPoint PPT PresentationTRANSCRIPT
1
Pourquoi L’USB?
• Vitesse.
• C’est un Bus.
• Présent sur tous les PC.
• Facilité pour l’utilisateur.
• …
• Mais difficulté pour le concepteur.
2
Sommaire
• Un microcontrôleur avec USB intégré: 68HC908JB8• Interface FT232 et microcontrôleur 68HC908AB32• Interface FT245 et PIC 16F873-20
La présentation se base sur le livre:
‘L’USB pour tous’ de Vincent Le Mieux au édition Dunod
3
Acquisition photodiode USB
Le système acquisition photodiode USB, permet de faire l’acquisitionde signal de 3 photodiodes simultanément via liaison USB d’un PC.F = 10Hz max
Le produit se compose de la façon suivante :• La carte électronique. • 3 photodiodes reliées à la carte électronique par une connexion
BNC.• Le logiciel d’acquisition : Phodiode_USB.exe• Le package USBIO de Thesycon : usbio_el.exe version 1.51 en
version freeware.• Le driver USB modifié comprenant : carte_HC08.inf et
carte_HC08.sys
4
Diagramme de contexte du système
Photodiodes
Cartephotodiode
Carte USB
PC
CommunicationUSB
CommunicationSPI CAN
CommandePot numConv I/U
Courant desphotodiodes
Alimentation
5
Côté Device
6
GND
VCC
C2100n
C3
100n
VCC
GNDGND
J12
CON16AP
+1
+3
+5
+7
+9
+11
+13
+15
+2
+4
+6
+8
+10
+12
+14
+16
GNDRSTmonIRQ
PTA3PTA2PTA1PTA0
Vout
U1
IQD14PCB
H8
VCC14
GND7
NC1
VCC
GND
OSC1
OSC1
J3
Selecteur alim
123
Vout
PTB0
PTB2PTB1
PTB4PTB3
PTB5PTB6
+ C710u
J6
Selecteur reset
123
RSTmonRST
C6100n
GND
J7
BP
12
GND
L1
Self
GND
GND
VBUS
F2 0.125A
VCCU3
hc08JB8
OSC143
OSC244
VDD
2
VSS
42
VREG
1
/IRQ18 /RST36
PTA0//KBA035
PTA1//KBA134
PTA2//KBA233
PTA3//KBA332
PTA4//KBA425
PTA5//KBA524
PTA6//KBA623
PTA7//KBA722
PTE0/TCLK27
PTE1/TCH011
PTE2/TCH126
PTE3/D+12
PTE4/D-13
PTB05
PTB14
PTB23
PTB341
PTB440
PTB539
PTB638
PTB737
PTC014
PTC115
PTC216
PTC317
PTC428
PTC529
PTC630
PTC731
PTD06
PTD17
PTD28
PTD39
PTD410
PTD521
PTD620
PTD719
VBUS
PTC5
+
C1
10u
VREG
R3 22
R2 22
JP1USB_TypeB
VBUS1 D-2 D+3 GND4
SHIELD5
SHIELD6
PTE3PTE4
J14
CON2
12
J13
CON10
12345678910
PTA0
PTB2PTB1PTB0
PTC5PTB4PTB3
PTB5PTB6
GND
GND
VCC
JH4
HEADER 1
11
JH3
HEADER 1
11
JH2
HEADER 1
11
JH1
HEADER 1
11
RST
R510k
R4 10k
GND
IRQ
PTA1PTA2PTA3
Hardware device: 68HC08JB8 + connecteur USB
Interface USB
7
0
VDD
VSS
CAL
C15
220p
1 2
+5V
D1
G1118
12
R4 10K1 2
U5
X9C104
INC1
U/D2
CS7
VH3
VW5
VL6
U2
REF1004
A4 K
6
K.8
0
R2
47K1
2
VDD
U3B
TLV2462
-6
V+8
04
OUT7
+5
U3A
TLV2462
-2
V+8
04
OUT1
+3
VRef
0
C40.1µF
12
R1
1
12
VDD
+C3
6.8µF
12
0
VAmpli
VAmpli
VRef
U4
CS5509
CS1
CONV2
CAL3
XIN4
XOUT5
BP/UP6
AIN+7
AIN-8
VREF+9
VREF-10
VA+11
DGND12VD+13
SCLK14SDATA15DRDY16
GND
0
0
VCC
VRef
GND
VCC
C50.1µF
12
R3 101 2
C60.1µF
12
VD+
0
VDD
VDDVD+
SCLKSDATA
CONV#CS_AD
#INCU/#D
#CS_POT
XIN
Hardware device:
Photodiode +Conv I/U+Pot num
CAN
Ref U
8
SISCK
+5V VCC
VCC
GND
GND
0
VDD
VSS
Amplificateur & Conversion_1
VCC
GND
SCLKSDATA
#CS_AD
CONV
#INCU/#D
XIN
#CS_POT
CAL
Amplificateur & Conversion_2
VCC
GND
SCLKSDATA
#CS_AD
CONV
#INCU/#D
XIN
#CS_POT
CAL
SCKSI
SCKSI
GND
VCC
VCC
GND
GND
VCCSISCK
CS1
CONV
CONV
CONV
CONV
CS1
CS3
CS2
CS3CS2
U_D
CAL
INC
CS1
CS3
CS2U_D
U_D
INCU_D
INC
INC
XIN
XIN
XIN
0
C1
100n
C2
100n
+5V
U14
kony
NC1
GND7
output8
VCC14
0
XIN
VCC
CAL
CAL
CAL
J3
CON2
12
J4
CON10
123456789
10
0
Amplificateur & Conversion
VCC
GND
SCLKSDATA
#CS_AD
CONV
#INCU/#D
XIN
#CS_POT
CAL
Hardware device:
9
Diagramme de communication USB
10
Enumération
L'énumération est le processus qui permet à l’hôte de déterminer l'appareil qui vient d'être branché au bus et les paramètres dont il besoin, comme la consommation électrique, le VID/PID, le nombre et le type de terminaison du produit, etc.…
Les étapes du processus d’énumération sont:
• L'hôte ou Hub détecte la connexion d'un nouvel appareil via les résistances de rappel de l'appareil reliées sur les 2 fils de données. L'hôte attend au moins 100ms, le temps que la prise soit insérée complètement et que l'alimentation de l'appareil soit stabilisée.
• L'hôte émet un "reset" mettant l'appareil dans l'état par défaut. L'appareil peut maintenant répondre à l'adresse zéro par défaut.
• L'hôte demande le descripteur de device.
• l'hôte émet immédiatement un autre reset sur le bus.
• L'hôte émet maintenant une commande SetAdress, mettant l'appareil dans l'état adressable.
• L'hôte demande les différents descripteurs (device, configuration, chaines).
11
//============================================================================// File: U08DESC.C Ver.: 1.01// Func: Device-, Configuration- and String-Descriptors for USB08 Demo Application (all const Data, placed in Flash-ROM)// // Auth: (C)2000,2001 by Oliver Thamm, MCT Elektronikladen GbR http://hc08web.de/usb08//============================================================================
const device_descriptor DeviceDesc ={
sizeof(device_descriptor), // Taille de ce descripteur en octetsDT_DEVICE, // Type de descripteur (=1 pour le matériel){0x10, 0x01}, // Version USB (ici = 1.10)0, // Code de classe (aucun)0, // Code de sous-classe(aucun)0, // Code de protocole (aucun)8, // taille maximum d'un paquet(transféré par EP0) {0x70, 0x0C}, // Vendor ID = MCT Elektronikladen 0x0C70{0xA6, 0xF0}, // Product ID = 0xF0A6{0x00, 0x01}, // Numéro de version (codé en BCD)1, // Index du descripteur de chaîne fabricant2, // Index du descripteur de chaîne produit0, // Index du descripteur de chaîne N° de série1 // Nombre de configurations possibles
};const configuration_descriptor ConfigDesc ={ sizeof(configuration_descriptor), // Taille du descripteur en octets DT_CONFIGURATION, // Type de descripteur(=2 pour Configuration) {sizeof(configuration_descriptor)+sizeof(interface_descriptor)+sizeof(endpoint_descriptor)+sizeof(endpoint_descriptor), 0x00}, // Longueur totale des données pour cette configuration 1, // Nombre d'interfaces supportées par cette configuration 1, // Valeur désignant cette configuration 0, // Index du descripteur de chaîne pour cette configuration 0x80, // Bus Powered : alimenté par l'USB (0xC0 = Self Powered) 0x64 // 100x2mA = 200 mA (car Ox64 = 100 en décimal)};
Les descripteurs HC08JB8
12
const interface_descriptor InterfaceDesc ={
sizeof(interface_descriptor), // Taille du descripteur en octetsDT_INTERFACE, // Type de descripteur (=4)0, // Numéro de cette Interface (0..)0, // interface secondaire2, // Nbre d'endpoints pour cette interface(EP0 exclu)0xff, // Code de classe (0xff = Vendor specific)0x01, // Code de sous-classe0xff, // Code de protocole (0xff = Vendor specific)0 // Index du descripteur de chaîne pour cette interface
};const endpoint_descriptor Endpoint1Desc ={
sizeof(endpoint_descriptor), //Taille du descripteur en octetsDT_ENDPOINT, // Type de descripteur(=5 pour un endpoint)0x81, // Adresse de cet EndPoint (EP1, IN)0x03, // fonctionnement sous Interruption{0x08, 0x00}, // Taille maximum du paquet pour cet EndPoint (8 octets)10 // Intervalle de scrutation (en ms)
};const endpoint_descriptor Endpoint2Desc ={
sizeof(endpoint_descriptor), // Taille du descripteur en octetsDT_ENDPOINT, // Type de descripteur(=5 pour un endpoint)0x02, // Adresse de cet EndPoint(EP2, OUT)0x03, // fonctionnement sous Interruption{0x04, 0x00}, // Taille maximum du paquet pour cet EndPoint (4
octet)10 // Intervalle de scrutation (en ms)
};
13
Descripteur de chaine
//Chaîne Fabricant//--------------------------------------------#define SD1LEN sizeof("CPMOH")*2//--------------------------------------------const uchar String1Desc[SD1LEN] = {
// Size, TypeSD1LEN, DT_STRING,// Unicode String'C', 0,'P', 0,'M', 0,'O', 0,'H', 0
};
// Chaîne Produit//-----------------------------------------------#define SD2LEN sizeof("carte_HC08")*2//-----------------------------------------------const uchar String2Desc[SD2LEN] = {
// Size, TypeSD2LEN, DT_STRING,// Unicode String'c', 0,'a', 0,'r', 0,'t', 0,'e', 0,'_', 0,'H', 0,'C', 0,'0', 0,'8', 0
};
14
Soft HC08JB8 : exemple Dongle USB
#include "hc08jb8.h" // définitions des registres du 68HC908JB8#include "u08usb.c" // toutes les fonctions USB (merci Oliver Thamm !)
void main() {
uchar i ; //indexuchar recep; //variable accueillant l'octet envoyé par le PC
uchar code[8] = {100,101,102,103,104,105,106,107}; //tableau de 8 octets constituant le code du dongle
initUSB(); // initialisation de l'USB
cli(); // autorise les interruptions
while(1) {
recep = getUSB(); // récupération de l'octet envoyé par le PCif (recep == 67) /67 = code ASCII de la lettre C {
for (i=0;i<=7;i++)putUSB(code[i]); // envoi du code du dongle vers le PC :
}
}}
15
Coté Host
16
Le driver USBIO de Thesycon
17
Insertion de l’objet COM dans VB6
18
Dim WithEvents Endpoint1 As USBIOCOMLib.USBIOInterface ' déclaration de variable objet de type USBIOCOMLib.USBIOInterface qui fait référenceDim WithEvents Endpoint2 As USBIOCOMLib.USBIOInterface ‘ a une instance de classe capable de générer des événements. Dim tampon_reception(0) As Byte ' un octets à recevoirDim tampon_emission(0) As Byte ' un octets à émettreDim Status As Long ' variable d'état
Private Sub Form_Load() ‘ Chargement de la feuille Dim Devices As Long Dim Status1 As Long Dim Status2 As Long Dim Index As Byte Set Endpoint1 = New USBIOCOMLib.USBIOInterface ' On crée une instance de l’objet USBIO COM pour l'Endpoint 2 Set Endpoint2 = New USBIOCOMLib.USBIOInterface ' On crée une instance de l’objet USBIO COM pour l'Endpoint 1
' Enumération des matériels disponibles ' Un Guid perso a été obtenu avec Guidgen.exe ; ce même Guid est copié ‘ dans le fichier carte_HC08.inf, le fichier pilote de ce montage USB Endpoint1.EnumerateDevices "{6C9B5899-077E-4e3f-9A39-C2C6C99C8DE8}", Devices If Devices >= 1 Then ' test du nombre de matériels disponibles Endpoint1.OpenDevice 0, Status1 Endpoint2.OpenDevice 0, Status2 If (Status1 = USBIO_ERR_SUCCESS) And (Status2 = USBIO_ERR_SUCCESS) Then ‘teste si la fonction opendevice a réussi
Endpoint1.AddInterface 0, 0, 4096, Status ‘ configuration du matériel Endpoint1.SetConfiguration 0, Status Endpoint1.Bind &H81, Status ‘ établi la liaison entre l’objet USBIO COM et l’endpoint EP1 in qui a pour adresse 0x81 Endpoint1.StartReading 1, 5, 5, Status ‘ valide la lecture pour EP1, la taille du tampon. Endpoint2.Bind &H2, Status ‘ établi la liaison entre l’objet USBIO COM et l’endpoint EP2 out qui a pour adresse 0x02 Endpoint2.StartWriting 1, 5, 5, False, Status ‘ valide l’ écriture pour EP2 , la taille du tampon Else MsgBox "Erreur de communication avec la carte" End If Else MsgBox "La carte n'est pas connectée ou le driver n'est pas installé" End If End Sub
Programme Visual Basic 6
Explication p122
19
Private Sub Endpoint1_ReadComplete(ByVal Obj As Object) Endpoint1.ReadData tampon_reception, 1, Status ‘ Reception d’un octet If Status = USBIO_ERR_SUCCESS Then LB_AFF.Caption = Format(tampon_reception(0) / 255 * Val(TB_Uref), " 0.000 V")
' affichage de la tension mesurée dans le Label LB_AFF
Else MsgBox "Erreur de communication Read Complete" End IfEnd Sub
Private Sub Timer1_Timer() tampon_emission(0) = 77 Endpoint2.WriteData tampon_emission, 1, Status ' envoi vers le hc08End Sub
Private Sub Form_Terminate() Close #1 Endpoint1.StopReading Endpoint2.StopWriting Endpoint1.CloseDevice Endpoint2.CloseDeviceEnd Sub
20
Logiciel VB6
21
Avantages et limites du systèmes
Avantages
• Simplicité du hardware (coût et encombrement)
• Transfert en mode interrupt (90% de la bande passante allouée pour les transferts périodiques)
Limites
• 1 transfert de 8 octets tous les 10ms → 800 octets/s
• Complexité de développement au niveau PC car obligation de passer par des .dll
• Pas de VID: 1500$
22
Pulse Start Laser Synchro • Le but est de synchroniser le déclenchement de 2 lasers (ML et SL)
Pour cela, le produit devra générer 2 pulses pour chaque laser.
La première impulsion (FlashSL et FlashML) déclenchera une lampe flash.
La seconde impulsion (QswitchSL et QswitchML) déclenchera un obturateur optique.
• Chaque impulsion devra avoir une largeur de L=20µs.
Les FlashSL et FlashML ont une fréquence de 10Hz.
• Le retard de QswitchSM par rapport à QswitcML est de ∆t +/-2ns de précision.
- ∆t : délais entre les Qswitch. -200ns < ∆t < 1s
∆t : -200ns → 1µs pas de 5ns
1µs → 1s pas de 1µs
23
Chronogramme
FlashSL
QswitchSL
FlashML
QswitchML
Laser 1
Laser 2
∆t
140µs
230µs
20µs
5V
0V
5V
0V
5V
0V
5V
0V
10Hz
10Hz
24
Schéma fonctionnel
HC08AB32
SCI
XILINXXCS30XL
DS1023-500
DS1023-500
DS1023-500
DS1023-500Génération des pulses+/-1µs
FlashSL +/-1ns
QswitchSL +/-1ns
FlashML +/-1ns
QswitchML +/-1ns
Programmation retard de 1ns → 1µs
Programmation :- Retard de 1µs → 1s
FlashSL +/-1us
QswitchSL +/-1us
FlashML +/-1us
QswitchML +/-1us
Générateur de retard de 1ns → 1µs
FT232
PC
Labview+ VCP
USB
Laser1
Laser2
25
Côté Device
26
C8 100n
C9 100n
JP1
USB_TypeB
VBUS1
D-2
D+3
GND4
SHIELD5
SHIELD6
U4
93C46
CS1
SK2
DIN3
DOUT4
VCC8
NC7
NC6
GND5
R2 27
R31k5
EEDATA
EESK
R427
EECS
EECS
RESET#
EESK
R7
10k
C7
33n
R82k2
EEDATA
R5470
VCC
C12 27p
VCC
C13 100n
C14 27p
C15 100n
U21
FT232BM
TXD25
RXD24
RTS#23
CTS#22
DTR#21
DSR#20
DCD#19
RSTOUT#5
XTOUT28
RESET#4
EECS32
EESK1
EEDATA2
AGND
29
GND
9
RI#18
GND
17
TEST31
PWRCTL14
PWREN#15
TXDEN16
TXLED#12
SLEEP#10
RXLED#11
VCC-
IO13
3V3OUT6
AVCC
30
VCC
26VC
C3
USBDM8
USBDP7
XTIN27
R64k7
R910k
R22200
12
VCC
D4LED
Y1CRYSTAL
5V
VCC
R23200
12
D5LED
TxHC08
RxHC08
Hardware device
EEPROMFT232
27
ADR_1ADR_2ADR_3ADR_4
DS_P0
DS_LE0
VCC
DS_LE1DS_LE2DS_LE3
DS_P1DS_P2DS_P3DS_P4DS_P5DS_P6DS_P7
FINX
U27
OSC_DIP8
H5
VCC8
GND4
NC1
STARTX
RSTXWRX
32MHz
HC08_P0CPTHC08_P1CPTHC08_P2CPTHC08_P3CPT
HC08_P0ENHC08_P1ENHC08_P2ENHC08_P3EN
HC08_0HC08_1
RxHC08
HC08_2
U2hc08AB32
OSC159
OSC258
/RST3
/IRQ2
PTA026
VREFH54
Avss/VREFL45
PTC060
PTC161
PTC2/MCLK62
PTC363
PTC41
PTC564
PTD042
PTD143
PTD246
PTD4/TBCLK50
PTD551
VD
D2
2V
SS
21
PTD6/TACLK52
PTD347
PTD753
PTE0/TxD13
PTE1/RxD14
PTE2/TACH015
PTE3/TACH116
PTE4//SS17
PTE5/MISO18
PTE6/MOSI19
PTE7/SPSCK20
PTF0/TACH24
PTF1/TACH35
PTF2/TBCH26
PTF3/TBCH37
PTF4/TBCH08
PTF5/TBCH111
PTF612
PTF710
PTG0/KBD023
PTG1/KBD124
PTG2/KBD225
PTH0/KBD348
PTA127
PTA228
PTA329
PTA430
PTA531
PTA632
PTA733
PTB0/ATD034
PTB1/ATD135
PTB2/ATD236
PTB3/ATD337
PTB4/ATD438
PTB5/ATD539
PTB6/ATD640
PTB7/ATD741
PTH1/KBD449
CGMXFC57
VD
DA
55
VS
SA
56
VD
DA
RE
F4
4
5V
HC08_3
GND
C2100n
5V
C3100n
C4100n
5V5V
GNDGND GND
GND
J12
CON16AP
+1
+3
+5
+7
+9
+11
+13
+15
+2
+4
+6
+8
+10
+12
+14
+16
RST
IRQRSTmon
PTA0
PTA0
IRQ
PTC3PTC1PTC0
PTC1PTC0
Vout
PTC3
5V
GND
GND
C5100n
CGMXFC
HC08_5HC08_4
HC08_7HC08_6
J3
Selecteur alim
123
TxHC08
5V
GND
+ C110u
J13
Selecteur reset
123RST
RSTmon
R110k
5V
C6100n
GND
J14
BP
12
GND F1 0.125A
VCCMON
5VVCCMON
ADR_0
HC908AB32
Vers mon08
Hardware device
28
HC08_7HC08_6
HC08_5
HC08_4HC08_3HC08_2HC08_1HC08_0
C20 100nF1 2
R21200
12
D3LED
R1810k
12
ADR_4ADR_3
ADR_1ADR_2
ADR_0
R1710k
12
U18
XC17128D
DATA1
CLK2 RST/OE3
CE4 CEO
6
GND5
VCC
8
VPP7
C27100nF
12
J6
CON6
123456
U28
OSC_DIP8
H5
VCC8
GND4
NC1
R20 4.7k
1 2
J7
CON3
123M0
RST_EE
DONE_EE
3.3V
DONE
_EE
/PROGRAM
DATA_EE
CCLK_EE
DATA_EE
GND
PULS
E_1
3.3V
GND
CLK8MHz
3.3V
GND
GNDCCLK_EE
DATA_EEDONE_EE
PULS
E_2
/PROGRAM
3.3V
C19 100nF1 2
GNDGND
PULS
E_3
3.3V
3.3V
3.3V
3.3V
3.3V
3.3V
3.3V
3.3V
3.3V
3.3V 3.3V
GND
GND
5V
GND
GND
GND
GND
GND
CCLK_EE
U31E
74HCT04/SO
1110
R1910k
12
GND
U17 XCS30XL
I/O GCK12
I/O_33
I/O_44
I/O_55
I/O TDI6
I/O TCK7
GND8
I/O_99
I/O_1010
I/O TMS11
I/O_1212
I/O_1313
I/O_1414
I/O_1515
I/O_1616
GND17
VCC18
I/O_1919
I/O_2020
I/O_2121
I/O_2222
I/O_2323
I/O_2424
I/O_2525
I/O_2626
GND27
I/O_2828
I/O_2929
I/O_3030
I/O_3131
I/O_3232
I/O GCK233
M134
GND35
M036
VCC
37/P
WRD
WN
38I/O
GCK
339
I/O (H
DC)
40I/O
_41
41I/O
_42
42I/O
_43
43I/O
(/LD
C)44
GND
45I/O
_46
46I/O
_47
47I/O
_48
48I/O
_49
49I/O
_50
50I/O
_51
51I/O
_52
52I/O
(/IN
IT)
53VC
C54
GND
55I/O
_56
56I/O
_57
57I/O
_58
58I/O
_59
59I/O
_60
60I/O
_61
61I/O
_62
62I/O
_63
63G
ND64
I/O_6
565
I/O_6
666
I/O_6
767
I/O_6
868
I/O_6
969
I/O G
CK4
70G
ND71
DONE
72
VCC73 /PROGRAM74 I/O (D7)75 I/O GCK576 I/O_7777 I/O_7878 I/O (D6)79 I/O_8080 GND81 I/O_8282 I/O_8383 I/O (D5)84 I/O_8585 I/O_8686 I/O_8787 I/O (D4)88 I/O_8989 VCC90 GND91 I/O (D3)92 I/O_9393 I/O_9494 I/O_9595 I/O (D2)96 I/O_9797 I/O_9898 I/O_9999 GND
100 I/O (D1)101 I/O_102102 I/O_103103 I/O_104104 I/O (D0 DIN)105 I/O GCK6 (DOUT)106 CCLK107 VCC108 O
TDO
109
GND
110
I/O_1
1111
1
I/O G
CK7
112
I/O_1
1311
3
I/O_1
1411
4
I/O C
SI11
5
I/O__
116
116
I/O_1
1711
7
GND
118
I/O_1
1911
9
I/O_1
2012
0
I/O_1
2112
1
I/O_1
2212
2
I/O_1
2312
3
I/O_1
2412
4
I/O_1
2512
5
I/O_1
2612
6
GND
127
VCC
128
I/O_1
2912
9
I/O_1
3013
0
I/O_1
3113
1
I/O_1
3213
2
I/O_1
3313
3
I/O_1
3413
4
I/O_1
3513
5
I/O_1
3613
6
GND
137
I/O_1
3813
8
I/O_1
3913
9
I/O_1
4014
0
I/O_1
4114
1
I/O_1
4214
2
I/O G
CK8
143
VCC
144
GND1
RST_
EE
C22 100nF1 2
C21
100nF
1 2
C23 100nF1 2
C24
100nF
1 2
C26100nF1
2
C25100nF1
2
CLK8
MHz
FINX
RSTXPU
LSE_
0WRXSTARTX
Hardware device
29
GND
U31B
74HCT04/SO
3 4
U31C
74HCT04/SO
5 6
HC08_P0EN
HC08_P1EN
U34A
74HCT08
1
23
U34B
74HCT08
4
56
U34C
74HCT08
9
108
U34D
74HCT08
12
1311
HC08_P2EN
HC08_P3EN
GND
U23
DS1023
IN1
LE2
Q/P03
CLK/P14
D/P25P3
6
P47
GND
8
REF/PWM9P5
10
MS11
P612
P713
P/S14
OUT/OUT15
VCC
16
PULSE_2
VCC
C18100n
GND
GND
U24
DS1023
IN1
LE2
Q/P03
CLK/P14
D/P25P3
6
P47
GND
8
REF/PWM9P5
10
MS11
P612
P713
P/S14
OUT/OUT15
VCC
16
PULSE_3
C28100n
VCC
GND
VCC
VCC
GND
GND
R12 0
R13 0
HC08_P2CPT
HC08_P3CPT
PULSE_3_OUT
PULSE_2_OUT
DS_P3 VCC
GND
C33100n
DS_P4DS_P5
U31A
74HCT04/SO
1 2
DS_P6DS_P7
DS_P1
U31D
74HCT04/SO
9 8
DS_LE0
DS_P0DS_P2
VCC
GND
GND
C16100n
U22
DS1023
IN1
LE2
Q/P03
CLK/P14
D/P25P3
6
P47
GND
8
REF/PWM9P5
10
MS11
P612
P713
P/S14
OUT/OUT15
VCC
16
PULSE_0
VCC
GND
R10 0
VCC
C17100n
VCC
GND
GND
U20
DS1023
IN1
LE2
Q/P03
CLK/P14
D/P25P3
6
P47
GND
8
REF/PWM9P5
10
MS11
P612
P713
P/S14
OUT/OUT15
VCC
16
GND
PULSE_1
R11 0
J15
CON5
12345
PULSE_0_OUT
PULSE_2_OUTPULSE_1_OUT
PULSE_3_OUT
GND
HC08_P0CPT
DS_P3
DS_P5DS_P4
DS_P7DS_P6
DS_LE1
DS_P1
DS_P2DS_P0
DS_P4DS_P3
DS_P6DS_P5
DS_P1
DS_P7
DS_P0
DS_LE2
PULSE_0_OUT
DS_P2
DS_P3
DS_P5DS_P4
DS_P7DS_P6
DS_LE3
DS_P1
DS_P2DS_P0
PULSE_1_OUT
GND
GNDGND
HC08_P1CPT
Hardware device
30
/************************************************************//* initialisation du micro et des périphériques *//************************************************************/void initialisation(void){ CONFIG1 = 0x01; /* watchdog disable */ DDRA |= 0xFE; /* PTA1..7 en sortie */ DDRB = 0xFF; /* PTB en sortie */ DDRD = 0xFF; /* PTD en sortie */ DDRE = 0b01111101; /* PTE2..6 en sortie et PTE7 en entrée */ DDRF = 0xF0; /* PTF0..3 en entrée et PTF4..7 en sortie */ DDRG = 0x07; /* PTG en sortie */ PTFPUE = 0x0F; /* PTF0..3 pull-up activé */ PTF |= 0xF0; /* Pulse enable */ PTA &= 0x0F; /* DS_LE = 0 */ PTB = 0x00; /* DS DATA = 0 */ PTG = 0x00; /* Xilinx START, WR, RST = 0 */ PTD = 0x00; /* Xilinx DATA = 0 */ PTE &= 0b10000011; /* Xilinx ADRESSE = 0 */
SCBR = 0x31; /* Baudrate = Fclk/(64xPDxBD) = 32MHz/(64*13*2) = 19200 Bauds */ SCC1 = 0x40; /* SCI enable */ SCC2 = 0x0C; /* Validation du mode réception et émission */ EnableInterrupts; /* validation des interruptions */}
Soft HC08
31
/* Déclaration des variables */unsigned char buffer_reception[TAILLE_BUFFER]; /* Création d’un tableau dont la taille est TAILLE_BUFFER */unsigned char *ptr_reception = buffer_reception; /* Création d’un pointeur sur le buffer_reception[0] */
/* Réception par l'usb */unsigned char reception_usb(void){unsigned char trame_recut = 0;static unsigned char attente_trame = 1;static unsigned char longueur_a_recevoir;
if (SCS1_SCRF == 1) /* si le buffer de réception est plein */ { *ptr_reception = SCDR; /* on stocker la donnée dans buffer_reception */ if (attente_trame == 1) /* si c'est le premier octet de la trame */ { longueur_a_recevoir = *ptr_reception; /* le premier octet correspond a la longueur de la trame */ attente_trame = 0; } longueur_a_recevoir--; ptr_reception++;
/* pointe sur prochain octet à recevoir */ if(!longueur_a_recevoir) /* Si plus d'octet à recevoir */ {
trame_recut = 1; attente_trame = 1; /* on passe en mode attente de trame car la transmission est terminée */
ptr_reception = buffer_reception; /* pointe le début du buffer */ } else trame_recut = 0; } else trame_recut = 0; return trame_recut; /* trame_recut = 1 si une trame est reçut */}
Soft HC08
32
/***********************************************//* Emission par l'usb *//***********************************************/void emission_usb(unsigned char caractere_a_envoyer){ while (SCS1_SCTE != 1); /* on attend tant que le buffer de transmission n'est pas vide */ SCDR = caractere_a_envoyer; /* copie du caractère dans le registre d’emission */}
Soft HC08
33
Coté Host
34
Driver: VCP
35
Driver: D2XX
36
Soft PC pour VCP
On peut utiliser tous les logiciels permettant de communiquer avec une liaison série:
• HyperTerminal de Microsoft ou Terminal v1.9b: http://bray.velenje.cx/avr/terminal/
• Visual basic, Visual C++,… avec le contrôle ActiveX de Microsoft dédié aux communications série (MSCOMM32.OCX).
• Labview que l’on a choisi.
• …
37
FT232 Xilinx
HC908AB32
38
Soft PC: Labview
• Sélection du Port COM 3 • En fonctionnement
39
Avantages et limites du systèmes
Avantages
• Facilité d’utilisation et de développement en utilisant les VCP
• Vitesse de transfert: • FT232 + HC08AB32 → 45Ko/s
avec les VCP.
Limites
• Complexité de développement au niveau PC si on veut utiliser les D2XXmais on a acces a de nouvelles fonctionnalités:- meilleurs débit- mode bit bang
40
Quelles performances peut-on obtenir en associant un PIC
16F873 et un FT245?• Le montage précédemment présenté
remplit parfaitement le cahier des charges demandé. Mais la vitesse de transfert des données peut-elle être augmentée de façon significative ? Sinon comment peut-on opérer en conservant cet interface et sa facilité de mise en œuvre?
41
Limites de la liaison série
• Quand on utilise une liaison série , chaque octet est mis en série .Sachant que chaque bit est échantillonné 16 fois et que 8 bits + 1 bit de start+1 bit d’arrêt donc au moins 10 bits sont nécessaires , la fréquence du débit des données est égale à la fréquence de cycle micro divisée par 160 (10*16) ; pour nous ici c’est 2Mhz divisé par 160= 50Kbytes /seconde .
• C’est la limite d’ envoi des données pour cette interface
42
Choix du module FT 245
• Au lieu d’utiliser le module FT232 , nous travaillons avec le module FT245 qui permet l’envoi des données directement en parallèle vers le module USB donc avec un gain de temps appréciable .
• Nous allons voir que les instructions même minimales du micro ne permettent pas un débit proche du maximum permis par la liaison USB.
• Nous utilisons un microprocesseur PIC16F
43
Vcc
44
45
/*Fichier usb_Lecture.h
Microcontrôleur : PIC16F873 /20PQuartz : 20MHz
*//* Déclaration des fonctions usb */#define RXF PORTB.1#define RD PORTB.5
char usb_Lecture(void) // Réception d'un octet{unsigned char donne;
while (RXF); //teste si ordre de départ arrivéRD=0; // activation de la lecture donne=PORTC;RD=1;return donne;
}
46
47
TMR1IF=0; // mettre le flag à 0 , mais sans permettre interruptionT1CON=0x7; // autorisation du compteur d’événements
// on viendra simplement tester le flag de dépassement
WRL=1; // synchro oscillowhile (TMR1IF==0){
if (TXE==0) // mode envoi normal{
WRM=1;// PORTC--;
WRM=0;
}TMR1IF=0; // raz du flag
WRL=0; // synchro oscillo
// fin=0; // signifier que c est finiWRL=0; // synchro oscilloTMR1IF=0;T1CON.0=0; // arrêt du compteur événements
WRM=1; // dernière donnée avec forçage du msb à 1WRM=0;
}
48
49
Essais et performances
• L’utilisation d’ un microprocesseur 16F873-20 est nécessaire pour obtenir des vitesses de transmission élevées.
• Ce montage permet d’autres possibilités d’interfaçage grâce aux commandes diverses sur les sorties des ports non employées.
50
DRIVER:DLL
51
52
Essais
• Nous avons pu transférer avec cette simple liaison USB des blocs de 64Koctets en 140ms donc au rythme de 2.3 us en moyenne et ceci sans perte d’information .
• Les blocs plus importants sont transmis avec des pertes d’information avec cette interface. Elle peut encore être améliorée.