регистры сдвига

Levin
Offline
Зарегистрирован: 28.08.2012

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

AlexFisher
AlexFisher аватар
Offline
Зарегистрирован: 20.12.2011

Вот статья Вам в помощь. Это как раз случай для Вашей схемы

Вообще-то этот вопрос нужно задавать в программировании, а не здесь.

leshak
Offline
Зарегистрирован: 29.09.2011

 А еще, прямо на этом сайте, в разделе "программирование", в абзаце "Базовые и полезные знания, необходимые для успешного программирования под платформу Arduino" есть ссылка на пример "Множим выходы с помощью сдвигового регистра 74HC595"

P.S. У меня "де жа вю". Как экономить выводы? Всего неделю назад. Те же вопросы, те же отвечающие, те же ответы :(

Levin
Offline
Зарегистрирован: 28.08.2012

leshak пишет:

 А еще, прямо на этом сайте, в разделе "программирование", в абзаце "Базовые и полезные знания, необходимые для успешного программирования под платформу Arduino" есть ссылка на пример "Множим выходы с помощью сдвигового регистра 74HC595"

P.S. У меня "де жа вю". Как экономить выводы? Всего неделю назад. Те же вопросы, те же отвечающие, те же ответы :(

с светодиодами я эту схему я собирал а как всё вместе чтобы работало с кнопками?

 

leshak
Offline
Зарегистрирован: 29.09.2011

Levin пишет:

с светодиодами я эту схему я собирал а как всё вместе чтобы работало с кнопками?

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

Начните с чтения http://arduino.ru/Reference/DigitalRead, а еще лучше весь раздел http://arduino.ru/Reference бегло просмотреть. Что-бы знать "какие строительные блоки" у вас имеются под руками.

На и базовые примеры, идущие с ArduinoIDE стоит посмотреть в File/Examples

Тот же File/Examples/Digital/Button  (в нем и ссылочку найдете где можно посмотреть один из вариантов подключения кнопки).

 

 

leshak
Offline
Зарегистрирован: 29.09.2011

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

Levin
Offline
Зарегистрирован: 28.08.2012

leshak пишет:

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

С мигающим светодиодам там всё просто выбирается пин как выход
высоки – низкий уровень и задержка тут всё просто
Вот в этом тоже вроде всё понятно сдвиг регист всё работает хорошо
int data = 2;
int clock = 3;
int latch = 4;
int ledState = 0;
const int ON = HIGH;
const int OFF = LOW;
void setup()
{
pinMode(data, OUTPUT);
pinMode(clock, OUTPUT);
pinMode(latch, OUTPUT);
}
void loop()
{
int delayTime = 50;
for(int i = 0; i < 256; i++){
updateLEDs(i);
delay(delayTime);
}
}

void updateLEDs(int value){
digitalWrite(latch, LOW);
shiftOut(data, clock, MSBFIRST, value);
digitalWrite(latch, HIGH);
}
Но не понятно как выбирать светодиод какой тебе нужно .

И вот тут я не пойму где вы сказали пример посмотреть
#include <SPI.h>

enum { REG_SELECT = 8 }; // пин, управляющий защёлкой (SS в терминах SPI)

void setup()
{
/* Инициализируем шину SPI. Если используется программная реализация,
* то вы должны сами настроить пины, по которым будет работать SPI.
*/
SPI.begin();

pinMode(REG_SELECT, OUTPUT);
digitalWrite(REG_SELECT, LOW); // выбор ведомого - нашего регистра
SPI.transfer(0); // очищаем содержимое регистра
/* Завершаем передачу данных. После этого регистр установит
* на выводах QA-QH уровни, соответствующие записанным битам.
*/
digitalWrite(REG_SELECT, HIGH);…………………………………….
http://robocraft.ru/blog/arduino/519.html
загружаю в ардуино 2180 не какой реакции я не понимаю как оно должно работать без этого int data = 2;
int clock = 3;
int latch = 4;
int ledState = 0;
const int ON = HIGH;
const int OFF = LOW;
void setup()
{
pinMode(data, OUTPUT);
pinMode(clock, OUTPUT);
pinMode(latch, OUTPUT);

 

Levin
Offline
Зарегистрирован: 28.08.2012

Ну подскажите как мне эту прогу написать
Что бы при нажатие кнопки через регистр светодиод гас ну очень нужно.
 

Alexander
Offline
Зарегистрирован: 25.04.2010

Помимого прочего почитайте вот это пожулуйста - http://arduino.ru/forum/obshchii/vstavka-programmnogo-koda-v-temukomment...

AlexFisher
AlexFisher аватар
Offline
Зарегистрирован: 20.12.2011

Levin пишет:

Ну подскажите как мне эту прогу написать
Что бы при нажатие кнопки через регистр светодиод гас ну очень нужно.
 

Leshak уже подсказал выше. От себя добавлю, чтобы научиться выбирать нужный светодиод, нужно понять, что байт состоит из 8 бит, каждый бит соответствует своему светодиоду. Ваша задача "в целом" сводится к 2-м действиям - прочитать содержимое регистров с кнопками и пихнуть это в регистры со светодиодами.

Никто за Вас писать прогу не будет Если Вы не будете выполнять рекомендации (хотя бы пытаться), то... сами понимаете.

Levin
Offline
Зарегистрирован: 28.08.2012

AlexFisher пишет:

Levin пишет:

Ну подскажите как мне эту прогу написать
Что бы при нажатие кнопки через регистр светодиод гас ну очень нужно.
 

Leshak уже подсказал выше. От себя добавлю, чтобы научиться выбирать нужный светодиод, нужно понять, что байт состоит из 8 бит, каждый бит соответствует своему светодиоду. Ваша задача "в целом" сводится к 2-м действиям - прочитать содержимое регистров с кнопками и пихнуть это в регистры со светодиодами.

Никто за Вас писать прогу не будет Если Вы не будете выполнять рекомендации (хотя бы пытаться), то... сами понимаете.

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

Levin
Offline
Зарегистрирован: 28.08.2012

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

step962
Offline
Зарегистрирован: 23.05.2011

Levin пишет:

[...]

неужели вам сложна

[...]

Неужели вам сложно написать - пусть неправвильный - скетч, реализующий чтение из регистра сдвига / запись в регистр сдвига? На основе уже предлагавшихся вам примеров?

Напишите скетч, опубликуйте в ветке. Ну а мы попинаем вас (ваш скетч). А попинав, поможем. 

А то как-то больно на эту рыбу похоже:

step962
Offline
Зарегистрирован: 23.05.2011

Levin пишет:

Я бы написал если бы знал с чего начать

leshak достаточно подробно описал возможный порядок действий.

chervyachok
chervyachok аватар
Offline
Зарегистрирован: 22.12.2011

 А зачем Вам вообще программу писать? В поставленом Вами задании можно и без МК и без регистров обойтись.

leshak
Offline
Зарегистрирован: 29.09.2011

 Ох... запинали Levin-а :) Правда сам, слегка, подставился :) Ну ничего... Не обижайтесь. Это всяко лучше чем "тупой игнор" (есть персонажи которые и такого результат добиваются на форуме).

С чего начать - как я уже говорил "с чтения" - выше перечислил чего именно.

Далее, с принятия того факта что вы заблуждаетесь когда думаете "я это знаю". Судя по вашим вопросам утверждения вида "С мигающим светодиодам там всё просто выбирается пин как выход,высоки – низкий уровень и задержка тут всё просто","вроде всё понятно сдвиг регист" и "я понимаю что байт состоит из 8 бит" - не соотвествуют действительности.

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

Пример, который вы просите, написать не трудно. Есть только одно но... он уже имеется в линках/статьях которые вам давали. Смысл их писать заново? Результат-то будет тот же самый. Раз сложность подобных примеров, пока, не по зубам - значит нужно "откатится на шаг назад". Кушать слона по частям.

Вы просто схватились за задачу не соотвествующую "своему уровню". При этом когда вам подсказывают путь "в каком порядке нужно решать такие задачи" - вы игнорируете это. Как бы говорите врачу "как вас нужно лечить". Что, естественно, вызывает зубоскальство (раз сам знаешь что именно нужно - ну так и делай сам). Вообщем у вас есть выбор. Либо пользоватся "тем что дают", либо пытатся настаивать что-бы вам дали именно то что вы хотите и в той форме как вы хотите (шансы это получить я думаю вы уже оценили). Вы пришли к тренеру, он вам говорит "отжимайся", а вы "не... покажи мне супер-прием и я сам всех побью".

Вообщем вам нужно

  1. Времено забыть про сдвиговые, отключить/отложить их в сторону
  2. Подключить, напрямую, две кнопки два диода. Добится зажигания диодов в соотвествии с кнопками.
  3. Забыть про кнопки. Отключить их.
  4. Перечитать еще раз статьи про сдвиговые, попытатся нагуглить еще все что сможете про сдвиговые (например вот http://easyelectronics.ru/sdvigovyj-registr.html)
  5. Поиграйтесь с симулятором регистра, попробуйте кликая мышкой выставить ему желаемое состояния выходных ног http://conductiveresistance.com/interactive-595-shift-register-simulator/. Например выставте в 1 "только четные выходы" или "только не четные".
  6. Прочитайте раздел "Bitwise Operators" на http://arduino.cc/en/Reference/HomePage
  7. Используя знания пунктов 5 и 6-ть подключить диоды через сдвиговые регистр. И сделать то что вы делали на пункте 5-ть, только уже "живым регистром", не мышкой кликая, а ногами ардуины дрыгая. Сделайте мигание типа "четные, не четные" диоды. Или "каждый третией" и т.п. Вообще прийдите в состояния "могу зажигать диод какой хочу" (вначале "какой хочу" - просто зашито в скетч).
  8. Подключите пару кнопок (напрямую не через регистр). Добейтесь ими задавать "какой хочу". Типа нажали на кнопку - зажгли нужный диод через регистор
  9. Отключает диоды и сдвиговы на выход.
  10. Подключаем кнопки через сдвиговый (опять-таки предварительно почитав все что смогли найти). Читаем кнопки и отправляем в Serial какая кнопка была нажата.
  11. Опять подключаем диоды через сдвиговый. И объеденяем то что получилось на шаге 7 с тем что вышло на шаге 10. По идее это и будет "То что вы хотели", но не останавливамся
  12. Читаем все что можем, обзорно про SPI. Что это такое и с чем его едят.
  13. Перечитываем статью которую давал AlexFisher (вот теперь она будет гораздо понятней и тривиальней)
  14. Применяем подход из статьи, что-бы ускорить работу скетча и сократить свой код (вместо програмного дрыгания ногами используем "железные помогалки" имеющиеся в камне).

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

P.S. И поправте ваш код. В соотвесвии с тем как вам сказали почитать "Втавка програмного кода". Лично мне код втавленный как вы вставили - даже читать/вникать не хочется. Если человеку лениво о удобстве других заботится, то зачем мне напрягатся?

 

leshak
Offline
Зарегистрирован: 29.09.2011

step962 пишет:

А то как-то больно на эту рыбу похоже:

Ну а если это все "длинно и сложно" и вы, все-таки, хотите что-бы вам давали "по вашему", в том виде "как вы просите" - переходите из категории "новичка коллеги" в категорию "клиент". Тогда никто парить мозг вам не будет. Тратить усилия что-бы поднять ваше понимание, давать вам линки для чтения. "Любой каприз за ваши деньги". Хотите "диоды от кнопок через сдвиги" - пожалуста. Получите работающий скетч. Что вы потом с ним делать будете - уже будет целиком ваша забота (любоватся, пытаться понять, опять нанять кого-то что-бы объяснил и т.п.)

Только скорее всего это будет дорого. Програмисты нынче не дешевы :) Банкой пива обойтись - не выйдет.

А может и выйдет, смотря кого найдете. Может и найдете кому "будет не трудно", за "просто так". Но из отметившихся в ветке таких явно нет :)

Levin
Offline
Зарегистрирован: 28.08.2012

На приму с этим та я разобрался тут сложностей нету правда по своему написано но работает а вот через регистр

Levin
Offline
Зарегистрирован: 28.08.2012
int Knopka1 = 7;
int Diod1 = 12;

int btnState;

int Knopka2 = 6;
int Diod2 = 11;

int btnState2;


void setup() {
pinMode(Diod1, OUTPUT);
pinMode(Knopka1, INPUT);

pinMode(Diod2, OUTPUT);
pinMode( Knopka2, INPUT);
}

void loop() {
btnState = digitalRead(Knopka1);
if (btnState == HIGH) {
digitalWrite(Diod1, LOW);
} else {
digitalWrite(Diod1, HIGH);

}
btnState2 = digitalRead( Knopka2);
if (btnState2 == HIGH) {
digitalWrite(Diod2, LOW);

} else {
digitalWrite(Diod2, HIGH);

}

}
 
Levin
Offline
Зарегистрирован: 28.08.2012

chervyachok пишет:

 А зачем Вам вообще программу писать? В поставленом Вами задании можно и без МК и без регистров обойтись.

По трём проводам такое количество кнопок не подключить

Levin
Offline
Зарегистрирован: 28.08.2012

Ну почему светодиод не гаснет в чём косяк

int KnopkaPin1 = 7;
int val = 0;
int data = 11;
int cloc = 12;
int RCK = 8;

void setup()

{

pinMode(KnopkaPin1, INPUT);
pinMode(data,OUTPUT);
pinMode(cloc,OUTPUT);
pinMode(RCK,OUTPUT);
 

}

void loop()

{
val = digitalRead(KnopkaPin1);
if (val == HIGH){

shiftOut(data,cloc,LSBFIRST,1);
digitalWrite(RCK,HIGH);
}

}
 

maksim
Offline
Зарегистрирован: 12.02.2012

 Для начала, что бы код был более читабельный научитесь его правилно вставлять в комментарий: Вставка программного кода в тему/комментарий

Вот как это должно выглядеть:

int KnopkaPin1 = 7; 
int val = 0; 
int data = 11;
int cloc = 12;
int RCK = 8;

void setup(){
  pinMode(KnopkaPin1, INPUT); 
  pinMode(data, OUTPUT);
  pinMode(cloc, OUTPUT);
  pinMode(RCK, OUTPUT);
}

void loop(){ 
  val = digitalRead(KnopkaPin1);
  if (val == HIGH){
    shiftOut(data, cloc, LSBFIRST, 1); 
    digitalWrite(RCK, HIGH);
  }
}

А теперь по делу:
1. Еще раз пересмотрите пример работы со сдвиговыми регистрами, и найдите ошибку в своем коде касающуюся "задвижки" RCK. Перед передачей данных функцией shiftOut() на "задвижку" должен быть подан логический 0.
2. А почему светодиод должен погаснуть? Для того что бы светодиод погас нужно в регистр отправить нулевой бит соответствующий этому светодиоду. 

 

leshak
Offline
Зарегистрирован: 29.09.2011

2Levin

maksim пишет:

 Для начала, что бы код был более читабельный научитесь его правилно вставлять в комментарий: Вставка программного кода в тему/комментарий

Кстати вам уже в третий(!) раз говорят про то что вы криво вставляете код. Обратите, наконец, на это внимание! И поправте свое прошлые посты в соотвествии с этим. Нажмите кнопку "изменить" и сделайте код читабильным.

leshak
Offline
Зарегистрирован: 29.09.2011

Levin пишет:

На приму с этим та я разобрался тут сложностей нету правда по своему написано но работает а вот через регистр

Ну хозяин - барин. Разобрался, так разобрался. Мне что-то вам доказывать - совершенно не интерестно. Моя жизнь от того разбирается вы или нет - совершенно не изменится. Так что готов согласится с вами что вы разобрались. Ну и хорошо.  Дальше можете доказывать свое правильное понимание сдвиговых регистров им самим. Рано или поздно они тоже согласятся с вами :)

 

