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

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

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

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

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

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

Работа с 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 #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 } }

На этом видео показано использование этого устройства в качестве двоичного счетчика.

Я долго работал со сдвиговыми регистрами и работа с ними послужила мне хорошим толчком для дальнейшего изучения электроники.

Оригинал статьи на английском языке (перевод: Александр Касьянов для сайта cxem.net)


Категория: Микроконтроллеры
Метки:

Написать коментарий

*
= 4 + 3

Добавить изображение

Последние статьи