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

bit
Offline
Зарегистрирован: 07.05.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, B00000001); 
shiftOut(data, cloc, LSBFIRST, B00000000);
digitalWrite(RCK, HIGH);
digitalWrite(RCK, LOW);
val = digitalRead(KnopkaPin1);
if (val == HIGH){

shiftOut(data, cloc, LSBFIRST, B00000000);
shiftOut(data, cloc, LSBFIRST, B00000001);
digitalWrite(RCK, HIGH);

digitalWrite(RCK, LOW);
delay(500);
}





}

 

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

 Потому что строки 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 непосредственно перед выводом данных.

  1. Защелка в LOW
  2. Вывели данные
  3. Защелка в HIGH (и осталась в таком виде пока не потребуется следующий вывод данных).

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

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

 И, кстати приучитесь отбивать код оступами руками. И вам самому и другим будет легче видно что во что вложенно. Вот посмотрите на код Максима и свой. У него сразу видно где if начался, где закончился. А у вас? Пока скетч короткий - еще можно глазами скобки пересчитать , а вот когда разрастется и if-вов будет с десяток - уже разобратся "почему как-то не так работает" - будет очень трудно.

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

хорошо

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

Подскажи пожалуйста как мне биты с сдвиг регистра HC165 направлять в HC595 причём одновременно могут быть нажаты от одной до 4 кнопак

 

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

Ну как всё это запустить?

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

Ну а дальше куда двигаться подскажи пожалуйста

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

 

bit пишет:

Ну как всё это запустить?

Помолясь :)

Ну а, если серьезней, вы бы сформулировали как-то более конкретно вопрос. Что именно вам не понятно. Что именно вызывает затруднение.

Бо вот так, в общем виде,  ответ очевиден:

unsigned int data; 
loop(){
  data=read595(); // читаем
  write595(data); // отправляем
}

осталось только написать-оттсетировать две функции. write595 - которая отправляет данные в 74HC595 и read595 - которая читает текущие состояние 74HC165.

Начать, наверное, стоит с write595. Как более простого. Она уже у вас есть "практически готовая". Смотри код максима выше. Осталось только отправку в регистр оформить в виде функции.

read595 - а тоже прийдется разбиратся как читать сдвиговые. гугл и поиск по форуму "клавиатура сдвиговые", "ардуино можим входы" и т.п. Уже не один раз это "расписывалось". Для начала - читаете и отправляете прочитанное в Serial. Когда "заработает"  - будете "отправлять на диоды" с помощью write595

Для начала data можно сделать не unsigned int, а byte. По одному регистру на входе и выходе. Так "проще". По одному байту. Когда это освоите - тогда уже можно будет "каскадировать". Подключать два 165 и два 595 (три, пять, десять).

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

хорошо тебе когда всё знаешь, а я тут голову сломал :)

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

 

bit пишет:

 

хорошо тебе когда всё знаешь, а я тут голову сломал :)

Конечно хорошо. А вам что мешает прийти в состояние "все знаешь"? Я ведь не родился с этим знанием. Я ведь вам "расписывал" не "что-то из пальца высосанное", а именно собственный подход к НЕЗНАКОМЫМ задачам. Дробим на подзадачи, гуглим, читаем, пробуем. Или вы думаете что я какого-то тибетского Ардуино-Гуру учился? Нет. Я просто действую вот точно так как написал. Открыл гулг, перечитал все что смог найти про сдвиговые :) Нагуглил online эмулятор сдвиговоего. Мышкой "подергал его за ноги", что-бы понять логику его работы.

А, вы, снова, "абстрактно стоните". "Голову сломал". На чем? Как выделить в функцию кусочек кода? Как отправлять в Serial? Как гуглом найти информацию про сдвиговые на входе? Как хранить прочитанные данные? Чем unsigned int отличается от byte? Как каскадировать?

Что вы вообще попробовали сделать из того что я написал в прошлом посте? Получилось/не получилось - вторично. Но, судя по всему, - ничего. Иначе вопросы были-бы более конкретны.

