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

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

Привет всем подскажите пожалуйста как мне написать алгоритм работы нажатых кнопак
В данный момент код работает так нажимаешь на первую кнопку скважность 200, нажимаешь на вторую кнопку не отпуская первую скважность прыгает 200 до 190, или с кажем нажимаешь 3 и 6 вместе скважность начинает прыгать с 180 до 150.
Подскажите как сделать чтобы скважность читалась только по верхней кнопке не зависимо в каком порядке они были нажаты
Пример нажимаю 1.2.5 вместе не зависимо в каком порядке кнопку скважность читается только по 5, нажимаешь 4.5.6 скважность читается только по 6. или 1.3 скважность только по 3.
 

 

   int ledPin = 9;   //  выход сигнала


    int dataPin = 11;             // Вывод  данных 165 
    int clockPin = 12;           // Вывод время 165
    int loadPin = 13;          // Вывод выбора 165
                
  boolean val[9] = {0,0,0,0,0,0,0,0};
    void setup()
    {
    pinMode(ledPin, OUTPUT);    пин 9 на выход
    
    
     
     pinMode(dataPin, INPUT);      //  Ввод 165. 
     pinMode(clockPin, OUTPUT);   // Ввод время 165. 
     pinMode(loadPin, OUTPUT);    //  Вывод load 165.
   

     }

    void loop()
    {
      digitalWrite(loadPin, 0); 
 digitalWrite(loadPin, 1); 

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

 if (val[1]== 1){
   int fadeValue = 200 ;                // скважность 200
    analogWrite(ledPin, fadeValue);        // выводим на выход                
         
 }
    
      if (val[2]== 1){  
int fadeValue = 190 ;                         // скважность 190
    analogWrite(ledPin, fadeValue);         // выводи на выход
       
    }

  if (val[3]== 1){  
int fadeValue = 180 ;
    analogWrite(ledPin, fadeValue);      
      
  }
    
      if (val[4]== 1){    
int fadeValue = 170 ;
    analogWrite(ledPin, fadeValue);        
     

      }
    }
    
     

 

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

не понимаю чего тут не хватает или ошибка в коде

Так не какой реакции

