Некорректная работа условий ...

Pupok
Offline
Зарегистрирован: 03.06.2015

 Необходимо обрабатывать условие при z и a равными 0,то есть просто по И, а обрабатывается по ИЛИ!!!!

В выводе отсутствуют целые десятки(!!!), то есть с одним  0. Пробовал и в скобки условия, и !=0 результат один ...

  if ( z >= 1 && a >= 1){
  Serial.println(q);
  Serial.print(a);
  Serial.println(z);
  }

 

Впечатление, что компилер переколбашивает в с двумя вложенными условиями ...

 

SU-27-16
SU-27-16 аватар
Offline
Зарегистрирован: 13.08.2012

if ( 0==z && 0==a) или if ( !z && !a)

Looka
Offline
Зарегистрирован: 24.04.2012

Покажите весь скетч.   И результат его работы

dimax
dimax аватар
Offline
Зарегистрирован: 25.12.2013

А можно и нетрадиционно подойти к задаче , долой штампы! :)

  if (!(a|z)) {.....} // сработает если и a и z равны нулю

SU-27-16
SU-27-16 аватар
Offline
Зарегистрирован: 13.08.2012

dimax пишет:

А можно и нетрадиционно подойти к задаче , долой штампы! :)

  if (!(a|z)) {.....} // сработает если и a и z равны нулю

в #1 убрал текст "по ИЛИ обрабытываюся нолики , а по И - единички"
аха , if (!(a|z)) - короче :)

Pupok
Offline
Зарегистрирован: 03.06.2015

Все приведенный условия работают!!!

Всем большое спасибо!!!!

Последний вариант вообще убил!

ЗЫ только почему ТАК, как-то подвыподвертом??? Особенности "перевода" ардуинки???

Pupok
Offline
Зарегистрирован: 03.06.2015

Looka пишет:

Покажите весь скетч.   И результат его работы

Пожалуйста ... Имею некий девайс, без документов. Девайс имеет 8 восьмисегментных индикатора, 4 кнопки и 5 индикаторров-диодов. Все это хозяйство управляется 4-мя проводами, не считая питания. Захотел "прикрутить" к паяльной станции. Не хочу выводить НОЛИКИ в старших сегментах. Вот теперь тренеруюсь!!! Код отладочный, так как весь функционал получаю экпериментально.

Да, девайс реализован на двух регистрах сдвига НС4094.

//Пин SH_CP
int SH_CP = 12;//строб
//Пин ST_CP
int ST_CP = 11;//защелка
//Пин DS
int DS = 13;//данные
//порт кнопок
const int BtnPin =10;
//
int BtnStat = 0;
long ButtMillis = 0;
int value = 0;
void MyShiftReg(int, int, int, int, int);
//void ShiftReg(int, int);
const int s[10] = { 3, 159, 37, 13, 153, 73, 65, 31, 1, 9};//символы без точки, с точкой

const int r[8] = { 127, 191, 223, 239, 247, 251, 253, 255};//регистры

const int b[4] = {239, 223, 191, 127};//кнопки

const int l[5] ={127, 191, 223, 239, 247};//индикаторы режимов




void setup() {
  Serial.begin(9600);
   // Настраиваем выходы SH_CP, ST_CP, DS
   pinMode(SH_CP, OUTPUT);
   pinMode(ST_CP, OUTPUT);
   pinMode(DS, OUTPUT);
   pinMode(BtnPin, INPUT);
}
 
void loop() {
     
  // Цикл обхода 16 светодиодов
 
  for (int d = 12; d < 16; d++) {
    for(int z = 0; z < 10; z++ ) {
      for(int y = 0; y < 10; y++ ) {
        for(int w = 0; w < 10; w++ ) {
          for(int x = 0; x < 10; x++ ) {
            
            MyShiftReg(z,y,w,x,d);
            MyShiftReg(z,y,w,x,d);
            MyShiftReg(z,y,w,x,d);
          }
        }
      }
    }
    // Запись в регистр
   // registerWrite(d, HIGH);
    // Задержка 0.5 с.
    delay(5);
   //обработка нажатия кнопок
    BtnStat = digitalRead (BtnPin);
    
    if(BtnStat == HIGH)
    {
     Serial.print("BtnStat");
    Serial.println(BtnStat);// if (millis() - ButtMillis > 300)
      //{
       // ButtMillis = millis();
       value ++;
      //}
    }
    else
    {
     value = 0;
    }
    switch(value){
      case 4:
      Serial.println("4");break;
      case 5:
      Serial.println("5");break;
      case 6:
      Serial.println("6");break;
      case 7:
      Serial.println("7");break;
      case 8:
      Serial.println("8");break;
      case 9:
      Serial.println("9");break;
          
    }
     //if(value >=5)
    //{
     // Serial.print(value);
      //Serial.println ("Yes");//Button = !Button;
     // value = 0;
   // }
  }
}