Levin
Offline
Зарегистрирован: 28.08.2012

maksim пишет:

 Для начала, что бы код был более читабельный научитесь его правилно вставлять в комментарий: Вставка программного кода в тему/комментарий

Вот как это должно выглядеть:

int KnopkaPin1 = 7; 
int val = 0; 
int data = 11;
int cloc = 12;
int RCK = 8;

void setup(){
  pinMode(KnopkaPin1, INPUT); 
  pinMode(data, OUTPUT);
  pinMode(cloc, OUTPUT);
  pinMode(RCK, OUTPUT);
}

void loop(){ 
  val = digitalRead(KnopkaPin1);
  if (val == HIGH){
    shiftOut(data, cloc, LSBFIRST, 1); 
    digitalWrite(RCK, HIGH);
  }
}

А теперь по делу:
1. Еще раз пересмотрите пример работы со сдвиговыми регистрами, и найдите ошибку в своем коде касающуюся "задвижки" RCK. Перед передачей данных функцией shiftOut() на "задвижку" должен быть подан логический 0.
2. А почему светодиод должен погаснуть? Для того что бы светодиод погас нужно в регистр отправить нулевой бит соответствующий этому светодиоду. 

 

int KnopkaPin1 = 7; 
int val = 0; 
int data = 11;
int cloc = 12;
int RCK = 8;

