Logiciels > Programmation PIC > Bases > MP > Registre à décalage 74165

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.

pic_tuto_base_shift_reg_74165_x1_001a

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 :

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.

pic_tuto_base_shift_reg_74165_x2_001a

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.