Serial port, помогите найти ошибку

Backspace
Offline
Зарегистрирован: 18.10.2013

Написал как начинающий для Ардуино Pro-Micro  два скетча

https://www.sparkfun.com/products/11098

 

- первый скетч включает локальные светодиоды LED1 LED2  при активности локальных входов, работает Ok. LED3 программно инвертированный светится, тк данных в порту нет

- второй скетч не работает, но должен был включать локальные свеодиоды при активности входов удаленного устройства. связь между ардуинами по последовательному порту,  схема подключения нижепробовал использовать класс Serial - светодиоды LED1 LED2 не светятся , то же для LED3 (нет данных)

Понимаю, что допустил ошибку , но найти ее сам пока не смог

.

 

// Локальные LED

int din,dout;
boolean val,  pulse=HIGH; // импульсное свечение вместо ограничительного резистора
unsigned int curtime=0, lasttime=0;
signed long interval=15;
int DIN1=10, DIN2=16, DOUT1=4, DOUT2=6, DOUT3=8;



void setup()
{     
  din=DIN1; pinMode(din, INPUT_PULLUP);
  din=DIN2; pinMode(din, INPUT_PULLUP);
 
  dout=DOUT1; pinMode(dout, OUTPUT);
  dout=DOUT2; pinMode(dout, OUTPUT);
  dout=DOUT3; pinMode(dout, OUTPUT);
  Serial1.begin(9600);
}


void loop()

  {
   curtime=millis();   
  if  ((curtime-lasttime)>=interval) {lasttime=curtime; pulse=!pulse;}
  din=DIN2;  dout=DOUT2;  val=digitalRead(din); digitalWrite(dout, pulse&val);
        
   if (!Serial1.available())  
       digitalWrite(DOUT3, HIGH&pulse);
   else digitalWrite(DOUT3, LOW&&pulse);
               
  }

///////////////////////////////////////////////////////////// НЕ РАБОТАЕТ ////////////////////////////////////////////////

// Сетевые светодиоды

boolean pulse=HIGH; // импульсное свечение вместо ограничительного резистора
unsigned int curtime=0, lasttime=0;
signed long interval=15;
int DIN1=10, DIN2=16, DOUT1=4, DOUT2=6, DOUT3=8;

int mask0=B1;
int mask1=B10;
//int mask2=B100;
//int mask3=B1000;
//int mask4=B10000;
//int mask5=B100000;
//int mask6=B1000000;
//int mask7=B10000000;
int RXbyte=0, TXbyte=0;

void setup()
{     
  pinMode(DIN1, INPUT_PULLUP);
  pinMode(DIN2, INPUT_PULLUP);
 
  pinMode(DOUT1, OUTPUT);
  pinMode(DOUT2, OUTPUT);
  pinMode(DOUT3, OUTPUT);
  Serial1.begin(19200);
  RXbyte=0; TXbyte=0;
}

void loop()
  {
   int b0,b1;
  //curtime=millis();   
  //if  ((curtime-lasttime)>=interval) {lasttime=curtime; pulse=!pulse;} else;
 
  if (Serial1.available())  
       digitalWrite(DOUT3, HIGH&pulse);  // LED3 на ноге 8 для класса Serial не светит, для Serial1=светит
   else digitalWrite(DOUT3, LOW&&pulse);
 
 if (Serial1.available()>0) {RXbyte=Serial.read();} else;
 if( RXbyte&mask0 !=0) b0=HIGH; else b0=LOW;
 digitalWrite(DOUT1, pulse&b0); // LED1 & LED2 для Serial не светят, для Serial1 светят оба  
 if( RXbyte&mask1 !=0) b1=HIGH; else b1=LOW;
 digitalWrite(DOUT2, pulse&b1); // LED1 & LED2 для Serial не светят, для Serial1 светят оба
 
  TXbyte=0;
  if (digitalRead(DIN1)!=0) TXbyte=TXbyte||mask0; else;
  if (digitalRead(DIN2)!=0) TXbyte=TXbyte||mask1; else;
  Serial1.write(TXbyte);
  Serial1.flush();
  }
 

 

 

 

Backspace
Offline
Зарегистрирован: 18.10.2013
///////////////////////////////////////////////////////////// НЕ РАБОТАЕТ ////////////////////////////////////////////////

// Сетевые светодиоды

boolean pulse=HIGH; // импульсное свечение вместо ограничительного резистора
unsigned int curtime=0, lasttime=0;
signed long interval=15;
int DIN1=10, DIN2=16, DOUT1=4, DOUT2=6, DOUT3=8;

int mask0=B1;
int mask1=B10;
//int mask2=B100;
//int mask3=B1000;
//int mask4=B10000;
//int mask5=B100000;
//int mask6=B1000000;
//int mask7=B10000000;
int RXbyte=0, TXbyte=0;

void setup()
{     
  pinMode(DIN1, INPUT_PULLUP);
  pinMode(DIN2, INPUT_PULLUP);
 
  pinMode(DOUT1, OUTPUT);
  pinMode(DOUT2, OUTPUT);
  pinMode(DOUT3, OUTPUT);
  Serial1.begin(19200);
  RXbyte=0; TXbyte=0;
}

