Сдвиговый регистр. Управления по технологи COM порта

efrem
Offline
Зарегистрирован: 25.02.2017

Добрый день! Столкнулся с проблемой по написанию скедча для различных моделей сдвигового регистра. А именно имеется необходимость создания более 256пинов которые могли бы управлять через стороннею программу с ПК. На данный момент имеется вот такой банальный код, который занимает довольно-такибольшое пространства на плате.(если его расширить на 256 независимых команд, а то и больше так как в некоторых случаях необходима совместная работа нескольких пинов одновременно)

char pc_code=0;
int dataPin  = 9;   //Пин подключен к DS входу 74HC595
int latchPin = 10;   //Пин подключен к ST_CP входу 74HC595
int clockPin = 11;  //Пин подключен к SH_CP входу 74HC595
void setup() {
  pinMode(latchPin, OUTPUT);
  pinMode(clockPin, OUTPUT);
  pinMode(dataPin, OUTPUT);
  Serial.begin(9600);                  
}
void loop() {
  if (Serial.available() > 0)
  {
    pc_code = Serial.read();
    if(pc_code=='q') // после подачи на порт q включить цикл 
    {
  digitalWrite(latchPin, LOW); // устанавливаем синхронизацию "защелки" на LOW                        
  shiftOut(dataPin, clockPin, LSBFIRST, B01001100);    // передаем последовательно на dataPin
  digitalWrite(latchPin, HIGH); //"защелкиваем" регистр, тем самым устанавливая значения на выходах
}    }
    if(pc_code=='Q')
    {
  digitalWrite(latchPin, LOW);                        
  shiftOut(dataPin, clockPin, LSBFIRST, B00000000);   
  digitalWrite(latchPin, HIGH);
    }
}
}

Хотелось бы узнать у вас, как создать массив с пустыми элементами, заполнения, которых происходила бы через ком порт что бы можно было заменить вот эту строку,

  shiftOut(dataPin, clockPin, LSBFIRST, B01001100);    