void setup()

{ 

pinMode(KnopkaPin1, INPUT); 
pinMode(data,OUTPUT);
pinMode(cloc,OUTPUT);
pinMode(RCK,OUTPUT);
 

}

void loop()

{ 
val = digitalRead(KnopkaPin1);
if (val == HIGH){

shiftOut(data,cloc,LSBFIRST,1); 
digitalWrite(RCK,HIGH);
}

}

digitalWrite(RCK,HIGH);  Ели тут поставить LOW он проста вырубается и тоже не какой реакции

 

Levin
Offline
Зарегистрирован: 28.08.2012
int KnopkaPin1 = 7; 
int val = 0; 
int data = 11;
int cloc = 12;
int RCK = 8;

void setup()

{ 

pinMode(KnopkaPin1, INPUT); 
pinMode(data, OUTPUT);
pinMode(cloc, OUTPUT);
pinMode(RCK, OUTPUT);
 

}

void loop()

{ 
val = digitalRead(KnopkaPin1);
if (val == HIGH){

shiftOut(data, cloc, LSBFIRST, 1); 
digitalWrite(RCK, HIGH);
}

}

digitalWrite(RCK, HIGH); Ели тут поставить LOW он проста вырубается и тоже не какой реакции

Levin
Offline
Зарегистрирован: 28.08.2012
int KnopkaPin1 = 7; 
int val = 0; 
int data = 11;
int cloc = 12;
int RCK = 8;

