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