void loop()
  {
   int b0,b1;
  //curtime=millis();   
  //if  ((curtime-lasttime)>=interval) {lasttime=curtime; pulse=!pulse;} else;
 
  if (Serial1.available())  
       digitalWrite(DOUT3, HIGH&pulse);  // LED3 на ноге 8 для класса Serial не светит, для Serial1=светит
   else digitalWrite(DOUT3, LOW&&pulse);
 
 if (Serial1.available()>0) {RXbyte=Serial.read();} else;
 if( RXbyte&mask0 !=0) b0=HIGH; else b0=LOW;
 digitalWrite(DOUT1, pulse&b0); // LED1 & LED2 для Serial не светят, для Serial1 светят оба  
 if( RXbyte&mask1 !=0) b1=HIGH; else b1=LOW;
 digitalWrite(DOUT2, pulse&b1); // LED1 & LED2 для Serial не светят, для Serial1 светят оба
 
  TXbyte=0;
  if (digitalRead(DIN1)!=0) TXbyte=TXbyte||mask0; else;
  if (digitalRead(DIN2)!=0) TXbyte=TXbyte||mask1; else;
  Serial1.write(TXbyte);
  Serial1.flush();
  }

 

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

|| - or  и  | - bitwise or

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

А землю вы обеих дуин не соединяли чтоли?

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

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

Backspace
Offline
Зарегистрирован: 18.10.2013

dmw пишет:
А землю вы обеих дуин не соединяли чтоли?
GND объединял, первый скетя работает же.от USB питается первая дуина, а вторая ртьант ее по линии VCC.

maksim пишет:
|| - or  и  | - bitwise or
спасибо, я здесь ошибся. Bitwise - побитное "ИЛИ" то, что мне надо.  К сожалению скетч2 все равно не работает. Нужна ли TTL serial подтяжкак VСС  и какой класс правильный для Pro Micro :  Serial или Serial1 ?

 

Попутно  вопрос : || -  какой вид "ИЛИ" для многобитной переменной - простое складывание двоичных разрадов операднов в кучу (те =1 если хотя бы в одной переменной есть 1 ? ) .

Backspace
Offline
Зарегистрирован: 18.10.2013

maksim пишет:

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

а у меня и земля GND и питание соединены,покритикуйте пожалуйста.

 

Выводы 0 и 1 это не тот ли самый порт, что обслуживает USB ?

Backspace
Offline
Зарегистрирован: 18.10.2013
boolean pulse=HIGH; // импульсное свечение вместо ограничительного резистора
unsigned int curtime=0, oldtime=0;
signed long interval=15;
int DIN1=10, DIN2=16, DOUT1=4, DOUT2=6, DOUT3=8;

int mask0=B1;
int mask1=B10;
//int mask2=B100;
//int mask3=B1000;
//int mask4=B10000;
//int mask5=B100000;
//int mask6=B1000000;
//int mask7=B10000000;
int RXbyte=0, TXbyte=0;


void setup() 
{     
  pinMode(DIN1, INPUT_PULLUP);
  pinMode(DIN2, INPUT_PULLUP);
  
  pinMode(DOUT1, OUTPUT);
  pinMode(DOUT2, OUTPUT);
  pinMode(DOUT3, OUTPUT);
  
  Serial.begin(9600);
  RXbyte=0; TXbyte=0;
}

void loop() 
  {
   int b0,b1;
  //curtime=millis();   
  //if  ((curtime-oldtime)>=interval) {oldtime=curtime; pulse=!pulse;} else;
  
  if (Serial1.available())  
       digitalWrite(DOUT3, HIGH&pulse);  // LED3 на ноге 8 для класса Serial не светит, для Serial1=светит
   else digitalWrite(DOUT3, LOW&&pulse);
  
 if (Serial1.available()>0) {RXbyte=Serial1.read();} else;
 if( RXbyte&mask0 !=0) b0=HIGH; else b0=LOW; 
 digitalWrite(DOUT1, pulse&b0); // LED1 & LED2 для Serial не светят, для Serial1 светят оба  
 if( RXbyte&mask1 !=0) b1=HIGH; else b1=LOW;
 digitalWrite(DOUT2, pulse&b1); // LED1 & LED2 для Serial не светят, для Serial1 светят оба
  
  TXbyte=0;
  if (digitalRead(DIN1)!=0) TXbyte=TXbyte|mask0; else;
  if (digitalRead(DIN2)!=0) TXbyte=TXbyte|mask1; else;
  //Serial1.write(TXbyte);
  // Serial.flush();
 ///delay (100); 
    Serial1.println("Test");
           
           
           
  }

И даже так через терминал на PC не идет. Менял местами RX-TX (схема), не мог сжечь выходы 0 и 1 на дуине?

Backspace
Offline
Зарегистрирован: 18.10.2013

