Устройство КС-017А-1 на перфоленте

nik182
Offline
Зарегистрирован: 04.05.2015

Попробовал сделать программу для шапки. Нужно проверить как ЦВМ отреагирует. Отключить магнитофон. Подключить УНУ согласно приведенной карте соединений. Обращаю внимание. СД , УПР, КнП к ногам 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; 
    }
}

 

61732
Offline
Зарегистрирован: 11.10.2020

Подключаю

nik182
Offline
Зарегистрирован: 04.05.2015

Магнитофон должен быть отключен от всех шлейфов. Сегодня в 11:00 я поменял программу.

61732
Offline
Зарегистрирован: 11.10.2020

На мониторе только старт тест. На логанализаторе  ничего.

nik182
Offline
Зарегистрирован: 04.05.2015

При отключении магнитофона раньше после нажатия старт ЦВМ выдавала 4 байта и загоралась ошибка. Сейчас не так? Отключите плату. Получите 4 импульса ЦВМ, подключите плату и посмотрите что изменилось. Плата после надписи старт тест стоит в режиме высокого сопротивления ног и не может влиять на линии сигналов. По крайней мере хоть один импульс от ЦВМ должен быть.  

61732
Offline
Зарегистрирован: 11.10.2020

Если ардуино отключить сигнал проходит, если ардуино подключить обратно сигнал пропадает.

nik182
Offline
Зарегистрирован: 04.05.2015

Значит надо проверить сигналы на линиях до и после подключения ардуины. После подключения и включения ардуины до нажатия кнопки старт. Все линии сигналов Должныбыть +3.3 В. Если какой то сигнал 0 вольт - сообщите. Буду смотреть что в программе не так.    

61732
Offline
Зарегистрирован: 11.10.2020

Это я лопух, земля на соплях была. На мониторе  старт тест. На логанализаторе 

https://cloud.mail.ru/public/1Yjv/jvAeWHPJd

nik182
Offline
Зарегистрирован: 04.05.2015

Не сработала программа.

Добавил тестовый вывод. Посмотрим почему.