// Метод для отсылки данных в регистры
void registerWrite(int num, int state) {
 // Для хранения 16 битов используется unsigned int
 unsigned int bitsToSend = 0;
 // 0b000000000000000
 // Инициализируем начало приема данных
 digitalWrite(ST_CP, LOW);
 
 // Устанавливаем 1 в соответствующий бит
 bitWrite(bitsToSend, num, state);
 
 // 16 бит необходимо разделить на два байта:
 // И записать каждый байт в соответствующий регистр
 byte register1 = r[num-12];//highByte(bitsToSend);номер сегмента
 byte register2 = s[num-7];//lowByte(bitsToSend); инфа сегмента
 
 // Последовательная передача данных на пин DS
 shiftOut(DS, SH_CP, MSBFIRST, register2);
 shiftOut(DS, SH_CP, MSBFIRST, register1);
  //Serial.println(register1);
   //Serial.println(register2);
 // Инициализируем окончание передачи данных.
 // Регистры подадут напряжение на указанные выходы
 digitalWrite(ST_CP, HIGH);
}

 void MyShiftReg(int q, int a, int z, int e, int g) {
  int num = 0;
  if (q > 0 ) {
    ShiftReg(q,num);}
      num++;
      delay(8);
   if (!(q|a)){}else{  
  ShiftReg(a,num);}
   num++;
   delay(8);
   
   if (!(a|z|q)){
  Serial.println(q);
  Serial.print(a);
  Serial.println(z);
  } else{ ShiftReg(z,num);
  }
  
   
  num++;
  delay(8);
  ShiftReg(e,num);
  delay(8);


}

void ShiftReg (int f, int t){
  byte register11,register21;
  // Инициализируем начало приема данных
 digitalWrite(ST_CP, LOW);
   register11 = r[t];//highByte(bitsToSend);номер сегмента
  register21 = s[f];//lowByte(bitsToSend); инфа сегмента
 // Последовательная передача данных на пин DS
 shiftOut(DS, SH_CP, MSBFIRST, register21);
 shiftOut(DS, SH_CP, MSBFIRST, register11);
 // Инициализируем окончание передачи данных.
 // Регистры подадут напряжение на указанные выходы
 digitalWrite(ST_CP, HIGH);
}

 

SU-27-16
SU-27-16 аватар
Offline
Зарегистрирован: 13.08.2012

только почему ТАК, как-то подвыподвертом???

с = /a * /b = /( a + b ) --->>>  if ( !(a|b) )
http://schoolinfo3.ioso.ru/zakony.htm

в коде из #6 - почти все int можно заменить на byte

а строки 2, 4 , 6 , 8
int SH_CP = 12;//строб ---->>>> #define SH_CP 12//строб

Pupok
Offline
Зарегистрирован: 03.06.2015

SU-27-16 пишет:

а строки 2, 4 , 6 , 8

int SH_CP = 12;//строб ---->>>> #define SH_CP 12//строб

Спасибо, причешу!!!

Pupok
Offline
Зарегистрирован: 03.06.2015

У меня засада ... Не могу отследить нажатие кнопок при цикле индикации ...  Если "зажигаю" один регистр - нажатие кнопки отслеживается! А в цикле - нет ...  Да, аппаратно кнопки с выходов регистра через диоды на вход. Может ошибаюсь и это не диоды маркировка A1t Вроде как сдвоенные диоды. В порт входа какой-то мусор валиться. Особенно, когда подносишь палец, как наводка.

ЗЫ На "железном" форуме нашел:"Все Atmelы не терпят крутых фронтов на входных линиях (разводка у них многослойная на кристалле). Поэтому все приходящие сигналы (особенно издалека и от быстрой логики) подаются через резистор (минимум 1 кОм) иначе будут вызываться прерывания, и запрещенные, и отсутствующие в программе". Вообщем, нужна "ПОДТЯЖКА"!!!

ЗЫЗЫ Нашел "подтяжку" !!!

digitalWrite(BtnPin, HIGH);

 

SU-27-16
SU-27-16 аватар
Offline
Зарегистрирован: 13.08.2012

Все Atmelы не терпят крутых фронтов на входных линиях (разводка у них многослойная на кристалле)
...все цЫфровые микросхемы ЛЮБЯТ-ОБОЖАЮТ фронты сигналов в 90 градусов !!!!!!!!
растянутый-пологий  фронт - это горе :(

подтяжка пина - это из другой сказки :)