Проверил  0 и 1 как дискретные входы, работают нормально:


int din,dout;
boolean val,  pulse=HIGH; // импульсное свечение вместо ограничительного резистора
unsigned int curtime, oldtime;
signed long interval=15;
int DIN1=10, DIN2=16, DOUT1=4, DOUT2=6, DOUT3=8, DINRX=0, DINTX=1;

void setup() 
{     
  
  oldtime=millis();
  pinMode(0, INPUT_PULLUP); // ПРОВЕРКА В КАЧЕСТВЕ ВХОДОВ
  pinMode(1, INPUT_PULLUP);// ПРОВЕРКА В КАЧЕСТВЕ ВХОДОВ
    
  dout=DOUT1; pinMode(dout, OUTPUT);
  dout=DOUT2; pinMode(dout, OUTPUT);
  dout=DOUT3; pinMode(dout, OUTPUT);
  // Serial.begin(9600);
}

void loop() 

  {
  curtime=millis(); //текущее время   
  if  ((curtime-oldtime)>=interval) {oldtime=curtime; pulse=!pulse;}
  
    val=digitalRead(0); digitalWrite(4, pulse&val);
    val=digitalRead(1); digitalWrite(6, pulse&val);
   
               
  }

и как выходы, тоже работоспособны

int din,dout;
boolean val,  pulse=HIGH; // импульсное свечение вместо ограничительного резистора
unsigned int curtime, oldtime;
signed long interval=15;
int DIN1=10, DIN2=16, DOUT1=4, DOUT2=6, DOUT3=8, DINRX=0, DINTX=1;



void setup() 
{     
  
  oldtime=millis();
  pinMode(0, INPUT_PULLUP); // ПРОВЕРКА В КАЧЕСТВЕ ВЫХОДОВ
  pinMode(1, INPUT_PULLUP); // ПРОВЕРКА В КАЧЕСТВЕ ВЫХОДОВ
    
  dout=DOUT1; pinMode(dout, OUTPUT);
  dout=DOUT2; pinMode(dout, OUTPUT);
  dout=DOUT3; pinMode(dout, OUTPUT);
  // Serial.begin(9600);
}


void loop() 

  {
  curtime=millis(); //текущее время   
  if  ((curtime-oldtime)>=interval) {oldtime=curtime; pulse=!pulse;}
  
    val=digitalRead(0); digitalWrite(4, pulse&val);
    val=digitalRead(1); digitalWrite(6, pulse&val);
                  
  }

Что еще проверять, в чем может быть ошибка?

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

Не знаю зачем там у вас 3 светодиод, но для двух как то так:

#define DIN1 10
#define DIN2 16 
#define DOUT1 4
#define DOUT2 6
#define DOUT3 8

void setup() 
{     
  pinMode(DIN1, INPUT_PULLUP);
  pinMode(DIN2, INPUT_PULLUP);

  pinMode(DOUT1, OUTPUT);
  pinMode(DOUT2, OUTPUT);
  pinMode(DOUT3, OUTPUT);

  Serial1.begin(9600);
}

void loop() 
{
  if (Serial1.available()) 
  {
    byte RXbyte = Serial1.read();
    digitalWrite(DOUT1, RXbyte&(1<<0));
    digitalWrite(DOUT2, RXbyte&(1<<1));
  }
  
  static byte TXbyte = 0;
  if (!digitalRead(DIN1)) TXbyte |= 1<<0; 
  else TXbyte &= ~(1<<0);
  if (!digitalRead(DIN2)) TXbyte |= 1<<1; 
  else TXbyte &= ~(1<<1);

  static byte prevByte = 0xFF;
  if(TXbyte != prevByte)
  {
    Serial1.write(TXbyte);
    prevByte = TXbyte;
  }
}

 

Backspace
Offline
Зарегистрирован: 18.10.2013

maksim пишет:
Не знаю зачем там у вас 3 светодиод, но для двух как то так:
третий светодиод для индикации статуса последовательного порта, ести ли принятые символы в буфере и т.д..

Почему же не идет связь между ардуинами? проверил выводы 0 и 1 в качестве входов и выходов - работают, а с последовательным портом почему-то проблема.

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

Код из сообщения #9 разве не работает?

Backspace
Offline
Зарегистрирован: 18.10.2013

maksim пишет:
Код из сообщения #9 разве не работает?

Я открывал его правой кнопкой мыши и  поэтому кода не заметил. Спасибо, посмотрел вашу программу, качественный подход к делу виден даже из структуры текста.  Загрузил в обе ардуины - работает. Поскольку на схеме реально не 2 независимые кнопки, а движковый перекидной переключатель на 2 положения, то 1 входной канал всегда активен (низкий уровень). Так вот заметил, что одна из арудин   (обычно  №2, а в 10 % случаев №1) при подаче питания не показывает активность светодиодами. Требуется переключение выключателя  со стороны №1 и после этого все нормализуется.  Сегодня уже нест сил, завтра проанализирую программу. В призраки  тем более на ночь не верю. Еще раз спасибо.

 

см файл