Реклама ⓘ
Главная » Микроконтроллеры
Призовой фонд
на апрель 2024 г.
1. 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 Поиск в магазине ОтронВ блокнот
U, U Сдвиговый регистр
CD74HC595
2 Поиск в магазине ОтронВ блокнот
R Резистор16 Номинал выбирается под тип светодиодаПоиск в магазине ОтронВ блокнот
LED Светодиод16 Поиск в магазине ОтронВ блокнот
Добавить все

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

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

Теги:

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

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

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

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

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

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

Программатор Pickit3
Программатор Pickit3
Discovery V8 Мини гравер 125 Ватт
вверх