Попробовал сделать программу для шапки. Нужно проверить как ЦВМ отреагирует. Отключить магнитофон. Подключить УНУ согласно приведенной карте соединений. Обращаю внимание. СД , УПР, КнП к ногам 2,3,4. НПД НГП к ногам А0 А1. Логанализатор к ногам НПД НГП УПР КнП СД ЛД7 ЛД6 ЛД0.
Запустить программу нажать кнопку ПУСК. Что бы не произошло длину записи лог анализатора не нужно больше 400мс. Пре триггер не более 10мс. Триггер на сигнал УПР на фронт 1->0. По результатам логанализатора будем править программу.
При отключении магнитофона раньше после нажатия старт ЦВМ выдавала 4 байта и загоралась ошибка. Сейчас не так? Отключите плату. Получите 4 импульса ЦВМ, подключите плату и посмотрите что изменилось. Плата после надписи старт тест стоит в режиме высокого сопротивления ног и не может влиять на линии сигналов. По крайней мере хоть один импульс от ЦВМ должен быть.
Значит надо проверить сигналы на линиях до и после подключения ардуины. После подключения и включения ардуины до нажатия кнопки старт. Все линии сигналов Должныбыть +3.3 В. Если какой то сигнал 0 вольт - сообщите. Буду смотреть что в программе не так.
Программа по неизвестной причине генерит непрерывно сигнал НГП после начала цикла. К тому же она не сгенерила сигнал СД по прерыванию от УПР, хотя прерывание сработало. Надо проверить соединения. СД должно быть на ноге D2 уны и на этой ноге должен быть сигнал по окончанию первого сигнала УПР. Это надо проверить. Для этого канал 7 логанализатора надо подсоединит прямо на ногу уны D2. И снять ещё раз отсоединив от уны линию НГП - А1.
Попробуйте без магнитофона, со всеми соединениями. По логанализатору, после фронта УПР 0->1 сразу должны сработать CД и НГП 1->0. Нужно добиться именно такого поведения. Если не получиться - проверять контакты и смотреть осциллографом, где проблема.
Ну вот. Получили необходимые сигналы, но не получили необходимой реакции ЦВМ. . Красная стрелка показывает, что с точностью до нескольких микросекунд ситуация с сигналами смоделирована. Однако, ЦВМ опять выставляет УПР. Необходимо искать причину. Логанализатором необходимо просмотреть все линии - и сигналов и данных, отдельно с магнитофоном и отдельно с программой. Найти в чём разница когда магнитофон подключен и отключен. Без этого двигаться дальше бесполезно.
Хорошо. ЦВМ ответила. Это главное. Теперь шаг за шагом надо добиться выхода на диалог и начало загрузки. Предлагаю оперативно поделать эти шаги. Первый - просто ждём что даёт ЦВМ. Нужны логи шины и данных. Сначала шины. Если ответит много, то и данных.
Снова ответила, но ждёт подтверждения. Следующая программа посылает подтверждение nz раз. Специально ввёл константу nz - Количество запросов магнитофона. Вы можете её менять в пределах 1 - 8, начинаем с двух, и смотреть как ЦВМ реагирует на количество подтверждений. Логер по каналам. НПД, НГП, УПР, СД, КнП, ЛД7, ЛД6, ЛД0. Программа через 2 секунды после начала цикла останавливается и выдаёт все данные, которые пробежали по шине. Этот вывод тоже приводите в постах со ссылками на файлы логера.
Увиденные проблемы - ответ на первый УПР есть, но потом не видит наши запросы. Очень большие интервалы между запросами. Рано читает байт. Попытался сократить. Запустите 1 раз.
Не было контакта логера с линией НГП. ЦВМ съела второй запрос и пошла крутить обмен дальше. Проверьте НГП и поставьте nz=2. И ещё раз снять данные логером.
Звезда в шоке. Не сработало условие while ((bitRead(PINC, 0) == 0 ) && (nc < 250) nc++; Как только НПД - PINC бит 0 - контакт А0 УНЫ - станет равным единицы и соответственно условие bitRead(PINC, 0) == 0 станет ложным программа должна вывалится из while, а вываливается по таймауту через 21 мкс. С чем это связано? Может быть контакт? Кстати, нет контакта между ЛД1 и УНОй Проверьте тестером , а ещё лучше осциллографом прямо на ноге УНЫ А0 соединение с НГП. Прямо на железе ноги должно колебаться что то. Два канала ПНД и СД надо получить чтобы поле перехода ПНД 0->1 через 1 мкс СД тоже перешла 0->1.
Попробуй в подпрограмме i_UPR заменить bitRead(PINC, 0) == 0 на PINC & 0x1 == 0. Может быть что то изменится? Хотя макрос bitRead именно так и разворачивается.
А ещё мне очень не нравиться лишние нули считываемые УНОй. Похоже на плохой контакт СД с УНОй. Проверьте пожалуйста. Нулей 1,4,5,7 быть не должно. Вот вывод:
0 c FD
1 c 0
2 c FB
3 c FB
4 c 0
5 c 0
6 c 83
7 c 0
8 d 0
9 c 0
10 c 29
Стало ещё хуже. Просто непрерывная наводка на СД УНЫ - на логере нет. Поэтому пусто - висит в прерывании на СД и не может выбраться. Посмотрите осциллографом что твориться на ноге 2 УНЫ. Возможно надо подтянуть резистором 1к к +3.3 вольта. Но задержка сработала. Теперь избавиться от наводки и смотреть дальше. Первую ступень отработали. Точное соответствие магнитофону. Всего 4 ступени до запуска обмена программой. Надо проверить землю логера и УНЫ. Бывает что дело не в линии а в земле.
Долго смотрел и анализировал. Чем дальше смотрю, тем меньше понимаю. Если бы это была чистая наводка на СД, то данные падали бы до начала цикла. Однако до начала всё спокойно. Первое ложное срабатывание прерывания идёт после первого нормального. Или по другому наводка идёт только тогда когда сигнал УПР = 0 вольт. Искать надо где то здесь - может какой то "лишний" контакт с УПР.
Подразумевается прямо. Есть лишний контакт. Посмотрите осцилографом на СД на ноге уны во время цикла, и логер на максимальную скорость и два канала на СД один на шину, второй на ногу УНЫ. Чудес не бывает. На СД УНЫ есть импульсы около 200 кГц только когда УПР низкий уровень. Или аккуратно пересоберите схему. Желательно совсем без скруток и длинных петель провода.
Нолики всё равно бегают. В программе есть массив ib - правильная последовательность данных на шине, которую мы должны получить. Попробуйте программу. В ней я закомментировал чтение данных. Снимите данные на скорости оцифровки логера 24МГц. На меньших скоростях наводок не увидеть. Потом раскомментируйте 3 строки с ...attachInterrupt(0... Это включит чтение. Оцифруйте так же - с той же скоростью и соединениями. Можно будет сравнить есть ли лишние импульсы от ложного чтения на шинах.
Попробовал сделать программу для шапки. Нужно проверить как ЦВМ отреагирует. Отключить магнитофон. Подключить УНУ согласно приведенной карте соединений. Обращаю внимание. СД , УПР, КнП к ногам 2,3,4. НПД НГП к ногам А0 А1. Логанализатор к ногам НПД НГП УПР КнП СД ЛД7 ЛД6 ЛД0.
Запустить программу нажать кнопку ПУСК. Что бы не произошло длину записи лог анализатора не нужно больше 400мс. Пре триггер не более 10мс. Триггер на сигнал УПР на фронт 1->0. По результатам логанализатора будем править программу.
P.S. 11:00 Поправил программу.
/*********************************************************** Подключение: СД - 2 НПД - A0 НГП - A1 УПР - 3 KнП - 4 ЛД0 - 7 ЛД1 - 6 ЛД2 - 13 ЛД3 - 12 ЛД4 - 11 ЛД5 - 10 ЛД6 - 9 ЛД7 - 8 ***********************************************************/ const byte INT_SD = 0; // Номер прерывания синхроимпульсов. const byte INT_UPR = 1; // Номер прерывания синхроимпульсов. const byte NPD = 14; // Пин НПД A0. const byte NGP = 15; // Пин НГП A1. const byte SD = 2; // Пин Данные действительны. const byte UPR = 3; // Пин для сигнала УПР. const byte KnP = 4; // Пин Данные действительны. const unsigned char MASK = 0b11000000; // Маска для формирования байта. volatile bool flStart = false; volatile unsigned char Ch, nc, nn, stat=0; volatile boolean flBuf=false; volatile uint32_t tm, tmo, dt, tmd; char buf[32]; uint32_t tb[150]; uint8_t bb[150], cb[150],nhex; uint8_t ib[] = {0xFD, 0xFB, 0x83, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0xFB, 0xFD, 0xFB, 0x83, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0xFB, 0xFD, 0xFB, 0x85, 0x010, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x08, 0x01, 0x01, 0x01, 0x01, 0xF1, 0xF1, 0x01, 0x01, 0x01, 0x19, 0x01, 0xFD, 0x19, 0x83, 0x01, 0x98, 0xFB, 0x45, 0x40, 0xFD, 0x43, 0x00}; uint8_t ic[] = {1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 0, 1, 1, 1, 0, 1, 1, 0, 0}; void setup() { PORTB = 0; PORTD = 0; DDRD = 0x0; DDRB = 0x0; EIFR = bit (INTF0); EIFR = bit (INTF1); attachInterrupt(INT_SD, input_char, FALLING); attachInterrupt(INT_UPR, i_UPR, RISING); Serial.begin(115200); Serial.println("Start test:"); } void input_char () { flStart = true; bitSet(DDRC, 1); //НГП Ch = ~((PINB & ~MASK) | (PIND & MASK)); bitClear(DDRC, 0);//НПД while (digitalRead(SD)==0); bitSet(DDRC, 0); //НПД bitClear(DDRC, 1); //НГП } void i_UPR () { detachInterrupt(INT_SD); detachInterrupt(INT_UPR); if (Ch==0x83){ if (stat< 4) { bitSet(DDRD, SD); bitSet(DDRC, 1); //НГП } stat++; }; if (Ch==0x43){ if (stat > 5) { bitSet(DDRD, SD); bitSet(DDRC, 1); //НГП } stat++; } } void send_dc(byte d) { PORTB=0; PORTC=0; PORTD=0; if ((d & 0x1) == 0) DDRD = 0x80; if ((d & 0x2) == 0) DDRD |= 0x40; if ((d & 0x4) == 0) DDRB = 0x20; if ((d & 0x8) == 0) DDRB |= 0x10; if ((d & 0x10) == 0) DDRB |= 0x8; if ((d & 0x20) == 0) DDRB |= 0x4; if ((d & 0x40) == 0) DDRB |= 0x2; if ((d & 0x80) == 0) DDRB |= 0x1; bitSet(DDRD,SD); while (digitalRead(NPD)==0); bitClear(DDRD, SD); DDRD = 0x0; DDRB = 0x0; DDRC = 0x0; } void loop() { switch (stat) { case 0: break; case 1: while (digitalRead(NPD)==0); bitClear(DDRD, SD); bitClear(DDRC, 1); //НГП for ( byte i=0; i<8; i++) send_dc(0); stat=2; EIFR = bit (INTF0); EIFR = bit (INTF1); attachInterrupt(INT_SD, input_char, FALLING); attachInterrupt(INT_UPR, i_UPR, RISING); break; case 2: if (digitalRead(KnP)==0) ; break; case 3: while (digitalRead(NPD)==0); bitClear(DDRD, SD); bitClear(DDRC, 1); //НГП while (digitalRead(KnP)==0) {while (digitalRead(NGP)==0); send_dc(0);}; stat=4; EIFR = bit (INTF0); EIFR = bit (INTF1); attachInterrupt(INT_SD, input_char, FALLING); attachInterrupt(INT_UPR, i_UPR, RISING); break; case 4: break; case 5: while (digitalRead(NGP)==0); send_dc(0x10); for ( byte i=0; i<7; i++) {while (digitalRead(NGP)==0); send_dc(0x01); }; while (digitalRead(NGP)==0); send_dc(0x08); while (digitalRead(KnP)==0) {while (digitalRead(NGP)==0); send_dc(0x01);}; stat=6; EIFR = bit (INTF0); EIFR = bit (INTF1); attachInterrupt(INT_SD, input_char, FALLING); attachInterrupt(INT_UPR, i_UPR, RISING); break; case 6: break; case 7: while (digitalRead(NGP)==0); bitClear(DDRD, SD); bitClear(DDRC, 1); //НГП delay(160); for ( byte i=0; i<32; i++) {while (digitalRead(NGP)==0); send_dc(0x01); delay(2);}; stat=8; break; case 8: Serial.println("RESTART. READY"); stat=0; break; } }Подключаю
Магнитофон должен быть отключен от всех шлейфов. Сегодня в 11:00 я поменял программу.
На мониторе только старт тест. На логанализаторе ничего.
При отключении магнитофона раньше после нажатия старт ЦВМ выдавала 4 байта и загоралась ошибка. Сейчас не так? Отключите плату. Получите 4 импульса ЦВМ, подключите плату и посмотрите что изменилось. Плата после надписи старт тест стоит в режиме высокого сопротивления ног и не может влиять на линии сигналов. По крайней мере хоть один импульс от ЦВМ должен быть.
Если ардуино отключить сигнал проходит, если ардуино подключить обратно сигнал пропадает.
Значит надо проверить сигналы на линиях до и после подключения ардуины. После подключения и включения ардуины до нажатия кнопки старт. Все линии сигналов Должныбыть +3.3 В. Если какой то сигнал 0 вольт - сообщите. Буду смотреть что в программе не так.
Это я лопух, земля на соплях была. На мониторе старт тест. На логанализаторе
https://cloud.mail.ru/public/1Yjv/jvAeWHPJd
Не сработала программа.
Добавил тестовый вывод. Посмотрим почему.
/*********************************************************** Подключение: СД - 2 НПД - A0 НГП - A1 УПР - 3 KнП - 4 ЛД0 - 7 ЛД1 - 6 ЛД2 - 13 ЛД3 - 12 ЛД4 - 11 ЛД5 - 10 ЛД6 - 9 ЛД7 - 8 ***********************************************************/ const byte INT_SD = 0; // Номер прерывания синхроимпульсов. const byte INT_UPR = 1; // Номер прерывания синхроимпульсов. const byte NPD = 14; // Пин НПД A0. const byte NGP = 15; // Пин НГП A1. const byte SD = 2; // Пин Данные действительны. const byte UPR = 3; // Пин для сигнала УПР. const byte KnP = 4; // Пин Данные действительны. const unsigned char MASK = 0b11000000; // Маска для формирования байта. volatile bool flStart = false; volatile unsigned char Ch=0, nc, nn, stat=0; volatile boolean flBuf=false; volatile uint32_t tm, tmo, dt, tmd; char buf[32]; uint32_t tb[150]; uint8_t bb[150], cb[150],nhex; uint8_t ib[] = {0xFD, 0xFB, 0x83, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0xFB, 0xFD, 0xFB, 0x83, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0xFB, 0xFD, 0xFB, 0x85, 0x010, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x08, 0x01, 0x01, 0x01, 0x01, 0xF1, 0xF1, 0x01, 0x01, 0x01, 0x19, 0x01, 0xFD, 0x19, 0x83, 0x01, 0x98, 0xFB, 0x45, 0x40, 0xFD, 0x43, 0x00}; uint8_t ic[] = {1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 0, 1, 1, 1, 0, 1, 1, 0, 0}; void setup() { PORTB = 0; PORTD = 0; EIFR = bit (INTF0); EIFR = bit (INTF1); attachInterrupt(INT_SD, input_char, FALLING); attachInterrupt(INT_UPR, i_UPR, RISING); Serial.begin(115200); Serial.println("Start test:"); } void input_char () { flStart = true; bitSet(DDRC, 1); //НГП Ch = ~((PINB & ~MASK) | (PIND & MASK)); bitClear(DDRC, 0);//НПД while (digitalRead(SD)==0); bitSet(DDRC, 0); //НПД bitClear(DDRC, 1); //НГП } void i_UPR () { Serial.println(Ch,HEX); if (Ch==0x83){ if (stat< 4) { bitSet(DDRD, SD); bitSet(DDRC, 1); //НГП } stat++; }; if (Ch==0x43){ if (stat > 5) { bitSet(DDRD, SD); bitSet(DDRC, 1); //НГП } stat++; } } void send_dc(byte d) { PORTB=0; PORTC=0; PORTD=0; if ((d & 0x1) == 0) DDRD = 0x80; if ((d & 0x2) == 0) DDRD |= 0x40; if ((d & 0x4) == 0) DDRB = 0x20; if ((d & 0x8) == 0) DDRB |= 0x10; if ((d & 0x10) == 0) DDRB |= 0x8; if ((d & 0x20) == 0) DDRB |= 0x4; if ((d & 0x40) == 0) DDRB |= 0x2; if ((d & 0x80) == 0) DDRB |= 0x1; bitSet(DDRD,SD); while (digitalRead(NPD)==0); bitClear(DDRD, SD); DDRD = 0x0; DDRB = 0x0; DDRC = 0x0; } void loop() { switch (stat) { case 0: if (flStart) {Serial.println(Ch,HEX); flStart=false;}; break; case 1: detachInterrupt(INT_SD); detachInterrupt(INT_UPR); while (digitalRead(NPD)==0); bitClear(DDRD, SD); bitClear(DDRC, 1); //НГП for ( byte i=0; i<8; i++) {while (digitalRead(NGP)==0); send_dc(0);}; stat=2; EIFR = bit (INTF0); EIFR = bit (INTF1); attachInterrupt(INT_SD, input_char, FALLING); attachInterrupt(INT_UPR, i_UPR, RISING); Serial.println("1"); break; case 2: if (digitalRead(KnP)==0) ; break; case 3: detachInterrupt(INT_SD); detachInterrupt(INT_UPR); while (digitalRead(NPD)==0); bitClear(DDRD, SD); bitClear(DDRC, 1); //НГП while (digitalRead(KnP)==0) {while (digitalRead(NGP)==0); send_dc(0);}; stat=4; EIFR = bit (INTF0); EIFR = bit (INTF1); attachInterrupt(INT_SD, input_char, FALLING); attachInterrupt(INT_UPR, i_UPR, RISING); Serial.println("3"); break; case 4: break; case 5: detachInterrupt(INT_SD); detachInterrupt(INT_UPR); while (digitalRead(NGP)==0); send_dc(0x10); for ( byte i=0; i<7; i++) {while (digitalRead(NGP)==0); send_dc(0x01); }; while (digitalRead(NGP)==0); send_dc(0x08); while (digitalRead(KnP)==0) {while (digitalRead(NGP)==0); send_dc(0x01);}; stat=6; EIFR = bit (INTF0); EIFR = bit (INTF1); attachInterrupt(INT_SD, input_char, FALLING); attachInterrupt(INT_UPR, i_UPR, RISING); Serial.println("5"); break; case 6: break; case 7: detachInterrupt(INT_SD); detachInterrupt(INT_UPR); while (digitalRead(NGP)==0); bitClear(DDRD, SD); bitClear(DDRC, 1); //НГП delay(160); for ( byte i=0; i<32; i++) {while (digitalRead(NGP)==0); send_dc(0x01); delay(2);}; stat=8; break; case 8: DDRD = 0x0; DDRB = 0x0; DDRC = 0x0; Serial.println("RESTART. READY"); stat=0; break; } }Прошу три запуска. Только вывод сериала. Переключать ничего не надо.
На мониторе
1 раз
83 потом нули
2 раз
2 нуля
3 раз
3 нуля
/*********************************************************** Подключение: СД - 2 НПД - A0 НГП - A1 УПР - 3 KнП - 4 ЛД0 - 7 ЛД1 - 6 ЛД2 - 13 ЛД3 - 12 ЛД4 - 11 ЛД5 - 10 ЛД6 - 9 ЛД7 - 8 ***********************************************************/ const byte INT_SD = 0; // Номер прерывания синхроимпульсов. const byte INT_UPR = 1; // Номер прерывания синхроимпульсов. const byte NPD = 14; // Пин НПД A0. const byte NGP = 15; // Пин НГП A1. const byte SD = 2; // Пин Данные действительны. const byte UPR = 3; // Пин для сигнала УПР. const byte KnP = 4; // Пин Данные действительны. const unsigned char MASK = 0b11000000; // Маска для формирования байта. volatile bool flStart = false; volatile unsigned char Ch=0, nc, nn=0, stat=0; volatile boolean flBuf=false; volatile uint32_t tm, tmo, dt, tmd; char buf[32]; uint32_t tb[150]; uint8_t bb[150], cb[150],nhex; uint8_t ib[] = {0xFD, 0xFB, 0x83, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0xFB, 0xFD, 0xFB, 0x83, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0xFB, 0xFD, 0xFB, 0x85, 0x010, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x08, 0x01, 0x01, 0x01, 0x01, 0xF1, 0xF1, 0x01, 0x01, 0x01, 0x19, 0x01, 0xFD, 0x19, 0x83, 0x01, 0x98, 0xFB, 0x45, 0x40, 0xFD, 0x43, 0x00}; uint8_t ic[] = {1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 0, 1, 1, 1, 0, 1, 1, 0, 0}; void setup() { PORTB = 0; PORTD = 0; EIFR = bit (INTF0); EIFR = bit (INTF1); attachInterrupt(INT_SD, input_char, FALLING); attachInterrupt(INT_UPR, i_UPR, RISING); Serial.begin(115200); Serial.println("Start test:"); } void input_char () { flStart = true; bitSet(DDRC, 1); //НГП Ch = ~((PINB & ~MASK) | (PIND & MASK)); bitClear(DDRC, 0);//НПД while (digitalRead(SD)==0); bitSet(DDRC, 0); //НПД bitClear(DDRC, 1); //НГП } void i_UPR (){ // Serial.println(Ch,HEX); // if (Ch==0x83){ if ( nn== 0) { bitSet(DDRD, SD); bitSet(DDRC, 1); //НГП stat=1; }; if (nn==2) { bitSet(DDRD, SD); bitSet(DDRC, 1); //НГП stat=3; } if (nn==4) { bitSet(DDRD, SD); bitSet(DDRC, 1); //НГП stat=5; } if (nn==9) { bitSet(DDRD, SD); bitSet(DDRC, 1); //НГП stat=7; } nn++; Serial.println(nn,HEX); } void send_dc(byte d) { PORTB=0; PORTC=0; PORTD=0; if ((d & 0x1) == 0) DDRD = 0x80; if ((d & 0x2) == 0) DDRD |= 0x40; if ((d & 0x4) == 0) DDRB = 0x20; if ((d & 0x8) == 0) DDRB |= 0x10; if ((d & 0x10) == 0) DDRB |= 0x8; if ((d & 0x20) == 0) DDRB |= 0x4; if ((d & 0x40) == 0) DDRB |= 0x2; if ((d & 0x80) == 0) DDRB |= 0x1; bitSet(DDRD,SD); while (digitalRead(NPD)==0); bitClear(DDRD, SD); DDRD = 0x0; DDRB = 0x0; DDRC = 0x0; } void loop() { switch (stat) { case 0: break;//if (flStart) {Serial.println(Ch,HEX); flStart=false;}; break; case 1: detachInterrupt(INT_SD); detachInterrupt(INT_UPR); while (digitalRead(NPD)==0); bitClear(DDRD, SD); bitClear(DDRC, 1); //НГП for ( byte i=0; i<8; i++) {while (digitalRead(NGP)==0); send_dc(0);}; stat=2; EIFR = bit (INTF0); EIFR = bit (INTF1); attachInterrupt(INT_SD, input_char, FALLING); attachInterrupt(INT_UPR, i_UPR, RISING); //Serial.println("1"); break; case 2: if (digitalRead(KnP)==0) ; break; case 3: detachInterrupt(INT_SD); detachInterrupt(INT_UPR); while (digitalRead(NPD)==0); bitClear(DDRD, SD); bitClear(DDRC, 1); //НГП while (digitalRead(KnP)==0) {while (digitalRead(NGP)==0); send_dc(0);}; stat=4; EIFR = bit (INTF0); EIFR = bit (INTF1); attachInterrupt(INT_SD, input_char, FALLING); attachInterrupt(INT_UPR, i_UPR, RISING); // Serial.println("3"); break; case 4: break; case 5: detachInterrupt(INT_SD); detachInterrupt(INT_UPR); while (digitalRead(NGP)==0); send_dc(0x10); for ( byte i=0; i<7; i++) {while (digitalRead(NGP)==0); send_dc(0x01); }; while (digitalRead(NGP)==0); send_dc(0x08); while (digitalRead(KnP)==0) {while (digitalRead(NGP)==0); send_dc(0x01);}; stat=6; EIFR = bit (INTF0); EIFR = bit (INTF1); attachInterrupt(INT_SD, input_char, FALLING); attachInterrupt(INT_UPR, i_UPR, RISING); // Serial.println("5"); break; case 6: break; case 7: detachInterrupt(INT_SD); detachInterrupt(INT_UPR); while (digitalRead(NGP)==0); bitClear(DDRD, SD); bitClear(DDRC, 1); //НГП delay(160); for ( byte i=0; i<32; i++) {while (digitalRead(NGP)==0); send_dc(0x01); delay(2);}; stat=8; break; case 8: DDRD = 0x0; DDRB = 0x0; DDRC = 0x0; Serial.println("RESTART. READY"); stat=0; break; } }Снять с записью логанализатором.
https://cloud.mail.ru/public/iBn5/UMsMJRHe2
Был вывод в сериал цифры 0?
на мониторе была цифра 1.
Программа по неизвестной причине генерит непрерывно сигнал НГП после начала цикла. К тому же она не сгенерила сигнал СД по прерыванию от УПР, хотя прерывание сработало. Надо проверить соединения. СД должно быть на ноге D2 уны и на этой ноге должен быть сигнал по окончанию первого сигнала УПР. Это надо проверить. Для этого канал 7 логанализатора надо подсоединит прямо на ногу уны D2. И снять ещё раз отсоединив от уны линию НГП - А1.
Понял. В понедельник сделаю.
Честно говоря, я уже не вижу смысла что то делать с уной. Попробовать только отреагирует ли ЦВМ на сигнал СД. Это я к вечеру напишу.
Спасибо.
https://cloud.mail.ru/public/NpYT/Lys6rQXTx
Уже не в понедельник #247, а в четверг. Говорят, что болеют.
Это ничего. Время есть.
Попробуйте без магнитофона, со всеми соединениями. По логанализатору, после фронта УПР 0->1 сразу должны сработать CД и НГП 1->0. Нужно добиться именно такого поведения. Если не получиться - проверять контакты и смотреть осциллографом, где проблема.
/*********************************************************** Подключение: СД - 2 НПД - A0 НГП - A1 УПР - 3 KнП - 4 ЛД0 - 7 ЛД1 - 6 ЛД2 - 13 ЛД3 - 12 ЛД4 - 11 ЛД5 - 10 ЛД6 - 9 ЛД7 - 8 ***********************************************************/ const byte INT_SD = 0; // Номер прерывания синхроимпульсов. const byte INT_UPR = 1; // Номер прерывания УПР. const byte NPD = 14; // Пин НПД A0. const byte NGP = 15; // Пин НГП A1. const byte SD = 2; // Пин Данные действительны. const byte UPR = 3; // Пин для сигнала УПР. const byte KnP = 4; // Пин Данные действительны. const unsigned char MASK = 0b11000000; // Маска для формирования байта. volatile bool flStart = false; volatile unsigned char Ch = 0, nc, nn = 0, stat = 0; volatile boolean flBuf = false, flUPR = false; volatile uint32_t tm, tmo, dt, tmd; char buf[32]; uint32_t tb[150]; uint8_t bb[150], cb[150], nhex; uint8_t ib[] = {0xFD, 0xFB, 0x83, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0xFB, 0xFD, 0xFB, 0x83, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0xFB, 0xFD, 0xFB, 0x85, 0x010, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x08, 0x01, 0x01, 0x01, 0x01, 0xF1, 0xF1, 0x01, 0x01, 0x01, 0x19, 0x01, 0xFD, 0x19, 0x83, 0x01, 0x98, 0xFB, 0x45, 0x40, 0xFD, 0x43, 0x00 }; uint8_t ic[] = {1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 0, 1, 1, 1, 0, 1, 1, 0, 0 }; void setup() { PORTB = 0; PORTC = 0; PORTD = 0; DDRB = 0x0; DDRC = 0x0; DDRD = 0x0; EIFR = bit (INTF1); attachInterrupt(1, i_UPR, RISING); Serial.begin(115200); Serial.println(" "); Serial.println("Start test:"); } void i_UPR () { bitSet(DDRD, SD); bitSet(DDRC, 1); //НГП nn++; flUPR = true; } void send_dc(byte d) { byte nc; PORTB = 0; PORTC = 0; PORTD = 0; if ((d & 0x1) == 0) DDRD |= 0x80; if ((d & 0x2) == 0) DDRD |= 0x40; if ((d & 0x4) == 0) DDRB |= 0x20; if ((d & 0x8) == 0) DDRB |= 0x10; if ((d & 0x10) == 0) DDRB |= 0x8; if ((d & 0x20) == 0) DDRB |= 0x4; if ((d & 0x40) == 0) DDRB |= 0x2; if ((d & 0x80) == 0) DDRB |= 0x1; nc=0; bitSet(DDRD, SD); while ((digitalRead(NPD) == LOW) && (nc < 100)) nc++; bitClear(DDRD, SD); DDRD = 0x0; DDRB = 0x0; DDRC = 0x0; } void loop() { byte nc; if (flUPR) { bitClear(DDRD, SD); bitClear(DDRC, 1); //НГП for ( byte i = 0; i < 8; i++) {nc=0;while ((digitalRead(NPD) == 0) && (nc < 100)) nc++; send_dc(0); }; flUPR = false; Serial.println(nn); }; }https://cloud.mail.ru/public/8a7v/m1zmiNePq
Ну вот. Получили необходимые сигналы, но не получили необходимой реакции ЦВМ.
. Красная стрелка показывает, что с точностью до нескольких микросекунд ситуация с сигналами смоделирована. Однако, ЦВМ опять выставляет УПР. Необходимо искать причину. Логанализатором необходимо просмотреть все линии - и сигналов и данных, отдельно с магнитофоном и отдельно с программой. Найти в чём разница когда магнитофон подключен и отключен. Без этого двигаться дальше бесполезно.
Одно отличие нашёл. Попробуйте вот эту.
/*********************************************************** Подключение: СД - 2 НПД - A0 НГП - A1 УПР - 3 KнП - 4 ЛД0 - 7 ЛД1 - 6 ЛД2 - 13 ЛД3 - 12 ЛД4 - 11 ЛД5 - 10 ЛД6 - 9 ЛД7 - 8 ***********************************************************/ const byte INT_SD = 0; // Номер прерывания синхроимпульсов. const byte INT_UPR = 1; // Номер прерывания УПР. const byte NPD = 14; // Пин НПД A0. const byte NGP = 15; // Пин НГП A1. const byte SD = 2; // Пин Данные действительны. const byte UPR = 3; // Пин для сигнала УПР. const byte KnP = 4; // Пин Данные действительны. const unsigned char MASK = 0b11000000; // Маска для формирования байта. volatile bool flStart = false; volatile unsigned char Ch = 0, nc, nn = 0, stat = 0; volatile boolean flBuf = false, flUPR = false; volatile uint32_t tm, tmo, dt, tmd; char buf[32]; uint32_t tb[150]; uint8_t bb[150], cb[150], nhex; uint8_t ib[] = {0xFD, 0xFB, 0x83, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0xFB, 0xFD, 0xFB, 0x83, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0xFB, 0xFD, 0xFB, 0x85, 0x010, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x08, 0x01, 0x01, 0x01, 0x01, 0xF1, 0xF1, 0x01, 0x01, 0x01, 0x19, 0x01, 0xFD, 0x19, 0x83, 0x01, 0x98, 0xFB, 0x45, 0x40, 0xFD, 0x43, 0x00 }; uint8_t ic[] = {1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 0, 1, 1, 1, 0, 1, 1, 0, 0 }; void setup() { PORTB = 0; PORTC = 0; PORTD = 0; DDRB = 0x0; DDRC = 0x0; DDRD = 0x0; EIFR = bit (INTF1); attachInterrupt(1, i_UPR, RISING); Serial.begin(115200); Serial.println(" "); Serial.println("Start test:"); } void i_UPR () { bitSet(DDRD, 7); bitSet(DDRD, SD); bitSet(DDRC, 1); //НГП nn++; flUPR = true; } void send_dc(byte d) { byte nc; PORTB = 0; PORTC = 0; PORTD = 0; if ((d & 0x1) == 0) DDRD |= 0x80; if ((d & 0x2) == 0) DDRD |= 0x40; if ((d & 0x4) == 0) DDRB |= 0x20; if ((d & 0x8) == 0) DDRB |= 0x10; if ((d & 0x10) == 0) DDRB |= 0x8; if ((d & 0x20) == 0) DDRB |= 0x4; if ((d & 0x40) == 0) DDRB |= 0x2; if ((d & 0x80) == 0) DDRB |= 0x1; nc=0; bitSet(DDRD, SD); while ((digitalRead(NPD) == LOW) && (nc < 100)) nc++; bitClear(DDRD, SD); DDRD = 0x0; DDRB = 0x0; DDRC = 0x0; } void loop() { byte nc; if (flUPR) { bitClear(DDRD, SD); bitClear(DDRC, 1); //НГП for ( byte i = 0; i < 8; i++) {nc=0;while ((digitalRead(NPD) == 0) && (nc < 100)) nc++; send_dc(1); }; flUPR = false; Serial.println(nn); }; }https://cloud.mail.ru/public/rhAV/6WJsRuoFr
Хорошо. ЦВМ ответила. Это главное. Теперь шаг за шагом надо добиться выхода на диалог и начало загрузки. Предлагаю оперативно поделать эти шаги. Первый - просто ждём что даёт ЦВМ. Нужны логи шины и данных. Сначала шины. Если ответит много, то и данных.
/*********************************************************** Подключение: СД - 2 НПД - A0 НГП - A1 УПР - 3 KнП - 4 ЛД0 - 7 ЛД1 - 6 ЛД2 - 13 ЛД3 - 12 ЛД4 - 11 ЛД5 - 10 ЛД6 - 9 ЛД7 - 8 ***********************************************************/ const byte INT_SD = 0; // Номер прерывания синхроимпульсов. const byte INT_UPR = 1; // Номер прерывания УПР. const byte NPD = 14; // Пин НПД A0. const byte NGP = 15; // Пин НГП A1. const byte SD = 2; // Пин Данные действительны. const byte UPR = 3; // Пин для сигнала УПР. const byte KnP = 4; // Пин Данные действительны. const unsigned char MASK = 0b11000000; // Маска для формирования байта. volatile bool flStart = false; volatile unsigned char Ch = 0, nc, nn = 0, stat = 0; volatile boolean flBuf = false, flUPR = false; volatile uint32_t tm, tmo, dt, tmd; char buf[32]; uint32_t tb[150]; uint8_t bb[150], cb[150], nhex; uint8_t ib[] = {0xFD, 0xFB, 0x83, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0xFB, 0xFD, 0xFB, 0x83, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0xFB, 0xFD, 0xFB, 0x85, 0x010, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x08, 0x01, 0x01, 0x01, 0x01, 0xF1, 0xF1, 0x01, 0x01, 0x01, 0x19, 0x01, 0xFD, 0x19, 0x83, 0x01, 0x98, 0xFB, 0x45, 0x40, 0xFD, 0x43, 0x00 }; uint8_t ic[] = {1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 0, 1, 1, 1, 0, 1, 1, 0, 0 }; void setup() { PORTB = 0; PORTC = 0; PORTD = 0; DDRB = 0x0; DDRC = 0x0; DDRD = 0x0; EIFR = bit (INTF1); attachInterrupt(1, i_UPR, RISING); Serial.begin(115200); Serial.println(" "); Serial.println("Start test:"); } void i_UPR () { bitSet(DDRD, 7); bitSet(DDRD, SD); bitSet(DDRC, 1); //НГП nn++; flUPR = true; } void send_dc(byte d) { byte nc; PORTB = 0; PORTC = 0; PORTD = 0; if ((d & 0x1) != 0) DDRD |= 0x80; if ((d & 0x2) != 0) DDRD |= 0x40; if ((d & 0x4) != 0) DDRB |= 0x20; if ((d & 0x8) != 0) DDRB |= 0x10; if ((d & 0x10) != 0) DDRB |= 0x8; if ((d & 0x20) != 0) DDRB |= 0x4; if ((d & 0x40) != 0) DDRB |= 0x2; if ((d & 0x80) != 0) DDRB |= 0x1; nc=0; bitSet(DDRD, SD); while ((digitalRead(NPD) == LOW) && (nc < 250)) nc++; bitClear(DDRD, SD); DDRD = 0x0; DDRB = 0x0; DDRC = 0x0; } void loop() { byte nc; if (flUPR) { delayMicroseconds(5); DDRD = 0x0; DDRB = 0x0; DDRC = 0x0; flUPR = false; Serial.println(nn); }; }https://cloud.mail.ru/public/v1r3/53sYH6RpY
Снова ответила, но ждёт подтверждения. Следующая программа посылает подтверждение nz раз. Специально ввёл константу nz - Количество запросов магнитофона. Вы можете её менять в пределах 1 - 8, начинаем с двух, и смотреть как ЦВМ реагирует на количество подтверждений. Логер по каналам. НПД, НГП, УПР, СД, КнП, ЛД7, ЛД6, ЛД0. Программа через 2 секунды после начала цикла останавливается и выдаёт все данные, которые пробежали по шине. Этот вывод тоже приводите в постах со ссылками на файлы логера.
/*********************************************************** Подключение: СД - 2 НПД - A0 НГП - A1 УПР - 3 KнП - 4 ЛД0 - 7 ЛД1 - 6 ЛД2 - 13 ЛД3 - 12 ЛД4 - 11 ЛД5 - 10 ЛД6 - 9 ЛД7 - 8 ***********************************************************/ const byte INT_SD = 0; // Номер прерывания синхроимпульсов. const byte INT_UPR = 1; // Номер прерывания УПР. const byte NPD = 14; // Пин НПД A0. const byte NGP = 15; // Пин НГП A1. const byte SD = 2; // Пин Данные действительны. const byte UPR = 3; // Пин для сигнала УПР. const byte KnP = 4; // Пин Данные действительны. const byte nz=2; // Количество запросов магнитофона. const unsigned char MASK = 0b11000000; // Маска для формирования байта. volatile bool flStart = true; volatile unsigned char Ch = 0, nc, nn = 0, stat = 0; volatile boolean flBuf = false, flUPR = false, flCh = false; volatile uint32_t tm, tmo, dt, tmd; char buf[32]; uint32_t tb[150]; uint8_t bb[150], cb[150], nhex; uint8_t ib[] = {0xFD, 0xFB, 0x83, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0xFB, 0xFD, 0xFB, 0x83, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0xFB, 0xFD, 0xFB, 0x85, 0x010, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x08, 0x01, 0x01, 0x01, 0x01, 0xF1, 0xF1, 0x01, 0x01, 0x01, 0x19, 0x01, 0xFD, 0x19, 0x83, 0x01, 0x98, 0xFB, 0x45, 0x40, 0xFD, 0x43, 0x00 }; uint8_t ic[] = {1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 0, 1, 1, 1, 0, 1, 1, 0, 0 }; void setup() { PORTB = 0; PORTC = 0; PORTD = 0; DDRB = 0x0; DDRC = 0x0; DDRD = 0x0; EIFR = bit (INTF0); attachInterrupt(0, input_char, FALLING); EIFR = bit (INTF1); attachInterrupt(1, i_UPR, RISING); Serial.begin(115200); Serial.println(" "); Serial.println("Start test:"); } void input_char () { flCh = true; bitSet(DDRC, 1); //НГП delayMicroseconds(1); Ch = ~((PINB & ~MASK) | (PIND & MASK)); bitClear(DDRC, 1); //НГП bb[nn]=Ch; cb[nn]=(PIND & 0x8); nn++; } void i_UPR () { detachInterrupt(0); bitSet(DDRD, 7); bitSet(DDRD, SD); bitSet(DDRC, 1); //НГП flUPR = true; } void send_dc(byte d) { byte nc; PORTB = 0; PORTC = 0; PORTD = 0; if ((d & 0x1) != 0) DDRD |= 0x80; if ((d & 0x2) != 0) DDRD |= 0x40; if ((d & 0x4) != 0) DDRB |= 0x20; if ((d & 0x8) != 0) DDRB |= 0x10; if ((d & 0x10) != 0) DDRB |= 0x8; if ((d & 0x20) != 0) DDRB |= 0x4; if ((d & 0x40) != 0) DDRB |= 0x2; if ((d & 0x80) != 0) DDRB |= 0x1; nc=0; bitSet(DDRD, SD); while ((digitalRead(NPD) == LOW) && (nc < 250)) nc++; bitClear(DDRD, SD); DDRD = 0x0; DDRB = 0x0; DDRC = 0x0; } void loop() { if (flUPR) { delayMicroseconds(3); DDRD = 0x0; DDRB = 0x0; DDRC = 0x0; delayMicroseconds(3); for ( byte i = 0; i < nz; i++) {byte nc=0; while ((digitalRead(NPD) != 0) && (nc < 250)) nc++; send_dc(1);}; EIFR = bit (INTF0); attachInterrupt(0, input_char, FALLING); flUPR = false; if (flStart) {cli();tmo=millis();sei(); flStart=false;}; }; if (!flStart) { cli(); tm=millis(); sei(); if (( tm -tmo ) > 2000L) { if (nn>0) for ( byte i = 0; i < nn; i++) { sprintf(buf, "%d %c %X", i,((cb[i] != 0 ) ? 'd' : 'c' ), bb[i]); Serial.println(buf); } else Serial.println("No data"); Serial.println("Stop"); DDRD = 0x0; DDRB = 0x0; DDRC = 0x0; while(1); } } }https://cloud.mail.ru/public/vWYR/Sra1ru6W9
https://cloud.mail.ru/public/vHWE/tPLM9ns8h
https://cloud.mail.ru/public/nsUx/vQrkfUEvd
https://cloud.mail.ru/public/26XZ/2S1Fmwwst
https://cloud.mail.ru/public/NWS3/nGYLPZK3C
https://cloud.mail.ru/public/mwNB/ccHDBYRAb
https://cloud.mail.ru/public/Ymdc/3aGuqmbW1
https://cloud.mail.ru/public/d3cf/ycCa18Hvs
Увиденные проблемы - ответ на первый УПР есть, но потом не видит наши запросы. Очень большие интервалы между запросами. Рано читает байт. Попытался сократить. Запустите 1 раз.
/*********************************************************** Подключение: СД - 2 НПД - A0 НГП - A1 УПР - 3 KнП - 4 ЛД0 - 7 ЛД1 - 6 ЛД2 - 13 ЛД3 - 12 ЛД4 - 11 ЛД5 - 10 ЛД6 - 9 ЛД7 - 8 ***********************************************************/ const byte INT_SD = 0; // Номер прерывания синхроимпульсов. const byte INT_UPR = 1; // Номер прерывания УПР. const byte NPD = 14; // Пин НПД A0. const byte NGP = 15; // Пин НГП A1. const byte SD = 2; // Пин Данные действительны. const byte UPR = 3; // Пин для сигнала УПР. const byte KnP = 4; // Пин Данные действительны. const byte nz=8; // Количество запросов магнитофона. const unsigned char MASK = 0b11000000; // Маска для формирования байта. volatile bool flStart = true; volatile unsigned char Ch = 0, nc, nn = 0, stat = 0; volatile boolean flBuf = false, flUPR = false, flCh = false; volatile uint32_t tm, tmo, dt, tmd; char buf[32]; uint32_t tb[150]; uint8_t bb[150], cb[150], nhex; uint8_t ib[] = {0xFD, 0xFB, 0x83, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0xFB, 0xFD, 0xFB, 0x83, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0xFB, 0xFD, 0xFB, 0x85, 0x010, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x08, 0x01, 0x01, 0x01, 0x01, 0xF1, 0xF1, 0x01, 0x01, 0x01, 0x19, 0x01, 0xFD, 0x19, 0x83, 0x01, 0x98, 0xFB, 0x45, 0x40, 0xFD, 0x43, 0x00 }; uint8_t ic[] = {1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 0, 1, 1, 1, 0, 1, 1, 0, 0 }; void setup() { PORTB = 0; PORTC = 0; PORTD = 0; DDRB = 0x0; DDRC = 0x0; DDRD = 0x0; EIFR = bit (INTF0); attachInterrupt(0, input_char, FALLING); EIFR = bit (INTF1); attachInterrupt(1, i_UPR, RISING); Serial.begin(115200); Serial.println(" "); Serial.println("Start test:"); } void input_char () { flCh = true; bitSet(DDRC, 1); //НГП delayMicroseconds(2); Ch = ~((PINB & ~MASK) | (PIND & MASK)); bitClear(DDRC, 1); //НГП bb[nn]=Ch; cb[nn]=(PIND & 0x8); nn++; } void i_UPR () { detachInterrupt(0); bitSet(DDRD, 7); bitSet(DDRD, SD); bitSet(DDRC, 1); //НГП flUPR = true; } void send_dc(byte d) { byte nc; PORTB = 0; PORTC = 0; PORTD = 0; if ((d & 0x1) != 0) DDRD |= 0x80; if ((d & 0x2) != 0) DDRD |= 0x40; if ((d & 0x4) != 0) DDRB |= 0x20; if ((d & 0x8) != 0) DDRB |= 0x10; if ((d & 0x10) != 0) DDRB |= 0x8; if ((d & 0x20) != 0) DDRB |= 0x4; if ((d & 0x40) != 0) DDRB |= 0x2; if ((d & 0x80) != 0) DDRB |= 0x1; nc=0; bitSet(DDRD, SD); while ((bitRead(PINC, 0) == 0 ) && (nc < 250)) nc++; //Пока HПД == 0 ждём или таймаут bitClear(DDRD, SD); DDRD = 0x0; DDRB = 0x0; DDRC = 0x0; } void loop() { if (flUPR) { delayMicroseconds(3); DDRD = 0x0; DDRB = 0x0; DDRC = 0x0; delayMicroseconds(3); for ( byte i = 0; i < nz; i++) {byte nc=0; while ((bitRead(PINC, 1) == 0) && (nc < 250)) nc++; send_dc(1);}; EIFR = bit (INTF0); attachInterrupt(0, input_char, FALLING); flUPR = false; if (flStart) {cli();tmo=millis();sei(); flStart=false;}; }; if (!flStart) { cli(); tm=millis(); sei(); if (( tm -tmo ) > 2000L) { if (nn>0) for ( byte i = 0; i < nn; i++) { sprintf(buf, "%d %c %X", i,((cb[i] != 0 ) ? 'd' : 'c' ), bb[i]); Serial.println(buf); } else Serial.println("No data"); Serial.println("Stop"); DDRD = 0x0; DDRB = 0x0; DDRC = 0x0; while(1); } } }https://cloud.mail.ru/public/24Cx/vS2sduwhC
https://cloud.mail.ru/public/PJAW/ZfrTFGtQR
Не было контакта логера с линией НГП. ЦВМ съела второй запрос и пошла крутить обмен дальше. Проверьте НГП и поставьте nz=2. И ещё раз снять данные логером.
https://cloud.mail.ru/public/66pv/4KeYUVnY1
https://cloud.mail.ru/public/mc8G/gEAaL5adc
Не успел только nz 2 переправить цех закрывали. Завтра переправлю.
Привёл в соответствие с диаграммами и логами первые три качания УПР. Интересно что получилось. Проверьте канал логера НГП он не пишет.
/*********************************************************** Подключение: СД - 2 НПД - A0 НГП - A1 УПР - 3 KнП - 4 ЛД0 - 7 ЛД1 - 6 ЛД2 - 13 ЛД3 - 12 ЛД4 - 11 ЛД5 - 10 ЛД6 - 9 ЛД7 - 8 ***********************************************************/ const byte INT_SD = 0; // Номер прерывания синхроимпульсов. const byte INT_UPR = 1; // Номер прерывания УПР. const byte NPD = 14; // Пин НПД A0. const byte NGP = 15; // Пин НГП A1. const byte SD = 2; // Пин Данные действительны. const byte UPR = 3; // Пин для сигнала УПР. const byte KnP = 4; // Пин Данные действительны. const byte nz=8; // Количество запросов магнитофона. const unsigned char MASK = 0b11000000; // Маска для формирования байта. volatile bool flStart = false; volatile unsigned char Ch = 0, nc, nn = 0, stat = 0, nu = 0; volatile boolean flBuf = false, flUPR = false, flCh = false; volatile uint32_t tm, tmo, dt, tmd; char buf[32]; uint32_t tb[150]; uint8_t bb[150], cb[150], nhex; uint8_t ib[] = {0xFD, 0xFB, 0x83, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0xFB, 0xFD, 0xFB, 0x83, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0xFB, 0xFD, 0xFB, 0x85, 0x010, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x08, 0x01, 0x01, 0x01, 0x01, 0xF1, 0xF1, 0x01, 0x01, 0x01, 0x19, 0x01, 0xFD, 0x19, 0x83, 0x01, 0x98, 0xFB, 0x45, 0x40, 0xFD, 0x43, 0x00 }; uint8_t ic[] = {1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 0, 1, 1, 1, 0, 1, 1, 0, 0 }; void setup() { PORTB = 0; PORTC = 0; PORTD = 0; DDRB = 0x0; DDRC = 0x0; DDRD = 0x0; EIFR = bit (INTF0); attachInterrupt(0, input_char, FALLING); EIFR = bit (INTF1); attachInterrupt(1, i_UPR, RISING); Serial.begin(115200); Serial.println(" "); Serial.println("Start test:"); } void input_char () { bitSet(DDRC, 1); //НГП delayMicroseconds(1); Ch = ~((PINB & ~MASK) | (PIND & MASK)); bitSet(DDRC, 0); //НПД delayMicroseconds(1); bitClear(DDRC, 0); //НПД bb[nn]=Ch; cb[nn]=(PIND & 0x8); nn++; if (nn>149) nn=148; flCh = true; bitClear(DDRC, 1); //НГП } void i_UPR () { if (nu==0 || nu==2) { bitSet(DDRD, 7); // ЛД7 = 1 detachInterrupt(0); bitSet(DDRD, SD); delayMicroseconds(1); while ((bitRead(PINC, 0) == 0 ) && (nc < 250)) nc++; //Пока HПД_0 == 0 ждём или таймаут bitClear(DDRD, SD); flUPR = true; nu++; } } void send_dc(byte d) { byte nc; if ((d & 0x1) != 0) DDRD |= 0x80; if ((d & 0x2) != 0) DDRD |= 0x40; if ((d & 0x4) != 0) DDRB |= 0x20; if ((d & 0x8) != 0) DDRB |= 0x10; if ((d & 0x10) != 0) DDRB |= 0x8; if ((d & 0x20) != 0) DDRB |= 0x4; if ((d & 0x40) != 0) DDRB |= 0x2; if ((d & 0x80) != 0) DDRB |= 0x1; nc=0; bitSet(DDRD, SD); delayMicroseconds(1); while ((bitRead(PINC, 0) == 0 ) && (nc < 250)) nc++; //Пока HПД_0 == 0 ждём или таймаут bitClear(DDRD, SD); DDRD = 0x0; DDRB = 0x0; DDRC = 0x0; } void loop() { if (flUPR) { PORTB = 0; PORTC = 0; PORTD = 0; while (((PIND & 0x8)!=0) && ((PIND & 0x10)!=0)) // Пока нет УПР или КнП посылаем 0х1 { byte nc=0; while ((bitRead(PINC, 1) == 0) && (nc < 250)) nc++; //Пока HПД_0 == 0 ждём или таймаут send_dc(1); }; EIFR = bit (INTF0); attachInterrupt(0, input_char, FALLING); flUPR = false; if (!flStart) {cli();tmo=millis();sei(); flStart=true;}; }; if (flStart) { cli(); tm=millis(); sei(); if (( tm -tmo ) > 2000L) { if (nn>0) for ( byte i = 0; i < nn; i++) { sprintf(buf, "%d %c %X", i,((cb[i] != 0 ) ? 'd' : 'c' ), bb[i]); Serial.println(buf); } else Serial.println("No data"); Serial.println("Stop"); DDRD = 0x0; DDRB = 0x0; DDRC = 0x0; while(1); } } }https://cloud.mail.ru/public/xQi4/V4GTHfmqW
https://cloud.mail.ru/public/SJKY/9ZNmZNF7Y
Звезда в шоке. Не сработало условие while ((bitRead(PINC, 0) == 0 ) && (nc < 250) nc++; Как только НПД - PINC бит 0 - контакт А0 УНЫ - станет равным единицы и соответственно условие bitRead(PINC, 0) == 0 станет ложным программа должна вывалится из while, а вываливается по таймауту через 21 мкс. С чем это связано? Может быть контакт? Кстати, нет контакта между ЛД1 и УНОй Проверьте тестером , а ещё лучше осциллографом прямо на ноге УНЫ А0 соединение с НГП. Прямо на железе ноги должно колебаться что то. Два канала ПНД и СД надо получить чтобы поле перехода ПНД 0->1 через 1 мкс СД тоже перешла 0->1.
Попробуй в подпрограмме i_UPR заменить bitRead(PINC, 0) == 0 на PINC & 0x1 == 0. Может быть что то изменится? Хотя макрос bitRead именно так и разворачивается.
https://cloud.mail.ru/public/PWsf/369vfat7z
https://cloud.mail.ru/public/7G5G/YGkWpUCgV
Из задержки включения УПР тянулась лишняя единичка. Добавим задержки чуть чуть.
/*********************************************************** Подключение: СД - 2 НПД - A0 НГП - A1 УПР - 3 KнП - 4 ЛД0 - 7 ЛД1 - 6 ЛД2 - 13 ЛД3 - 12 ЛД4 - 11 ЛД5 - 10 ЛД6 - 9 ЛД7 - 8 ***********************************************************/ const byte INT_SD = 0; // Номер прерывания синхроимпульсов. const byte INT_UPR = 1; // Номер прерывания УПР. const byte NPD = 14; // Пин НПД A0. const byte NGP = 15; // Пин НГП A1. const byte SD = 2; // Пин Данные действительны. const byte UPR = 3; // Пин для сигнала УПР. const byte KnP = 4; // Пин Данные действительны. const byte nz=8; // Количество запросов магнитофона. const unsigned char MASK = 0b11000000; // Маска для формирования байта. volatile bool flStart = false; volatile unsigned char Ch = 0, nc, nn = 0, stat = 0, nu = 0; volatile boolean flBuf = false, flUPR = false, flCh = false; volatile uint32_t tm, tmo, dt, tmd; char buf[32]; uint32_t tb[150]; uint8_t bb[150], cb[150], nhex; uint8_t ib[] = {0xFD, 0xFB, 0x83, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0xFB, 0xFD, 0xFB, 0x83, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0xFB, 0xFD, 0xFB, 0x85, 0x010, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x08, 0x01, 0x01, 0x01, 0x01, 0xF1, 0xF1, 0x01, 0x01, 0x01, 0x19, 0x01, 0xFD, 0x19, 0x83, 0x01, 0x98, 0xFB, 0x45, 0x40, 0xFD, 0x43, 0x00 }; uint8_t ic[] = {1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 0, 1, 1, 1, 0, 1, 1, 0, 0 }; void setup() { PORTB = 0; PORTC = 0; PORTD = 0; DDRB = 0x0; DDRC = 0x0; DDRD = 0x0; EIFR = bit (INTF0); attachInterrupt(0, input_char, FALLING); EIFR = bit (INTF1); attachInterrupt(1, i_UPR, RISING); Serial.begin(115200); Serial.println(" "); Serial.println("Start test:"); } void input_char () { bitSet(DDRC, 1); //НГП delayMicroseconds(1); Ch = ~((PINB & ~MASK) | (PIND & MASK)); bitSet(DDRC, 0); //НПД delayMicroseconds(1); bitClear(DDRC, 0); //НПД bb[nn]=Ch; cb[nn]=(PIND & 0x8); nn++; if (nn>149) nn=148; flCh = true; bitClear(DDRC, 1); //НГП } void i_UPR () { if (nu==0 || nu==2) { bitSet(DDRD, 7); // ЛД7 = 1 detachInterrupt(0); bitSet(DDRD, SD); delayMicroseconds(1); while ((bitRead(PINC, 0) == 0 ) && (nc < 250)) nc++; //Пока HПД_0 == 0 ждём или таймаут bitClear(DDRD, SD); flUPR = true; nu++; } } void send_dc(byte d) { byte nc; if ((d & 0x1) != 0) DDRD |= 0x80; if ((d & 0x2) != 0) DDRD |= 0x40; if ((d & 0x4) != 0) DDRB |= 0x20; if ((d & 0x8) != 0) DDRB |= 0x10; if ((d & 0x10) != 0) DDRB |= 0x8; if ((d & 0x20) != 0) DDRB |= 0x4; if ((d & 0x40) != 0) DDRB |= 0x2; if ((d & 0x80) != 0) DDRB |= 0x1; nc=0; bitSet(DDRD, SD); delayMicroseconds(1); while ((bitRead(PINC, 0) == 0 ) && (nc < 250)) nc++; //Пока HПД_0 == 0 ждём или таймаут bitClear(DDRD, SD); DDRD = 0x0; DDRB = 0x0; DDRC = 0x0; } void loop() { if (flUPR) { PORTB = 0; PORTC = 0; PORTD = 0; while (((PIND & 0x8)!=0) && ((PIND & 0x10)!=0)) // Пока нет УПР или КнП посылаем 0х1 { byte nc=0; while ((bitRead(PINC, 1) == 0) && (nc < 250)) nc++; //Пока HПД_0 == 0 ждём или таймаут send_dc(1); delayMicroseconds(2); }; EIFR = bit (INTF0); attachInterrupt(0, input_char, FALLING); flUPR = false; if (!flStart) {cli();tmo=millis();sei(); flStart=true;}; }; if (flStart) { cli(); tm=millis(); sei(); if (( tm -tmo ) > 2000L) { if (nn>0) for ( byte i = 0; i < nn; i++) { sprintf(buf, "%d %c %X", i,((cb[i] != 0 ) ? 'd' : 'c' ), bb[i]); Serial.println(buf); } else Serial.println("No data"); Serial.println("Stop"); DDRD = 0x0; DDRB = 0x0; DDRC = 0x0; while(1); } } }А ещё мне очень не нравиться лишние нули считываемые УНОй. Похоже на плохой контакт СД с УНОй. Проверьте пожалуйста. Нулей 1,4,5,7 быть не должно. Вот вывод:
https://cloud.mail.ru/public/6rdR/1mFxdqGBz
На уне почему-то пусто, уже все контакты перетрёс.
Стало ещё хуже. Просто непрерывная наводка на СД УНЫ - на логере нет. Поэтому пусто - висит в прерывании на СД и не может выбраться. Посмотрите осциллографом что твориться на ноге 2 УНЫ. Возможно надо подтянуть резистором 1к к +3.3 вольта. Но задержка сработала. Теперь избавиться от наводки и смотреть дальше. Первую ступень отработали. Точное соответствие магнитофону. Всего 4 ступени до запуска обмена программой. Надо проверить землю логера и УНЫ. Бывает что дело не в линии а в земле.
Долго смотрел и анализировал. Чем дальше смотрю, тем меньше понимаю. Если бы это была чистая наводка на СД, то данные падали бы до начала цикла. Однако до начала всё спокойно. Первое ложное срабатывание прерывания идёт после первого нормального. Или по другому наводка идёт только тогда когда сигнал УПР = 0 вольт. Искать надо где то здесь - может какой то "лишний" контакт с УПР.
В чем подразумевается "лишний"? Задумку пока Вашу не понял.
Подразумевается прямо. Есть лишний контакт. Посмотрите осцилографом на СД на ноге уны во время цикла, и логер на максимальную скорость и два канала на СД один на шину, второй на ногу УНЫ. Чудес не бывает. На СД УНЫ есть импульсы около 200 кГц только когда УПР низкий уровень. Или аккуратно пересоберите схему. Желательно совсем без скруток и длинных петель провода.
Плата nucleo-64 STM32F411 уже у меня. По контактам пока работаю.
Нолики всё равно бегают. В программе есть массив ib - правильная последовательность данных на шине, которую мы должны получить. Попробуйте программу. В ней я закомментировал чтение данных. Снимите данные на скорости оцифровки логера 24МГц. На меньших скоростях наводок не увидеть. Потом раскомментируйте 3 строки с ...attachInterrupt(0... Это включит чтение. Оцифруйте так же - с той же скоростью и соединениями. Можно будет сравнить есть ли лишние импульсы от ложного чтения на шинах.
/*********************************************************** Подключение: СД - 2 НПД - A0 НГП - A1 УПР - 3 KнП - 4 ЛД0 - 7 ЛД1 - 6 ЛД2 - 13 ЛД3 - 12 ЛД4 - 11 ЛД5 - 10 ЛД6 - 9 ЛД7 - 8 ***********************************************************/ const byte INT_SD = 0; // Номер прерывания синхроимпульсов. const byte INT_UPR = 1; // Номер прерывания УПР. const byte NPD = 14; // Пин НПД A0. const byte NGP = 15; // Пин НГП A1. const byte SD = 2; // Пин Данные действительны. const byte UPR = 3; // Пин для сигнала УПР. const byte KnP = 4; // Пин Данные действительны. const byte nz=8; // Количество запросов магнитофона. const unsigned char MASK = 0b11000000; // Маска для формирования байта. volatile bool flStart = false, i0 = false, i1 = false; volatile unsigned char Ch = 0, nc, nn = 0, stat = 0, nu = 0; volatile boolean flBuf = false, flUPR = false, flCh = false; volatile uint32_t tm, tmo, dt, tmd; char buf[32]; uint32_t tb[150]; uint8_t bb[150], cb[150], nhex; uint8_t ib[] = {0xFD, 0xFB, 0x83, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0xFB, 0xFD, 0xFB, 0x83, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0xFB, 0xFD, 0xFB, 0x85, 0x010, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x08, 0x01, 0x01, 0x01, 0x01, 0xF1, 0xF1, 0x01, 0x01, 0x01, 0x19, 0x01, 0xFD, 0x19, 0x83, 0x01, 0x98, 0xFB, 0x45, 0x40, 0xFD, 0x43, 0x00 }; uint8_t ic[] = {1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 0, 1, 1, 1, 0, 1, 1, 0, 0 }; void setup() { PORTB = 0; PORTC = 0; PORTD = 0; DDRB = 0x0; DDRC = 0x0; DDRD = 0x0; // if (!i0) { EIFR = bit (INTF0); attachInterrupt(0, input_char, FALLING); i0=true;}; if (!i1) { EIFR = bit (INTF1); attachInterrupt(1, i_UPR, RISING); i1=true;}; Serial.begin(115200); Serial.println(" "); Serial.println("Start test:"); } void input_char () { bitSet(DDRC, 1); //НГП delayMicroseconds(1); Ch = ~((PINB & ~MASK) | (PIND & MASK)); bitSet(DDRC, 0); //НПД delayMicroseconds(1); bitClear(DDRC, 0); //НПД bb[nn]=Ch; cb[nn]=(PIND & 0x8); nn++; if (nn>149) nn=148; flCh = true; bitClear(DDRC, 1); //НГП } void i_UPR () { if (nu==0 || nu==2) { bitSet(DDRD, 7); // ЛД7 = 1 if (i0) {detachInterrupt(0); i0=false;}; bitSet(DDRD, SD); delayMicroseconds(1); while ((bitRead(PINC, 0) == 0 ) && (nc < 250)) nc++; //Пока HПД_0 == 0 ждём или таймаут bitClear(DDRD, SD); flUPR = true; nu++; } } void send_dc(byte d) { byte nc; if ((d & 0x1) != 0) DDRD |= 0x80; if ((d & 0x2) != 0) DDRD |= 0x40; if ((d & 0x4) != 0) DDRB |= 0x20; if ((d & 0x8) != 0) DDRB |= 0x10; if ((d & 0x10) != 0) DDRB |= 0x8; if ((d & 0x20) != 0) DDRB |= 0x4; if ((d & 0x40) != 0) DDRB |= 0x2; if ((d & 0x80) != 0) DDRB |= 0x1; nc=0; bitSet(DDRD, SD); delayMicroseconds(1); while ((bitRead(PINC, 0) == 0 ) && (nc < 250)) nc++; //Пока HПД_0 == 0 ждём или таймаут bitClear(DDRD, SD); DDRD = 0x0; DDRB = 0x0; DDRC = 0x0; } void loop() { if (flUPR) { PORTB = 0; PORTC = 0; PORTD = 0; while (((PIND & 0x8)!=0) && ((PIND & 0x10)!=0)) // Пока нет УПР или КнП посылаем 0х1 { byte nc=0; while ((bitRead(PINC, 1) == 0) && (nc < 250)) nc++; //Пока HПД_0 == 0 ждём или таймаут send_dc(1); delayMicroseconds(3); }; // if (!i0) { EIFR = bit (INTF0); attachInterrupt(0, input_char, FALLING); i0=true;}; flUPR = false; if (!flStart) {cli();tmo=millis();sei(); flStart=true;}; }; if (nu==9) { if (i0) {detachInterrupt(0); i0=false;}; if (i1) {detachInterrupt(1); i1=false;}; for ( int i = 0; i < 1000; i++) { delayMicroseconds(25);send_dc(0);}; delayMicroseconds(20); bitSet(DDRD, UPR); send_dc(0x43); delayMicroseconds(120); bitClear(DDRD, UPR); delayMicroseconds(120); bitSet(DDRD, UPR); send_dc(0x43); delayMicroseconds(120); bitClear(DDRD, UPR); // if (!i0) { EIFR = bit (INTF0); attachInterrupt(0, input_char, FALLING); i0=true;}; delayMicroseconds(800); if (nn>0) for ( byte i = 0; i < nn; i++) { if (i0) {detachInterrupt(0); i0=false;}; sprintf(buf, "%d %c %X", i,((cb[i] != 0 ) ? 'd' : 'c' ), bb[i]); Serial.println(buf); } else Serial.println("No data"); Serial.println("Stop"); if (i0) {detachInterrupt(0); i0=false;}; DDRD = 0x0; DDRB = 0x0; DDRC = 0x0; while(1); } if (flStart) { cli(); tm=millis(); sei(); if (( tm -tmo ) > 5000L) { if (nn>0) for ( byte i = 0; i < nn; i++) { sprintf(buf, "%d %c %X", i,((cb[i] != 0 ) ? 'd' : 'c' ), bb[i]); Serial.println(buf); } else Serial.println("No data"); Serial.println("Stop"); DDRD = 0x0; DDRB = 0x0; DDRC = 0x0; if (i0) {detachInterrupt(0); i0=false;}; if (i1) {detachInterrupt(1); i1=false;}; while(1); } } }https://cloud.mail.ru/public/FeB8/kCuxDJnHi
https://cloud.mail.ru/public/5F7E/za1wpHnoo
Можно больше подробностей? Это закомментировано - раскомментировано?
А по графикам - нет контакта УНЫ и НПД.