Dernière mise à jour :
10/08/2014
Présentation
Nous allons voir ici comment transférer des données logiques
via un registre à décalage
(shift register) de type 74165 (SN74165 ou 74HC165 par exemple). Ce
type de composant permet par exemple d'ajouter 8, 16 ou plus entrées
logiques à un PIC en ne consommant que trois broches. Dans
un premier temps, nous verrons comment disposer de 8 sorties
individuelles en n'utilisant que trois broches d'un PIC. Puis nous
verrons ensuite comment disposer de 16 sorties individuelles ou plus
(24, 32, etc), en utilisant toujours uniquement trois broches
du
PIC. Avant de lire cette page, je vous conseille de
commencer avec la page
PIC -
Bases
- Configuration minimale, si ce n'est déjà fait.
Pour l'ajout de 16 sorties sur le même principe, voir page
Registre à décalage 74595.
Registre à décalage 74165
Une petite description de ce composant s'impose avant d'aller plus
loin. Le
circuit
intégré
74165 fait partie de la famille des circuits TTL (Transistor and
Transistor Logic) et fonctionne sous une tension d'alimentation de +5
V. Il dispose de 8 entrées "parallèle" sur lesquelles on applique
l'état de 8 sorties logiques indépendantes (ces sorties peuvent
provenir de circuits logiques ou de simples interrupteurs), et d'une
sortie "série" qui
permet de véhiculer à la queue-leu-leu l'état des 8 entrées. Dit
autrement, le premier bit véhiculé sur la sortie série représente
l'état de la première entrée, le second bit véhiculé sur la
sortie série représente l'état de la seconde entrée, etc jusqu'au
huitième bit. Les 8 entrées sont capturées en même temps et ne sont
plus lues pendant la durée du transfert sur la sortie série. Nous avons
besoin de trois fils pour faire travailler le
74165 :
- un fil de données série pour le transfert des bits sur la sortie série (Data)
- un fil d'horloge pour cadencer le transfert des données (Clock / CLK)
- un fil de validation / verrouillage des entrées parallèles (Strobe ou SH/LD).
Si on désire plus de 8 entrées, on peut chaîner plusieurs 74165, nous
verrons comment faire plus tard.
PIC 16F628A et 1 x 74165, pour 8 entrées
Passons
maintenant au côté pratique, avec un PIC de type 16F628A associé à un
seul 74165. Ce PIC est répandu et dispose d'un nombre suffisant de broches pour mettre en évidence le transfert des données
(8 bits). Mais bien sûr, n'importe quel autre PIC peut convenir, le
logiciel donné ici en exemple s'adapte sans problème à d'autres
références.
Dans
le cas présent, les données à transférer proviennent de l'état d'un
ensemble de huit interrupteurs (DSW1), il peut s'agir de toute
autre source (valeur numérisée en sortie de CAN, mémoire EEPROM, etc).
Les LED raccordées aux huit
sorties du PORT B du PIC reflètent l'état des
interrupteurs. Le code complet est visible
ci-après.
program electronique_tuto_pic_mp_shiftreg_74165_16f628;
var
iValue: byte;
iLoop: byte;
Out_Clock: sbit at RA0_bit;
In_Data: sbit at RA1_bit;
Out_Strobe: sbit at RA2_bit;
procedure CPU_Init;
begin
CMCON := 7;
TRISA := %00000010;
TRISB := $00;
OPTION_REG := $00;
INTCON := $00;
Out_Clock := 0;
Out_Strobe := 1;
end;
function Data_Read: byte;
begin
iValue := $00;
Out_Strobe := 0;
Out_Strobe := 1;
for iLoop := 7 downTo 0 do
begin
iValue.iLoop := In_Data;
Out_Clock := 1;
Out_Clock := 0;
end;
result := iValue;
end;
begin
CPU_Init;
while true do
begin
PORTB := Data_Read;
delay_ms(1);
end;
end.
Deux remarques concernant ce
code :
- Dans la procédure Data_Read, les bits de la variable iValue
sont lues à l'envers.
On commence par le bit #7 et on termine avec le
bit #0. Celà s'explique par le fait que le premier bit délivré par la
sortie série du 74165 correspond à la dernière entrée (D7)
après transfert des huit bits. Si on ne transférait qu'un seul bit
au
lieu de huit, la valeur de ce premier (et unique) bit envoyé par
le 74165
correspondrait à la première entrée (D0).
- On ne laisse aucun
temps mort entre les changements d'état de la ligne Clock pour
transmettre l'état de chaque bit de la variable iValue.
On la
met à 1 et on retourne aussitôt après à 0. On peut se le permettre ici
car le PIC fonctionne avec son horloge interne de 4 MHz et le transfert
des données ne peut donc excéder la vitesse de 1 Mbps (ou 1 MHz si vous
préférez). Le 74165 peut monter à 20 MHz, et le temps minimum qui
sépare deux instructions est de 1 us, on ne risque pas d'avoir des
problèmes avec les temps de montée du circuit TTL.
PIC 16F628A et 2 x 74165, pour 16 entrées
Nous allons garder la
routine maison vue ci-avant mais cette fois, les
16 bits transmis seront enregistrés dans un mot (variable de type
word). Histoire de rendre l'exercice plus rigolo, on double le nombre
d'entrées mais on garde le PIC 16F628A et ses 8 LED sur le port B.
La différentiation des deux groupes de 8 entrées se fait dans le temps
: pendant une seconde on visualise l'état du premier groupe d'entrées,
et la seconde suivante on visualise l'état du second groupe d'entrées.
Le code complet correspondant est le suivant.
program electronique_tuto_pic_mp_shiftreg_74165_x2_16f628;
var
iValue: word;
iLoop: byte;
Out_Clock: sbit at RA0_bit;
In_Data: sbit at RA1_bit;
Out_Strobe: sbit at RA2_bit;
procedure CPU_Init;
begin
CMCON := 7;
TRISA := %00000010;
TRISB := $00;
OPTION_REG := $00;
INTCON := $00;
Out_Clock := 0;
Out_Strobe := 1;
end;
function Data_Read: byte;
begin
iValue := $00;
Out_Strobe := 0;
Out_Strobe := 1;
for iLoop := 15 downTo 0 do
begin
iValue.iLoop := In_Data;
Out_Clock := 1;
Out_Clock := 0;
end;
result := iValue;
end;
begin
CPU_Init;
while true do
begin
Data_Read;
PORTB := hi(iValue);
delay_ms(1000);
PORTB := lo(iValue);
delay_ms(1000);
end;
end.
Les seules différences par rapport au code du premier montage (avec
un seul registre 74165) concernent le nombre de bits à transmettre, 16
à la place de 8 (word à la place de byte, et boucle "for iLoop" de 15 à
0 au lieu de 7 à 0). La boucle principale assure l'affichage alterné
des deux groupes de 8 bits, un coup on visualise les 8 bits de poids
faible, et le coup suivant on s'occupe des 8 bits de poids fort.