/***********************************************************
  Подключение:
  СД  - 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; 
    }
}

 

nik182
Offline
Зарегистрирован: 04.05.2015

Прошу три запуска. Только вывод сериала. Переключать ничего не надо.  

61732
Offline
Зарегистрирован: 11.10.2020

На мониторе 

1 раз

83 потом нули  

2 раз

2 нуля

3 раз 

3 нуля

 

nik182
Offline
Зарегистрирован: 04.05.2015
/***********************************************************
  Подключение:
  СД  - 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; 
    }
}

Снять с записью логанализатором.

61732
Offline
Зарегистрирован: 11.10.2020
nik182
Offline
Зарегистрирован: 04.05.2015

Был вывод в сериал цифры 0?

61732
Offline
Зарегистрирован: 11.10.2020

на мониторе была цифра 1. 

nik182
Offline
Зарегистрирован: 04.05.2015

Программа по неизвестной причине генерит непрерывно сигнал НГП после начала цикла.  К тому же она не сгенерила сигнал СД по прерыванию от УПР, хотя прерывание сработало. Надо проверить соединения. СД должно быть на ноге D2 уны и на этой ноге должен быть сигнал по окончанию первого сигнала УПР. Это надо проверить. Для этого канал 7 логанализатора надо подсоединит прямо на ногу уны D2. И снять ещё раз отсоединив от уны линию НГП - А1. 

61732
Offline
Зарегистрирован: 11.10.2020

Понял. В понедельник сделаю.

nik182
Offline
Зарегистрирован: 04.05.2015

Честно говоря, я уже не вижу смысла что то делать с уной. Попробовать только отреагирует ли ЦВМ на сигнал СД. Это я к вечеру напишу. 

61732
Offline
Зарегистрирован: 11.10.2020

Спасибо.

61732
Offline
Зарегистрирован: 11.10.2020
61732
Offline
Зарегистрирован: 11.10.2020

Уже не в понедельник #247, а в четверг. Говорят, что болеют.

nik182
Offline
Зарегистрирован: 04.05.2015

Это ничего. Время есть.

Попробуйте без магнитофона, со всеми соединениями. По логанализатору, после фронта УПР 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);
  };
}

       

61732
Offline
Зарегистрирован: 11.10.2020
nik182
Offline
Зарегистрирован: 04.05.2015

Ну вот. Получили необходимые сигналы, но не получили необходимой реакции ЦВМ. . Красная стрелка показывает, что с точностью до нескольких микросекунд ситуация с сигналами смоделирована. Однако, ЦВМ опять выставляет УПР. Необходимо искать причину. Логанализатором необходимо просмотреть все линии - и сигналов и данных, отдельно с магнитофоном и отдельно с программой. Найти в чём разница когда магнитофон подключен и отключен. Без этого двигаться дальше бесполезно.  

nik182
Offline
Зарегистрирован: 04.05.2015

Одно отличие нашёл. Попробуйте вот эту.

/***********************************************************
  Подключение:
  СД  - 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);
  };
}

 

61732
Offline
Зарегистрирован: 11.10.2020
nik182
Offline
Зарегистрирован: 04.05.2015

Хорошо. ЦВМ ответила. Это главное. Теперь шаг за шагом надо добиться выхода на диалог и начало загрузки. Предлагаю оперативно поделать эти шаги. Первый - просто ждём что даёт ЦВМ. Нужны логи шины и данных. Сначала шины. Если ответит много, то и данных. 

/***********************************************************
  Подключение:
  СД  - 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);
  };
}

 

61732
Offline
Зарегистрирован: 11.10.2020
nik182
Offline
Зарегистрирован: 04.05.2015

Снова ответила, но ждёт подтверждения. Следующая программа посылает подтверждение 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);
    }
  }
}

 

61732
Offline
Зарегистрирован: 11.10.2020
nik182
Offline
Зарегистрирован: 04.05.2015

Увиденные проблемы - ответ на первый УПР есть, но потом не видит наши запросы. Очень большие интервалы между запросами. Рано читает байт.  Попытался сократить. Запустите 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);
    }
  }
}

 

 

61732
Offline
Зарегистрирован: 11.10.2020
nik182
Offline
Зарегистрирован: 04.05.2015

Не было контакта логера с линией НГП. ЦВМ съела второй запрос и пошла крутить обмен дальше. Проверьте НГП и поставьте nz=2. И ещё раз снять данные логером.

 

61732
Offline
Зарегистрирован: 11.10.2020

https://cloud.mail.ru/public/66pv/4KeYUVnY1

https://cloud.mail.ru/public/mc8G/gEAaL5adc

Не успел только nz 2 переправить цех закрывали. Завтра  переправлю.

 
nik182
Offline
Зарегистрирован: 04.05.2015

Привёл в соответствие с диаграммами и логами первые три качания УПР. Интересно что получилось. Проверьте канал логера НГП он не пишет.

/***********************************************************
  Подключение:
  СД  - 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);
    }
  }
}

 

61732
Offline
Зарегистрирован: 11.10.2020
nik182
Offline
Зарегистрирован: 04.05.2015

Звезда в шоке. Не сработало условие 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 именно так и разворачивается. 

61732
Offline
Зарегистрирован: 11.10.2020
nik182
Offline
Зарегистрирован: 04.05.2015

Из задержки включения УПР тянулась лишняя единичка. Добавим задержки чуть чуть.

/***********************************************************
  Подключение:
  СД  - 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);
    }
  }
}

  

nik182
Offline
Зарегистрирован: 04.05.2015

А ещё мне очень не нравиться лишние нули считываемые УНОй. Похоже на плохой контакт СД с УНОй. Проверьте пожалуйста. Нулей 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

 

61732
Offline
Зарегистрирован: 11.10.2020

https://cloud.mail.ru/public/6rdR/1mFxdqGBz

На уне почему-то пусто, уже все контакты перетрёс.

 

nik182
Offline
Зарегистрирован: 04.05.2015

Стало ещё хуже. Просто непрерывная наводка на СД УНЫ - на логере нет. Поэтому пусто - висит в прерывании на СД и не может выбраться. Посмотрите осциллографом что твориться на ноге 2 УНЫ. Возможно надо подтянуть резистором 1к  к  +3.3 вольта. Но задержка сработала. Теперь избавиться от наводки и смотреть дальше. Первую ступень отработали. Точное соответствие магнитофону. Всего 4 ступени до запуска обмена программой. Надо проверить землю логера и УНЫ. Бывает что дело не в линии а в земле. 

nik182
Offline
Зарегистрирован: 04.05.2015

Долго смотрел и анализировал. Чем дальше смотрю, тем меньше понимаю. Если бы это была чистая наводка на СД, то данные падали бы до начала цикла. Однако до начала всё спокойно. Первое ложное срабатывание прерывания идёт после первого нормального. Или по другому наводка идёт только тогда когда сигнал УПР = 0 вольт. Искать надо где то здесь - может какой то "лишний" контакт с УПР.  

61732
Offline
Зарегистрирован: 11.10.2020

В чем подразумевается "лишний"? Задумку пока Вашу не понял.

nik182
Offline
Зарегистрирован: 04.05.2015

Подразумевается прямо. Есть лишний контакт. Посмотрите осцилографом на СД на ноге уны во время цикла, и логер на максимальную скорость и два канала на СД один на шину, второй на ногу УНЫ. Чудес не бывает. На СД УНЫ есть импульсы около 200 кГц только когда УПР низкий уровень.  Или аккуратно пересоберите схему. Желательно совсем без скруток и длинных петель провода.

61732
Offline
Зарегистрирован: 11.10.2020

Плата nucleo-64 STM32F411 уже у меня. По контактам пока работаю.

61732
Offline
Зарегистрирован: 11.10.2020

nik182
Offline
Зарегистрирован: 04.05.2015

Нолики всё равно бегают. В программе есть массив 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);
    }
  }
}

 

61732
Offline
Зарегистрирован: 11.10.2020
nik182
Offline
Зарегистрирован: 04.05.2015

Можно больше подробностей? Это закомментировано - раскомментировано?

А по графикам - нет контакта УНЫ и НПД.