Ну вот решил поделать тесты с таймером и узнать, почему получаются левые числа и какова их закономерность. Вроде бы удалось это понять. Но сначала несколько скриншотов для последующего объяснения ситуации.
Скрытый текст
http://kisly-alexey.pisem.net/TSTMR4...ERR1/SCR01.jpg
http://kisly-alexey.pisem.net/TSTMR4...ERR1/SCR02.jpg
http://kisly-alexey.pisem.net/TSTMR4...ERR1/SCR03.jpg
http://kisly-alexey.pisem.net/TSTMR4...ERR1/SCR04.jpg
http://kisly-alexey.pisem.net/TSTMR4...ERR1/SCR05.jpg
http://kisly-alexey.pisem.net/TSTMR4...ERR1/SCR06.jpg
http://kisly-alexey.pisem.net/TSTMR4...ERR1/SCR07.jpg
http://kisly-alexey.pisem.net/TSTMR4...ERR1/SCR08.jpg
http://kisly-alexey.pisem.net/TSTMR4...ERR1/SCR09.jpg
http://kisly-alexey.pisem.net/TSTMR4...ERR1/SCR10.jpg
[свернуть]
Titus, ну что могу сказать. Вы оказались правы насчет записи и чтения регистров таймера. По поводу привязки этих событий к тактам делителя информация подтвердилась. На скриншотах видно, что обычно ошибки бывают только на 8 и 16 мкс, т.к. в данном варианте между импульсами после делителя проскакивает 50 и 100 тактов процессора соответственно. Ну а теперь начнем анализ ситуации. Процессор, как известно, выставляет на шине данные для записи и сопровождает это сигналом DOUT. В ответ на этот сигнал, устройство должно записать данные в свой регистр и выдать сигнал RPLY. В ответ на RPLY процессор снимает сигнал DOUT и данные с магистрали. Соответственно устройство снимает RPLY, а процессор SYNC, всё, адресный обмен завершился. Ну а теперь предположим, что интерфейс связи с QBUS в БМК работает нормально, а вот запись в буферный регистр производится по сигналам с делителя. Что при этом может произойти? Правильно, процессор завершает адресный обмен, приготавливается к очередному, шина адреса-данных будет в третьем состоянии, читаться с нее будет ноль - вот и ноль в буферном регистре. Но ситуация может ухудшиться и процессор уже выставил новый адрес на шине - значит в буфер запишется новый адрес.
Посмотрим внимательно на скриншоты. Для вывода содержимого ОЗУ ПП используется утилита PMEM, которая показывает размер блока данных памяти, занимаемой резидентом, для полного объема надо прибавить шесть (размер заголовка). Загрузка произведена с IDE-Flash и резидентом у нас сидит только драйвер WD. Левое число равно 3598. Загрузим модуль KBS, его объем 144+6=150 байт, левое число стало 3748=3598+150. Загрузим модуль ALTNUM, его объем 192+6=198 байт, левое число стало 3946=3748+198. Загрузим модуль RBTRON, его объем 102+6=108 байт, левое число стало 4054=3946+108. Загрузим модуль ESCFG, его объем 490+6=496 байт, левое число должно стать 4550=4054+496, но буфер 12-разрядный, вычитаем 4096, получаем 454.
Вроде бы все сходится, но на 8 мкс иногда проскакивает постоянное значение 976, в восьмеричном это 001720, либо это код команды, либо смещение, кода нет, не могу сказать.
Как видно на 4 мкс и 2 мкс ошибок нет. Отсюда вывод - останавливать таймер только на 2 мкс и записывать новое значение в буфер, должно обязательно записаться.
А так для полного анализа нужен ассемблерный листинг, именно листинг MACRO с восьмеричными значениями и мнемониками команд, хотя бы для того, чтобы узнать откуда у 001720 ноги растут.

