Работа со сдвиговым регистром 74HC595/74HC165 и библиотекой SPI для управления ЭМЗ.

Нет ответов
Evgeny.want-to-sleep
Offline
Зарегистрирован: 20.05.2014

Название темы, конечно, многообещающие, но ... Стуация такая: хочу сделать на базе ардуино систему управления электро-механическими замками. В наличии ардуино уно. Так как количество цифровых выходов ограничено, решил использовать сдвиговый регистр 74HC595 и 165. 595 подключил к выходам: DS(14)->11(MOSI); 11(SHCP)->13(SCK); 12(STCP)->12(SS)(http://www.nxp.com/documents/data_sheet/74HC_HCT595.pdf); остальные выходы как в туториале (http://robocraft.ru/blog/arduino/519.html). Написал на пробу простую программу, в которой инициализировал 11, 12, 13 пины для шины SPI как OUTPUT и 7 для кнопки как INPUT. Запись битов в сдвиговый регистр делал встроенной полудуплексной командой shiftOut (11, 12, MSBFIRST, LED_ON). byte LED_ON = B00000001 (подаёт +5В на Q1 регистра). Запись происходит при нажатии кнопки на 7 пине ардуино. Когда кнопка отпущена записывается byte LED_OFF = B00000000. Весь код скетча:

#define SS_PIN 12
#define SCK_PIN 13
#define MOSI_PIN 11
#define BUTTON_PIN  7

byte LED_ON = B00000001; 
byte LED_OFF = B00000000; 

void setup()
{
  pinMode(BUTTON_PIN, INPUT);
  pinMode(SS_PIN, OUTPUT);
  pinMode(SCK_PIN, OUTPUT);
  pinMode(MOSI_PIN, OUTPUT);
  
  Serial.begin(9600);
}

void loop()
{
  if (digitalRead(BUTTON_PIN)== HIGH)
  {
    Serial.println(1);
    delay(200);
  }
  else 
  {
    Serial.println(0);
    delay(200);
  }
   
 if (digitalRead(BUTTON_PIN) == HIGH)
 {
     digitalWrite(SS_PIN, LOW);
     shiftOut(MOSI_PIN, SCK_PIN, MSBFIRST, LED_ON);
     digitalWrite(SS_PIN, HIGH);
 }
 else 
 {
     digitalWrite(SS_PIN, LOW);
     shiftOut(MOSI_PIN, SCK_PIN, MSBFIRST, LED_OFF); 
     digitalWrite(SS_PIN, HIGH);
 }
}

Всё работает отлично. Но существует другое решение, более гибкое (особенно при подключении входного сдвигового регистра) - это использование библиотеки SPI. Хорошо, решил попробовать с ней: убрал инициализацию пинов, кроме кнопки (7) и SS (12), сделал #include <SPI.h>, в setup SPI.begin() и SPI.setBitOrder(MSBFIRST), shiftOut заменил на SPI.transfer(LED_ON), залил скетч, но ничего не заработало. Более того всключидись 3, 4, 5, 6 пины регистра. Попробовал сделать в setup

digitalWrite(SS_PIN, LOW);
SPI.transfer(0);
digitalWrite(SS_PIN, HIGH);

не помогло. Стандартный вопрос - что я делаю не так, почему shiftOut работает, а SPI.transfer нет.

P.S. Кнопка подключена как во втором уроке Джереми Блюма http://wiki.amperka.ru/%D0%B2%D0%B8%D0%B4%D0%B5%D0%BE%D1%83%D1%80%D0%BE%D0%BA%D0%B8:2-%D0%BA%D0%BD%D0%BE%D0%BF%D0%BA%D0%B8-pwm-%D1%84%D1%83%D0%BD%D0%BA%D1%86%D0%B8%D0%B8.