if (val[1,2,3]== 1){                       // Если нажимаем и держим три кнопки одновременно приходит 1,2,3 то выполняем команду в фигурных скобках //
   int fadeValue = 180 ;          
    analogWrite(ledPin, fadeValue);  

И так тоже

else if (val[1,2,3]== 1){                       // Если нажимаем и держим три кнопки одновременно  приходит 1,2,3 то выполняем команду в фигурных скобках//
   int fadeValue = 180 ;          
    analogWrite(ledPin, fadeValue);  

 

 

 

   int ledPin = 9;   


    int dataPin = 11;             // Вывод  данных 165 
    int clockPin = 12;           // Вывод время 165
    int loadPin = 13;          // Вывод выбора 165
                
  boolean val[9] = {0,0,0,0,0,0,0,0};
    void setup()
    {
    pinMode(ledPin, 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=1; i<9; i++){   // читаем 8 входов 165
  digitalWrite(clockPin, 0); // время лог 0
  val[i] = digitalRead(dataPin);   // читаем состояние 165
  digitalWrite(clockPin, 1);    // время лог 1
} 


 if (val[1]== 1){                       // если приходит 1 то выполняем команду в фигурных скобках//
   int fadeValue = 200 ;          
    analogWrite(ledPin, fadeValue);  
       
         
 }

if (val[1,2,3]== 1){                       // если приходит 1,2,3 то выполняем команду в фигурных скобках//
   int fadeValue = 180 ;          
    analogWrite(ledPin, fadeValue);  


    
      if (val[2]== 1){            // если приходит 2 то выполняем команду в фигурных скобках//

int fadeValue = 190 ;
    analogWrite(ledPin, fadeValue);        
       
    }

  if (val[3]== 1){  
int fadeValue = 180 ;
    analogWrite(ledPin, fadeValue);      
      
  }
    
      if (val[4]== 1){    
int fadeValue = 170 ;
    analogWrite(ledPin, fadeValue);        
     

      }
      

 

 

 

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

val[1,2,3] это что??? Массивы

if(val[1]== 1 || val[2]== 1 || val[3]== 1) или if(val[1]== 1 && val[2]== 1 && val[3]== 1)

Вынесите строчку analogWrite(ledPin, fadeValue); из условий после всех условий, что бы не плодить эту строку в каждом условии.

 

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

 И нажмите Ctrl+T в Ардуино.

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

Спасибо

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

Выношу ниже всех условий код не проходит ругается analogWrite(ledPin, fadeValue);

 

int ledPin = 9;   


int dataPin = 11;             // Вывод  данных 165 
int clockPin = 12;           // Вывод время 165
int loadPin = 13;          // Вывод выбора 165

boolean val[9] = {
  0,0,0,0,0,0,0,0};
void setup()
{
  pinMode(ledPin, 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=1; i<9; i++){   // читаем 8 входов 165
    digitalWrite(clockPin, 0); // время лог 0
    val[i] = digitalRead(dataPin);   // читаем состояние 165
    digitalWrite(clockPin, 1);    // время лог 1
  } 


  if (val[1]== 1){              // если условия 1 то выполняем команду в фигурных скопках//
    int fadeValue = 200 ;
    
  }



  if (val[2]== 1){  
    int fadeValue = 190 ;
          

  }
   analogWrite(ledPin, fadeValue); 
}

 

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

Вот так совершенно не реагирует на заданные кнопки  if(val[1]== 1 || val[2]== 1 || val[3]== 1)

А вот так скважность меняется но всё равно не стабильно  if(val[1]== 1 && val[2]== 1 && val[3]== 1)

int ledPin = 9;   


int dataPin = 11;             // Вывод  данных 165 
int clockPin = 12;           // Вывод время 165
int loadPin = 13;          // Вывод выбора 165

boolean val[9] = {
  0,0,0,0,0,0,0,0};
void setup()
{
  pinMode(ledPin, 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=1; i<9; i++){   // читаем 8 входов 165
    digitalWrite(clockPin, 0); // время лог 0
    val[i] = digitalRead(dataPin);   // читаем состояние 165
    digitalWrite(clockPin, 1);    // время лог 1
  } 


  if (val[1]== 1){              // если условия 1 то выполняем команду в фигурных скопках//
    int fadeValue = 200 ;
    analogWrite(ledPin, fadeValue);  


  }



  if (val[2]== 1){  
    int fadeValue = 190 ;
    analogWrite(ledPin, fadeValue);        

  }

  if (val[3]== 1){  
    int fadeValue = 180 ;
    analogWrite(ledPin, fadeValue);      

  }

  if (val[4]== 1){    
    int fadeValue = 170 ;
    analogWrite(ledPin, fadeValue);        


  }
  if (val[2]== 1 && val[3] == 1){    
    int fadeValue = 50 ;
    analogWrite(ledPin, fadeValue);

}

}

 

прыгает скважность когда нажимаешь две кнопки одновременно

 

 

 

 

 

А когда одну то всё нормально, и как добиться такой стабильности при нажатие двух кнопка

 

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

Может это как то так сделать. Я образно магу мысль обрисовать и то не всегда.

Кнопка нажимаем по отдельность

1 - A - if (val[A]== 1 int fadeValue = 200 ;

2 - B - if (val[A]== 1 int fadeValue = 190 ;

3 - C - if (val[A]== 1 int fadeValue = 180 ;

4 - D - if (val[A]== 1 int fadeValue = 170 ;

Жмём две кнопки в месте 1-2 получаем В и от B идёт команда

1 |
   | } B - if (val[A]== 1 int fadeValue = 190 ;
2 |

3 - C - if (val[A]== 1 int fadeValue = 180 ;

4 - D - if (val[A]== 1 int fadeValue = 170 ;

Или жмём три кнопки одновременно 1-2-3 получаем C и от C идёт команда

1 |
   |
2 | } С - if (val[A]== 1 int fadeValue = 180 ;
   |
3 |

4 - D - if (val[A]== 1 int fadeValue = 170 ;

Это наверно глупо выглядит?
 

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

Или как то так что ли привязать цифры

 

{1,0,0,0,0,0,0,0} - 1

{0,1,0,0,0,0,0,0} - 2

{0,0,1,0,0,0,0,0} - 3

{0,0,0,1,0,0,0,0} - 4

 

{1,1,0,0,0,0,0,0} – 15

{1,1,0,1,0,0,0,0} - 17

 

if (val[1]== 1){    
    int fadeValue = 200 ;
    analogWrite(ledPin, fadeValue);

if (val[2]== 1){    
    int fadeValue = 190 ;
    analogWrite(ledPin, fadeValue);

if (val[3]== 1){    
    int fadeValue = 180 ;
    analogWrite(ledPin, fadeValue);

if (val[4]== 1){    
    int fadeValue = 170 ;
    analogWrite(ledPin, fadeValue);

if (val[15]== 1){    
    int fadeValue = 190 ;
    analogWrite(ledPin, fadeValue);

if (val[17]== 1){    
    int fadeValue = 180 ;
    analogWrite(ledPin, fadeValue

 

 

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

или так

if (val[1,0,0,0,0,0,0,0]== 1){    
    int fadeValue = 200 ;
    analogWrite(ledPin, fadeValue);

if (val[0,1,0,0,0,0,0,0]== 1){    
    int fadeValue = 190 ;
    analogWrite(ledPin, fadeValue);

if (val[1,1,0,0,0,0,0,0]== 1){    
    int fadeValue = 190 ;
    analogWrite(ledPin, fadeValue);

 

Что бы восемь бит привязывать к команде

 

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

bit пишет:

Выношу ниже всех условий код не проходит ругается analogWrite(ledPin, fadeValue);

Объявите int fadeValue = 0; глобально, а не в каждом условии.

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

maksim пишет:

bit пишет:

Выношу ниже всех условий код не проходит ругается analogWrite(ledPin, fadeValue);

Объявите int fadeValue = 0; глобально, а не в каждом условии.

Так я уже делал , не на одну кнопку не реагирует

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

Я еже совсем запутался

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

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

 

 

if (val[1,0,0,0,0,0,0,0]== 1){    
    int fadeValue = 200 ;
    analogWrite(ledPin, fadeValue);

if (val[0,1,0,0,0,0,0,0]== 1){    
    int fadeValue = 190 ;
    analogWrite(ledPin, fadeValue);

if (val[1,1,0,0,0,0,0,0]== 1){    
    int fadeValue = 190 ;
    analogWrite(ledPin, fadeValue);

 

или так нельзя сделать

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

bit пишет:

maksim пишет:

bit пишет:

Выношу ниже всех условий код не проходит ругается analogWrite(ledPin, fadeValue);

Объявите int fadeValue = 0; глобально, а не в каждом условии.

Так я уже делал , не на одну кнопку не реагирует

Не правильно делали.

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

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

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

bit пишет:

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

 

или так нельзя сделать

У Вас 8-ми мерный массив?

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

Поясню для тех, у кого англиский - это китайский :)

// val - переменная, в которой мы проверяем биты
if (bitRead(val, 7) == 1) //Проверяем седьмой бит
{
  // делаем то, для чего 7-й бит предназначен
}

 

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

Извини я про сто не силён в этих делах.

мы спомащью

boolean val[9] = {0,0,0,0,0,0,0,0};

 берем сохранённые данныё с дата ( с регистра сдвига)
и делим на 8 частей и присваиваем каждой цифру по возрастанию
 

 

Нажимаем первую кнопку

 

 

if (val[2]== 1){    // если есть  принятый символ 2 //
int fadeValue = 190 ;  // то выполняем действие //

analogWrite(ledPin, fadeValue);  // отправляем на пин 9//

Нажимаем две кнопки одновременно 1 и 2
 

 

if (val[1]== 1 && val[2]==1){    // если есть  принятый символ 1-2 //
int fadeValue = 190 ;  // то выполняем действие //

но когда нажимаешь две кнопки одновременно скважность прыгает от 200 до 190

 

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

 как их все проверять в одном

if (val[1,0,0,0,0,0,0,0]== 1){   

 // принятые биты с регистра сдвига ( 1,0,0,0,0,0,0,0,0) нажата первая кнопка//

    int fadeValue = 200 ;  // скважность 200 //

    analogWrite(ledPin, fadeValue);  // отправляем на пин 9//


if (val[0,1,0,0,0,0,0,0]== 1){    

// принятые биты с регистра сдвига ( 0,1,0,0,0,0,0,0,0) нажата вторая кнопка//

    int fadeValue = 190 ;  // скважность  190  //

    analogWrite(ledPin, fadeValue);  // отправляем на пи 9//



if (val[1,1,0,0,0,0,0,0]== 1){ 
  
// принятые  биты с регистра сдвига ( 1,1,0,0,0,0,0,0,0) // нажаты первая и вторая кнопка вместе //

    int fadeValue = 190 ;  // скважность 190 //

    analogWrite(ledPin, fadeValue); //отправляем на пин 9//

 

Нажимаем втору кнопку

 

 

 

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

 

int ledPin = 9;   

int dataPin = 11;             // Вывод  данных 165 
int clockPin = 12;           // Вывод время 165
int loadPin = 13;          // Вывод выбора 165

byte val = 0;
int fadeValue = 0;
void setup()
{
  pinMode(ledPin, OUTPUT);

  pinMode(dataPin, INPUT);      //  Ввод 165. 
  pinMode(clockPin, OUTPUT);   // Ввод время 165. 
  pinMode(loadPin, OUTPUT);    //  Вывод load 165.
}

void loop()
{
  digitalWrite(loadPin, 0); 
  digitalWrite(loadPin, 1); 
  val = shiftIn(dataPin, clockPin, LSBFIRST); // читаем 8 входов 165
// если условия 1 то выполняем команду в фигурных скопках//
  if (val == B10000000) fadeValue = 200 ; //нажата 1 кнопка
  if (val == B01000000) fadeValue = 190 ; //нажата 2 кнопка     
  if (val == B00100000) fadeValue = 180 ; //нажата 3 кнопка
  if (val == B00010000) fadeValue = 170 ; //нажата 4 кнопка
  if (val == B01100000) fadeValue = 50 ; //нажата 2 и 3 кнопки

  analogWrite(ledPin, fadeValue);  
}

 если последовательность будет обратной то LSBFIRST нужно поменять на MSBFIRST

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

да для меня он точно китайский

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

спасибо большое за помощь я бы целую вечность разбирался бы

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

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

 

void loop()
{
  digitalWrite(loadPin, 0); 
  digitalWrite(loadPin, 1); 
  
  val = shiftIn(dataPin, clockPin, MSBFIRST); 
  
  if (val == B10000000) fadeValue = 50 ;     
    // читаем 8 бит и если на 1 бите высокий уровень  то отправляем скважность 50 на  пин 9


  if (val == B01000000) fadeValue = 190 ; 
  if (val == B00100000) fadeValue = 180 ; 
  if (val == B00010000) fadeValue = 170 ; 
  if (val == B00001000) fadeValue = 160 ; 
  if (val == B00001100) fadeValue = 150 ; 
      // читаем 8 бит и если на  5 и 6 бите высокий уровень  то отправляем скважность 150 на  пин 9

  if (val == B00000010) fadeValue = 140 ; 
  if (val == B00000001) fadeValue = 10 ; 
  
 analogWrite(ledPin, fadeValue);  
}

 

Всё работает практически идеально НО первый бит теряется точнее не первый а 8 ну в зависимости от LSBFIRST или MSBFIRST , первая кнопка или восьмая не какой реакции как будто биты сдвинуты

 

Цепляем последовательно два регистра сдвига

 

if (val == B00000000 || val == B10000000) fadeValue = 190 ;
и потерянный 8 бит у нас появляется в втором 

|| val == B10000000

на остальные кнопки после 8 бита не какой реакции Подскажи пожалуйста как сделать чтобы два регистра работали в месте в чём причина что не хватает

 

Так и так уже пробовал и кучу других способ

 

if (val == B00000000 && val == B10000000)  //ошибка
if (val == B00000000 .B10000000) // ошибка
if val { B00000000 , B10000000) // ошибка
if (val[0,0,0,0,0,0,0,0] || val[0,0,0,1,0,0,0,0 ) //ошибка

 

В схеме всё нормально 100% проверил через

Serial.println все 16 бит реагируют на 16 кнопок
 

 

 

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

Вот вам тестилка для одного регистра:

int dataPin = 11;             // Вывод  данных 165 
int clockPin = 12;           // Вывод время 165
int loadPin = 13;          // Вывод выбора 165

byte val = 0, prev_val = 0;

void setup(){
  Serial.begin(9600);
  pinMode(dataPin, INPUT);      //  Ввод 165. 
  pinMode(clockPin, OUTPUT);   // Ввод время 165. 
  pinMode(loadPin, OUTPUT);    //  Вывод load 165.
}

void loop(){
  digitalWrite(loadPin, 0); 
  digitalWrite(loadPin, 1); 
  val = shiftIn(dataPin, clockPin, LSBFIRST); // читаем 8 входов 165
  if(val != prev_val){
    Serial.println(val, BIN);
    prev_val = val;
    delay(200);
  }
}

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

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

Ну что же Вы? ShiftIn - восьмибитная штука, а у Вас 16 кнопок! Вам нужно что-то в стиле:

  digitalWrite(loadPin, 0); 
  digitalWrite(loadPin, 1); 
  
  val = shiftIn(dataPin, clockPin, MSBFIRST); 
  val=(val<<8)+ shiftIn(dataPin, clockPin, MSBFIRST); //сдвигаем на 8 бит влево, в младшие биты вписываем второй байт с регистров 

  if (val == B1000000000000000) fadeValue = 50 ;     
    // читаем 16 бит и если на 1 бите высокий уровень  то отправляем скважность 50 на  пин 9


Тип переменной val должен быть WORD или unsigned int или uint16_t соответственно 

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

maksim пишет:

Вот вам тестилка для одного регистра:

int dataPin = 11;             // Вывод  данных 165 
int clockPin = 12;           // Вывод время 165
int loadPin = 13;          // Вывод выбора 165

byte val = 0, prev_val = 0;

void setup(){
  Serial.begin(9600);
  pinMode(dataPin, INPUT);      //  Ввод 165. 
  pinMode(clockPin, OUTPUT);   // Ввод время 165. 
  pinMode(loadPin, OUTPUT);    //  Вывод load 165.
}

void loop(){
  digitalWrite(loadPin, 0); 
  digitalWrite(loadPin, 1); 
  val = shiftIn(dataPin, clockPin, LSBFIRST); // читаем 8 входов 165
  if(val != prev_val){
    Serial.println(val, BIN);
    prev_val = val;
    delay(200);
  }
}

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

я такую же написал только немножко по другому

 

 
 void loop(){ 
 digitalWrite(inloadPin, 0); 
 digitalWrite(inloadPin, 1); 
 for(int i=0; i<=7; i++){          // читаем биты с 0 по 7       соответственно если пишем с 0 по 15  это 2 регистра параллельно
 digitalWrite(inclockPin, 0); 
 temp = digitalRead(indataPin); 
 digitalWrite(inclockPin, 1); 
 Serial.print (temp); 
 } 
 Serial.println (""); 

 

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

 Так то оно так, но к сожалению нельзя писать B1000000000000000 компилятор ругается, можно просто в десятичном виде записывать, но тогда теряется наглядность где какой бит находится, поэтому проще не в одну переменную размером в 2 байта засовывать 16 бит,  а в 2 переменные размером в 1 байт по 8 бит.

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

В тесте нужно пользоваться той же функцией, что и в программе! Поэтому важно использовать именно shiftIn()! 

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

bit пишет:

maksim пишет:

Вот вам тестилка для одного регистра:

int dataPin = 11;             // Вывод  данных 165 
int clockPin = 12;           // Вывод время 165
int loadPin = 13;          // Вывод выбора 165

byte val = 0, prev_val = 0;

void setup(){
  Serial.begin(9600);
  pinMode(dataPin, INPUT);      //  Ввод 165. 
  pinMode(clockPin, OUTPUT);   // Ввод время 165. 
  pinMode(loadPin, OUTPUT);    //  Вывод load 165.
}

void loop(){
  digitalWrite(loadPin, 0); 
  digitalWrite(loadPin, 1); 
  val = shiftIn(dataPin, clockPin, LSBFIRST); // читаем 8 входов 165
  if(val != prev_val){
    Serial.println(val, BIN);
    prev_val = val;
    delay(200);
  }
}

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

я такую же написал только немножко по другому

 

 
 void loop(){ 
 digitalWrite(inloadPin, 0); 
 digitalWrite(inloadPin, 1); 
 for(int i=0; i<=7; i++){          // читаем биты с 0 по 7       соответственно если пишем с 0 по 15  это 2 регистра параллельно
 digitalWrite(inclockPin, 0); 
 temp = digitalRead(indataPin); 
 digitalWrite(inclockPin, 1); 
 Serial.print (temp); 
 } 
 Serial.println (""); 

 

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

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

maksim пишет:

 Так то оно так, но к сожалению нельзя писать B1000000000000000 компилятор ругается, можно просто в десятичном виде записывать, но тогда теряется наглядность где какой бит находится, поэтому проще не в одну переменную размером в 2 байта засовывать 16 бит,  а в 2 переменные размером в 1 байт по 8 бит.

Тогда поопределять константы:

#define MB1000000000000000 (1<<15)

 

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

Извиняюсь , запустил код н ереагирует на первую кнопку а на остальные пиши 1-10-100-100 и так далии

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

 И еще раз! покажите что у вас в мониторе, скопируйте и вставьте сюда, неужели это так сложно...

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

Я просто подумал что эти две программ одинаковы по смыслу

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

 

сикнал             кнопка

нет ответа           1

1                           2               
0
10                         3
0
100                         4
0
1000                      5
0
10000                     6
0
100000                  7
0
1000000                8
0

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

 Ясно, а если так:

int dataPin = 11;             // Вывод  данных 165 
int clockPin = 12;           // Вывод время 165
int loadPin = 13;          // Вывод выбора 165

byte val = 0, prev_val = 0;

void setup(){
  Serial.begin(9600);
  pinMode(dataPin, INPUT);      //  Ввод 165. 
  pinMode(clockPin, OUTPUT);   // Ввод время 165. 
  pinMode(loadPin, OUTPUT);    //  Вывод load 165.
}

void loop(){
  digitalWrite(loadPin, 0); 
  digitalWrite(loadPin, 1); 
  delay(10);
  val = shiftIn(dataPin, clockPin, LSBFIRST); // читаем 8 входов 165
  if(val != prev_val){
    Serial.println(val, BIN);
    prev_val = val;
    delay(200);
  }
}

 

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

так же

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

AlexFisher пишет:

В тесте нужно пользоваться той же функцией, что и в программе! Поэтому важно использовать именно shiftIn()! 

 

ну дак я же не знал этого

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

Могу предположить, что 74yc165 отдает бит по заднему фронту импульсов линии тактирования, а функция shiftIn читает по переднему фронту и первый бит теряется, но могу и ошибаться. Самое протое решение это отказаться от shiftIn и воспользоваться тем, что работает.

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

AlexFisher пишет:

maksim пишет:

 Так то оно так, но к сожалению нельзя писать B1000000000000000 компилятор ругается, можно просто в десятичном виде записывать, но тогда теряется наглядность где какой бит находится, поэтому проще не в одну переменную размером в 2 байта засовывать 16 бит,  а в 2 переменные размером в 1 байт по 8 бит.

Тогда поопределять константы:

#define MB1000000000000000 (1<<15)

 

Можно тогда даже не константы объвлять, а прям в условиях двигать биты

if(val == 1<<15) val = 50;

 

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

Будим пробовать :-)

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

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

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

 попробуйте так:

int dataPin = 11;             // Вывод  данных 165 
int clockPin = 12;           // Вывод время 165
int loadPin = 13;          // Вывод выбора 165

byte val = 0, prev_val = 0;

void setup(){
  Serial.begin(9600);
  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++){          // читаем биты с 0 по 7   
    digitalWrite(clockPin, 0); 
    if(digitalRead(dataPin)) val |= 1<<i;
    else val &= ~(1<<i);
    digitalWrite(clockPin, 1); 
  } 
  if(val != prev_val){
    Serial.println(val, BIN);
    prev_val = val;
    delay(200);
  }

}

 

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

maksim пишет:

 попробуйте так:

int dataPin = 11;             // Вывод  данных 165 
int clockPin = 12;           // Вывод время 165
int loadPin = 13;          // Вывод выбора 165

byte val = 0, prev_val = 0;

void setup(){
  Serial.begin(9600);
  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++){          // читаем биты с 0 по 7   
    digitalWrite(clockPin, 0); 
    if(digitalRead(dataPin)) val |= 1<<i;
    else val &= ~(1<<i);
    digitalWrite(clockPin, 1); 
  } 
  if(val != prev_val){
    Serial.println(val, BIN);
    prev_val = val;
    delay(200);
  }

}

 

А так всё читает с 1 по 8

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

 Тогда выносим рабочий код в отдельную функцию SiftIn8bit

int ledPin = 9;   
int dataPin = 11;             // Вывод  данных 165
int clockPin = 12;           // Вывод время 165
int loadPin = 13;          // Вывод выбора 165

byte val = 0, prev_val = 0;
int fadeValue = 0;

void setup(){
  pinMode(ledPin, OUTPUT);
  pinMode(dataPin, INPUT);      //  Ввод 165. 
  pinMode(clockPin, OUTPUT);   // Ввод время 165. 
  pinMode(loadPin, OUTPUT);    //  Вывод load 165.
}

void loop(){
  digitalWrite(loadPin, 0); 
  digitalWrite(loadPin, 1); 
  val = SiftIn8bit(dataPin, clockPin); // читаем 8 входов 165
// если условия 1 то выполняем команду в фигурных скопках//
  if (val == B10000000) fadeValue = 200 ; //нажата 1 кнопка
  if (val == B01000000) fadeValue = 190 ; //нажата 2 кнопка     
  if (val == B00100000) fadeValue = 180 ; //нажата 3 кнопка
  if (val == B00010000) fadeValue = 170 ; //нажата 4 кнопка
  if (val == B01100000) fadeValue = 50 ; //нажата 2 и 3 кнопки

  analogWrite(ledPin, fadeValue);  
}

byte SiftIn8bit(byte dataPin, byte clockPin){
  byte in8bit = 0;
  for(int i = 0; i < 8; i++){          // читаем биты с 0 по 7   
    digitalWrite(clockPin, 0); 
    if(digitalRead(dataPin)) in8bit |= 1<<i;
    else in8bit &= ~(1<<i);
    digitalWrite(clockPin, 1); 
  }
  return in8bit;
}

 

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

 Для двух регистров есть два пути описаных выше.

1 вариант воспользоваться двумя переменными типа byte:

int ledPin = 9;   
int dataPin = 11;             // Вывод  данных 165
int clockPin = 12;           // Вывод время 165
int loadPin = 13;          // Вывод выбора 165

byte val = 0, val2 = 0, prev_val = 0;
int fadeValue = 0;

void setup(){
  pinMode(ledPin, OUTPUT);
  pinMode(dataPin, INPUT);      //  Ввод 165. 
  pinMode(clockPin, OUTPUT);   // Ввод время 165. 
  pinMode(loadPin, OUTPUT);    //  Вывод load 165.
}

void loop(){
  digitalWrite(loadPin, 0); 
  digitalWrite(loadPin, 1); 
  val = SiftIn8bit(dataPin, clockPin); // читаем 8 входов 165
  val2 = SiftIn8bit(dataPin, clockPin); // читаем 8 входов 165
// если условия 1 то выполняем команду в фигурных скопках//
  if (val == B00000000 && val2 == B01000000) fadeValue = 170 ; //нажата 10 кнопка
  if (val == B10000000 && val2 == B00000000) fadeValue = 200 ; //нажата 1 кнопка
  if (val == B01000000 && val2 == B00000000) fadeValue = 190 ; //нажата 2 кнопка     
  if (val == B00100000 && val2 == B00000000) fadeValue = 180 ; //нажата 3 кнопка 
  if (val == B01100000 && val2 == B00000000) fadeValue = 50 ; //нажата 2 и 3 кнопки

  analogWrite(ledPin, fadeValue);  
}

byte SiftIn8bit(byte dataPin, byte clockPin){
  byte in8bit = 0;
  for(int i = 0; i < 8; i++){          // читаем биты с 0 по 7   
    digitalWrite(clockPin, 0); 
    if(digitalRead(dataPin)) in8bit |= 1<<i;
    else in8bit &= ~(1<<i);
    digitalWrite(clockPin, 1); 
  }
  return in8bit;
}

2 вариант воспользоваться одной переменной типа unsigned int:

int ledPin = 9;   
int dataPin = 11;             // Вывод  данных 165
int clockPin = 12;           // Вывод время 165
int loadPin = 13;          // Вывод выбора 165

unsigned int val = 0;
int fadeValue = 0;

void setup(){
  pinMode(ledPin, OUTPUT);
  pinMode(dataPin, INPUT);      //  Ввод 165. 
  pinMode(clockPin, OUTPUT);   // Ввод время 165. 
  pinMode(loadPin, OUTPUT);    //  Вывод load 165.
}

void loop(){
  digitalWrite(loadPin, 0); 
  digitalWrite(loadPin, 1); 
  val = SiftIn16bit(dataPin, clockPin); // читаем 16 входов 165
// если условия 1 то выполняем команду в фигурных скопках//
  if (val == 1<<6) fadeValue = 170 ; //нажата 10 кнопка
  if (val == 1<<15) fadeValue = 200 ; //нажата 1 кнопка
  if (val == 1<<14) fadeValue = 190 ; //нажата 2 кнопка     
  if (val == 1<<13) fadeValue = 180 ; //нажата 3 кнопка 
  if (val == B00000011<<14) fadeValue = 50 ; //нажата 2 и 3 кнопки
  
  analogWrite(ledPin, fadeValue);  
}

unsigned int SiftIn16bit(byte dataPin, byte clockPin){
  unsigned int in16bit = 0;
  for(int i = 0; i < 16; i++){          // читаем биты с 0 по 7   
    digitalWrite(clockPin, 0); 
    if(digitalRead(dataPin)) in16bit |= 1<<i;
    else in16bit &= ~(1<<i);
    digitalWrite(clockPin, 1); 
  }
  return in16bit;
}

 

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

Ну ты Макс профи, всё чудесно работает спасибо что помог и за то что пинка не дал)))

4ERTIK
Offline
Зарегистрирован: 24.03.2013

Вот состряпал код


int ledaPin = 3;
int ledbPin = 4;
int ledcPin = 5;
int leddPin = 6;
int ledePin = 7;
int ledfPin = 8;
int ledgPin = 9;
int ledjPin = 10;
int dataPin = 11;             // Вывод  данных 165-7нога
int clockPin = 12;           // Вывод время 165-2 нога
int loadPin = 13;          // Вывод выбора 165-1 нога
boolean val[8] = {
  0,0,0,0,0,0,0,0};

int fadeValue = 0;

void setup(){
  pinMode(ledaPin, OUTPUT);
  pinMode(ledbPin, OUTPUT);
  pinMode(ledcPin, OUTPUT);
  pinMode(leddPin, OUTPUT);
  pinMode(ledePin, OUTPUT);
  pinMode(ledfPin, OUTPUT);
  pinMode(ledgPin, OUTPUT);
  pinMode(ledjPin, 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)
  {
    digitalWrite(ledaPin, HIGH);
  }
  else
  {
    digitalWrite(ledaPin, LOW);
  }

  if (val[1]== 1)
  {
    digitalWrite(ledbPin, HIGH);
  }
  else
  {
    digitalWrite(ledbPin, LOW);
  }
  if (val[2]== 1)
  {
    digitalWrite(ledcPin, HIGH);
  }
  else
  {
    digitalWrite(ledcPin, LOW);
  }
  if (val[3]== 1)
  {
    digitalWrite(leddPin, HIGH);
  }
  else
  {
    digitalWrite(leddPin, LOW);
  }
  if (val[4]== 1)
  {
    digitalWrite(ledePin, HIGH);
  }
  else
  {
    digitalWrite(ledePin, LOW);
  }
  if (val[5]== 1)
  {
    digitalWrite(ledfPin, HIGH);
  }
  else
  {
    digitalWrite(ledfPin, LOW);
  }
  if (val[6]== 1)
  {
    digitalWrite(ledgPin, HIGH);
  }
  else
  {
    digitalWrite(ledgPin, LOW);
  }
  if (val[7]== 1)
  {
    digitalWrite(ledjPin, HIGH);
  }
  else
  {
    digitalWrite(ledjPin, LOW);
  }
}
4ERTIK
Offline
Зарегистрирован: 24.03.2013

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

Почему?

Puhlyaviy
Puhlyaviy аватар
Offline
Зарегистрирован: 22.05.2013

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

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

Причем тут вообще ардуино, схемы, программы и прочий бред на 4 страницы? Такими темпами, скоро начнете на держатель туалетной бамаги сервомотор прикручивать.. Но там хоть будет смысл какой то, типа по команде голосовой бамажка отматывалась что бы..

гы гы

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

 

Сейчас расскажу))