управление светодами через сдвиговый регистр

Михаил Бурко

✩✩✩✩✩✩✩
16 Апр 2021
30
0
немогу разобраться как через сериал порт адресовать данные на конкретный сдвиговый регистр и на конкретный пин не затранивая остальные , перелопатил инет ч так и не нашел , или нашел но не понял как всё это осуществить , счас пытаюсь разобраться вот с этим кодом
C++:
int latchPin = 10;
int clockPin = 11;
int dataPin = 9;

int bitToSet = 1;

void setup() {
  pinMode(latchPin, OUTPUT);
  pinMode(dataPin, OUTPUT);
  pinMode(clockPin, OUTPUT);

  digitalWrite(latchPin, LOW);                       
  shiftOut(dataPin, clockPin, LSBFIRST, B00000000); 
  shiftOut(dataPin, clockPin, LSBFIRST, B00000000);
  digitalWrite(latchPin, HIGH);
  registerWrite(bitToSet, HIGH);// Записываем HIGH в позицию соответствующую bitToSet
}

void loop() {  }

void registerWrite(int whichPin, int whichState)// этот метод отсылает бит на сдвиговый регистр
{



  unsigned int bitsToSend = 0;  // для хранения 16 битов используем unsigned int
  digitalWrite(latchPin, LOW);// выключаем светодиоды на время передачи битов

  bitWrite(bitsToSend, 3, 1);// устанавливаем HIGH в соответствующий бит

  byte register1 = highByte(bitsToSend); // разбиваем наши 16 бит на два байта// для записи в первый и второй регистр
  byte register2 = lowByte(bitsToSend);

  shiftOut(dataPin, clockPin, MSBFIRST, register2);  // "проталкиваем" байты в регистры
  shiftOut(dataPin, clockPin, MSBFIRST, register1);

  digitalWrite(latchPin, HIGH); // "защелкиваем" регистр, чтобы биты появились на выходах регистра
}
в цикле void registerWrite() не работают глобальные переменные и сериал порт не работает или я просто не понимаю как это сделать , помогите пожалуйста знатоки
 

Arnare

✩✩✩✩✩✩✩
1 Май 2021
3
0
возможно void registerWrite() не цикл он выполняется 1 раз.
 

IamNikolay

★★★✩✩✩✩
15 Янв 2020
820
175
адресовать данные на конкретный сдвиговый регистр и на конкретный пин
для начала: посчитайте какой по счету пин нужен и его порядковый номер надо считать с той же стороны с какой заполняете регистры
 

poty

★★★★★★✩
19 Фев 2020
3,237
942

@Михаил Бурко, для начала - поставьте задачу. У Вас в коде много неразберихи.
Через сдвиговый регистр Вы не сможете без обратной связи адресовать каждый пин отдельно без запоминания текущего состояния в памяти МП. Почитайте внимательно функцию shiftOut - она меняет ВСЕ 8 бит в регистре. Что Вы пытаетесь туда сейчас загнать? Один бит выставляете в 1, остальные - в 0. Всё гасите, кроме одного. Вам нужно сохранить уже задвинутый в регистр байт, менять бит в этой переменной, потом "задвигать" это в регистр.
Что касается нескольких регистров: для ответа на этот вопрос нужно понять, как Вы их соединили (электрическая схема соединений). Я могу, конечно, предположить это из кода, но случаи бывают разные...
 
Изменено:

Михаил Бурко

✩✩✩✩✩✩✩
16 Апр 2021
30
0
Избыточное цитирование

