Получилось что то странное. Иногда время до следующего байта отрицательное. Надо запретить прерывания при выводе micros. cli(); sei(); micros окружить, может что изменится. Но по крайней мере видно, с какой команды поехала лента магнитофона - ей почти 200 мс надо стартануть и до первой дырки домотать - потом дырки идут через 2 мс , а обмен между компом и магом по 500 мкс. Такую задержку надо вписать в программу. Сейчас 5 мкс вписано. Надо увеличить. И обязательно НГП НДП подключить. И в программу ввести.
/***********************************************************
Подключение:
ЛД0 - 7 // 8
ЛД1 - 6 // 9
ЛД2 - 13 // 10
ЛД3 - 12 // 11
ЛД4 - 11 // 12
ЛД5 - 10 // 13
ЛД6 - 9 // 6
ЛД7 - 8 // 7
СД - 2
УПР - 5
ЗО - 4
***********************************************************/
const int PIN_CLOCK = 2; // Пин синхроимпульсов.
const int INT_CLOCK = 0; // Номер прерывания синхроимпульсов.
const int DOP_6 = 9; //6; // Пин шестого разряда данных.
const int DOP_7 = 8; //7; // Пин седьмого разряда данных.
const int UPR = 5; // Пин для сигнала УПР.
const int ZO = 4; // Пин для сигнала ЗО.
const unsigned char MASK = 0b11000000; // Маска для формирования байта.
unsigned char bufferCh;
boolean bufferFlag;
void setup()
{
attachInterrupt(INT_CLOCK, input_char, FALLING);
bufferFlag = false;
pinMode(DOP_6, INPUT);
pinMode(DOP_7, INPUT);
pinMode(UPR, INPUT);
pinMode(ZO, INPUT);
DDRB = MASK;
pinMode(PIN_CLOCK, INPUT_PULLUP);
Serial.begin(57600);
Serial.println("Start test:");
Serial.println();
}
void input_char ()
{
static byte nhex=0;
static unsigned long timo;
delayMicroseconds(3);
bufferCh = ~((PINB & ~MASK) | (PIND & MASK));
cli();
unsigned long time=micros();
sei();
Serial.print( time );
Serial.write(' ');
Serial.print( (time-timo );
Serial.write(' ');
Serial.write( digitalRead(UPR) ? 'd' : 'c' );
if (bufferCh<16) Serial.write('0');
Serial.println(bufferCh, HEX);
nimo=time;
}
void loop()
{
}
А как у Вас с программированием? На этом этапе надо сделать несколько раз мелкие исправления программ, в зависимости от результатов. Если это будем делать как сейчас, то уйдёт много времени. Я могу описать алгоритм действий, и если Вы сможете менять программу и проверят, то за день может получиться всё настроить.
Уже лучше. Отрицательного времени нет. Но начало стремное. По хорошему надо нажать ресет на уне, потом нажать пуск на пульте. Если всё штатно, то первое время = время между нажатием ресет и нажатием кнопки на пульте. Я ожидаю несколько секунд. Попробуйте несколько раз одну и ту же ленту. Надо сравнить воспроизводимость.
На мой взгляд, нужно попробовать передачу самой маленькой ленты с фильтрацией служебных данных. Служебные данные по видимому можно опознать увеличив паузу перед установлением сигнала СД. Т.е. перед тем как установит этот сигнал, ждем и слушаем линию. Если должна передаваться команда, ЦВМ сама выставит этот сигнал, и нам нужно будет просто пропустить байт. В результате даже не понимая сути протокола мы сможем воспроизвести обмен. Данный скетч является попыткой реализовать такую схему работы.
Шина данных подключается аналогично предыдущим версиям, но через диоды (катодом к ардуине, анодом к линиям данных). Это нужно для того, что бы имитировать подключение с открытым коллектором. Линия НГП подключается к пину А2. Линия НПД подключается к пину А3. Сигнал СД подключается к пину 2 и через диод к пину A4 (катодом к пину А4).
Константа DELAY_FOR_SEPARATION_COMMAND является величиной задержки в микросекундах перед установкой СД. Ее значение взято с потолка. По правильному, нужно снять осциллограмму и измерить задержку во время передачи первого байта между сигналами СД и НГП, и взять примерно на 10-25% больше.
Подключать параллельно с "слушающей" ардуиной, и по ней смотреть в каком месте заткнется.
На мой взгляд, нужно попробовать передачу самой маленькой ленты с фильтрацией служебных данных. Служебные данные по видимому можно опознать увеличив паузу перед установлением сигнала СД. Т.е. перед тем как установит этот сигнал, ждем и слушаем линию. Если должна передаваться команда, ЦВМ сама выставит этот сигнал, и нам нужно будет просто пропустить байт. В результате даже не понимая сути протокола мы сможем воспроизвести обмен....
Идея нормальная, но надо знать времена между байтами, которые выдает ЦВМ и сколько ЦВМ ждёт ответа до ошибки и выдать байт в этот промежуток.
З.Ы. Подумалось тут. Если использовать диоды для развязки, то надо перевести все входы на подтяжку. О возможности обойтись без диодов напоминал Адриано #95 и я сделал в #139. Но это всё на грани фола. На шинах стоят резисторы около 430 Ом. Для уны байт 0х00 с управляющими это максимум по суммарному току выводов. Надо гонять и смотреть - сможет ли управлять без переходника на транзисторах.
Попробуйте прочитать обмен магнитофона и ЦВМ вот этой программой. Желательно несколько раз одну и ту же ленту. Я программу почистил. Вынес вывод в сериал из прерывания. Соответственно sei() не должен портить жизнь. В выводе идет время, время между байтами и собственно байт с признаком d или с. Как я уже писал, первое время - между запуском уны и первым полученным байтом должно быть большим.
/***********************************************************
Подключение:
ЛД0 - 7 // 8
ЛД1 - 6 // 9
ЛД2 - 13 // 10
ЛД3 - 12 // 11
ЛД4 - 11 // 12
ЛД5 - 10 // 13
ЛД6 - 9 // 6
ЛД7 - 8 // 7
СД - 2
УПР - 5
ЗО - 4
***********************************************************/
const int PIN_CLOCK = 2; // Пин синхроимпульсов.
const int INT_CLOCK = 0; // Номер прерывания синхроимпульсов.
const int DOP_6 = 9; //6; // Пин шестого разряда данных.
const int DOP_7 = 8; //7; // Пин седьмого разряда данных.
const int UPR = 5; // Пин для сигнала УПР.
const int ZO = 4; // Пин для сигнала ЗО.
const unsigned char MASK = 0b11000000; // Маска для формирования байта.
volatile unsigned char bufferCh;
volatile boolean bufferFlag;
volatile uint32_t tm, tmo, dt, tmd;
void setup()
{
attachInterrupt(INT_CLOCK, input_char, FALLING);
bufferFlag = false;
tmo=0;
Serial.begin(57600);
Serial.println("Start test:");
Serial.println();
}
void input_char ()
{
tm = micros();
bufferFlag = true;
bufferCh = ~((PINB & ~MASK) | (PIND & MASK));
}
void loop()
{
if (bufferFlag)
{
cli();
tmd=tm;
dt=tm-tmo;
sei();
Serial.print( tmd );
Serial.print(', ');
Serial.print( dt );
Serial.print(', ');
tmo=tmd;
Serial.print( digitalRead(UPR) ? 'd' : 'c' );
if (bufferCh < 16) Serial.print('0');
Serial.println(bufferCh, HEX);
bufferFlag=false;
}
}
Заметил ошибку довольно давно пролезшую в наш код:
const int DOP_6 = 9; //6; // Пин шестого разряда данных.
const int DOP_7 = 8; //7; // Пин седьмого разряда данных.
Восьмой и девятый пин ардуины и так читаются при чтении PINB (это 0 и 1 пин регистра B). В результате старшие биты оказываются потеряннми и замененными битами сдублированными из битов 0 и 1.
Нужно заменить на:
const int DOP_6 = 6; // Пин шестого разряда данных.
const int DOP_7 = 7; // Пин седьмого разряда данных.
И снова проверять соответствие читаемх данных и перфоленты. И заодно перечитать образци лент.
Нет. Всё в порядке. Мы ж по дырочкам проверяли. Именно в текущей конфигурации полученные данные точно соответствуют. А DOP_6 DOP_7 в программе не используются. Исправить конечно можно, но на конечный результат это никак не повлияет. Можно просто выкинуть.
Добавил пробелов в одинарные кавычки, а на двойные не поменял....Можно ещё пару раз этой программой. По алгоритму - нажать ресет на уне, увидеть Start test на мониторе, нажать Старт на пульте. И скорость сериала на 500000 изменить можно? Надо в терминале установить скорость 500000 и в Serial.begin(500000);
/***********************************************************
Подключение:
ЛД0 - 7 // 8
ЛД1 - 6 // 9
ЛД2 - 13 // 10
ЛД3 - 12 // 11
ЛД4 - 11 // 12
ЛД5 - 10 // 13
ЛД6 - 9 // 6
ЛД7 - 8 // 7
СД - 2
УПР - 5
ЗО - 4
***********************************************************/
const int PIN_CLOCK = 2; // Пин синхроимпульсов.
const int INT_CLOCK = 0; // Номер прерывания синхроимпульсов.
const int DOP_6 = 9; //6; // Пин шестого разряда данных.
const int DOP_7 = 8; //7; // Пин седьмого разряда данных.
const int UPR = 5; // Пин для сигнала УПР.
const int ZO = 4; // Пин для сигнала ЗО.
const unsigned char MASK = 0b11000000; // Маска для формирования байта.
volatile unsigned char bufferCh;
volatile boolean bufferFlag;
volatile uint32_t tm, tmo, dt, tmd;
void setup()
{
pinMode(PIN_CLOCK, INPUT_PULLUP);
attachInterrupt(INT_CLOCK, input_char, FALLING);
bufferFlag = false;
tmo=0;
Serial.begin(57600);
Serial.println("Start test:");
Serial.println();
}
void input_char ()
{
tm = micros();
bufferFlag = true;
bufferCh = ~((PINB & ~MASK) | (PIND & MASK));
}
void loop()
{
if (bufferFlag)
{
cli();
tmd=tm;
dt=tm-tmo;
sei();
Serial.print( tmd );
Serial.print(", ");
Serial.print( dt );
Serial.print(", ");
tmo=tmd;
Serial.print( digitalRead(UPR) ? 'd' : 'c' );
if (bufferCh < 16) Serial.print('0');
Serial.println(bufferCh, HEX);
bufferFlag=false;
}
}
Сегодня всё по другому. Начальные байты с19 d43. На них ответ d00 и всё. Дальше просто валит всё с ленты. Даже видно как лента разгоняется. По сотне миллисекунд до первой дырочки и время между дырками выходит на 3 мс где то за 10 дырок. Прикольно. Можно попробовать заменить магнитофон. Только один из трёх считал d19 вместо с19. Однако надо разбираться почему.
Хюстон! У нас проблемы. Суть в том, что вывод одной строчки данных сейчас идёт около миллисекунды. Магнитофон и ЦВМ успевают за это время обменяться кучей денных. Это хорошо видно на Вашей осциллограмме #19. На осциллограмме за 1.2 мс пробежало 5 команд с данными. Тоже самое с хвостом. Там 4 команды за те же 1.2 мс. Как добраться до хвоста я ещё не придумал, а вот голову надо снять этой программой. Желательно несколько раз, что бы получить точные данные. Программа снимает первые 100 байт обмена. Потом останавливается и ждёт ресет. У меня распознаёт 8 мкс. И неожиданно выяснил что у моей платы проблемы с D13. При попытке закоротить на землю выбивает USB порт. Соответственно на D13 висит всегда 1. Повторяю. Эта программа только для снятия команд головы обмена между ЦВМ и магнитофоном. По той же схеме - ресет, ждем Start test: на экране, нажимаем старт на пульте.
Start test:
01 6558680 c FD
02 20 c FB
03 28 c 83
04 20 d 1
05 24 d 1
06 12 d 1
07 24 d 1
08 36 d 1
09 28 d 1
10 24 d 1
11 36 d 1
12 88 c FB
13 64 c FD
14 20 c FB
15 28 c 83
16 20 d 1
17 24 d 1
18 16 d 1
19 16 d 1
20 16 d 1
21 20 d 1
22 16 d 1
23 16 d 1
24 16 d 1
25 20 d 1
26 56 d 1
27 28 d 1
28 32 d 1
29 28 d 1
30 32 d 1
31 40 c FB
32 100 c FD
33 20 c FB
34 24 c 85
35 36 d 10
36 32 d 1
37 40 d 1
38 24 d 1
39 32 d 1
40 24 d 1
41 28 d 1
42 24 d 1
43 20 d 8
44 28 d 1
45 24 d 1
46 24 d 1
47 20 d 1
48 40 d F1
49 20 d F1
50 36 d 1
51 32 d 1
52 24 d 1
53 36 d 19
54 44 d 1
55 24 c FD
56 48 c 19
57 24 c 83
58 20 d 1
59 28 c 98
60 24 c FB
61 164 c 45
62 24 d 40
63 24 c FD
64 32 c 43
65 32 d 0
66 142268 d 0
67 6712 d 0
68 6884 d 0
69 6988 d 0
70 4708 d 0
71 6216 d 0
72 4832 d 0
73 6636 d 0
74 4764 d 0
75 4408 d 0
76 3908 d 0
77 3568 d 0
78 3428 d 0
79 3424 d 0
80 3360 d 0
81 3348 d 0
82 3420 d 0
83 3432 d 0
84 3356 d 0
85 3428 d 0
86 3348 d 0
87 3280 d 0
88 3208 d 0
89 3076 d 0
90 3096 d 0
91 3092 d 0
92 3044 d 0
93 2976 d 0
94 3024 d 0
95 2916 d 0
96 2932 d 0
97 2880 d 0
98 2752 d 0
99 2684 d 0
100 2752 d 0
Stop, wait for RESET!
2 раз
Start test:
Start test:
01 4027856 c FD
02 20 c FB
03 28 c 83
04 20 d 1
05 24 d 1
06 12 d 1
07 24 d 1
08 36 d 1
09 28 d 1
10 24 d 1
11 36 d 1
12 88 c FB
13 64 c FD
14 20 c FB
15 28 c 83
16 20 d 1
17 24 d 1
18 16 d 1
19 16 d 1
20 16 d 1
21 24 d 1
22 12 d 1
23 16 d 1
24 16 d 1
25 20 d 1
26 56 d 1
27 28 d 1
28 32 d 1
29 28 d 1
30 32 d 1
31 40 c FB
32 100 c FD
33 20 c FB
34 24 c 85
35 36 d 10
36 32 d 1
37 40 d 1
38 24 d 1
39 32 d 1
40 24 d 1
41 28 d 1
42 24 d 1
43 20 d 8
44 28 d 1
45 24 d 1
46 24 d 1
47 20 d 1
48 40 d F1
49 20 d F1
50 36 d 1
51 32 d 1
52 24 d 1
53 36 d 19
54 44 d 1
55 24 c FD
56 48 c 19
57 24 c 83
58 20 d 1
59 28 c 98
60 24 c FB
61 164 c 45
62 24 d 40
63 24 c FD
64 32 c 43
65 32 d 0
66 148764 d 0
67 5816 d 0
68 4156 d 0
69 4220 d 0
70 7108 d 0
71 5664 d 0
72 3728 d 0
73 4436 d 0
74 5428 d 0
75 4712 d 0
76 5848 d 0
77 4156 d 0
78 3920 d 0
79 3564 d 0
80 3304 d 0
81 3152 d 0
82 3200 d 0
83 3140 d 0
84 3136 d 0
85 3164 d 0
86 3224 d 0
87 3208 d 0
88 3128 d 0
89 3188 d 0
90 3192 d 0
91 3168 d 0
92 3148 d 0
93 3040 d 0
94 3016 d 0
95 2920 d 0
96 2840 d 0
97 2816 d 0
98 2828 d 0
99 2868 d 0
100 2900 d 0
Stop, wait for RESET!
3 раз
Start test:
Start test:
01 3229532 c FD
02 20 c FB
03 28 c 83
04 20 d 1
05 24 d 1
06 12 d 1
07 24 d 1
08 36 d 1
09 28 d 1
10 24 d 1
11 36 d 1
12 88 c FB
13 64 c FD
14 20 c FB
15 28 c 83
16 20 d 1
17 24 d 1
18 16 d 1
19 16 d 1
20 20 d 1
21 16 d 1
22 16 d 1
23 16 d 1
24 16 d 1
25 20 d 1
26 56 d 1
27 28 d 1
28 32 d 1
29 28 d 1
30 32 d 1
31 40 c FB
32 100 c FD
33 20 c FB
34 24 c 85
35 36 d 10
36 32 d 1
37 40 d 1
38 24 d 1
39 32 d 1
40 24 d 1
41 28 d 1
42 24 d 1
43 20 d 8
44 28 d 1
45 28 d 1
46 20 d 1
47 20 d 1
48 40 d F1
49 20 d F1
50 36 d 1
51 32 d 1
52 24 d 1
53 36 d 19
54 44 d 1
55 24 c FD
56 48 c 19
57 24 c 83
58 20 d 1
59 28 c 98
60 24 c FB
61 164 c 45
62 24 d 40
63 24 c FD
64 32 c 43
65 32 d 0
66 156204 d 0
67 5048 d 0
68 3572 d 0
69 2992 d 0
70 2764 d 0
71 2684 d 0
72 3140 d 0
73 8760 d 0
74 5572 d 0
75 2860 d 0
76 3040 d 0
77 3960 d 0
78 5388 d 0
79 3828 d 0
80 5220 d 0
81 4344 d 0
82 3868 d 0
83 3468 d 0
84 3328 d 0
85 3072 d 0
86 2936 d 0
87 3004 d 0
88 2968 d 0
89 2912 d 0
90 3020 d 0
91 3024 d 0
92 3016 d 0
93 3036 d 0
94 3056 d 0
95 3020 d 0
96 3020 d 0
97 3012 d 0
98 3016 d 0
99 2984 d 0
100 2940 d 0
Stop, wait for RESET!
Какой содержательный разговор. Аж 65 слов до начала выдачи ленты. Теперь надо пару раз с отключенным магнитофоном, что бы посмотреть с какого момента ЦВМ ждёт ответа. Отлично получилось! Второй параметр это время в мкс между байтами. Чётко видно с какого момента пошла лента и как ускоряется. И программа ждёт 100 байт. С отключенным магнитофоном придётся несколько раз может десяток нажимать на кнопку пуск на пульте, пока не наберётся 100 байт в линии. Издержки скоростного чтения. Или поменяйте в 57 строке 99 на число поменьше, типа 50.
Так и должно быть. Надо сбрасывать ошибку и нажимать пуск много раз. Пока 100 байт не пробежит по линии. или самому подергать линию СД на землю 100 раз, после того как загорелась ошибка. Я так и проверял программу. Елозил проводом замкнутым на землю по второй ноге. За счёт дребезга хватало раза 3 - 4 провести по ноге, что бы набралось 100 интервалов.
Start test:
Start test:
01 11029092 c FD
02 20 c FB
03 24 c 83
04 48 c 29
05 10824480 c 0
06 460896 c 0
07 171696 c 0
08 376 c 0
09 336572 c 0
10 20 c 0
11 16 c 0
12 80 c 0
13 748 c 0
14 417816 c 0
15 596 c 0
16 28 c 0
17 104 c 0
18 12 c 0
19 8 c 0
20 136 c 0
21 569676 c 0
22 12 c 0
23 12 c 0
24 466488 c 0
25 8 c 0
26 144556 c 0
27 319028 c 0
28 96 c 0
29 12 c 0
30 76 c 0
31 197928 c 0
32 372924 c 0
33 8 c 0
34 16 c 0
35 32 c 0
36 202828 c 0
37 298672 c 0
38 372 c 0
39 12 c 0
40 8 c 0
41 12 c 0
42 112 c 0
43 56 c 0
44 388 c 0
45 24 c 0
46 457632 c 0
47 144 c 0
48 32 c 0
49 499832 c 0
50 128 c 0
51 16 c 0
52 8 c 0
53 201976 c 0
54 36 c 0
55 12 c 0
56 20 c 0
57 48 c 0
58 227452 c 0
59 84 c 0
60 140 c 0
61 12 c 0
62 12 c 0
63 12 c 0
64 60 c 0
65 16 c 0
66 160 c 0
67 80 c 0
68 12 c 0
69 8 c 0
70 60 c 0
71 40 c 0
72 12 c 0
73 187112 c 0
74 5054632 c 0
75 1105480 c 0
76 44 c 0
77 68 c 0
78 44 c 0
79 108 c 0
80 24 c 0
81 172 c 0
82 80 c 0
83 108 c 0
84 8 c 0
85 12 c 0
86 88 c 0
87 256 c 0
88 12 c 0
89 2084 c 0
90 1065624 c 0
91 660 c 0
92 5644 c 0
93 96 c 0
94 378940 c 0
95 416820 c 0
96 12 c 0
97 172 c 0
98 232 c 0
99 336 c 0
100 8 c 0
Stop, wait for RESET!
2 раз
Start test:
Start test:
01 19883332 c FD
02 20 c FB
03 28 c 83
04 48 c 29
05 6550908 c 0
06 757516 c 0
07 157700 c 0
08 12 c 0
09 12 c 0
10 365476 c 0
11 171644 c 0
12 32 c 0
13 8 c 0
14 12 c 0
15 16 c 0
16 2058540 c 0
17 12 c 0
18 8 c 0
19 677608 c 0
20 12 c 0
21 8 c 0
22 234808 c 0
23 52 c 0
24 16 c 0
25 8 c 0
26 12 c 0
27 445652 c 0
28 12 c 0
29 694644 c 0
30 633120 c 0
31 646096 c 0
32 36 c 0
33 8 c 0
34 16 c 0
35 8 c 0
36 598356 c 0
37 256864 c 0
38 12 c 0
39 152 c 0
40 12 c 0
41 452824 c 0
42 225940 c 0
43 8 c 0
44 459548 c 0
45 60 c 0
46 32 c 0
47 8 c 0
48 12 c 0
49 613116 c 0
50 323280 c 0
51 446328 c 0
52 1037012 c 0
53 8 c 0
54 12 c 0
55 132 c 0
56 609160 c 0
57 84 c 0
58 241604 c 0
59 28 c 0
60 12 c 0
61 405992 c 0
62 24 c 0
63 257916 c 0
64 379944 c 0
65 8 c 0
66 44 c 0
67 28 c 0
68 8 c 0
69 256288 c 0
70 395460 c 0
71 12 c 0
72 8 c 0
73 660028 c 0
74 212 c 0
75 601140 c 0
76 219100 c 0
77 12 c 0
78 72 c 0
79 375252 c 0
80 12 c 0
81 12 c 0
82 236168 c 0
83 168 c 0
84 372624 c 0
85 12 c 0
86 246872 c 0
87 12 c 0
88 168 c 0
89 32 c 0
90 303336 c 0
91 48 c 0
92 596 c 0
93 2040 c 0
94 12 c 0
95 1721732 c 0
96 1271384 c 0
97 292 c 0
98 1180 c 0
99 1136 c 0
100 1520 c 0
Stop, wait for RESET!
Решил попробовать варварским способом, откусывал провода поочереди НГП, НПД, ДУ, КНП, ОИ, УПР, ЗО и результат получил такой: НГП, УПР, НПД - ВЫДАЕТ ОШИБКУ, А - ДУ, КНП, ОИ, ЗО на загрузку программы не влияет. Есть две ардуино уно.
Может здесь ответ? Без НГП и НПД загибается? Читать надо с ними. Возможно дальше уйдём по количеству байт.
Где Вы отрывали НГП НДП? Если оторвать только у магнитофона? Не на шине.
Программа RС0. Читает 65 байт головы, всю ленту и хвост. Пока закомментирована идея Imp выдавать байты при затыке в обмене данными ЦВМ и считывателя, но для головы уже всё написано, надо дописать данные хвоста. Обмен полностью прописан как в мануале, поэтому надо подключить НГП к 3 ноге уны, НПД к 4. Т.к. не знаю сколько байт в хвосте, пока зарезервировал 85 байт. Программа после начала движения ленты должна выбросить в терминал голову, и по мере движения выбрасывать данные ленты строчками по 16 байт. В конце ленты должна выбросить хвост. Если зависнет, то ей надо помочь завершить цикл замыкая ногу 2 уны на землю много раз. Собственно уже после первого завершения можно посмотреть сколько байт в хвосте и поставить эту цифру в программу. Как всегда запустить несколько раз, что бы быть уверенным, что нет ошибок.
А если отключить магнитофон загорается неисправность. Корочу на Сд
1 раз
Start test:
01 9815296 c 29
02 24 c 0
03 16 c 0
04 12 c 0
05 16 c 0
06 16 c 0
07 16 c 0
08 16 c 0
09 12 c 0
10 16 c 0
11 16 c 0
12 16 c 0
13 16 c 0
14 16 c 0
15 12 c 0
16 16 c 0
17 16 c 0
18 16 c 0
19 16 c 0
20 16 c 0
21 12 c 0
22 16 c 0
23 16 c 0
24 16 c 0
25 16 c 0
26 12 c 0
27 16 c 0
28 16 c 0
29 16 c 0
30 16 c 0
31 16 c 0
32 12 c 0
33 16 c 0
34 16 c 0
35 16 c 0
36 16 c 0
37 12 c 0
38 16 c 0
39 16 c 0
40 16 c 0
41 16 c 0
42 16 c 0
43 12 c 0
44 16 c 0
45 16 c 0
46 16 c 0
47 16 c 0
48 12 c 0
49 16 c 0
50 16 c 0
51 16 c 0
52 16 c 0
53 16 c 0
54 16 c 0
55 12 c 0
56 16 c 0
57 16 c 0
58 16 c 0
59 16 c 0
60 16 c 0
61 16 c 0
62 16 c 0
63 16 c 0
64 16 c 0
65 12 c 0
00
001 9816300 c 0
67 16 c 0
68 16 c 0
69 16 c 0
70 16 c 0
71 16 c 0
72 16 c 0
73 16 c 0
74 16 c 0
75 16 c 0
76 16 c 0
77 16 c 0
78 20 c 0
79 868 c 0
80 60840 c 0
81 1308 c 0
82 3096 c 0
83 556 c 0
84 419552 c 0
85 196 c 0
86 16 c 0
87 798148 c 0
88 280 c 0
89 520 c 0
90 472 c 0
91 419684 c 0
92 52 c 0
93 24 c 0
94 212 c 0
95 16 c 0
96 92 c 0
97 16 c 0
98 96 c 0
99 24 c 0
100 108 c 0
101 56 c 0
102 356 c 0
103 728 c 0
104 400 c 0
105 88 c 0
106 524 c 0
107 140 c 0
108 414100 c 0
109 352 c 0
110 400696 c 0
111 16 c 0
112 932 c 0
113 128 c 0
114 120048 c 0
115 56 c 0
116 304232 c 0
117 1492 c 0
118 92 c 0
119 104 c 0
120 168 c 0
121 88 c 0
122 572 c 0
123 44 c 0
124 100304 c 0
125 20 c 0
126 612956 c 0
127 16 c 0
128 88 c 0
129 56 c 0
130 204 c 0
131 435032 c 0
132 72 c 0
133 20 c 0
134 108 c 0
135 442996 c 0
136 528 c 0
137 16 c 0
138 32 c 0
139 168 c 0
140 28 c 0
141 544 c 0
142 64 c 0
143 28 c 0
144 16 c 0
145 40 c 0
146 84 c 0
147 104 c 0
148 192 c 0
149 624 c 0
150 112 c 0
Stop, wait for RESET!
2 раз
Start test:
01 10523380 c 29
02 336 c 0
03 16 c 0
04 16 c 0
05 16 c 0
06 16 c 0
07 12 c 0
08 16 c 0
09 16 c 0
10 16 c 0
11 16 c 0
12 16 c 0
13 16 c 0
14 16 c 0
15 16 c 0
16 16 c 0
17 12 c 0
18 16 c 0
19 16 c 0
20 16 c 0
21 16 c 0
22 16 c 0
23 16 c 0
24 16 c 0
25 16 c 0
26 16 c 0
27 12 c 0
28 16 c 0
29 16 c 0
30 16 c 0
31 16 c 0
32 16 c 0
33 16 c 0
34 16 c 0
35 16 c 0
36 12 c 0
37 16 c 0
38 16 c 0
39 16 c 0
40 16 c 0
41 16 c 0
42 16 c 0
43 16 c 0
44 16 c 0
45 16 c 0
46 12 c 0
47 16 c 0
48 16 c 0
49 16 c 0
50 16 c 0
51 16 c 0
52 16 c 0
53 16 c 0
54 16 c 0
55 16 c 0
56 12 c 0
57 16 c 0
58 16 c 0
59 16 c 0
60 16 c 0
61 16 c 0
62 16 c 0
63 -1008 c 0
64 16 c 0
65 12 c 0
00
001 10523688 c 0
67 16 c 0
68 16 c 0
69 16 c 0
70 16 c 0
71 16 c 0
72 16 c 0
73 16 c 0
74 16 c 0
75 16 c 0
76 16 c 0
77 16 c 0
78 16 c 0
79 12 c 0
80 16 c 0
81 16 c 0
82 16 c 0
83 16 c 0
84 16 c 0
85 24 c 0
86 700 c 0
87 36 c 0
88 16 c 0
89 20 c 0
90 213344 c 0
91 1080 c 0
92 279364 c 0
93 924 c 0
94 704800 c 0
95 16 c 0
96 16 c 0
97 16 c 0
98 227388 c 0
99 1252 c 0
100 636708 c 0
101 223056 c 0
102 592 c 0
103 16 c 0
104 32 c 0
105 251192 c 0
106 840 c 0
107 24 c 0
108 24 c 0
109 24 c 0
110 32 c 0
111 20 c 0
112 1392236 c 0
113 16 c 0
114 228 c 0
115 318988 c 0
116 16 c 0
117 24 c 0
118 560 c 0
119 473148 c 0
120 16 c 0
121 20 c 0
122 28 c 0
123 20 c 0
124 32 c 0
125 16 c 0
126 1104 c 0
127 36 c 0
128 16 c 0
129 16 c 0
130 306708 c 0
131 1268 c 0
132 274576 c 0
133 1464 c 0
134 387500 c 0
135 16 c 0
136 24 c 0
137 1288 c 0
138 338700 c 0
139 1640 c 0
140 292532 c 0
141 960 c 0
142 24 c 0
143 16 c 0
144 250352 c 0
145 1572 c 0
146 226988 c 0
147 1556 c 0
148 227216 c 0
149 48 c 0
150 560 c 0
Stop, wait for RESET!
Start test:
01 4109200 c FD
02 20 c FB
03 28 c 83
04 20 d 1
05 28 d 1
06 36 d 1
07 120 d 1
08 88 c FB
09 64 c FD
10 20 c FB
11 28 c 83
12 20 d 1
13 24 d 1
14 36 d 1
15 32 d 1
16 36 d 1
17 16 d 1
18 16 d 1
19 148 d 1
20 28 d 1
21 40 c FB
22 100 c FD
23 20 c FB
24 24 c 85
25 36 d 10
26 32 d 1
27 40 d 1
28 24 d 1
29 28 d 1
30 28 d 1
31 28 d 1
32 24 d 1
33 20 d 8
34 28 d 1
35 24 d 1
36 24 d 1
37 20 d 1
38 40 d F1
39 20 d F1
40 36 d 1
41 32 d 1
42 24 d 1
43 36 d 19
44 40 d 1
45 28 c FD
46 44 c 19
47 28 c 83
48 20 d 1
49 28 c 98
50 24 c FB
51 164 c 45
52 24 d 40
53 24 c FD
54 32 c 43
55 32 d 0
56 199468 d 0
57 3784 d 0
58 2480 d 0
59 2004 d 0
60 1856 d 0
61 1740 d 0
62 1700 d 0
63 1760 d 0
64 1848 d 0
65 2416 d 0
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
00 00 00 00 00 00 00 00
2 раз
Start test:
01 3021668 c FD
02 20 c FB
03 28 c 83
04 20 d 1
05 28 d 1
06 36 d 1
07 32 d 1
08 88 d 1
09 88 c FB
10 64 c FD
11 20 c FB
12 24 c 83
13 20 d 1
14 28 d 1
15 36 d 1
16 32 d 1
17 32 d 1
18 36 d 1
19 116 d 1
20 32 d 1
21 28 d 1
22 40 c FB
23 96 c FD
24 20 c FB
25 28 c 85
26 32 d 10
27 36 d 1
28 40 d 1
29 24 d 1
30 28 d 1
31 24 d 1
32 32 d 1
33 24 d 1
34 20 d 8
35 28 d 1
36 24 d 1
37 24 d 1
38 20 d 1
39 40 d F1
40 20 d F1
41 36 d 1
42 28 d 1
43 28 d 1
44 36 d 19
45 40 d 1
46 28 c FD
47 44 c 19
48 28 c 83
49 20 d 1
50 24 c 98
51 28 c FB
52 160 c 45
53 24 d 40
54 28 c FD
55 32 c 43
56 28 d 0
57 200876 d 0
58 3344 d 0
59 2292 d 0
60 1928 d 0
61 1824 d 0
62 1784 d 0
63 1956 d 0
64 2792 d 0
65 7836 d 0
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
00 00 00 00 00 00 00 00 00
Это всё? Я ожидал ещё хвост. И всю ленту. Да и голова изменилась. В 184 3 раза было по 65 байт. Сегодня 56. При этом не изменился набор команд, а только данные с единичками.
Считайте самую маленькую ленту с магнитофона с помощью 194. Интересует первые и последние по полсотни байт.
Ток до 8 мА.
На второй ардуино показало
22289612 cFD
22290120 c00
А с магнитофоном?
С магнитофоном не пробовал, что такое 194 в #151
144, программа с таймингами, уже по этим двум числам видно, что время между двумя байтами 500 мкс. А как магнитофон ответит?
Начало
Конец
Получилось что то странное. Иногда время до следующего байта отрицательное. Надо запретить прерывания при выводе micros. cli(); sei(); micros окружить, может что изменится. Но по крайней мере видно, с какой команды поехала лента магнитофона - ей почти 200 мс надо стартануть и до первой дырки домотать - потом дырки идут через 2 мс , а обмен между компом и магом по 500 мкс. Такую задержку надо вписать в программу. Сейчас 5 мкс вписано. Надо увеличить. И обязательно НГП НДП подключить. И в программу ввести.
nik182 можете в программе исправить, а то я могу не правильно понять. Потом вообще запутаемся.
А как у Вас с программированием? На этом этапе надо сделать несколько раз мелкие исправления программ, в зависимости от результатов. Если это будем делать как сейчас, то уйдёт много времени. Я могу описать алгоритм действий, и если Вы сможете менять программу и проверят, то за день может получиться всё настроить.
Показывает ошибку 62 строчка.
'nimo' was not declared in this scope
У меня с программированием все грустно.
описка. timo
Подключал одну уно через магнитофон, скетч #160.
В начале только вывелась эта информация, после загрузка продолжалась, но информация больше не выводилась.
Уже лучше. Отрицательного времени нет. Но начало стремное. По хорошему надо нажать ресет на уне, потом нажать пуск на пульте. Если всё штатно, то первое время = время между нажатием ресет и нажатием кнопки на пульте. Я ожидаю несколько секунд. Попробуйте несколько раз одну и ту же ленту. Надо сравнить воспроизводимость.
1 раз
2 раз
3 раз
Что то пошло не так. Закомментируйте cli sbi - 52 54 строки и попробуйте ещё раз.
Только уже в понедельник, все закрыто.
Вот так
Правильно понял?
Нет. Главное закомментировали , получение времени. Строки по отдельности комментируются //
На мой взгляд, нужно попробовать передачу самой маленькой ленты с фильтрацией служебных данных. Служебные данные по видимому можно опознать увеличив паузу перед установлением сигнала СД. Т.е. перед тем как установит этот сигнал, ждем и слушаем линию. Если должна передаваться команда, ЦВМ сама выставит этот сигнал, и нам нужно будет просто пропустить байт. В результате даже не понимая сути протокола мы сможем воспроизвести обмен. Данный скетч является попыткой реализовать такую схему работы.
Шина данных подключается аналогично предыдущим версиям, но через диоды (катодом к ардуине, анодом к линиям данных). Это нужно для того, что бы имитировать подключение с открытым коллектором. Линия НГП подключается к пину А2. Линия НПД подключается к пину А3. Сигнал СД подключается к пину 2 и через диод к пину A4 (катодом к пину А4).
Константа DELAY_FOR_SEPARATION_COMMAND является величиной задержки в микросекундах перед установкой СД. Ее значение взято с потолка. По правильному, нужно снять осциллограмму и измерить задержку во время передачи первого байта между сигналами СД и НГП, и взять примерно на 10-25% больше.
Подключать параллельно с "слушающей" ардуиной, и по ней смотреть в каком месте заткнется.
В данной цепи магнитофон отключен или нет? И по СД не совсем понял подключение. Его разветвлять на два пина один на 2 второй через диод А4?
На 'слушающею' ардуино, скетч из #136 подойдёт?
На мой взгляд, нужно попробовать передачу самой маленькой ленты с фильтрацией служебных данных. Служебные данные по видимому можно опознать увеличив паузу перед установлением сигнала СД. Т.е. перед тем как установит этот сигнал, ждем и слушаем линию. Если должна передаваться команда, ЦВМ сама выставит этот сигнал, и нам нужно будет просто пропустить байт. В результате даже не понимая сути протокола мы сможем воспроизвести обмен....
Идея нормальная, но надо знать времена между байтами, которые выдает ЦВМ и сколько ЦВМ ждёт ответа до ошибки и выдать байт в этот промежуток.
З.Ы. Подумалось тут. Если использовать диоды для развязки, то надо перевести все входы на подтяжку. О возможности обойтись без диодов напоминал Адриано #95 и я сделал в #139. Но это всё на грани фола. На шинах стоят резисторы около 430 Ом. Для уны байт 0х00 с управляющими это максимум по суммарному току выводов. Надо гонять и смотреть - сможет ли управлять без переходника на транзисторах.
Попробуйте прочитать обмен магнитофона и ЦВМ вот этой программой. Желательно несколько раз одну и ту же ленту. Я программу почистил. Вынес вывод в сериал из прерывания. Соответственно sei() не должен портить жизнь. В выводе идет время, время между байтами и собственно байт с признаком d или с. Как я уже писал, первое время - между запуском уны и первым полученным байтом должно быть большим.
Понял завтра сделаю.
Заметил ошибку довольно давно пролезшую в наш код:
Восьмой и девятый пин ардуины и так читаются при чтении PINB (это 0 и 1 пин регистра B). В результате старшие биты оказываются потеряннми и замененными битами сдублированными из битов 0 и 1.
Нужно заменить на:
И снова проверять соответствие читаемх данных и перфоленты. И заодно перечитать образци лент.
Нет. Всё в порядке. Мы ж по дырочкам проверяли. Именно в текущей конфигурации полученные данные точно соответствуют. А DOP_6 DOP_7 в программе не используются. Исправить конечно можно, но на конечный результат это никак не повлияет. Можно просто выкинуть.
1 раз
2 раз
3 раз
Добавил пробелов в одинарные кавычки, а на двойные не поменял....Можно ещё пару раз этой программой. По алгоритму - нажать ресет на уне, увидеть Start test на мониторе, нажать Старт на пульте. И скорость сериала на 500000 изменить можно? Надо в терминале установить скорость 500000 и в
Serial
.begin(500000);
Сегодня всё по другому. Начальные байты с19 d43. На них ответ d00 и всё. Дальше просто валит всё с ленты. Даже видно как лента разгоняется. По сотне миллисекунд до первой дырочки и время между дырками выходит на 3 мс где то за 10 дырок. Прикольно. Можно попробовать заменить магнитофон. Только один из трёх считал d19 вместо с19. Однако надо разбираться почему.
Хюстон! У нас проблемы. Суть в том, что вывод одной строчки данных сейчас идёт около миллисекунды. Магнитофон и ЦВМ успевают за это время обменяться кучей денных. Это хорошо видно на Вашей осциллограмме #19. На осциллограмме за 1.2 мс пробежало 5 команд с данными. Тоже самое с хвостом. Там 4 команды за те же 1.2 мс. Как добраться до хвоста я ещё не придумал, а вот голову надо снять этой программой. Желательно несколько раз, что бы получить точные данные. Программа снимает первые 100 байт обмена. Потом останавливается и ждёт ресет. У меня распознаёт 8 мкс. И неожиданно выяснил что у моей платы проблемы с D13. При попытке закоротить на землю выбивает USB порт. Соответственно на D13 висит всегда 1. Повторяю. Эта программа только для снятия команд головы обмена между ЦВМ и магнитофоном. По той же схеме - ресет, ждем Start test: на экране, нажимаем старт на пульте.
Задачу понял, к выполнению приступил!
Обратите внимание - скорость сериала в программе 115200 - такая же должна быть в программе терминала.
А багу ИМХО лучше все же пофиксить.
1 раз
2 раз
3 раз
Какой содержательный разговор. Аж 65 слов до начала выдачи ленты. Теперь надо пару раз с отключенным магнитофоном, что бы посмотреть с какого момента ЦВМ ждёт ответа. Отлично получилось! Второй параметр это время в мкс между байтами. Чётко видно с какого момента пошла лента и как ускоряется. И программа ждёт 100 байт. С отключенным магнитофоном придётся несколько раз может десяток нажимать на кнопку пуск на пульте, пока не наберётся 100 байт в линии. Издержки скоростного чтения. Или поменяйте в 57 строке 99 на число поменьше, типа 50.
Загорелась неисправность после нажатия пуск, на экране только Start test и больше ничего.
Так и должно быть. Надо сбрасывать ошибку и нажимать пуск много раз. Пока 100 байт не пробежит по линии. или самому подергать линию СД на землю 100 раз, после того как загорелась ошибка. Я так и проверял программу. Елозил проводом замкнутым на землю по второй ноге. За счёт дребезга хватало раза 3 - 4 провести по ноге, что бы набралось 100 интервалов.
1 раз
2 раз
Эх. Не нравиться мне байт 29. Откуда интересно взялся? Не было такого с магнитофоном. И микросекунд всего 48. Что за это время успеешь? Чувствую без анализатора типа такого https://supereyes.ru/catalog/logicheskie_analizatory/logicheskiy_analizator_saleae_logic8_analyzer/?roistat=merchant10_g_73384793880_online:ru:RU:1095&roistat_referrer=&roistat_pos=&gclid=CjwKCAiAmrOBBhA0EiwArn3mfOOTPUUCbSrjQ_gBm-8XRWZWvaUKP8q8cr3n8H0pt1U52ZCeTbSM5RoC9QkQAvD_BwE не обойтись. УВас нет чего либо похожего? Или осциллограф с приставкой бывает. Понять бы как он так быстро определяет что магнитофона нет?
Может здесь ответ? Без НГП и НПД загибается? Читать надо с ними. Возможно дальше уйдём по количеству байт.
Где Вы отрывали НГП НДП? Если оторвать только у магнитофона? Не на шине.
Разрыв делал по середине шлейфа.
Программа RС0. Читает 65 байт головы, всю ленту и хвост. Пока закомментирована идея Imp выдавать байты при затыке в обмене данными ЦВМ и считывателя, но для головы уже всё написано, надо дописать данные хвоста. Обмен полностью прописан как в мануале, поэтому надо подключить НГП к 3 ноге уны, НПД к 4. Т.к. не знаю сколько байт в хвосте, пока зарезервировал 85 байт. Программа после начала движения ленты должна выбросить в терминал голову, и по мере движения выбрасывать данные ленты строчками по 16 байт. В конце ленты должна выбросить хвост. Если зависнет, то ей надо помочь завершить цикл замыкая ногу 2 уны на землю много раз. Собственно уже после первого завершения можно посмотреть сколько байт в хвосте и поставить эту цифру в программу. Как всегда запустить несколько раз, что бы быть уверенным, что нет ошибок.
Если магнитофон подключен то сразу загорается неисправность.
А если отключить магнитофон загорается неисправность. Корочу на Сд
1 раз
2 раз
НГП НПД отключите, если подключен магнитофон. Они должны работать без магнитофона.
НГП и НПД отключить от ардуино или (откусить)
от магнитофона?
Не подключать к ардуине. Измерьте напряжение на НГП НДП до нажатия пуск и после окончания считывания ленты.
1 раз
2 раз
Это всё? Я ожидал ещё хвост. И всю ленту. Да и голова изменилась. В 184 3 раза было по 65 байт. Сегодня 56. При этом не изменился набор команд, а только данные с единичками.
Когда лента шла информация не выводилась, только после когда закоротил на Сд. Может входе ленты надо было коротить?