void setup()

{ 

pinMode(KnopkaPin1, INPUT); 
pinMode(data, OUTPUT);
pinMode(cloc, OUTPUT);
pinMode(RCK, OUTPUT);
 

}

void loop()

{ shiftOut(data, cloc, LSBFIRST, B00000010); 
digitalWrite(RCK, HIGH);
digitalWrite(RCK, LOW);
val = digitalRead(KnopkaPin1);
if (val == HIGH){

shiftOut(data, cloc, LSBFIRST, B00000001); 
digitalWrite(RCK, HIGH);
delay(100); 
digitalWrite(RCK, LOW);
}





}
Вот она ошибочка закрывать надо защёлку
Levin
Offline
Зарегистрирован: 28.08.2012

Блин с утра мысли в голову свежие лезут

step962
Offline
Зарегистрирован: 23.05.2011

А то... ;)

Для полноты счастья резюмируйте, чему научились:

Загонять данные в сдвиговый регистр?

Загоняете нужные вам данные? На нужные места? Или пока что только хоть какой-то реакции на регистре добились?

Сможете зажечь второй светодиод? (т.е. тот, что подключен к 2-му выводу сдв.регистра при нумерации 0->7)

А пятый?

А если на входе у вас две (пока что) кнопки? Сможете зажигать нужный вам светодиод или оба сразу (если обе кнопки нажаты одновременно)? Как вы будете это делать (код в студию)?

 

