Главная » Микроконтроллеры
Призовой фонд
на май 2017 г.
1. Тестер компонентов MG328
Паяльник
2. Осциллограф DSO138
Паяльник
3. Регулируемый паяльник 60 Вт
Паяльник
4. 100 руб.
От пользователей

Управление 595 сдвиговыми регистрами при помощи AVR по SPI

Сдвиговый регистр 74HC595

На самом деле управлять сдвиговыми регистрами при помощи AVR микроконтроллера довольно просто. Большинство микроконтроллеров имеют SPI (последовательный периферийный интерфейс). Сдвиговый регистр является периферийным устройством, подключаемым через последовательный порт. Все, что нам нужно сделать, это присоединить к микроконтроллеру сдвиговый регистр и написать достаточно простую программу. О сдвиговых регистрах и принципах их работы можно прочитать здесь.

Отечественным аналогом популярной микросхемы 74HC595 является отечественная КР1564ИР52 (правда первую найти бывает проще у нас).

Схема управления сдвиговыми регистрами

В подключении контактов Clear и Enable к микроконтроллеру необходимости нет. Если используется мало регистров сдвига, можно подать на них нули, закрыв их. Я просто подключил вывод SCLR к VCC и вывод Enable к GND.

После этого у нас осталось три вывода: SI, SCK и RCK. Можно подавать сигнал на выводы SCK и RCK по одному проводу, но это уже другая тема.  Я подключил эти контакты к ATmega168. Обратите внимание, что выводы SCK и RCK для обоих сдвиговых регистров связаны между собой. Вывод SI  первого чипа подключен к микроконтроллеру. Вывод QH первого сдвигового регистра подключен к выводу SI второго чипа.

Макетка на сдвиговых регистрах 595

Работа с SPI

Работа с SPI довольно проста. Необходимо сделать несколько вещей для работы с ним:
1. Настройте используемые контакты как выход.
2. Включите SPI в режиме Master
3. Подайте низкий уровень на СС
4. Передайте команды в SPDR, он автоматически подготовит и предаст их сдвиговому регистру.
5. Дайте команду сдвиговому регистру для исполнения полученных команд.

В качестве SPI выводов можно использовать только заранее определённые выводы, которые можно узнать в документации.

#define SHIFT_REGISTER DDRB
#define SHIFT_PORT PORTB
#define DATA (1<< PB3)           //MOSI (SI)
#define LATCH (1<< PB2)          //SS   (RCK)
#define CLOCK (1<< PB5)          //SCK  (SCK)

SHIFT_REGISTER |= (DATA | LATCH | CLOCK);     //Set control pins as outputs
SHIFT_PORT &= ~(DATA | LATCH | CLOCK);                //Set control pins low

SPI включается в режиме Master одной строкой:

SPCR = (1 << SPE) | (1 << MSTR);  //Start SPI as Master

На пин SS необходимо подать низкий уровень. В документации на микроконтроллер написано: "Когда SPI включен в режиме Master, СС не контролируется автоматически. Это должно быть сделано пользователем". Это делается так:

//Pull LATCH low (Important: this is necessary to start the SPI transfer!)
 SHIFT_PORT &= ~LATCH;

Сейчас мы пишем наши команды для регистра сдвига:

//Shift in some data
SPDR = 0b01010101;            //This should light alternating LEDs
//Wait for SPI process to finish
while(!(SPSR & (1<< SPIF)));

Пока данные хранятся в регистре сдвига светодиоды не загорятся:

//Toggle latch to copy data to the storage register
SHIFT_PORT |= LATCH;
SHIFT_PORT &= ~LATCH;

Готовая программа:

#include "avr/io.h"
 
#define SHIFT_REGISTER DDRB
#define SHIFT_PORT PORTB
#define DATA (1<< PB3)     //MOSI (SI)
#define LATCH (1<< PB2)        //SS   (RCK)
#define CLOCK (1<< PB5)        //SCK  (SCK)
 
int main(void)
{
  //Setup IO
  SHIFT_REGISTER |= (DATA | LATCH | CLOCK); //Set control pins as outputs
  SHIFT_PORT &= ~(DATA | LATCH | CLOCK);        //Set control pins low
 
  //Setup SPI
  SPCR = (1<< SPE) | (1<< MSTR);  //Start SPI as Master
 
  //Pull LATCH low (Important: this is necessary to start the SPI transfer!)
  SHIFT_PORT &= ~LATCH;
 
  //Shift in some data
  SPDR = 0b01010101;        //This should light alternating LEDs
  //Wait for SPI process to finish
  while(!(SPSR & (1<< SPIF)));
 
  //Shift in some more data since I have two shift registers hooked up
  SPDR = 0b01010101;        //This should light alternating LEDs
  //Wait for SPI process to finish
  while(!(SPSR & (1<< SPIF)));
 
  //Toggle latch to copy data to the storage register
  SHIFT_PORT |= LATCH;
  SHIFT_PORT &= ~LATCH;
 
  while(1)
  {
    //Loop forever
  }
}

Список радиоэлементов

Обозначение Тип Номинал Количество ПримечаниеМагазинМой блокнот
IC МК AVR 8-бит
ATmega8
1 Поиск в FivelВ блокнот
U, U Сдвиговый регистр
CD74HC595
2 Поиск в FivelВ блокнот
R Резистор16 Номинал выбирается под тип светодиодаПоиск в FivelВ блокнот
LED Светодиод16 Поиск в FivelВ блокнот
Добавить все

Скачать список элементов (PDF)

Оригинал статьи

Теги:

none Опубликована: 2012 г. 0 0
Я собрал 0 0
x

Оценить статью

  • Техническая грамотность
  • Актуальность материала
  • Изложение материала
  • Полезность устройства
  • Повторяемость устройства
  • Орфография
0

Средний балл статьи: 0 Проголосовало: 0 чел.

Комментарии (1) | Я собрал (0) | Подписаться

0
Bredov-IV #
Пощупал хорошую микросхему - TB62706BN (или BF) - 16-разрядный регистр сдвига с защёлкой и постоянным током на выходах. Светодиодики без резисторов
Жаль только, найти сложновато, в отличие от тех же 595.
Ответить
Добавить комментарий
Имя:
E-mail:
не публикуется
Текст:
Защита от спама:
В чем измеряется сила тока?
Файлы:
 
Для выбора нескольких файлов использйте CTRL

Программатор Pickit3
Программатор Pickit3
FM-модуль RDA5807M Набор 4WD Kit Bluetooth
вверх