Расширяем порты AVR или как подключить 74HC165 к AVR

Бывают случаи когда портов  AVR не хватает, а тратить деньги на более мощный мк не хочется — тут нам поможет микросхема 74HC165.

Даташит на микросхему 74HC165 Скачали 749 раз

Микросхема 74HC165 — сдвиговый регистр, преобразующий параллельный входной сигнал в последовательный выходной. Она позволяет увеличивать количество цифровых входов микроконтроллера.

Назначение выводов:

  • Vcc — питание
  • GND — земля
  • PL— защёлка
  • CP— тактовый вход
  • D0-D7— входы, состояние которых считывается в регистр
  • Q7— последовательный вывод
  • Q7— инверсный вывод, на нём идут биты с Q7, но инвертированные
  • DS— последовательный ввод; к нему можно подсоединить вывод QH второго регистра, получив каскадное подключение
  • CE— Clock Inhibit, или инвертированный Clock Enable; когда на нём 1, тактирование выключено

74hc165

Чип преобразовывает входящий параллельный сигнал на 8 пинах (Dx) в выходной последовательный сигнал на 1 пине (Q7). Передача синхронна: для такта используется дополнительный пин (CP). Также отдельным пином управляется регистр данных (PL), что позволяет «загружать» параллельный сигнал для последовательного считывания с 8 выходов единовременно.

74hc165_diagramm

Алгоритм работы с данной микросхемой очень прост:

1 — Вход SH/LD (сдвиг/загрузка) управляет занесением состояний входов в триггеры — подаём минус на вход — данные загрузятся.
— затем снова установить SH/LD в 1.
2 — Читаем данные с выхода SO.(это будет 8 бит)
3 — Вход CLK прижымаем к земле, задержка,  и поотом снова подаём плюс.
4 — возращаемся к 2 пункту и повторяем  всё заново — это будет уже 7 бит.

И так далее до последнего бита…

Для примера в Proteus накидал схемку.parallel input

На схеме у нас два таких регистра , внимательно посмотрите схему.

Код для работы в CVAVR будет выглядеть следущим образом:

#include 
#include 

#define   CLK         PORTB.0    // строб - сдвиг данных
#define   SHLD       PORTB.1  //защёлкивание входов
#define   BIT_IN      PINB.2      //вход данных
#define   BIT          16      //количество входов-бит ...1 регистр 8 входов

unsigned char data[BIT];     //здесь будем хранить данные

void data_in()      //функция чтения данных   74HC165
{
  unsigned int i=0;
    
     SHLD=0;         //защёлкиваем входные данные
     delay_us(300);
     SHLD=1;   
     
  for( i=0; i<BIT; i++ )   //цикл побитного чтения  данных
  {  
       delay_us(100);    
       data[ i ]=BIT_IN; 
      CLK=0;            //сдвигаем данные
      delay_us(100);   
      CLK=1;       
  }

}

void programm()
{
    data_in();
                //выводим данные в порт
     PORTB.7 = data[15];
     PORTB.6 = data[14];  
     PORTB.5 = data[13];
     PORTB.4 = data[12];
     PORTB.3 = data[11];
     PORTA.0 = data[10];
     PORTA.1 = data[9];
     PORTD.0 = data[8];  
     PORTD.1 = data[7];
     PORTD.2 = data[6];
     PORTD.3 = data[5];
     PORTD.4 = data[4];
     PORTD.5 = data[3];
     PORTD.6 = data[2];
                 
   delay_ms(10);
}

void main(void)
{
// Crystal Oscillator division factor: 1
#pragma optsize-
CLKPR=0x80;
CLKPR=0x00;
#ifdef _OPTIMIZE_SIZE_
#pragma optsize+
#endif

PORTA=0b100;
DDRA=  0b011;
PORTB=0b00000011;
DDRB=  0b11111011;            
PORTD=0x00;
DDRD=0xFF;


while (1)
      {
       programm();
      }
}

Как видите нет ничего сложного! Одна функция и все данные с регистров будут занесены в массив. Но не забывайте что чем больше вы подключаете регистров тем медленней опрос!

Результат выполнения симуляции в Proteus.R

Готовый пример проекта можно скачать по ссылке ниже.
Скачать проект — расширяем порты AVR или как подключить 74HC165 к AVR Скачали 1031 раз

Расширяем порты AVR или как подключить 74HC165 к AVR: 4 комментария

  1. Я может чего недопонял, но картинка совершенно не соответствует описанию в теме именования выводов. Логически оно понятно, но какая-то каша.
    А к тому же употребление слова «прижЫмаем «… Ну вы поняли — граммар наци негодует.

Добавить комментарий

Ваш e-mail не будет опубликован. Обязательные поля помечены *