@Михаил Бурко, для начала - поставьте задачу. У Вас в коде много неразберихи.
Через сдвиговый регистр Вы не сможете без обратной связи адресовать каждый пин отдельно без запоминания текущего состояния в памяти МП. Почитайте внимательно функцию shiftOut - она меняет ВСЕ 8 бит в регистре. Что Вы пытаетесь туда сейчас загнать? Один бит выставляете в 1, остальные - в 0. Всё гасите, кроме одного. Вам нужно сохранить уже задвинутый в регистр байт, менять бит в этой переменной, потом "задвигать" это в регистр.
Что касается нескольких регистров: для ответа на этот вопрос нужно понять, как Вы их соединили (электрическая схема соединений). Я могу, конечно, предположить это из кода, но случаи бывают разные...
спасибо за ответ по сути ,задача в том чтобы адресно управлять светодиодами по сериал.
пока подключены 2 регистра по этой схеме , но нужно будет подключить еще 2 1620027836029.png
пока вот так смог добиться желаемого хоть и не полял как это работает , там только незначительные изменения сделать и можно будет управлять по сериал , буду очень благодарен если немного обьясните как работает данный скетч
C++:
#define dataPin  9  // пин подключен к входу DS
#define latchPin 10  // пин подключен к входу ST_CP
#define clockPin 11  // пин подключен к входу SH_CP
unsigned int bitsToSend = 0;
void setup()
{
   // устанавливаем режим работы пинов OUTPUT
   pinMode(latchPin, OUTPUT);
   pinMode(clockPin, OUTPUT);
   pinMode(dataPin, OUTPUT);
   digitalWrite(latchPin, HIGH);// ставим HIGH на "защёлку", чтобы регистр не принимал сигнал
}

void loop()
{
      
      
         digitalWrite(latchPin, LOW);
         bitWrite(bitsToSend, 2, HIGH);
         bitWrite(bitsToSend,1, HIGH);
                
         byte register1 = highByte(bitsToSend); // разбиваем наши 16 бит на два байта
         byte register2 = lowByte(bitsToSend); // для записи в первый и второй регистр                                             
        
         shiftOut(dataPin, clockPin, MSBFIRST, register2);  // "проталкиваем" байты в регистры
         shiftOut(dataPin, clockPin, MSBFIRST, register1);
      
         digitalWrite(latchPin, HIGH);// ставим HIGH на "защёлку"

delay (3000);

         digitalWrite(latchPin, LOW);
         bitWrite(bitsToSend, 4, HIGH);
         bitWrite(bitsToSend,5, HIGH);
                
         byte register4 = highByte(bitsToSend); // разбиваем наши 16 бит на два байта
         byte register5 = lowByte(bitsToSend);  // для записи в первый и второй регистр                                           
        
         shiftOut(dataPin, clockPin, MSBFIRST, register4);  // "проталкиваем" байты в регистры
         shiftOut(dataPin, clockPin, MSBFIRST, register5);
      
         digitalWrite(latchPin, HIGH);                                       

}
 

Михаил Бурко

✩✩✩✩✩✩✩
16 Апр 2021
30
0
обьясните пожалуйста вот эту часть кода как оно работает
C++:
byte register4 = highByte(bitsToSend); // разбиваем наши 16 бит на два байта       
byte register5 = lowByte(bitsToSend);  // для записи в первый и второй регистр
 

Старик Похабыч

★★★★★★★
14 Авг 2019
4,267
1,303
Москва
Целые числа типа int, word , int16_t, uint16_t занимают в памяти 2 байта. Если написать число 12345 в шестнадцетеричном виде, то это будет 0х3039 , где 0х общепринятое обозначение, что число указано в шестнадцетеричном виде.
Так вот функция в 1-ой строке вернет 0х30, а во второ 0х39. В десятичном виде это будет 48 и 57 соотв. Связь такая 256*48+57=12345
 
  • Лойс +1
Реакции: Михаил Бурко

poty

★★★★★★✩
19 Фев 2020
3,237
942
@Михаил Бурко, объяснить можно, только это гораздо доходчивее читать в форме "урока". Например, здесь.
Вкратце:
- переменная bitsToSend объявлена как (присвоение начального значения я опустил):
C++:
unsigned int bitsToSend;
Это значит, что эта переменная занимает в памяти 2 байта (2 по 8 бит или 16 бит). Первый байт (младшие разряды, 8 бит) доступен с помощью макроподстановки lowByte, второй байт (старшие разряды, 8 бит) - highByte.
 
  • Лойс +1
Реакции: Михаил Бурко