Cette carte d'extension est le gros morceau
électronique de l'Asservissement et du Positionnement.
Il ne s'agit que d'une bête carte d'extension
d'un bus processeur, cependant, le nombre de périphériques,
et de signaux transportés, ainsi que les spécificités
cumulées du DSP et du Starter Kit, rendent
cette carte une belle usine à gaz ...
cf description générale
Mécaniquement la carte est un PCB double face de 10,5*25 cm
environ. Elle comprend un nombre conséquent de via, a demandé
un certain nombre (élevé) d'heures de routage, 4 heures
de soudage initial. Une belle bête.
PCB double face de la carte d'extension. (La
résolution n'est pas assez grande pour voir apparaitre les pistes
...)
Le fichier Orcad du routage est ici
(par Polio).
Il comporte des ERREURS. La plus grosse est l'inversion
de 2 connecteurs de 40 broches (où vient s'enficher la carte
DSP Starter Kit). Cette inversion aurait pu être catastrophique,
heureusement, il s'agissait des connecteurs ayant le moins de pistes
arrivant dessus. Il y a quelques autres erreurs aussi. Ces
erreurs ne viennent pas du routage, mais de la documentation
indiquant les contraintes mécaniques et la connectique
à utiliser (doc présentée
ici, FAUSSE au niveau de la désignation des connecteurs
d'extension). Les autres erreurs, sont des erreurs de conception sur
le schéma.
Le schéma électronique (comportant toujours les même
ERREURS) est donné ici.
Il va être détaillé par la suite. (les erreurs
aussi)
Le schéma comporte 8 pages A4. Les diverses fonctions sont
regroupées par bloc.
Alimentation
Alimentation
Cette page ne comporte qu'un 7805. L'alimentation externe
fait environ 7.2V. Le 7805 alimente la carte d'extension.
Connecteurs
Connecteurs
Là encore, peu de commentaires, ce sont les 4 connecteurs
venant s'enficher sur la carte DSP Starter Kit. Il n'est pas
exclus qu'il reste une/des erreurs ou une inversion au niveau des
notations (JPx)
Ram
128 KMots de RAM ajoutés.
Le DSP a une architecture 32 bits (cf DSP).
Il ne travaille que sur des données de 32 bits, et
son bus externe est en 32 bits. Il faut donc que la mémoire
soit en 32 bits. Ici, la mémoire est séparée
en 4 mémoires de 8 bits. A chaque accès
les 4 chips sont sélectionnés et assurent des
données sur 4*8=32 bits. Chaque puce a une
capacité de 128Ko. Donc au total 128KMots de
32 bits.
Les lignes d'adresses sont directement issues du DSP (A0-A16).
Les lignes de données(D0-D31) aussi.
Ces RAM ont 4 signaux de validation :
- 2 chips select (_CS1,CS2)
- un signal de lecture (_OE)
- un signal d'écriture(_WE).
La façon dont ils sont reliés aux signaux du DSP
est FAUSSE.
Certes, le signal _SRAM est actif lorsque l'on accède
à une plage de mémoire précise du DSP
(_USER_RAM
actif de 80A000h à BFFFFFh )(signal décodé
à partir du bus d'@ par le Starter Kit).
Le signal _USERR sera actif lorsqu'il y aura une lecture
et le signal _USERW sera actif lorsqu'il y aura une écriture.
Mais _USERR et _USERW ne seront effectivement actifs QUE
LORSQUE l'accès est sur la plage _USERIO (C00000h
à DEFFFFh) ... (voilà ce que c'est
de faire des architectures mémoire à des heures pas
possibles de la nuit ...)
Il y a donc eu les modifications suivantes :
- _OE mis à 0. La mémoire est en lecture
permanente, du moins dès qu'elle est sélectionnée
(_CS=0)
- _WE relié à R/_W du DSP.
En écriture, on aura donc _OE à 0
et _WE à 0. Dans cette condition la mémoire
considère qu'il s'agit d'une écriture.
Flash
128Ko de Flash
La Flash utilisée est une flash 8 bits. L'architecture est
en 32 bits, mais la Flash sert à un but précis : le
boot (en autonome, sans PC pour charger le code). Le mécanisme
employé pour le démarrage est le même que celui
expliqué lors du chargement du code (cf présentation
du DSP).
C'est à dire qu'après le reset, si _INT0 est
mis à 0, le chargement va avoir lieu à partir de l'adresse
1000h qui est l'@ décodée par _USER_BOOT. Donc
si _INT0 est activé, le premier Mot lu sera
dans la Flash (en fait seuls les 8 bits de poids faible seront cohérents).
Cet octet, va déterminer sur combien de bits (8,16,32) va
se faire le téléchargement. Evidemment ici, il faudra
que ce soit sur 8 bits.
Il est à noter que les 1000h premiers octets de la
Flash ne sont pas utilisés (le chargement commencera en 1000h).
Les signaux _OE,_WE sont FAUX et seront détaillés
plus loin, car ils nécessitent une attention particulière
pour le flashage._CE par contre est juste et n'active la
puce que lorqu'il y'a un accès sur sa plage d'adresse. Le
flashage est effectué en envoyant des séquences de
commandes particulières à la Flash. Ici, pour simplifier
les opérations, le flashage sera réalisé par
le PC. C'est à dire que le PC, va demander
au Kernel de lire et écrire dans des zones mémoires
qui correspondront à la Flash (1000h .à 400000h)
Logique de contrôle
Logique de contrôle ("glue logic")
Ici, sont regroupés plusieurs petits détails à
ne pas négliger.
- Le signal PWM issu du StarterKit est mis à 0.
En regardant la documentation du StarterKit,
on s'aperçoit qu'il existe une patte DEMO, qui contôle
2 multiplexeurs, qui vont envoyer sur _USER_BOOT
et _USER_IO, soit les signaux _USER_BOOT et _USER_IO, soit
les signaux issu d'un timer du DSP. Pourquoi faire ? Faire
des zoli z'effets lumineux avec la led Bicolore connectée
entre ces 2 signaux. Ayant besoin des signaux _USER_BOOT et _USER_IO,
il est NECESSAIRE de désactiver ces effets (en mettant
donc PWM=DEMO à 0). Cette LED, bicolore
n'est pas complètement inutile non plus. Elle permet de
connaitre l'état de la carte. Si aucun accès ne
se produit ni sur IO ni sur BOOT, les 2 lignes seront à
1 et la led éteinte. Si il y'a un accès sur une
des 2 lignes, la led va s'allumer (rouge pour BOOT et vert
pour IO). En général un allumage permanent
(rouge ou vert indique un plantage du DSP -- il essaye toujours
d'accéder dans la même zone). On peut d'ailleurs
remarquer que lorsque la carte boote en mode autonome,
c'est à dire qu'elle boote en venant charger le code présent
dans la flash situé sur _USER_BOOT on voit
s'allumer la led en rouge le temps du chargement, qui dure très
peu de temps.
- Le jumper (situé en haut de la carte, à côté
des autres connecteurs), permet de mettre _INT_0 à
0. Cela a pour conséquence, après le reset
du DSP, de lui faire commencer son chargement depuis la
flash (_USER_BOOT : 1000h à 400000h),
et non d'attendre le chargement depuis le PC (FFF000h à
FFFFFFh). Lorsqu'un chargement ne s'effectue pas (en autonome
ou depuis le PC, il ne faut jamais oublier d'aller vérifier
ce jumper ...)
- Le circuit 74HC138 est un décodeur 3=>8, c'est
à dire qu'en sortie (Y0-Y7), seule la patte correspondant
au code binaire en entrée va être mise à 0.
(et ceci uniquement si le circuit est sélectionné,
sinon toutes les sorties sont à 1). Ici le circuit
est sélectionné lorsqu'il y'a un accès _USERX,
c'est à dire sur la plage (C00000h à DEFFFFh
en lecture ou écriture). Sur cette plage il existe aussi
les signaux _USERR et _USERW, qui ne sont actifs
que pour la lecture pour l'un et l'ecriture pour l'autre. En résumé
sur cette plage, quand on a :
- une lecture : _USERR est actif et _USERX
est actif
- une écriture : _USERW est actif et _USERX
est actif
Les 7 signaux de sortie génèrent 7 chip select,
(actifs chacun pour une adresse séparée).
Il y'a cependant une astuce. Les 3 bits connectés
en entrées sont les bits A1,A2,A3 (et non A0,A1,A2).
Cela veut donc dire que pour l'adresse C00000h (première
adresse de la plage _USERX), ce sera Y0 qui sera
actif , pour l'adresse C00001h ce sera AUSSI, Y0.
(Pour C00002h ce sera Y1). Cette astuce permet
de commander plus facilement les LM629.
- Y0 et Y1 servent à la commande des
LM629.(CS_LM_D et CS_LM_G) @C00000,C00001
et @C00002,C00003
- Y2 sert à la gestion des IT externes,
et des 4 entrées et 4 sorties numériques. @C00004,C00005
- Y3 sert au PIC @C00006,C00007
- Y4 sert à l'initialisation du système
(cf en dessous) @C00008,C00009
- Y5 servira à passer la flash en écriture
@C0000A,C0000B
- Y6 servira à passer la flash en lecture
@C0000C,C0000D
- Y7 servira pour l'UART sur l'extension @C0000E,C0000F
- Y2 (CS_EXT), va être séparé
en un chip select actif en écriture et un chip
select actif en lecture, via les 2 portes OU.
- Il avait été indiqué
que les signaux _OE,_WE de la flash étaient
FAUX.
Le signal _WE est relié à R/_W, il
sélectionnera la flash en écriture lorsqu'il y aura
un accès en écriture. Cependant il n'est pas possible
comme pour les RAM de relier _WE à 0, car
si les 2 signaux (_OE et _WE) sont à 0 la
flash n'effectue pas une écriture (comme l'effectue
la RAM dans ce cas). Il aurait été possible
générer 2 signaux _OE et _WE actifs
uniquement en lecture pour l'un et en écriture pour l'autre.
Une autre solution a été réalisée.
(demandant moins de modifs sur le PCB déjà tiré
- voilà ce qu'arrive quand on fait des architectures
mémoires tard dans la nuit (bis)).
Patch signal _CE Flash
Il a été utilisé une bascule
qui restait non utilisée sur le circuit. Voilà
le fonctionnement :
-
A l'allumage de la carte, le signal
_RESET va passer un bref instant à 0 puis
remonter à 1. Il va y avoir un front montant
sur CLK. A ce moment le contenu de D est envoyé
sur Q. Q passe donc à 0, et _CE
de la Flash est à 0 La Flash peut être
utilisée en lecture (mais pas en écriture).
Il se passe la même chose si l'on effectue un reset
manuel. Ce fonctionnement est nécessaire pour permettre
le bootload à partir de la flash (donc accès
en lecture à la flash).
- Lorsque l'on effectue un accès sur Y5, le signal
_PRE (preset) de la bascule est activé. Sa sortie
passe donc à 1, il n'est plus possible de faire
d'accès en lecture à la Flash, par contre les
accès en écriture fonctionneront.
- Lorsque l'on effectue un accès sur Y6, le signal
_CLR (clear) de la bascule est activé. Sa sortie
passe donc à 0, on revient dans le premier cas.
- Il sera donc possible en accédant aux @C0000A (Y5)
et @C0000C (Y6) (en lecture ou écriture, en lisant
ou écrivant n'importe quoi, peu importe seul le fait
d'y accéder et de générer un chip select
compte), d'autoriser les accès en lecture ou en écriture
sur la flash.
- Sur la droite du schéma se trouve le circuit de reset,
qui a été par la suite connecté au reset
du DSP.
- Etant donné le fonctionnement du DSP,
il est impératif qu'au reset
aucune des interruptions "utilisateur" ne soit
activée. Ce qui impose un mécanisme permettant
qu'au boot, il n'y ait pas d'interruptions de générées
par la carte. Ceci est réalisé par la bascule U9A.
Fonctionnement :
- Au boot, le signal _RESET, active l'entrée_PRE
(preset) et la sortie Q passe à 1. En
sortie des portes OU (_INT1, _INT3),
on aura toujours 1. Les interruptions ne sont donc
pas activées au boot.
- Lorsque l'on effectue un accès sur Y4, on
passe la bascule à 0. La sortie des portes OU,
recopie les entrées IT_EXT et IT_PIC.
- Il faut encore noter sur ces quelques bascules, qu'il faut faire
attention aux timings. C'est à dire que le décodeur
3=>8 (74HC138) et les portes OU sont de type
HC (74HC), ce qui permet d'assurer un fonctionnement
correct avec les timings des signaux de 40ns. Les bascules
sont des 74LS, les réactions sur les bascules pouvant
être décalées d'un cycle sans poser de problèmes
(et surtout on avait pas autre chose)
Interuptions
Interruptions externes et capteur de ligne
La carte dispose de 4 lignes d'interruptions externes, de 4 bits
d'entrée et de 4 bits de sortie. 2 latchs permettent de
recupérer et d'envoyer 8 bits de données.
- Lorsqu'un accès est fait en écriture sur l'@CS_EXT,
le signal _CS_EXT_OUT, passe à 0 (cf
au dessus). Le latch 74HC374(U6) va à ce moment
mémoriser les données présentes sur le bus.
De même en lecture, le buffer 74HC244(U3), mets les
données sur le bus lorsqu'il est sélectionné
(_CS_EXT_IN).
- A partir de ce mécanisme, on rentre les 4 interruptions
sur les 4 bits de poids faible de U3. Les 4 bits de poids
fort seront 4 entrées numériques 'simples' (sans
IT).
- On sort les 4 bits de poids faible de U6, sur un comparateur.
Les 4 bits de poids forts sont 4 sorties numériques 'simples'.
- On ajoute donc un comparateur U5, qui va comparer les
4 entrées 'interruptions' avec les 4 bits de poids faible
de U6. Si les 2 sont identiques sa sortie P=Q sera à
1 donc _IT_EXT ne sera pas actif. Si il y'a une
différence entre les 2, la sortie passera à 0
et une interruption sera levée.
- On suppose qu'il n'y a pas d'IT (les 4 bits de poids
faible de U6 ont la même valeur que les entrées
interruptions -- ceci est réalisé en lisant l'état
des entrées interruption et en écrivant cette valeur
sur les 4 bits de sortie de U6 -- ce qui revient à acquiter
l'interruption).
- Si une ligne d'interruption change d'état, la sortie
du comparateur passe à 0 et une interruption est
levée. L'interruption restera levée tant qu'elle
ne sera pas acquitée comme au dessus.
En résumé, ce sytème permet de :
- Générer une interruption lorsqu'un changement
(front montant OU descendant) intervient sur une des
4 entrées IT.
- Déterminer (dans la boucle d'IT par ex), quelle est(sont)
la(les) ligne(s) d'interruption(s) qui ont provoqué l'IT.
3 des 4 IT sont laissées libres (reliées en pratique
aux 2 moustaches devant le robot).
La dernière est utilisée par le capteur de ligne.
Le capteur de ligne est un détecteur composé
d'une diode et d'un phototransistor. La diode est
polarisée par R4; Le phototransistor par R5/R6.
Il est ensuite effectué une comparaison entre le signal sorti
du phototransistor et une référence ajustable(R7).
Ce qui permet de générer une information binaire :
ligne-pas ligne (et donc de générer
une IT à chaque entrée ET à chaque
sortie d'une ligne).
LM629
2 LM629
Les 2 LM629 permettent de réaliser plusieurs fonctions
dont l'asservissement. Au niveau électronique il s'agit de
périphériques recevant un bus de données, un
signal _RD, un signal _WR, un signal _CS.
Les 2 signaux _CS_LM_D et _CS_LM_G, viennent d'ici.
Ils correspondent chacun à 2 adresses mémoires. Ceci
permet de connecter la patte PS, (port select), qui permet
de sélectionner l'écriture d'une donnée ou
d'une commande, à la ligne d'adresse A0. Ainsi :
- A l'@C00000, le LM droite sera sélectionné.(avec
PS à 0 : commande)
- A l'@C00001, le LM droite sera sélectionné.(avec
PS à 1: donnée)
- A l'@C00002, le LM gauche sera sélectionné.(avec
PS à 0 : commande)
- A l'@C00003, le LM gauche sera sélectionné.(avec
PS à 1: donnée)
La patte HI (host interrupt), n'est pas utilisée
(elle permet de générer une interruption, mais n'est
pas utile dans le cadre de l'utilisation faite ici).
L'entrée _RST est reliée au _RESET de
la carte. L'entrée CLK, est reliée à
un oscillateur (en boitier DIP14) de 8 MHz. Le LM629 sort 2 informations,
(sens de rotation, PWM), envoyées au moteur (via la carte
puissance).
Les entrées A et B sont reliées aux
entrées A et B des roues codeuses. Les
roues codeuses doivent être alimentées (en 5V).
L'alimentation est reportée sur les connecteurs(J7
et J8) allant vers les roues codeuses. L'entrée IN
(servant pour une information d'index) ne doit pas être laisée
en l'air. Elle est rapellée à +5V.
Les signaux A et B issus des roues codeuses doivent être
traités avec soin, pour ne pas perdre d'information. Il faut
minimiser la longueur des cables entre les roues codeuses et les
LM,et si possible poser une résistance de rappel au +5V (environ
2,7ko) sur chacun des signaux, au plus prêt des roues (ex
sur le connecteur situé sur les roues).
PIC
PIC
Le PIC permet de réaliser la communication
I²C et la réception série de la liaison
HF.(non représentée ici). Sa connection au bus
se fait classiquement par _USERR,_USERW,_CS_PIC
et les 8 bits de données. Le PIC présent sur
la carte est un 20MHz, avec un quartz à 20MHz.Le flashage fait
appel au flasheur présenté à côté.
Le circuit de reset du PIC est un peu particulier. Il est nécessaire
d'ajouter une diode, car lors du flashage du PIC, on
apporte une tension de + de 13V sur la patte reset, tension
qui ne serait pas appréciée par les autres circuits.
Le reste ....
A cette description plus ou moins exhaustive de la carte, il faut
ajouter l'UART qui a été rajoutée après.
Elle est connecté classiquement, elle aussi au bus. Elle
utilise la même interuption que le PIC. Le fonctionnement
du PIC n'a PAS été testé en présence
de l'UART...(il *doit* marcher ...)(résultat : il ne marche
pas correctement, il faudrait traiter en soft tous les cas d'interruption
de l'UART)
Le schéma électrique de
la carte rajoutée 'à la place' du PIC
permettant de mettre le PIC et l'UART.
Schéma électrique de l'extension
ATTENTION ! le 74HC245 est inversé
(port A et B). Il y aurait une résistance de
pullup d' 1k en plus sur le signal Reset du PIC (de MCLR/VPP, broche
1 vers le +5V). La présence de cette résistence de
pull-up peut empecher le flashage correct du PIC
La carte a cet aspect mécanique
Le nombre de problèmes pouvant survenir sur l'assemblage
des différentes cartes est assez conséquent. Un élément
qui bloque le bus, ou n'agit pas comme il devrait peut complètement
bloquer le système.
Mapping mémoire
du DSP + carte Starter Kit + carte d'extension
Pour un certain nombre des périphiques présentés
au dessus, les adresses ne sont pas décodées complètement.
C'est à dire que tous les bits d'adresse ne sont pas
vérifiés. Il y'a alors plusieurs adresses qui
correspondent à la même case mémoire physique.
Dans le tableau qui suit; les adresses désignant un élément
déjà atteint par une autre adresse sont appelés
alias.
Adresse
|
Contenu
|
0 - FFFh |
ROM du DSP |
1000h - 1FFFFh |
Flash externe(la partie 0h
- 1000h, n'est pas accessible en utilisant cette plage
d'adresse) |
20000h - 3FFFFh |
Flash externe (alias) |
... |
|
7E0000h - 7FFFFFh |
Flash externe (alias) |
800000h - 807FFFh |
Réservé par le DSP |
808000h - 8097FFh |
Périphériques du DSP
(timer,DMA,etc) |
809800h - 809BFFh |
1ère partie de la RAM interne du
DSP (1024 Kmots) |
809C00h - 809EFFh |
début de la 2ème partie de la RAM
interne du DSP |
809F00h - 809FC0h |
suite de la 2ème partie de la RAM interne
du DSP (utilisée par le Kernel assurant la communication) |
809FC1h - 809FFFh |
fin de la 2ème partie de la RAM interne
du DSP (zone où sont situés les pseudo-vecteurs
d'interruption) |
80A000h - 81FFFFh |
RAM externe (128 KMots) (la
partie 800000h - 80A000h, n'est pas acessible
en utilisant cette plage d'adresse) |
820000h - 83FFFFh |
RAM externe (alias) |
... |
|
900000h - 91FFFFh |
RAM externe (alias) |
... - BFFFFFh |
|
C00000h |
LM Droite commande |
C00001h |
LM Droite donnée |
C00002h |
LM Gauche commande |
C00003h |
LM Gauche donnée |
C00004h |
4 entrées, 4 sorties + 4 IT |
C00005h |
4 entrées, 4 sorties + 4 IT (alias) |
C00006h |
Parallel Slave Port (Registre)
du PIC |
C00007h |
Parallel Slave Port (Registre)
du PIC (alias) |
C00008h |
Un accès à cette adresse autorise
les IT venant de la carte externe |
C00009h |
Un accès à cette adresse autorise
les IT venant de la carte externe (alias) |
C0000Ah |
Un accès à cette adresse passe
la flash en écriture |
C0000Bh |
Un accès à cette adresse passe
la flash en écriture (alias) |
C0000Ch |
Un accès à cette adresse passe
la flash en lecture |
C0000Dh |
Un accès à cette adresse passe
la flash en lecture (alias) |
C0000Eh |
UART |
C0000Fh |
UART (alias) |
C00010h - DEFFFFh |
alias de C00000h - C0000Fh |
E00000h - EFFFFFh |
utilisé par la carte StarterKit |
FFF000h - FFFFFFh |
utilisé par la carte StarterKit
(communication PC <-> DSP), bloque
tant que le PC n'a pas répondu |
|