на что то подобное.

  shiftOut(dataPin, clockPin, LSBFIRST, Babsdifgk);  

 Где n, a, b, s, d, i, f, g и k являются переменными массива который бы непосредственно засылались стороней програмы по ком порту.  Ничего похожжего увы не нашел. :( Помогите разобраться или посоветуйте литературу где можно почитать про это поподробний.
Заранее благодарю, с уважениям Александр.

andriano
andriano аватар
Offline
Зарегистрирован: 20.06.2015

Дважды перечитал Ваш пост и ничего не понял.

Поэтому просто некоторые мысли вслух:

Для того, чтобы управлять 256 пинами, нужно 32 корпусов 74HC595. Это много. Подумайте над схемой, нельзя ли ее преобразовать к виду матрицы 16х16. Тогда 256 ячейками можно будет управлять всего по 32 пинам, т.е. с помощью 4-х корпусов 74HC595.

В своем коде Вы используете довольно медленные команнды digitalWrite() и shiftOut(), который внутри тоже использует digitalWrite(). Передача одного байта таким образом занимает около 0.2 мс. 30 байт будут передаваться 6 мс. Бывает, это некритично, а бывает - слишком много. При большом количестве регистров я бы посоветовал использовать SPI.

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

efrem
Offline
Зарегистрирован: 25.02.2017

Спасибо за ответ, прошу прошения что не понятно выражаюсь. Данный регистр приведены просто для примера, будут использованы HV 507. Я не могу найти хорошую книгу по программированию скетча. Вкратце можно сказать что есть устройство построенное на базе ардуино. Для него пишу программа на ПК которая будит отправлять команды на открытия и закрытия пина(с этим проблемы нет). До этого обходился пинами на самой плате по этому использовал вот такой код 

char pc_code=0;

void setup()
{
pinMode(13, OUTPUT);
pinMode(12, OUTPUT);
pinMode(11, OUTPUT);
pinMode(10, OUTPUT);
pinMode(9, OUTPUT);
pinMode(8, OUTPUT);
pinMode(7, OUTPUT);
pinMode(6, OUTPUT);
pinMode(5, OUTPUT);
pinMode(2, OUTPUT);
Serial.begin(9600);
}

void loop()
{
  if (Serial.available() > 0)
  {
    pc_code = Serial.read();
    if(pc_code=='q')
    {
      digitalWrite(13, HIGH);
    }
    else if(pc_code=='w')
    {
      digitalWrite(13, LOW);
    }
    else if(pc_code=='e')
    {
      digitalWrite(5, HIGH);
    }
    else if(pc_code=='r')
    {
      digitalWrite(5, LOW);
    }
    else if(pc_code=='t')
    {
      digitalWrite(8, HIGH);
    }
    else if(pc_code=='y')
    {
      digitalWrite(8, LOW);
    }
    else if(pc_code=='u')
    {
      digitalWrite(10, HIGH);
    }
    else if(pc_code=='i')
    {
      digitalWrite(10, LOW);
    }
    else if(pc_code=='a')
    {
      digitalWrite(9, HIGH);
    }
    else if(pc_code=='s')
    {
      digitalWrite(9, LOW);
    }
    else if(pc_code=='d')
    {
      digitalWrite(7, HIGH);
    }
    else if(pc_code=='f')
    {
      digitalWrite(7, LOW);
    }
    else if(pc_code=='g')
    {
      digitalWrite(12, HIGH);
    }
    else if(pc_code=='h')
    {
      digitalWrite(12, LOW);
    }
   else if(pc_code=='j')
    {
      digitalWrite(11, HIGH);
    }
    else if(pc_code=='k')
    {
      digitalWrite(11, LOW);
    }
    else if(pc_code=='z')
    {
      digitalWrite(6, HIGH);
    }
    else if(pc_code=='x')
    {
      digitalWrite(6, LOW);
    }
     if(pc_code=='c')
    {
      digitalWrite(2, HIGH);
    }
    else if(pc_code=='v')
    {
      digitalWrite(2, LOW);
    }
  }
} 

Теперь решил заняться регистрами но не могу понять как управлять ими с помощью команд отправленными с ПК. Мне нужно реализовать скейч где можно ардуинузаставить ожидать количество бай с пк и команду на выполнения цикла с этими байтами, не могли бы вы подсказать где можно почитать про работу с ком портом, а то все что нахожу все не то:(    

andriano
andriano аватар
Offline
Зарегистрирован: 20.06.2015

Хороших книг по Ардуино не существует. Все, изданное на настоящий момент имеет значительное количество серьезных ошибок.

Поэтому могу посоветовать начать с Кернигана и Ритчи "Язык программирования Си".

Затем - любой учебник по C++. Страуструпа порекомендовать не могу, он хотя и создатель языка, но с дидактической точки зрения его книга написана сложновато.

После этого можно, конечно, прочитать одну-две книжки про Ардуино, а можно и не читать, а пользоваться исключительно онлайн-документацией.

Из Ваших сообщений я могу сделать вывод, что проблема у Вас не с ком-портом, а с выводом информации в регистры. Т.е. как работать с ком-портом, Вы в общих чертах представляете, а с регистрами - нет. В этом случае основной источник знаний - дэйташит на те устройства, которые собираетесь использовать. В Вашем случае, как понимаю, это HV 507.

И еще пара замечаний:

Вероятнее всего, Вам нужно будет хранить карту активности ваших пинов в оперативной памяти - в битовом поле, а потом, вероятнее всего, все битовое поле одной командой отправлять в регистры. Если Вам нужно будет изменить состояние нескольких десятков пинов одновременно, обновление состояние регистров после изменения каждого бита будет довольно накладно. Т.е. нужно предусмотреть отдельные команды как для изменения битов, так и для обновления регистров.

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

efrem
Offline
Зарегистрирован: 25.02.2017

Спасибо большое, за потраченное время. Будим изучать:)

qwone
qwone аватар
Offline
Зарегистрирован: 03.07.2016

Так кину свой код для ознакомления. Полный код здесь https://yadi.sk/d/_MeJSDvJ3EaSzR

Головной файл выкладываю 

/* class_74HC595.ino 
  #1 регистр 74HC595
  #2 модуль выполнения
  Принцип кода:написать модуль управления каждым пином подключеного регистра
*/
//#1 регистр 74HC595
#include "Cl_74HC595.h"

//#2 модуль выполнения
void setup() {
  //#1 регистр 74HC595
  Modul_74HC595.setup();
  //#2 модуль выполнения
}
void loop() {
  //#1 регистр 74HC595
  Modul_74HC595.loop();
  //#2 модуль выполнения
}

 

andriano
andriano аватар
Offline
Зарегистрирован: 20.06.2015

А ничего, что этот класс не поддерживает масштабирование (каскадирование)?

qwone
qwone аватар
Offline
Зарегистрирован: 03.07.2016

Ну я же не обязан за ТС делать все. Разберется и промаштабирует. Тем более есть там то, что будет интересно ТС.

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

andriano пишет:

А ничего, что этот класс не поддерживает масштабирование (каскадирование)?

- Странные у Вас часы. Показывают дату, день недели, фазу Луны, а который час не показывают!
- С какой стати? Часы не обязаны всё показывать!

:---)))

efrem
Offline
Зарегистрирован: 25.02.2017

Примного блогодарен:)

andriano
andriano аватар
Offline
Зарегистрирован: 20.06.2015

qwone пишет:

Ну я же не обязан за ТС делать все. Разберется и промаштабирует. Тем более есть там то, что будет интересно ТС.

Вероятно, есть. Чтобы посмотреть и сделать по-своему. Хоты бы потому, что вот так:

    Cl_74HC595(byte _pin1, byte _pin2, byte _pin3, bool _logic);

делать не нужно ни в каком случае. Имена формальных параметров должны иметь осмысленные имена. 

Но, честно говоря, городить класс ради работы со сдвиговым регистром IMHO перебор. Тем более, что никаких "вкусностей" там нет - стандартные неповоротливые digitalWrite и shiftOut.

 

qwone
qwone аватар
Offline
Зарегистрирован: 03.07.2016

Британские ученые провели долгие исследования и обнаружили, что IMHO у каждого свой.

ПС: Критика ради критики полезна только критиканам.

andriano
andriano аватар
Offline
Зарегистрирован: 20.06.2015

Отнюдь.

Иногда из критики умеют извлекать пользу как сами критикуемые, так и простые читатели.