Ответите на эти вопросы - можно браться за регистр на входе...

 

UPD:

shiftOut(data, cloc, LSBFIRST, B00000001); 
digitalWrite(RCK, HIGH);
delay(100); 
digitalWrite(RCK, LOW);

По каким соображениям выбрали delay(100)? Почему не delay(1000)? Или delay(1)? Или в конце концов delayMicroseconds(1)?

Levin
Offline
Зарегистрирован: 28.08.2012

step962 пишет:

А то... ;)

Для полноты счастья резюмируйте, чему научились:

Загонять данные в сдвиговый регистр?

Загоняете нужные вам данные? На нужные места? Или пока что только хоть какой-то реакции на регистре добились?

Сможете зажечь второй светодиод? (т.е. тот, что подключен к 2-му выводу сдв.регистра при нумерации 0->7)

А пятый?

А если на входе у вас две (пока что) кнопки? Сможете зажигать нужный вам светодиод или оба сразу (если обе кнопки нажаты одновременно)? Как вы будете это делать (код в студию)?

 

Ответите на эти вопросы - можно браться за регистр на входе...

 

UPD:

shiftOut(data, cloc, LSBFIRST, B00000001); 
digitalWrite(RCK, HIGH);
delay(100); 
digitalWrite(RCK, LOW);