А так остается только пожать плечами. Ну что-ж "жаль дитятьку". Сложно для нее. Голову ломает. Може не нужно тогда? Пока холода не настали лучше пойти в футбол поиграть?

В не обижайтесь, но в программирование навык "искать и разбиратся" - это самый первичный. Знания конкретного железа/языка/платформы - дело десятое. Это все очень быстро меняется/устаревает/появляется новое. Поэтому само "знание" - не очень ценно. А вот навык "разбиратся" - наоборот. Так что без прокачики именно этого "скилза" - ничего не выйдет.
И если вы думаете что когда-нибудь можно прийти в состояние "все знаешь" - ошибаетесь. Я тоже постоянно, все время "ищу и учусь". Моя работа на 95% именно из этого и состоит. А уж сам "кодинг" - это настолько вторичная вещь :)

 

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

Да это та я согласен что надо мозг ломать больше запомнишь и больше знать будишь но иногда нужно подсказывать или объяснять:)

 

bit
Offline
Зарегистрирован: 07.05.2012
Ну почти пол дня потерла на это но в конце концов заработало ну вот тока с компа
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') {              

 

Ну никак не могу понять куда это вписать чтобы с регистра биты шли?
 

unsigned int data; 
loop(){
  data=read595(); // читаем
  write595(data); // отправляем
}

 

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

Для того, чтобы это заработало, у Вас должны уже быть 2 функции - чтения последовательных портов и запись в последовательные порты. Вот, функция вывода будет примерно такой (судя по Вашему листингу)

void write595(int data)
{ 
shiftOut(DS,SHCP,LSBFIRST,data); //формируем биты для регистра сдвига
digitalWrite(STCP,HIGH);
digitalWrite(STCP,LOW);                    //регистр закрыть защёлку
 }

 

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

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

 

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

 Тогда эта функция так:

void read165(){  
  byte data = shiftIn(DS165,SHCP165,LSBFIRST); //читаем биты из регистра сдвига
  digitalWrite(STCP165,HIGH);
  digitalWrite(STCP165,LOW);                    //регистр закрыть защёлку
  return data;
}

 При этом можно использовать теже выводы дуины для DS и SHCP обоих регистров, но линию DS нужно будет конфигурировать то на вход то на выход. 

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

 А можно вообще напрвить поток битов из одного регистра в другой, не сохраняя их в дуине. Для этого надо соответственно между собой соеденить линии регистров DS, SHCP, STCP, к дуине подключить только два соединения SHCP и STCP и вуаля - дуина выступает в роли тактового генератора. В теории должно работать.


#define SHCP 10  // защёлка
#define STCP 8  // тактирование            

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

void loop() {
  for(byte i = 0; i < 8; i++){
    digitalWrite(STCP,HIGH);
    digitalWrite(STCP,LOW); 
  }  
  digitalWrite(STCP,HIGH);
  digitalWrite(STCP,LOW); 
}

 

 

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

maksim пишет:

 Тогда эта функция так:

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); //читаем биты из регистра сдвига;
}
maksim
Offline
Зарегистрирован: 12.02.2012

Да, действительно, функцию правил после копирования, просмотрел. По поводу задержки - по-моему защелка работает не по уровню, а по фронту, то есть не важно сколько времени ее держать, считывание (или вывод) битов происходит в момент изменения STCP с низкого уровня на высокий (с 0 на 1).

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

>ну вот тока с компа

ну дык это не мало. вы освоили чуть-ли не основной отладочный прием на ардуино. как тестить "схему по частям". Проверили,отдельно выходную часть.

А пол дня на незнакомую железку - это относительно быстро расковыряли.

 2bite:

почитайте http://arduino.ru/Reference/FunctionDeclaration

В вашем скетче из #24. Явно есть куски (25-27,31-33, 37-39). Которые ну просто просятся "выделить их в функцию".  Просто что-бы из лени не писать повторяющийся код который отличается "на комаринный чих"  (кстати это у вас и выдйте write595. выше уже дали пример, но вы и сами попробуйте)

 

И куча if-фов. Оно конечно "и так правильно", но прочитайте еще http://arduino.ru/Reference/SwitchCase он как раз для таких случаев придуман.

