Serial port, помогите найти ошибку
- Войдите на сайт для отправки комментариев
Написал как начинающий для Ардуино 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();
}
///////////////////////////////////////////////////////////// НЕ РАБОТАЕТ //////////////////////////////////////////////// // Сетевые светодиоды 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(); }|| - or и | - bitwise or
А землю вы обеих дуин не соединяли чтоли?
Как бы без разницы относительно чего изменяется сигнал - относительно земли или относительно питания, при условии что напряжения питания одинаковые. Но по всем правилам и логике, конечно, нужно соединять земли, а не питание, в противном случае возможны подводные камни.
Попутно вопрос : || - какой вид "ИЛИ" для многобитной переменной - простое складывание двоичных разрадов операднов в кучу (те =1 если хотя бы в одной переменной есть 1 ? ) .
Как бы без разницы относительно чего изменяется сигнал - относительно земли или относительно питания, при условии что напряжения питания одинаковые. Но по всем правилам и логике, конечно, нужно соединять земли, а не питание, в противном случае возможны подводные камни.
Выводы 0 и 1 это не тот ли самый порт, что обслуживает USB ?
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 на дуине?
Проверил 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); }Что еще проверять, в чем может быть ошибка?
Не знаю зачем там у вас 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; } }Почему же не идет связь между ардуинами? проверил выводы 0 и 1 в качестве входов и выходов - работают, а с последовательным портом почему-то проблема.
Код из сообщения #9 разве не работает?
Я открывал его правой кнопкой мыши и поэтому кода не заметил. Спасибо, посмотрел вашу программу, качественный подход к делу виден даже из структуры текста. Загрузил в обе ардуины - работает. Поскольку на схеме реально не 2 независимые кнопки, а движковый перекидной переключатель на 2 положения, то 1 входной канал всегда активен (низкий уровень). Так вот заметил, что одна из арудин (обычно №2, а в 10 % случаев №1) при подаче питания не показывает активность светодиодами. Требуется переключение выключателя со стороны №1 и после этого все нормализуется. Сегодня уже нест сил, завтра проанализирую программу. В призраки тем более на ночь не верю. Еще раз спасибо.
см файл