По каким соображениям выбрали delay(100)? Почему не delay(1000)? Или delay(1)? Или в конце концов delayMicroseconds(1)?

Что бы была фиксация на нажатую кнопку

int KnopkaPin1 = 7; 
int KnopkaPin2 = 6;
int val = 0; 
int data = 11;
int cloc = 12;
int RCK = 8;
int val1 = 0; 

void setup()

{ 

pinMode(KnopkaPin1, INPUT); 
pinMode(KnopkaPin2, INPUT); 
pinMode(data, OUTPUT);
pinMode(cloc, OUTPUT);
pinMode(RCK, OUTPUT);
 

}

void loop()

{ shiftOut(data, cloc, LSBFIRST, B11111111); 
digitalWrite(RCK, HIGH);
digitalWrite(RCK, LOW);
val = digitalRead(KnopkaPin1);
if (val == HIGH)
{

shiftOut(data, cloc, LSBFIRST, B11111101); 
digitalWrite(RCK, HIGH);
delay(1000); 
digitalWrite(RCK, LOW);
}
val = digitalRead(KnopkaPin2);
if (val == HIGH)
{

shiftOut(data, cloc, LSBFIRST, B11111110); 
digitalWrite(RCK, HIGH);
delay(1000); 
digitalWrite(RCK, LOW);
}




}

 

Levin
Offline
Зарегистрирован: 28.08.2012

step962 пишет:

А то... ;)

Для полноты счастья резюмируйте, чему научились:

Загонять данные в сдвиговый регистр?

Загоняете нужные вам данные? На нужные места? Или пока что только хоть какой-то реакции на регистре добились?

Сможете зажечь второй светодиод? (т.е. тот, что подключен к 2-му выводу сдв.регистра при нумерации 0->7)

А пятый?

А если на входе у вас две (пока что) кнопки? Сможете зажигать нужный вам светодиод или оба сразу (если обе кнопки нажаты одновременно)? Как вы будете это делать (код в студию)?

 

Ответите на эти вопросы - можно браться за регистр на входе...

 

UPD:

shiftOut(data, cloc, LSBFIRST, B00000001); 
digitalWrite(RCK, HIGH);
delay(100); 
digitalWrite(RCK, LOW);

По каким соображениям выбрали delay(100)? Почему не delay(1000)? Или delay(1)? Или в конце концов delayMicroseconds(1)?

Хотя это там вовсе и ненужно delay(100);

step962
Offline
Зарегистрирован: 23.05.2011

Levin пишет:

Что бы была фиксация на нажатую кнопку

"Сомневаюсь я, однако..." (с)

delay между установкой и сбросом уровня на выводе RCK в общем то и не нужен. Есть подозрение (давно не заглядывал в соответствующий даташит), что сдвиговый регистр защелкивается либо по возрастающему, либо по ниспадающему фронту. И, стало быть, необходимо обеспечить лишь определенный фронт, а не импульс минимально допустимой ширины.

А нажатие кнопки регистрируется довольно далеко от этого места - в строках 27 и 36.