И покажите "что у вас вышло". Давайте "отполируем" этот ваш скетч.

 

 

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

maksim пишет:

то есть не важно сколько времени ее держать, 

Возможно вы правы. Я про задержку на http://www.arduino.cc/en/Tutorial/ShiftIn подглядел. Возможно это еще от самой микрухи зависит (там CD4021B используется). Но в любом случае "хуже от этого не будет". А потом, когда заработает, можно и убрать задержку. Посмотреть будет ли без нее работать.

P.S. Кстати в этом туториале можете подглядеть схему подключения.

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

    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 (""); 
   
    }

вот это клинопись вроде всё логично вроде должна работать но не хочет      
 
    


  

 

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

    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 (""); 
   
    }

     
 
А тут у меня совсем бардак    


  

 

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

Ну чего опять не то помогите, исправьте код пожалуйста

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

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

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
} 

 И вам дали правильное направление и если оно не работает, то не игнорируйте его, а разбиритесь в нем...

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

1. "Чего-то опять" - привыкните как можно более подробно описывать "что у вас не так". В данном случае, конечно, можно догадатся "че не так", но лучше привыкните. Раз есть ошибка - пишем ее, если идут какие-то неверные данные в Serial - их тоже показываем. Все время держите в уме что у никто за плечом у вас не стоит. Что вы видите - никто не знает (если вы не скажете об этом), что вы "пытались сделать" - тоже.
2. Не нужно пытатся сразу shiftIn, shiftOut работать. Не прыгайте через ступеньки. Чего вы схватились за read165 если с write595() не закончили? Причем, опять-таки не нужно пытатся "сразу вместе их завести". Вначале "из Serial читаем в write595 отправляем" (начали но не завершили), потом read165 - отпарвляем в Serial. И только потом "читаем read165 отправляем в write595".

Вообщем доведите свой скетч #74 "до ума". Как я говорите- выделите функцию write595(), сделайте switch... (потом покажу как еще можно "к реальности" приблизить) . Вот почитали-бы ссылку, сделали - уже такой глупой ошибки с read165 - небыло-бы (ниже скажу что за ошибка).

А по поводу функций. Во первых видно чото вы попытались объявить функцию, но не видно что-бы вы пытались ее использовать.
Во вторых. Функция не может объявлятся внутри функции (по крайней мере в ардуино-языке).

Вот такое:

loop(){
    ....
	void myFunc(){ // компилятор скажет много не хороших слов. тупо не поймет что мы тут хотим от него.
	....
	}
	....
}

Работать не будеть.

А вот так будет:

void myFunc(){ // обявляем функцию
	....
}

void loop(){
	...
	myFunc();// используем функцию
	...
}

И на закуску. Понимаю что "сразу много нового", запутатся не мудрено. Но "чуть внимательней" читайте тему. Например read165 вы взяли "не рабочую", с очепяткой. Хотя ниже уже была поправленная версия. Кстати это явно говорит что "что такое функции" - вы так и не поняли до конца, перечитайте еще раз ссылку из документации что я вам давал. можете какой-нибудь учебник по C заглянуть, в раздел функций, может там понятней будет написанно).

Итого: кушайте слона по кусочкам. Микрошагами. Замените в своем скетче #74 куски повторяющегося кода на вызов write595 (и покажите), потом поедем дальше.

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

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

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

maksim пишет:

Вот вам быть может даже рабочий вариант кода,

