Потому что строки 21-24 вы выполняете на каждом проходе loop, в не зависимости от того нажата кнопка или нет. Если не нажата - то постоянно шлете данные в сдвиговый, если нажата, то засветили - подождали пол секунды и выключили и тут же снова включили.
Я бы вам рекомендовал, в конце loop сохранять val, в какую-то дополнительную переменную prevVal (предыдущие состояние val).
И потом, после val = digitalRead(KnopkaPin1); проверять изменилась ли val по сравнению с прошлым проходом цикла. и что-то делать только если изменилась.
byte val=0;
byte prevVal=0;
loop(){
val=digitalRead(BUTTON_PIN);
if(!prevVal && val){ // поменялась с 0 на 1
// зажигаем
}
if(prevVal && !val){ // поменялась с 1 на 0
//гасим
};
prevVal=val;
}
И с "защелкой" - лучше все-таки работать как Максим. Оставлять ее постоянно в HIGH, а не держать в LOW.
То есть выставлять в LOW непосредственно перед выводом данных.
Защелка в LOW
Вывели данные
Защелка в HIGH (и осталась в таком виде пока не потребуется следующий вывод данных).
В таком варианте у вас код будет выглядит более "традиционно" (а значит и легче для понимания другими), во вторых вы снизите шанс что регистр поймает какую-то помеху (а так вы, фактически, все-время держите его в состоянии "слушаю вход"). Порядок "слушай команду", "команда", "исполняй" - IMHO Логиченей, чем "команда", "исполняй", "слушай команду" :)
И, кстати приучитесь отбивать код оступами руками. И вам самому и другим будет легче видно что во что вложенно. Вот посмотрите на код Максима и свой. У него сразу видно где if начался, где закончился. А у вас? Пока скетч короткий - еще можно глазами скобки пересчитать , а вот когда разрастется и if-вов будет с десяток - уже разобратся "почему как-то не так работает" - будет очень трудно.
осталось только написать-оттсетировать две функции. write595 - которая отправляет данные в 74HC595 и read595 - которая читает текущие состояние 74HC165.
Начать, наверное, стоит с write595. Как более простого. Она уже у вас есть "практически готовая". Смотри код максима выше. Осталось только отправку в регистр оформить в виде функции.
read595 - а тоже прийдется разбиратся как читать сдвиговые. гугл и поиск по форуму "клавиатура сдвиговые", "ардуино можим входы" и т.п. Уже не один раз это "расписывалось". Для начала - читаете и отправляете прочитанное в Serial. Когда "заработает" - будете "отправлять на диоды" с помощью write595
Для начала data можно сделать не unsigned int, а byte. По одному регистру на входе и выходе. Так "проще". По одному байту. Когда это освоите - тогда уже можно будет "каскадировать". Подключать два 165 и два 595 (три, пять, десять).
хорошо тебе когда всё знаешь, а я тут голову сломал :)
Конечно хорошо. А вам что мешает прийти в состояние "все знаешь"? Я ведь не родился с этим знанием. Я ведь вам "расписывал" не "что-то из пальца высосанное", а именно собственный подход к НЕЗНАКОМЫМ задачам. Дробим на подзадачи, гуглим, читаем, пробуем. Или вы думаете что я какого-то тибетского Ардуино-Гуру учился? Нет. Я просто действую вот точно так как написал. Открыл гулг, перечитал все что смог найти про сдвиговые :) Нагуглил online эмулятор сдвиговоего. Мышкой "подергал его за ноги", что-бы понять логику его работы.
А, вы, снова, "абстрактно стоните". "Голову сломал". На чем? Как выделить в функцию кусочек кода? Как отправлять в Serial? Как гуглом найти информацию про сдвиговые на входе? Как хранить прочитанные данные? Чем unsigned int отличается от byte? Как каскадировать?
Что вы вообще попробовали сделать из того что я написал в прошлом посте? Получилось/не получилось - вторично. Но, судя по всему, - ничего. Иначе вопросы были-бы более конкретны.
А так остается только пожать плечами. Ну что-ж "жаль дитятьку". Сложно для нее. Голову ломает. Може не нужно тогда? Пока холода не настали лучше пойти в футбол поиграть?
В не обижайтесь, но в программирование навык "искать и разбиратся" - это самый первичный. Знания конкретного железа/языка/платформы - дело десятое. Это все очень быстро меняется/устаревает/появляется новое. Поэтому само "знание" - не очень ценно. А вот навык "разбиратся" - наоборот. Так что без прокачики именно этого "скилза" - ничего не выйдет.
И если вы думаете что когда-нибудь можно прийти в состояние "все знаешь" - ошибаетесь. Я тоже постоянно, все время "ищу и учусь". Моя работа на 95% именно из этого и состоит. А уж сам "кодинг" - это настолько вторичная вещь :)
Ну почти пол дня потерла на это но в конце концов заработало ну вот тока с компа
int val; // хранения принятого символа
#define DS 9 // дата
#define SHCP 10 // защёлка
#define STCP 8 // время
void setup()
{
Serial.begin(9600); //установка порта на скорость 9600 бит/сек
pinMode(DS,OUTPUT); // пин выход дата
pinMode(SHCP,OUTPUT); // пин выход защёлки
pinMode(STCP,OUTPUT); // пин выход время
}
void loop()
{
if (Serial.available()) { //если есть принятый символ,
val = Serial.read(); // то читаем его и сохраняем в val
if (val == '1') { // если принят символ '1'
shiftOut(DS,SHCP,LSBFIRST,B10000000); //формируем биты для регистра сдвига
digitalWrite(STCP,HIGH);
digitalWrite(STCP,LOW); //регистр закрыть защёлку
}
if (val == '2') {
shiftOut(DS,SHCP,LSBFIRST,B01000000); //формируем биты для регистра сдвига
digitalWrite(STCP,HIGH);
digitalWrite(STCP,LOW); //регистр закрыть защёлку
}
if (val == '3') {
shiftOut(DS,SHCP,LSBFIRST,B00100000); //формируем биты для регистра сдвига
digitalWrite(STCP,HIGH);
digitalWrite(STCP,LOW); //регистр закрыть защёлку
}
if (val == '4') {
Ну никак не могу понять куда это вписать чтобы с регистра биты шли?
Для того, чтобы это заработало, у Вас должны уже быть 2 функции - чтения последовательных портов и запись в последовательные порты. Вот, функция вывода будет примерно такой (судя по Вашему листингу)
Что за глюк такой? пропадает верхняя панель в окне комментария, но только в определенных темах, например в этой, ни код по нормальному не вставить ни картинки... просто ждать когда заработает?
А можно вообще напрвить поток битов из одного регистра в другой, не сохраняя их в дуине. Для этого надо соответственно между собой соеденить линии регистров DS, SHCP, STCP, к дуине подключить только два соединения SHCP и STCP и вуаля - дуина выступает в роли тактового генератора. В теории должно работать.
void read165(){
byte data = shiftIn(DS165,SHCP165,LSBFIRST); //читаем биты из регистра сдвига
digitalWrite(STCP165,HIGH);
digitalWrite(STCP165,LOW); //регистр закрыть защёлку
return data;
}
Опечатка: нужно еще объявить тип который функция возвращает. явно не void.
И второе, а не будет более правильно вначале подергать защелку, а потом уже делать shiftIn? И наверное, имеет смысл , при дергании защелка дать какую-то паузу. Что-бы "успел прочитать".
byte read165(){
digitalWrite(STCP165,HIGH);
delay(20); // чуть подожали
digitalWrite(STCP165,LOW); //регистр закрыть защёлку
return shiftIn(DS165,SHCP165,LSBFIRST); //читаем биты из регистра сдвига;
}
Да, действительно, функцию правил после копирования, просмотрел. По поводу задержки - по-моему защелка работает не по уровню, а по фронту, то есть не важно сколько времени ее держать, считывание (или вывод) битов происходит в момент изменения STCP с низкого уровня на высокий (с 0 на 1).
В вашем скетче из #24. Явно есть куски (25-27,31-33, 37-39). Которые ну просто просятся "выделить их в функцию". Просто что-бы из лени не писать повторяющийся код который отличается "на комаринный чих" (кстати это у вас и выдйте write595. выше уже дали пример, но вы и сами попробуйте)
Возможно вы правы. Я про задержку на http://www.arduino.cc/en/Tutorial/ShiftIn подглядел. Возможно это еще от самой микрухи зависит (там CD4021B используется). Но в любом случае "хуже от этого не будет". А потом, когда заработает, можно и убрать задержку. Посмотреть будет ли без нее работать.
P.S. Кстати в этом туториале можете подглядеть схему подключения.
int DS = 9; // дата
int SHCP = 10; // защёлка
int STCP = 8; // время
int indataPin = 11; // Вывод данных 165
int inclockPin = 12; // Вывод время 165
int inloadPin = 13; // Вывод выбора 165
int Data; // Переменная 165
void setup()
{
Serial.begin(9600); //установка порта на скорость 9600 бит/сек
pinMode(DS,OUTPUT); // пин выход дата
pinMode(SHCP,OUTPUT); // пин выход защёлки
pinMode(STCP,OUTPUT); // пин выход время
pinMode(indataPin, INPUT); // Ввод 165.
pinMode(inclockPin, OUTPUT); // Ввод время 165.
pinMode(inloadPin, OUTPUT); // Вывод load 165.
}
void loop()
{
digitalWrite(inloadPin, 0); // считываем 165
digitalWrite(inloadPin, 1); // выводим данные на последовательный вывод 165.
for(int i=0; i<=7; i++){ // В цикле считываем каждый из 8 входов (D0-D7) 165.
digitalWrite(inclockPin, 0); // Устанавливаем время в лог "0".
Data = digitalRead(indataPin); // Читаем текущее состояние выхода данных и сохраняет в дата 165.
digitalWrite(inclockPin, 1); // Устанавливаем время в лог "1" и этем завершаем вывод данных.
Serial.print (Data); // Отправляем данные
}
if (Data == '10000000') { // если принят символ '10000000'
shiftOut(DS,SHCP,LSBFIRST,B10000000); //формируем биты для регистра сдвига 595
digitalWrite(STCP,HIGH);
digitalWrite(STCP,LOW); //регистр закрыть защёлку 595
}
Serial.println ("");
}
вот это клинопись вроде всё логично вроде должна работать но не хочет
int DS = 9; // дата
int SHCP = 10; // защёлка
int STCP = 8; // время
int indataPin = 11; // Вывод данных 165
int inclockPin = 12; // Вывод время 165
int inloadPin = 13; // Вывод выбора 165
int Data; // Переменная 165
void setup()
{
Serial.begin(9600); //установка порта на скорость 9600 бит/сек
pinMode(DS,OUTPUT); // пин выход дата
pinMode(SHCP,OUTPUT); // пин выход защёлки
pinMode(STCP,OUTPUT); // пин выход время
pinMode(indataPin, INPUT); // Ввод 165.
pinMode(inclockPin, OUTPUT); // Ввод время 165.
pinMode(inloadPin, OUTPUT); // Вывод load 165.
}
void loop()
{
void read165(){
byte data = shiftIn(indataPin,inclockPin,LSBFIRST); //читаем биты из регистра сдвига
digitalWrite(inloadPin,HIGH);
digitalWrite(inloadPin,LOW); //регистр закрыть защёлку
return data;
}
}
if (Data == '10000000') { // если принят символ '10000000'
shiftOut(DS,SHCP,LSBFIRST,B10000000); //формируем биты для регистра сдвига 595
digitalWrite(STCP,HIGH);
digitalWrite(STCP,LOW); //регистр закрыть защёлку 595
}
Serial.println ("");
}
А тут у меня совсем бардак
Я бы даже сказал у вас во всем коде бардак ) Вот вам быть может даже рабочий вариант кода, не просто залейте его в дуину, а внимательно изучите и сравните со своим и сделайте для себя выводы...
int DS = 9; // дата
int SHCP = 10; // защёлка
int STCP = 8; // время
int indataPin = 11; // Вывод данных 165
int inclockPin = 12; // Вывод время 165
int inloadPin = 13; // Вывод выбора 165
void setup(){
Serial.begin(9600); //установка порта на скорость 9600 бит/сек
pinMode(DS,OUTPUT); // пин выход дата
pinMode(SHCP,OUTPUT); // пин выход защёлки
pinMode(STCP,OUTPUT); // пин выход время
pinMode(indataPin, INPUT); // Ввод 165.
pinMode(inclockPin, OUTPUT); // Ввод время 165.
pinMode(inloadPin, OUTPUT); // Вывод load 165.
}
void loop(){
byte data = read165();
write595(data);
Serial.println(data, BIN);
}
byte read165(){
digitalWrite(inloadPin,HIGH);
delayMicroseconds(100);
digitalWrite(inloadPin,LOW); //регистр закрыть защёлку
byte data = shiftIn(indataPin,inclockPin,LSBFIRST); //читаем биты из регистра сдвига
return data;
}
void write595(byte data) { // если принят символ '10000000'
shiftOut(DS,SHCP,LSBFIRST,data); //формируем биты для регистра сдвига 595
digitalWrite(STCP,HIGH);
delayMicroseconds(100);
digitalWrite(STCP,LOW); //регистр закрыть защёлку 595
}
И вам дали правильное направление и если оно не работает, то не игнорируйте его, а разбиритесь в нем...
1. "Чего-то опять" - привыкните как можно более подробно описывать "что у вас не так". В данном случае, конечно, можно догадатся "че не так", но лучше привыкните. Раз есть ошибка - пишем ее, если идут какие-то неверные данные в Serial - их тоже показываем. Все время держите в уме что у никто за плечом у вас не стоит. Что вы видите - никто не знает (если вы не скажете об этом), что вы "пытались сделать" - тоже.
2. Не нужно пытатся сразу shiftIn, shiftOut работать. Не прыгайте через ступеньки. Чего вы схватились за read165 если с write595() не закончили? Причем, опять-таки не нужно пытатся "сразу вместе их завести". Вначале "из Serial читаем в write595 отправляем" (начали но не завершили), потом read165 - отпарвляем в Serial. И только потом "читаем read165 отправляем в write595".
Вообщем доведите свой скетч #74 "до ума". Как я говорите- выделите функцию write595(), сделайте switch... (потом покажу как еще можно "к реальности" приблизить) . Вот почитали-бы ссылку, сделали - уже такой глупой ошибки с read165 - небыло-бы (ниже скажу что за ошибка).
А по поводу функций. Во первых видно чото вы попытались объявить функцию, но не видно что-бы вы пытались ее использовать.
Во вторых. Функция не может объявлятся внутри функции (по крайней мере в ардуино-языке).
Вот такое:
loop(){
....
void myFunc(){ // компилятор скажет много не хороших слов. тупо не поймет что мы тут хотим от него.
....
}
....
}
И на закуску. Понимаю что "сразу много нового", запутатся не мудрено. Но "чуть внимательней" читайте тему. Например read165 вы взяли "не рабочую", с очепяткой. Хотя ниже уже была поправленная версия. Кстати это явно говорит что "что такое функции" - вы так и не поняли до конца, перечитайте еще раз ссылку из документации что я вам давал. можете какой-нибудь учебник по C заглянуть, в раздел функций, может там понятней будет написанно).
Итого: кушайте слона по кусочкам. Микрошагами. Замените в своем скетче #74 куски повторяющегося кода на вызов write595 (и покажите), потом поедем дальше.
Кстати, по поводу задержек на задвижку - можно поставить для перестраховки, так как если у линии задвижки создастся емкость, то без задержки может не хватить времени, что бы на регистре успел появиться этот фронт.
Ну вот. Лишили человека возможности самому "пройти путь". Сделали за него домашнее задание/лабораторную работу. То что вы можете написать - никто и не сомневался. А со следующей задачай что он будет делать? Опять ждать помощи добрых самаритян? Даже если он посмотрит на ваш код и "вроде понял" - все равно в своих силах уверенности не будет. Шаг вправо, шаг влево - и "а... помогите". Когда смотришь "как другой работу делает" - оно всегда просто. А как сам, так "ничего не выходит" :(
Вообщем IMHO - это "медвежья услуга". Тем более в ситуации когда человек явно пытается разобратся-научится. Пусть и не сразу получается, но ведь приближается к ответу. Пусть чуть позже на пару дней, но он бы 100% получил-бы рабочий код. Вот только написал-бы его САМ. И познал-бы радость "я его заставил" :) А так вы и это у него отобрали :(
Ну у него всегда есть выбор - разобраться и научиться или просто скопировать и вставить, зачем человека мучить если он так старается... )
Если человеку это интересно, то готовое решение никогда не сделает хуже, рано или поздно он сам дойдет до этого.
Пусть сам для себя решит, что ему нужно... может ему совсем не нужны чьи-то учения и не хочет он дальше в этом разбираться, а просто хочет, что бы оно заработало и на этом его познания закончатся навсегда, может это его первый и последний опыт работы с МК и больше никогда в жизни он не столкнется с этим.
Ну у него всегда есть выбор - разобраться и научиться или просто скопировать и вставить,
Ну вы совсем психологию не учитываете. Снесли под корень мотивацию, а потом "есть выбор". В том-то и дело, что для "сферического коня в вакууме" выбор может и есть, а вот для живого человека - выбора практически не осталось.
maksim пишет:
зачем человека мучить если он так старается... )
Вот именно поэтому. Именно потому что старается и есть смысл тратить свое время. Вести пошагово "за ручку". А мучить вы не захотели не его, а себя. Это знающему, в первую очередь, трудно через эти очевидные вещи "продиратся". И соблазн "на тебе готовый код и отцепись" - очень велик. Прийти к тому же результату чужими руками, добившись его понимания - намного трудней.
maksim пишет:
Если человеку это интересно, то готовое решение никогда не сделает хуже, рано или поздно он сам дойдет до этого.
Так ведь интерес-то вы и убиваете. "Создателя" превращаете в "потребителя". Это не "сделает хуже"?
maksim пишет:
Пусть сам для себя решит, что ему нужно... может ему совсем не нужны чьи-то учения и не хочет он дальше в этом разбираться, а просто хочет, что бы оно заработало и на этом его познания закончатся навсегда, может это его первый и последний опыт работы с МК и больше никогда в жизни он не столкнется с этим.
Давайте все-таки предполагать в людях хорошее. Что приходящие сюда - не потребители. Что это люди которые хотят чему-то научится, что-то сами создавать. Тем более что bit продемонстрировал свое желание разбиратся и учится. Не на словах, а действиями.
А тех кто хотят "просто получить готовое" - тоже нечего баловать. Не хочется разбиратся - ищи исполнителя. Нефиг халяве потакать.
Хотя, конечно, давно известно что мы с вами имеем противоположную точку зрения на этот вопрос. И вряд-ли мы друг-друга переубедим. Так что... вообщем-то сильно мы убежали в оффтоп. Действительно дальше все зависит уже от bit.
Прошу прощения, если это прозвучало как "указываю что вам делать нужно".Просто досада взяла. Безусловно вы имеете право постить что хотите (и подоздеваю что многим новичкам ваш подход даже более приятен).
В этом коде как я понял мы просто данные принимаем считываем и отправляем но при работе кода когда нажимаешь на первую кнопку регистра сдвига загораются все светодиоды разом когда отпускаешь они гаснут на остальные кнопки реакции не какой
В Serial.print отображается один 0 при нажатии на первую кнопку на остальные реакции не какой
int DS = 9; // дата
int SHCP = 10; // защёлка
int STCP = 8; // время
int indataPin = 11; // Вывод данных 165
int inclockPin = 12; // Вывод время 165
int inloadPin = 13; // Вывод выбора 165
void setup(){
Serial.begin(9600); //установка порта на скорость 9600 бит/сек
pinMode(DS,OUTPUT); // пин выход дата
pinMode(SHCP,OUTPUT); // пин выход защёлки
pinMode(STCP,OUTPUT); // пин выход время
pinMode(indataPin, INPUT); // Ввод 165.
pinMode(inclockPin, OUTPUT); // Ввод время 165.
pinMode(inloadPin, OUTPUT); // Вывод load 165.
}
void loop(){
byte data = read165();
write595(data);
Serial.println(data, BIN);
}
byte read165(){
digitalWrite(inloadPin,HIGH);
delayMicroseconds(100);
digitalWrite(inloadPin,LOW); //регистр закрыть защёлку
byte data = shiftIn(indataPin,inclockPin,LSBFIRST); //читаем биты из регистра сдвига
return data;
}
void write595(byte data) { // если принят символ '10000000'
shiftOut(DS,SHCP,LSBFIRST,data); //формируем биты для регистра сдвига 595
digitalWrite(STCP,HIGH);
delayMicroseconds(100);
digitalWrite(STCP,LOW); //регистр закрыть защёлку 595
}
А в этом коде я пытался при нажатии первой кнопки на регистре сдвига 165 мы зажигаем первыё светодиод на регистре сдвига 565 но нечего не получается
int val = 0; // хранения принятого символа
int DS = 9; // дата 595
int SHCP = 10; // защёлка 595
int STCP = 8; // время 595
int dataPin = 11; // дата 165
int clockPin = 12; // время 165
int loadPin = 13; // load 165
void setup()
{
Serial.begin(9600); //установка порта на скорость 9600 бит/сек
pinMode(DS,OUTPUT); // пин выход дата 595
pinMode(SHCP,OUTPUT); // пин выход защёлки 595
pinMode(STCP,OUTPUT); // пин выход время 595
pinMode(dataPin, INPUT); // пин дата вход 165
pinMode(clockPin, OUTPUT); // пин время выход 165
pinMode(loadPin, OUTPUT); //пин load выход 165
}
void loop(){
digitalWrite(loadPin, 0); // читаем данные 165
delayMicroseconds(100); // стоп 100мс
digitalWrite(loadPin, 1); // выводим данные 165
for(int i=0; i<=7; i++){ // читаем каждые 8 входо 165
digitalWrite(clockPin, 0); // время лог 0
val = digitalRead(dataPin); // читаем состояние 165
digitalWrite(clockPin, 1); // время лог 0
Serial.print (val);
Serial.println ("");
}
{
if (val == '10000000') { // если принят символ '10000000'
shiftOut(DS,SHCP,LSBFIRST,B10000000); //формируем биты для регистра сдвига
digitalWrite(STCP,HIGH);
digitalWrite(STCP,LOW); //регистр закрыть защёлку
}
Serial.print (val); //отправляем данные
Serial.println ("");
}
}
Ну вот с таким же кодам работает когда с компа подаёшь символ
if (val == '1') { // если принят символ '10000000'
shiftOut(DS,SHCP,LSBFIRST,B10000000); //формируем биты для регистра сдвига
digitalWrite(STCP,HIGH);
digitalWrite(STCP,LOW); //регистр закрыть защёлку
Когда с компа вы отсылаете символ '1' вы отсылаете именно СИМВОЛ, а не значение 1, на самом деле за этим символом прячится значение 48. '10000000' - это вообще бред получается, так как одинарными ковычками выделяется только один символ, а вы туда засунули 8 символов.
Зачем вы пользыетесь символами??? Если вы хотите сравнивать значения в бинарном виде, то это делается так:
if (val == В10000000)
НО вы все равно этим ничего не добьетесь, так как в вашем коде переменная val временно хранит только один бит прочитанной информации из регистра и поэтому переменная val никогда не станет B10000000 и ваше условие никогда не будет верным.
Вы можете работать и с символами, но тогда вам нужно собрать из символов строку val[9] = "10000000" хоть это и не совсем правильный подход, но работать будет. Для этого вам нужно объявить глобальную строку (массив):
char val[9] = "00000000";
затем в цикле, где вы читаете данные из регистра заполнить эту строку:
и только после этого можно сравнивать в таком виде:
if (val == "10000000")
но еще раз повторюсь, что это не совсем правильный подход. Тогда, если вы не понимаете как работать с битами вместо символов (строк) лучше работать с байтами, а точнее с массивом байт, а еще лучше с массивом переменных типа bool, по аналогии:
переменная:
boolean val[8] = {0,0,0,0,0,0,0,0};
читаем данные из регистра и заполняем массив:
for(int i=0; i<8; i++){ // читаем 8 входов 165
digitalWrite(clockPin, 0); // время лог 0
val[i] = digitalRead(dataPin); // читаем состояние 165
digitalWrite(clockPin, 1); // время лог 1
}
сравниваем:
if (val[0]== 1){выводим в регистр 1000000}
if (val[1]== 1){выводим в регистр 0100000}
и т.д.
Ну что же вы прыгаете-то с пятого на десятое? Ну почему вам нужно сразу добится "и читать и отправлять". Ну почему вначале не научится "четко отправлять", зажигать именно те диоды которые хотите? Вы же вынуждаете максима объяснять вам сразу 10-ть вещей, в своем скетче меняете тоже сразу 5-ть вещей. Переключатся, вслед за вами, с реализации одного подхода, на другой. Одно сделали правильно, другое поломали, потом наоборот. Потому что "сделали правильно" - случайно. Без понимания "почему именно так". Вы же сами себе устраиваете "информационную перегрузку".
У вас в "уравнение" которая нужно разгадать (найти неправильный элемент) образуется сразу 10-то неизвестных.
Почему не оттолкнутся от того что "работает и понятно" и добавлять по одной неизвестной за раз?
В который раз. Код из сообщение 74 работает у вас? Ну вот от него и нужно отталкиватся. Постепенно(!) приводить его желаемому поведению. Меняя за один раз только один элемент поведения.
Возьмите свой код из #74. И перепешите его на использования функции write595(). Добейтесь что-бы он "делал тоже самое", но через функцию. Без дублирования/размазывания по коду работы с 595-тым.
"Хаотичный подход", пробовать все подряд, вы уже попробовали. Может попробуете то что я предлагаю? Последовательно грызть задачу. Неужели первый шаг который я вам предлагаю такой трудный?
// хранения принятого символа
int DS = 9; // дата
int SHCP = 10; // защёлка
int STCP = 8; // время
int dataPin = 11; // Вывод данных 165
int clockPin = 12; // Вывод время 165
int loadPin = 13; // Вывод выбора 165
boolean val[8] = {0,0,0,0,0,0,0,0};
void setup()
{
Serial.begin(9600); //установка порта на скорость 9600 бит/сек
pinMode(DS,OUTPUT); // пин выход дата
pinMode(SHCP,OUTPUT); // пин выход защёлки
pinMode(STCP,OUTPUT); // пин выход время
pinMode(dataPin, INPUT); // Ввод 165.
pinMode(clockPin, OUTPUT); // Ввод время 165.
pinMode(loadPin, OUTPUT); // Вывод load 165.
}
void loop()
{
digitalWrite(loadPin, 0);
digitalWrite(loadPin, 1);
for(int i=0; i<8; i++){ // читаем 8 входов 165
digitalWrite(clockPin, 0); // время лог 0
val[i] = digitalRead(dataPin); // читаем состояние 165
digitalWrite(clockPin, 1); // время лог 1
}
if (val[0]== 1){ // если принят символ '1'
shiftOut(DS,SHCP,LSBFIRST,B10001000); //формируем биты для регистра сдвига
digitalWrite(STCP,HIGH);
digitalWrite(STCP,LOW); //регистр закрыть защёлку
}
}
Чего та я совсем запутался почему та что в этих кодах которые вы мне рани давали http://www.arduino.cc/en/Tutorial/ShiftIn нажимаешь на первую кнопку отображаются 0
Что в этом коде реакция только на одну кнопку на первую я уже всё перепробовал не понимаю
А вот в этом коде на каждую кнопку отображается символ
int indataPin = 11; // Вывод чтения дата 165
int inclockPin = 12; // Вывод CLK 165
int inloadPin = 13; // Вывод выбора 165
int temp = 0; // Переменная 165.
void setup(){ // Инициализация контролера.
Serial.begin(9600); // Выбираем скорость обмена по UART.
pinMode(indataPin, INPUT); // Ввод для приёма данных из 165.
pinMode(inclockPin, OUTPUT); // Вывод CLK на 165.
pinMode(inloadPin, OUTPUT); // Вывод load на 165.
}
void loop(){
digitalWrite(inloadPin, 0); // считываем в входов 165 в регистр.
digitalWrite(inloadPin, 1); // выводим данные 165.
for(int i=0; i<=7; i++){ // В цикле считываем каждый из 8 входов 165.
digitalWrite(inclockPin, 0); // CLK в лог "0".
temp = digitalRead(indataPin); // Читаем текущее состояние выхода данных 165.
digitalWrite(inclockPin, 1); // CLK в лог "1" и этем завершаем вывод данных.
Serial.print (temp); // Отправляем данные
}
Serial.println ("");
Serial.println ("--------");
delay(2000);
Чего та я совсем запутался почему та что в этих кодах которые вы мне рани давали
Простите, но я, видимо, не смогу вам помочь. Может быть другие.
Вы тупо игнорируете то что вам пишут. Мне уж лень считать, сколько раз я сказал "забудте, пока, про ввод", "возмите СВОЙ скетч из #74", "доделайте вывод". Сделайте по нему самую простую модификацию которую вам советуют (выделите вывод в функцию, потом дальше пойдем). Не получается - показывайте что не получается, спрашивайте, а не начинайте "заниматся другим". Ведь в процессе этого и будет разбиратся "что там в этом байте должно быть", что-бы потом опираясь на эту базу, на это понимание, разбиратся с вводом.
Безусловно. Каждый разбирается-учится по своему. Кому-то одни методы подходят, кому-то другие. Видимо мой подход вас почему-то не устраивает. Ну ладно. Я и не претендую что "он самый лучший в мире".
Тем более, судя по вашему упорству, я не сомневаюсь что, в итоге, у вас все получится. К одному и тому же результату можно прийти разными путями.
Чего та я совсем запутался почему та что в этих кодах которые вы мне рани давали
Простите, но я, видимо, не смогу вам помочь. Может быть другие.
Вы тупо игнорируете то что вам пишут. Мне уж лень считать, сколько раз я сказал "забудте, пока, про ввод", "возмите СВОЙ скетч из #74", "доделайте вывод". Сделайте по нему самую простую модификацию которую вам советуют (выделите вывод в функцию, потом дальше пойдем). Не получается - показывайте что не получается, спрашивайте, а не начинайте "заниматся другим". Ведь в процессе этого и будет разбиратся "что там в этом байте должно быть", что-бы потом опираясь на эту базу, на это понимание, разбиратся с вводом.
Безусловно. Каждый разбирается-учится по своему. Кому-то одни методы подходят, кому-то другие. Видимо мой подход вас почему-то не устраивает. Ну ладно. Я и не претендую что "он самый лучший в мире".
Тем более, судя по вашему упорству, я не сомневаюсь что, в итоге, у вас все получится. К одному и тому же результату можно прийти разными путями.
Всем привет подскажите пожалуйста какую нить нормальную книжку в по программированию микроконтроллеров чтобы там все команды понятным языком были расписаны
Это можно и так но тока не пойму почему принажатой кнопки светодиод который гаснет слегка помигивает
Потому что строки 21-24 вы выполняете на каждом проходе loop, в не зависимости от того нажата кнопка или нет. Если не нажата - то постоянно шлете данные в сдвиговый, если нажата, то засветили - подождали пол секунды и выключили и тут же снова включили.
Я бы вам рекомендовал, в конце loop сохранять val, в какую-то дополнительную переменную prevVal (предыдущие состояние val).
И потом, после val = digitalRead(KnopkaPin1); проверять изменилась ли val по сравнению с прошлым проходом цикла. и что-то делать только если изменилась.
И с "защелкой" - лучше все-таки работать как Максим. Оставлять ее постоянно в HIGH, а не держать в LOW.
То есть выставлять в LOW непосредственно перед выводом данных.
В таком варианте у вас код будет выглядит более "традиционно" (а значит и легче для понимания другими), во вторых вы снизите шанс что регистр поймает какую-то помеху (а так вы, фактически, все-время держите его в состоянии "слушаю вход"). Порядок "слушай команду", "команда", "исполняй" - IMHO Логиченей, чем "команда", "исполняй", "слушай команду" :)
И, кстати приучитесь отбивать код оступами руками. И вам самому и другим будет легче видно что во что вложенно. Вот посмотрите на код Максима и свой. У него сразу видно где if начался, где закончился. А у вас? Пока скетч короткий - еще можно глазами скобки пересчитать , а вот когда разрастется и if-вов будет с десяток - уже разобратся "почему как-то не так работает" - будет очень трудно.
хорошо
Подскажи пожалуйста как мне биты с сдвиг регистра HC165 направлять в HC595 причём одновременно могут быть нажаты от одной до 4 кнопак
Ну как всё это запустить?
Ну а дальше куда двигаться подскажи пожалуйста
Ну как всё это запустить?
Помолясь :)
Ну а, если серьезней, вы бы сформулировали как-то более конкретно вопрос. Что именно вам не понятно. Что именно вызывает затруднение.
Бо вот так, в общем виде, ответ очевиден:
осталось только написать-оттсетировать две функции. write595 - которая отправляет данные в 74HC595 и read595 - которая читает текущие состояние 74HC165.
Начать, наверное, стоит с write595. Как более простого. Она уже у вас есть "практически готовая". Смотри код максима выше. Осталось только отправку в регистр оформить в виде функции.
read595 - а тоже прийдется разбиратся как читать сдвиговые. гугл и поиск по форуму "клавиатура сдвиговые", "ардуино можим входы" и т.п. Уже не один раз это "расписывалось". Для начала - читаете и отправляете прочитанное в Serial. Когда "заработает" - будете "отправлять на диоды" с помощью write595
Для начала data можно сделать не unsigned int, а byte. По одному регистру на входе и выходе. Так "проще". По одному байту. Когда это освоите - тогда уже можно будет "каскадировать". Подключать два 165 и два 595 (три, пять, десять).
хорошо тебе когда всё знаешь, а я тут голову сломал :)
хорошо тебе когда всё знаешь, а я тут голову сломал :)
Конечно хорошо. А вам что мешает прийти в состояние "все знаешь"? Я ведь не родился с этим знанием. Я ведь вам "расписывал" не "что-то из пальца высосанное", а именно собственный подход к НЕЗНАКОМЫМ задачам. Дробим на подзадачи, гуглим, читаем, пробуем. Или вы думаете что я какого-то тибетского Ардуино-Гуру учился? Нет. Я просто действую вот точно так как написал. Открыл гулг, перечитал все что смог найти про сдвиговые :) Нагуглил online эмулятор сдвиговоего. Мышкой "подергал его за ноги", что-бы понять логику его работы.
А, вы, снова, "абстрактно стоните". "Голову сломал". На чем? Как выделить в функцию кусочек кода? Как отправлять в Serial? Как гуглом найти информацию про сдвиговые на входе? Как хранить прочитанные данные? Чем unsigned int отличается от byte? Как каскадировать?
Что вы вообще попробовали сделать из того что я написал в прошлом посте? Получилось/не получилось - вторично. Но, судя по всему, - ничего. Иначе вопросы были-бы более конкретны.
А так остается только пожать плечами. Ну что-ж "жаль дитятьку". Сложно для нее. Голову ломает. Може не нужно тогда? Пока холода не настали лучше пойти в футбол поиграть?
В не обижайтесь, но в программирование навык "искать и разбиратся" - это самый первичный. Знания конкретного железа/языка/платформы - дело десятое. Это все очень быстро меняется/устаревает/появляется новое. Поэтому само "знание" - не очень ценно. А вот навык "разбиратся" - наоборот. Так что без прокачики именно этого "скилза" - ничего не выйдет.
И если вы думаете что когда-нибудь можно прийти в состояние "все знаешь" - ошибаетесь. Я тоже постоянно, все время "ищу и учусь". Моя работа на 95% именно из этого и состоит. А уж сам "кодинг" - это настолько вторичная вещь :)
Да это та я согласен что надо мозг ломать больше запомнишь и больше знать будишь но иногда нужно подсказывать или объяснять:)
Ну никак не могу понять куда это вписать чтобы с регистра биты шли?
Для того, чтобы это заработало, у Вас должны уже быть 2 функции - чтения последовательных портов и запись в последовательные порты. Вот, функция вывода будет примерно такой (судя по Вашему листингу)
Что за глюк такой? пропадает верхняя панель в окне комментария, но только в определенных темах, например в этой, ни код по нормальному не вставить ни картинки... просто ждать когда заработает?
Тогда эта функция так:
При этом можно использовать теже выводы дуины для DS и SHCP обоих регистров, но линию DS нужно будет конфигурировать то на вход то на выход.
А можно вообще напрвить поток битов из одного регистра в другой, не сохраняя их в дуине. Для этого надо соответственно между собой соеденить линии регистров DS, SHCP, STCP, к дуине подключить только два соединения SHCP и STCP и вуаля - дуина выступает в роли тактового генератора. В теории должно работать.
Тогда эта функция так:
Опечатка: нужно еще объявить тип который функция возвращает. явно не void.
И второе, а не будет более правильно вначале подергать защелку, а потом уже делать shiftIn? И наверное, имеет смысл , при дергании защелка дать какую-то паузу. Что-бы "успел прочитать".
Да, действительно, функцию правил после копирования, просмотрел. По поводу задержки - по-моему защелка работает не по уровню, а по фронту, то есть не важно сколько времени ее держать, считывание (или вывод) битов происходит в момент изменения STCP с низкого уровня на высокий (с 0 на 1).
>ну вот тока с компа
ну дык это не мало. вы освоили чуть-ли не основной отладочный прием на ардуино. как тестить "схему по частям". Проверили,отдельно выходную часть.
А пол дня на незнакомую железку - это относительно быстро расковыряли.
2bite:
почитайте http://arduino.ru/Reference/FunctionDeclaration
В вашем скетче из #24. Явно есть куски (25-27,31-33, 37-39). Которые ну просто просятся "выделить их в функцию". Просто что-бы из лени не писать повторяющийся код который отличается "на комаринный чих" (кстати это у вас и выдйте write595. выше уже дали пример, но вы и сами попробуйте)
И куча if-фов. Оно конечно "и так правильно", но прочитайте еще http://arduino.ru/Reference/SwitchCase он как раз для таких случаев придуман.
И покажите "что у вас вышло". Давайте "отполируем" этот ваш скетч.
то есть не важно сколько времени ее держать,
Возможно вы правы. Я про задержку на http://www.arduino.cc/en/Tutorial/ShiftIn подглядел. Возможно это еще от самой микрухи зависит (там CD4021B используется). Но в любом случае "хуже от этого не будет". А потом, когда заработает, можно и убрать задержку. Посмотреть будет ли без нее работать.
P.S. Кстати в этом туториале можете подглядеть схему подключения.
Ну чего опять не то помогите, исправьте код пожалуйста
Я бы даже сказал у вас во всем коде бардак ) Вот вам быть может даже рабочий вариант кода, не просто залейте его в дуину, а внимательно изучите и сравните со своим и сделайте для себя выводы...
И вам дали правильное направление и если оно не работает, то не игнорируйте его, а разбиритесь в нем...
1. "Чего-то опять" - привыкните как можно более подробно описывать "что у вас не так". В данном случае, конечно, можно догадатся "че не так", но лучше привыкните. Раз есть ошибка - пишем ее, если идут какие-то неверные данные в Serial - их тоже показываем. Все время держите в уме что у никто за плечом у вас не стоит. Что вы видите - никто не знает (если вы не скажете об этом), что вы "пытались сделать" - тоже.
2. Не нужно пытатся сразу shiftIn, shiftOut работать. Не прыгайте через ступеньки. Чего вы схватились за read165 если с write595() не закончили? Причем, опять-таки не нужно пытатся "сразу вместе их завести". Вначале "из Serial читаем в write595 отправляем" (начали но не завершили), потом read165 - отпарвляем в Serial. И только потом "читаем read165 отправляем в write595".
Вообщем доведите свой скетч #74 "до ума". Как я говорите- выделите функцию write595(), сделайте switch... (потом покажу как еще можно "к реальности" приблизить) . Вот почитали-бы ссылку, сделали - уже такой глупой ошибки с read165 - небыло-бы (ниже скажу что за ошибка).
А по поводу функций. Во первых видно чото вы попытались объявить функцию, но не видно что-бы вы пытались ее использовать.
Во вторых. Функция не может объявлятся внутри функции (по крайней мере в ардуино-языке).
Вот такое:
Работать не будеть.
А вот так будет:
И на закуску. Понимаю что "сразу много нового", запутатся не мудрено. Но "чуть внимательней" читайте тему. Например read165 вы взяли "не рабочую", с очепяткой. Хотя ниже уже была поправленная версия. Кстати это явно говорит что "что такое функции" - вы так и не поняли до конца, перечитайте еще раз ссылку из документации что я вам давал. можете какой-нибудь учебник по C заглянуть, в раздел функций, может там понятней будет написанно).
Итого: кушайте слона по кусочкам. Микрошагами. Замените в своем скетче #74 куски повторяющегося кода на вызов write595 (и покажите), потом поедем дальше.
Кстати, по поводу задержек на задвижку - можно поставить для перестраховки, так как если у линии задвижки создастся емкость, то без задержки может не хватить времени, что бы на регистре успел появиться этот фронт.
Вот вам быть может даже рабочий вариант кода,
Ну вот. Лишили человека возможности самому "пройти путь". Сделали за него домашнее задание/лабораторную работу. То что вы можете написать - никто и не сомневался. А со следующей задачай что он будет делать? Опять ждать помощи добрых самаритян? Даже если он посмотрит на ваш код и "вроде понял" - все равно в своих силах уверенности не будет. Шаг вправо, шаг влево - и "а... помогите". Когда смотришь "как другой работу делает" - оно всегда просто. А как сам, так "ничего не выходит" :(
Вообщем IMHO - это "медвежья услуга". Тем более в ситуации когда человек явно пытается разобратся-научится. Пусть и не сразу получается, но ведь приближается к ответу. Пусть чуть позже на пару дней, но он бы 100% получил-бы рабочий код. Вот только написал-бы его САМ. И познал-бы радость "я его заставил" :) А так вы и это у него отобрали :(
Ну у него всегда есть выбор - разобраться и научиться или просто скопировать и вставить, зачем человека мучить если он так старается... )
Если человеку это интересно, то готовое решение никогда не сделает хуже, рано или поздно он сам дойдет до этого.
Пусть сам для себя решит, что ему нужно... может ему совсем не нужны чьи-то учения и не хочет он дальше в этом разбираться, а просто хочет, что бы оно заработало и на этом его познания закончатся навсегда, может это его первый и последний опыт работы с МК и больше никогда в жизни он не столкнется с этим.
Ну у него всегда есть выбор - разобраться и научиться или просто скопировать и вставить,
Ну вы совсем психологию не учитываете. Снесли под корень мотивацию, а потом "есть выбор". В том-то и дело, что для "сферического коня в вакууме" выбор может и есть, а вот для живого человека - выбора практически не осталось.
зачем человека мучить если он так старается... )
Вот именно поэтому. Именно потому что старается и есть смысл тратить свое время. Вести пошагово "за ручку". А мучить вы не захотели не его, а себя. Это знающему, в первую очередь, трудно через эти очевидные вещи "продиратся". И соблазн "на тебе готовый код и отцепись" - очень велик. Прийти к тому же результату чужими руками, добившись его понимания - намного трудней.
Если человеку это интересно, то готовое решение никогда не сделает хуже, рано или поздно он сам дойдет до этого.
Так ведь интерес-то вы и убиваете. "Создателя" превращаете в "потребителя". Это не "сделает хуже"?
Пусть сам для себя решит, что ему нужно... может ему совсем не нужны чьи-то учения и не хочет он дальше в этом разбираться, а просто хочет, что бы оно заработало и на этом его познания закончатся навсегда, может это его первый и последний опыт работы с МК и больше никогда в жизни он не столкнется с этим.
Давайте все-таки предполагать в людях хорошее. Что приходящие сюда - не потребители. Что это люди которые хотят чему-то научится, что-то сами создавать. Тем более что bit продемонстрировал свое желание разбиратся и учится. Не на словах, а действиями.
А тех кто хотят "просто получить готовое" - тоже нечего баловать. Не хочется разбиратся - ищи исполнителя. Нефиг халяве потакать.
Хотя, конечно, давно известно что мы с вами имеем противоположную точку зрения на этот вопрос. И вряд-ли мы друг-друга переубедим. Так что... вообщем-то сильно мы убежали в оффтоп. Действительно дальше все зависит уже от bit.
Прошу прощения, если это прозвучало как "указываю что вам делать нужно".Просто досада взяла. Безусловно вы имеете право постить что хотите (и подоздеваю что многим новичкам ваш подход даже более приятен).
В этом коде как я понял мы просто данные принимаем считываем и отправляем но при работе кода когда нажимаешь на первую кнопку регистра сдвига загораются все светодиоды разом когда отпускаешь они гаснут на остальные кнопки реакции не какой
В Serial.print отображается один 0 при нажатии на первую кнопку на остальные реакции не какой
А в этом коде я пытался при нажатии первой кнопки на регистре сдвига 165 мы зажигаем первыё светодиод на регистре сдвига 565 но нечего не получается
Не понятно мы же сохраняем данные в val = digitalRead(dataPin);
И читаем в
Да видимо чего та я не догоняю
Ну вот с таким же кодам работает когда с компа подаёшь символ
Когда с компа вы отсылаете символ '1' вы отсылаете именно СИМВОЛ, а не значение 1, на самом деле за этим символом прячится значение 48. '10000000' - это вообще бред получается, так как одинарными ковычками выделяется только один символ, а вы туда засунули 8 символов.
Зачем вы пользыетесь символами??? Если вы хотите сравнивать значения в бинарном виде, то это делается так:
НО вы все равно этим ничего не добьетесь, так как в вашем коде переменная val временно хранит только один бит прочитанной информации из регистра и поэтому переменная val никогда не станет B10000000 и ваше условие никогда не будет верным.
Вы можете работать и с символами, но тогда вам нужно собрать из символов строку val[9] = "10000000" хоть это и не совсем правильный подход, но работать будет. Для этого вам нужно объявить глобальную строку (массив):
затем в цикле, где вы читаете данные из регистра заполнить эту строку:
и только после этого можно сравнивать в таком виде:
но еще раз повторюсь, что это не совсем правильный подход. Тогда, если вы не понимаете как работать с битами вместо символов (строк) лучше работать с байтами, а точнее с массивом байт, а еще лучше с массивом переменных типа bool, по аналогии:
переменная:
читаем данные из регистра и заполняем массив:
сравниваем:
2bit
Ну что же вы прыгаете-то с пятого на десятое? Ну почему вам нужно сразу добится "и читать и отправлять". Ну почему вначале не научится "четко отправлять", зажигать именно те диоды которые хотите? Вы же вынуждаете максима объяснять вам сразу 10-ть вещей, в своем скетче меняете тоже сразу 5-ть вещей. Переключатся, вслед за вами, с реализации одного подхода, на другой. Одно сделали правильно, другое поломали, потом наоборот. Потому что "сделали правильно" - случайно. Без понимания "почему именно так". Вы же сами себе устраиваете "информационную перегрузку".
У вас в "уравнение" которая нужно разгадать (найти неправильный элемент) образуется сразу 10-то неизвестных.
Почему не оттолкнутся от того что "работает и понятно" и добавлять по одной неизвестной за раз?
В который раз. Код из сообщение 74 работает у вас? Ну вот от него и нужно отталкиватся. Постепенно(!) приводить его желаемому поведению. Меняя за один раз только один элемент поведения.
Возьмите свой код из #74. И перепешите его на использования функции write595(). Добейтесь что-бы он "делал тоже самое", но через функцию. Без дублирования/размазывания по коду работы с 595-тым.
"Хаотичный подход", пробовать все подряд, вы уже попробовали. Может попробуете то что я предлагаю? Последовательно грызть задачу. Неужели первый шаг который я вам предлагаю такой трудный?
Да я и так разбираю всё по кусочкам тока не всё получается
Чего та я совсем запутался почему та что в этих кодах которые вы мне рани давали http://www.arduino.cc/en/Tutorial/ShiftIn нажимаешь на первую кнопку отображаются 0
Что в этом коде реакция только на одну кнопку на первую я уже всё перепробовал не понимаю
А вот в этом коде на каждую кнопку отображается символ
Что то где то у меня не так и не магу разобраться
Видимо чего та ещё не хватает
Извиняюсь мой косяк
Чего та я совсем запутался почему та что в этих кодах которые вы мне рани давали
Простите, но я, видимо, не смогу вам помочь. Может быть другие.
Вы тупо игнорируете то что вам пишут. Мне уж лень считать, сколько раз я сказал "забудте, пока, про ввод", "возмите СВОЙ скетч из #74", "доделайте вывод". Сделайте по нему самую простую модификацию которую вам советуют (выделите вывод в функцию, потом дальше пойдем). Не получается - показывайте что не получается, спрашивайте, а не начинайте "заниматся другим". Ведь в процессе этого и будет разбиратся "что там в этом байте должно быть", что-бы потом опираясь на эту базу, на это понимание, разбиратся с вводом.
Безусловно. Каждый разбирается-учится по своему. Кому-то одни методы подходят, кому-то другие. Видимо мой подход вас почему-то не устраивает. Ну ладно. Я и не претендую что "он самый лучший в мире".
Тем более, судя по вашему упорству, я не сомневаюсь что, в итоге, у вас все получится. К одному и тому же результату можно прийти разными путями.
уже исправил
digitalWrite(inloadPin, 0);
digitalWrite(inloadPin, 1);
забыл вставить
Чего та я совсем запутался почему та что в этих кодах которые вы мне рани давали
Простите, но я, видимо, не смогу вам помочь. Может быть другие.
Вы тупо игнорируете то что вам пишут. Мне уж лень считать, сколько раз я сказал "забудте, пока, про ввод", "возмите СВОЙ скетч из #74", "доделайте вывод". Сделайте по нему самую простую модификацию которую вам советуют (выделите вывод в функцию, потом дальше пойдем). Не получается - показывайте что не получается, спрашивайте, а не начинайте "заниматся другим". Ведь в процессе этого и будет разбиратся "что там в этом байте должно быть", что-бы потом опираясь на эту базу, на это понимание, разбиратся с вводом.
Безусловно. Каждый разбирается-учится по своему. Кому-то одни методы подходят, кому-то другие. Видимо мой подход вас почему-то не устраивает. Ну ладно. Я и не претендую что "он самый лучший в мире".
Тем более, судя по вашему упорству, я не сомневаюсь что, в итоге, у вас все получится. К одному и тому же результату можно прийти разными путями.
Да с чего вы взяли что я кого то игнорирую
Ну наконец-то всё за работало
Большое спасибо вам за помощь
И всем остальным кто участвовал
Будим дальше чудить !
Всем привет подскажите пожалуйста какую нить нормальную книжку в по программированию микроконтроллеров чтобы там все команды понятным языком были расписаны
А.В. Белов "Самоучитель разработчика устройств на микроконтроллерах AVR", Наука и техника, Санкт-Петербург 2008 ISBN 978-5-94387-363-8
Вот этот курс рекомендую
Спасибо