Кстати, в последней редакции скетча вы можете отследить только раздельные нажатия кнопок. Если же их нажать одновременно, то ни одна нормально гореть не будет - особенно кнопка 2 (бит 0, т.к. после ее отработки вы сразу же забиваете регистр единичками (строки 24-26), теряя только что установленное состояние. Пока что вас спасают условные переходы и паразитное гашение (зажигание?) светодиода длится лишь микросекунды, но с разрастанием кода это может вылезти наружу.

bit
Offline
Зарегистрирован: 07.05.2012

Чего та не магу не как врубится по логике если 8 бит пишем В11111111
А если 16 В1111111111111111 не понятно не пашит с двумя регистроми послед.
 

#define DS 11
#define SHCP 12
#define STCP 8

void setup() 
{
pinMode(DS,OUTPUT);
pinMode(SHCP,OUTPUT);
pinMode(STCP,OUTPUT);
}

void loop() 
{
shiftOut(DS,SHCP,LSBFIRST,B11111110); 
digitalWrite(STCP,HIGH);
}

Добавляем сюда

shiftOut(DS,SHCP,LSBFIRST,B11111110,B11111111); 

Почему не работает?

 static uint8_t digit[16] = 
    {B11111110,B11111111};

Чёта я запутался помогите

step962
Offline
Зарегистрирован: 23.05.2011

 а если так попробовать:

shiftOut(DS,SHCP,LSBFIRST,B11111110); // засылаем первый байт
shiftOut(DS,SHCP,LSBFIRST,B11111111); // засылаем второй байт

Чем черт не шутит - а вдруг последовательная отправка двух байтов позволит заполнить два последовательно подключенных регистра сдвига?

AlexFisher
AlexFisher аватар
Offline
Зарегистрирован: 20.12.2011

Лишний параметр добавляете, вот и не работает.

Два подряд - это правильно. Если регистры подключены последовательно, то так и надо.

А почему Вы массив из 16 байт иниализируете только 2-мя байтами? 

maksim
Offline
Зарегистрирован: 12.02.2012
#define DS 11
#define SHCP 12
#define STCP 8

void setup() 
{
pinMode(DS,OUTPUT);
pinMode(SHCP,OUTPUT);
pinMode(STCP,OUTPUT);
}

static uint8_t digit[2] = 
   {B11111110,B11111111};

void loop() 
{
digitalWrite(STCP,LOW);  
shiftOut(DS,SHCP,LSBFIRST,digit[0]); 
shiftOut(DS,SHCP,LSBFIRST,digit[1]); 
digitalWrite(STCP,HIGH);
delay(3000);
}

 

bit
Offline
Зарегистрирован: 07.05.2012

step962 пишет:

 а если так попробовать:

shiftOut(DS,SHCP,LSBFIRST,B11111110); // засылаем первый байт
shiftOut(DS,SHCP,LSBFIRST,B11111111); // засылаем второй байт

Чем черт не шутит - а вдруг последовательная отправка двух байтов позволит заполнить два последовательно подключенных регистра сдвига?

так тоже не работает

AlexFisher
AlexFisher аватар
Offline
Зарегистрирован: 20.12.2011

Интересно, а в чем выражается это "так тоже не работает"? 

maksim
Offline
Зарегистрирован: 12.02.2012

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

bit
Offline
Зарегистрирован: 07.05.2012

maksim пишет:

#define DS 11
#define SHCP 12
#define STCP 8

void setup() 
{
pinMode(DS,OUTPUT);
pinMode(SHCP,OUTPUT);
pinMode(STCP,OUTPUT);
}

static uint8_t digit[2] = 
   {B11111110,B11111111};

void loop() 
{
digitalWrite(STCP,LOW);  
shiftOut(DS,SHCP,LSBFIRST,digit[0]); 
shiftOut(DS,SHCP,LSBFIRST,digit[1]); 
digitalWrite(STCP,HIGH);
delay(3000);
}

 

Может я чёта в схеме напутал первый сдвиг регистр работает нормально а второй не хочет , 9 ногу первого регистра цепляем на 14 второго, а на в тором 9 висит пустая

maksim
Offline
Зарегистрирован: 12.02.2012

 Вот схема:

этот здесь смотрели?

bit
Offline
Зарегистрирован: 07.05.2012

Извиняюсь на нагрузку массу не подал

bit
Offline
Зарегистрирован: 07.05.2012

step962 пишет:

 а если так попробовать:

shiftOut(DS,SHCP,LSBFIRST,B11111110); // засылаем первый байт
shiftOut(DS,SHCP,LSBFIRST,B11111111); // засылаем второй байт

Чем черт не шутит - а вдруг последовательная отправка двух байтов позволит заполнить два последовательно подключенных регистра сдвига?

Блин оказывается в схеме косяк был

 

bit
Offline
Зарегистрирован: 07.05.2012

 

Ну вот на конец та с вашей помощью я добрался практически до конца
Подключаем кнопки через регистр
 

int indataPin = 11; 
 int inclockPin = 12; 
 int inloadPin = 13; 
 int temp = 0;. 

 void setup(){ 
 Serial.begin(9600); 
 pinMode(indataPin, INPUT); 
 pinMode(inclockPin, OUTPUT); 
 pinMode(inloadPin, OUTPUT); 
 } 

 void loop(){ 
 digitalWrite(inloadPin, 0); 
 digitalWrite(inloadPin, 1); 
 for(int i=0; i<=7; i++){ 
 digitalWrite(inclockPin, 0); 
 temp = digitalRead(indataPin); 
 digitalWrite(inclockPin, 1); 
 Serial.print (temp); 
 } 
 Serial.println (""); 
 Serial.println ("--------"); 
 delay(2000);

Подключаем последовательно

for(int i=0; i<=15; i++)

Всё работает идеальна

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

 #define DS 11
#define SHCP 12
#define STCP 8

void setup() 
{
pinMode(DS,OUTPUT);
pinMode(SHCP,OUTPUT);
pinMode(STCP,OUTPUT);
}

void loop() 
{
shiftOut(DS,SHCP,LSBFIRST,B01111111); 
shiftOut(DS,SHCP,LSBFIRST,B11111111);
digitalWrite(STCP,HIGH);


}

Всё работает идеально

А теперь как же это всё совместить?

maksim
Offline
Зарегистрирован: 12.02.2012

bit пишет:

 #define DS 11
#define SHCP 12
#define STCP 8

void setup() 
{
pinMode(DS,OUTPUT);
pinMode(SHCP,OUTPUT);
pinMode(STCP,OUTPUT);
}

void loop() 
{
shiftOut(DS,SHCP,LSBFIRST,B01111111); 
shiftOut(DS,SHCP,LSBFIRST,B11111111);
digitalWrite(STCP,HIGH);


}

Для начала нужно перестать игнорировать сообщения.... Вот этот ваш код будет работать ровно один раз после перезаглузки. А почему подумайте сами...

bit
Offline
Зарегистрирован: 07.05.2012

Я не игнорировал я попробовал у меня не заработала косяк в другом был

bit
Offline
Зарегистрирован: 07.05.2012

 

вот это

digitalWrite(STCP,LOW); 

 

maksim
Offline
Зарегистрирован: 12.02.2012

 Правильно. По умолчанию все выводы находятся в состоянии 0. Вы передаете данные в регистры и защелкиваете задвижку. При следующей передаче в регистры задвижку нужно опять опустить в 0 иначе регистр не выведет переданные ему биты.

bit
Offline
Зарегистрирован: 07.05.2012

Я умею в Ардуине управлять светодиодом через кнопку а вот дальше не знаю как

int Knopka1 = 7;
int Diod1 = 12;

int btnState;

int Knopka2 = 6;
int Diod2 = 11;

int btnState2;


void setup() {
  pinMode(Diod1, OUTPUT);
  pinMode(Knopka1, INPUT);
  
  pinMode(Diod2, OUTPUT);
  pinMode( Knopka2, INPUT);
}

void loop() {
  btnState = digitalRead(Knopka1);
  if (btnState == HIGH) {
    digitalWrite(Diod1, LOW);
  } else {
    digitalWrite(Diod1, HIGH);
    
  }
   btnState2 = digitalRead( Knopka2);
  if (btnState2 == HIGH) {
    digitalWrite(Diod2, LOW);
    
  } else {
    digitalWrite(Diod2, HIGH);
   
  }
  
}

 

bit
Offline
Зарегистрирован: 07.05.2012

а дальше что делать?

maksim
Offline
Зарегистрирован: 12.02.2012

 Примерно дальше так:

int Knopka1 = 7;
int Knopka2 = 6;

uint8_t digit[2] = {B11111110,B11111111};

void setup() {
pinMode(DS,OUTPUT);
pinMode(SHCP,OUTPUT);
pinMode(STCP,OUTPUT);
}

void loop() {
  
  if(digitalRead(Knopka1) == HIGH) { // Если на выводе 7 +5вольт, то
    digit[0] &= ~(1<<8); // устанавливаем 8 бит в 0
  } else {  // иначе 
    digit[0] |= 1<<8; // устанавливаем 8 бит в 1  
  }
  
  if (digitalRead(Knopka2) == HIGH) { // Если на выводе 6 +5вольт, то
    digit[0] &= ~(1<<7);  // устанавливаем 7 бит в 0
  } else {   // иначе 
    digit[0] |= 1<<7;  // устанавливаем 7 бит в 1  
  }
  
  // Выводим в регистры
  digitalWrite(STCP,LOW);  
  shiftOut(DS,SHCP,LSBFIRST,digit[0]); 
  shiftOut(DS,SHCP,LSBFIRST,digit[1]); 
  digitalWrite(STCP,HIGH);
  delay(200);
  
}