Ну вот. Лишили человека возможности самому "пройти путь". Сделали за него домашнее задание/лабораторную работу. То что вы можете написать - никто и не сомневался. А со следующей задачай что он будет делать? Опять ждать помощи добрых самаритян? Даже если он посмотрит на ваш код и "вроде понял" - все равно в своих силах уверенности не будет. Шаг вправо, шаг влево - и "а... помогите". Когда смотришь "как другой работу делает" - оно всегда просто. А как сам, так "ничего не выходит" :(

Вообщем IMHO - это "медвежья услуга". Тем более в ситуации когда человек явно пытается разобратся-научится. Пусть и не сразу получается, но ведь приближается к ответу. Пусть чуть позже на пару дней, но он бы 100% получил-бы рабочий код. Вот только написал-бы его САМ. И познал-бы радость "я его заставил" :) А так вы и это у него отобрали :(

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

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

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

maksim пишет:

Ну у него всегда есть выбор - разобраться и научиться или просто скопировать и вставить,

Ну вы совсем психологию не учитываете. Снесли под корень мотивацию, а потом "есть выбор". В том-то и дело, что для "сферического коня в вакууме" выбор может и есть, а вот для живого человека - выбора практически не осталось.

maksim пишет:

зачем человека мучить если он так старается... )

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

maksim пишет:

Если человеку это интересно, то готовое решение никогда не сделает хуже, рано или поздно он сам дойдет до этого.

Так ведь интерес-то вы и убиваете. "Создателя" превращаете в "потребителя". Это не "сделает хуже"?

maksim пишет:

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

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

А тех кто хотят "просто получить готовое" - тоже нечего баловать. Не хочется разбиратся - ищи исполнителя. Нефиг халяве потакать.

Хотя, конечно, давно известно что мы с вами имеем противоположную точку зрения на этот вопрос. И вряд-ли мы друг-друга переубедим. Так что... вообщем-то сильно мы убежали в оффтоп. Действительно дальше все зависит уже от bit.

Прошу прощения, если это прозвучало как "указываю что вам делать нужно".Просто досада взяла. Безусловно вы имеете право постить что хотите (и подоздеваю что многим новичкам ваш подход даже более приятен).

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

В этом коде как я понял мы просто данные принимаем считываем и отправляем но при работе кода когда нажимаешь на первую кнопку регистра сдвига загораются все светодиоды разом когда отпускаешь они гаснут на остальные кнопки реакции не какой
В 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
} 

 

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

А в этом коде я пытался при нажатии первой кнопки на регистре сдвига 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 (""); 
    }
}

 

    

 

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

Не понятно мы же сохраняем данные в val = digitalRead(dataPin);
И читаем в

if (val == '10000000')

 

Да видимо чего та я не догоняю
 

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

Ну вот с таким же кодам работает когда с компа подаёшь символ

if (val == '1') {                           //  если принят символ '10000000'
    shiftOut(DS,SHCP,LSBFIRST,B10000000);        //формируем биты для регистра сдвига
    digitalWrite(STCP,HIGH);
    digitalWrite(STCP,LOW);                   //регистр закрыть защёлку

 

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

 Когда с компа вы отсылаете символ '1' вы отсылаете именно СИМВОЛ, а не значение 1, на самом деле за этим символом прячится значение 48. '10000000' - это вообще бред получается, так как одинарными ковычками выделяется только один символ, а вы туда засунули 8 символов.
Зачем вы пользыетесь символами??? Если вы хотите сравнивать значения в бинарном виде, то это делается так:

if (val == В10000000)

НО вы все равно этим ничего не добьетесь, так как в вашем коде переменная val временно хранит только один бит прочитанной информации из регистра и поэтому переменная val никогда не станет B10000000  и ваше условие никогда не будет верным.

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

Вы можете работать и с символами, но тогда вам нужно собрать из символов строку val[9] = "10000000" хоть это и не совсем правильный подход, но работать будет. Для этого вам нужно объявить глобальную строку (массив):

char val[9] = "00000000";

затем в цикле, где вы читаете данные из регистра заполнить эту строку:

for(int i=0; i<8; i++){   // читаем 8 входов 165
  digitalWrite(clockPin, 0); // время лог 0
  val[i] = digitalRead(dataPin) + 48;   // читаем состояние 165
  digitalWrite(clockPin, 1);    // время лог 1
}
val[8] = 0;
Sevalrial.println (val);  

и только после этого можно сравнивать в таком виде:

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}
и т.д.

 

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

 2bit

Ну что же вы прыгаете-то с пятого на десятое? Ну почему вам нужно сразу добится "и читать и отправлять". Ну почему вначале не научится "четко отправлять", зажигать именно те диоды которые хотите? Вы же вынуждаете максима объяснять вам сразу 10-ть вещей, в своем скетче меняете тоже сразу 5-ть вещей. Переключатся, вслед за вами, с реализации одного подхода, на другой. Одно сделали правильно, другое поломали, потом наоборот. Потому что "сделали правильно" - случайно. Без понимания "почему именно так". Вы же сами себе устраиваете "информационную перегрузку".

 

У вас в "уравнение" которая нужно разгадать (найти неправильный элемент) образуется сразу 10-то неизвестных.
Почему не оттолкнутся от того что "работает и понятно" и добавлять по одной неизвестной за раз?

В который раз. Код из сообщение 74 работает у вас? Ну вот от него и нужно отталкиватся. Постепенно(!) приводить его желаемому поведению. Меняя за один раз только один элемент поведения.

Возьмите свой код из #74. И перепешите его на использования функции write595(). Добейтесь что-бы он "делал тоже самое", но через функцию. Без дублирования/размазывания по коду работы с 595-тым.

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

 

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

Да я и так разбираю всё по кусочкам тока не всё получается

 

bit
Offline
Зарегистрирован: 07.05.2012
                         // хранения принятого символа

    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

Что в этом коде реакция только на одну кнопку на первую я уже всё перепробовал не понимаю
 

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

А вот в этом коде на каждую кнопку отображается символ

 

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);




 

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

Что то где то у меня не так и не магу разобраться

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

Видимо чего та ещё не хватает

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

Извиняюсь мой косяк

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

 

bit пишет:

 

Чего та я совсем запутался почему та что в этих кодах которые вы мне рани давали

Простите, но я, видимо, не смогу вам помочь. Может быть другие.
 Вы тупо игнорируете то что вам пишут. Мне уж лень считать, сколько раз я сказал "забудте, пока, про ввод", "возмите СВОЙ скетч из #74", "доделайте вывод". Сделайте по нему самую простую модификацию которую вам советуют (выделите вывод в функцию, потом дальше пойдем). Не получается - показывайте что не получается, спрашивайте, а не начинайте "заниматся другим". Ведь в процессе этого и будет разбиратся "что там в этом байте должно быть", что-бы потом опираясь на эту базу, на это понимание, разбиратся с вводом.

Безусловно. Каждый разбирается-учится по своему. Кому-то одни методы подходят, кому-то другие. Видимо мой подход вас почему-то не устраивает. Ну ладно. Я и не претендую что "он самый лучший в мире".

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

 

 

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

уже исправил

digitalWrite(inloadPin, 0);
digitalWrite(inloadPin, 1);
 

забыл вставить

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

leshak пишет:

 

bit пишет:

 

Чего та я совсем запутался почему та что в этих кодах которые вы мне рани давали

Простите, но я, видимо, не смогу вам помочь. Может быть другие.
 Вы тупо игнорируете то что вам пишут. Мне уж лень считать, сколько раз я сказал "забудте, пока, про ввод", "возмите СВОЙ скетч из #74", "доделайте вывод". Сделайте по нему самую простую модификацию которую вам советуют (выделите вывод в функцию, потом дальше пойдем). Не получается - показывайте что не получается, спрашивайте, а не начинайте "заниматся другим". Ведь в процессе этого и будет разбиратся "что там в этом байте должно быть", что-бы потом опираясь на эту базу, на это понимание, разбиратся с вводом.

Безусловно. Каждый разбирается-учится по своему. Кому-то одни методы подходят, кому-то другие. Видимо мой подход вас почему-то не устраивает. Ну ладно. Я и не претендую что "он самый лучший в мире".

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

 

 

Да с чего вы взяли что я кого то игнорирую

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

Ну наконец-то всё за работало
Большое спасибо вам за помощь
И всем остальным кто участвовал
 

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

Будим дальше чудить !

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

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

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

А.В. Белов "Самоучитель разработчика устройств на микроконтроллерах AVR", Наука и техника, Санкт-Петербург 2008 ISBN 978-5-94387-363-8 

Вот этот курс рекомендую

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

Спасибо