|
nedoPC.orgElectronics hobbyists community established in 2002 |
|
8086 - проверка без приборов
Author |
Message |
Stan
Banned
Joined: 04 Jan 2013 10:09 Posts: 397 Location: 95.24.178.158
|
Именно так: BHE все время находится в низком (активном) уровне, вообще без переходов в высокий - ну хоть процеcсоры ведут себя идентично, судя по осциллограмме, чего не скажешь о задающих генераторах.
Я Вам очень благодарен за сравнение - я тут закопался в чтениe мануалов и пришел к выводу, что моя изначальная предпосылка, пожалуй, была неверна.
Операции NOP из очереди выполняет Операционное устройство, а его корреляцию с действиями Шинного интерфейса предсказать несколько сложно, поскольку это несколько независимые устройства в 8086.
Как пишут во многих источниках: предсказать поведение 8086 по тактам исполения команд довольно трудоемко, в отличие от привычных 8080, 8085, z80 и уж тем более 6502.
|
25 Nov 2014 14:28 |
|
|
Mixa64
Doomed
Joined: 25 Aug 2009 07:02 Posts: 463 Location: Москва
|
Значит, без приборов? А уж осциллограмм-то накидали!
|
26 Nov 2014 04:31 |
|
|
Shaos
Admin
Joined: 08 Jan 2003 23:22 Posts: 22827 Location: Silicon Valley
|
Это из серии "если к вам неожиданно нагрянули гости, а в холодильнике ничего нет"
|
26 Nov 2014 06:33 |
|
|
Stan
Banned
Joined: 04 Jan 2013 10:09 Posts: 397 Location: 95.24.178.158
|
А это мы просто сверили отечественный КР1810ВМ86 с зарубежным Siemens 8086, поскольку в задающих генераторах разночтения были обнаружены, а ведь элементная база этого комплекта у людей может быть на руках самая разнообразная....
Так что к отладке без приборов это непосредственного отношения не имеет.
Ну и чтобы объяснить людям, как это запустить без приборов, вполне нелишне посмотреть самому тщательнее, как схема по приборам правильно работает, или где-то неправильно.
А то я тут читал, как кто-то торопливый брякнул " HLDA, значит, на три ТТЛа хватает, IO/M - нет?" и ведь попал пальцем в небо...
|
26 Nov 2014 10:51 |
|
|
Stan
Banned
Joined: 04 Jan 2013 10:09 Posts: 397 Location: 95.24.178.158
|
Продолжаем сборку и проверку без приборов платы на микропроцессое КР1810ВМ86...
Подключаем шинные формирователи на 580ВА86 и буферы адреса - 580ИР82 - как на схеме.
Увеличить
На входы шинных формироватей цепляем те же самые резисторы, изображающие команду NOP.
Теперь их номиналы не так критичны, как непосредственно на шине процессора, поэтому можно
любые и разные в пределах 100 Ом... 4.7 кОм.
Я поставил те же, что уже были на плате - по 4.3 кОм.
На элементах DD2.1, DD2.2 собираем одновибратор для формирования тактов задержки процессора.
С номиналом С3 = 1uF (микрофарад) диоды на адресных линиях А15...А12 индицируют перебор
процессором адресов и этот процесс визуально заметен.
Если подключить эти диоды к младшим адресам - моргание их уже не заметно и просто сливается
в тусклое свечение.
Увеличение ёмкости С3 до 100uF заметно скорость не сбавляет, но при таких номиналах и выше
одновибратор начинает работать неустойчиво, поэтому далее организуем другой тест.
А на этом этапе есть смысл проверить исполнение процессором некоторых команд, что позволит
убедиться в правильной работе формирователя сигналов /IORD, /IOWR, /MWR.
Для этого на выводы /IOR, /IOW подключаем триггеры К155ТМ2, включенные как счетные ( /Q соединен с D),
а на шине данных D0...D7 резисторами изображаем следующие команды:
на линиях D8...D15 так и оставим 90Н - как было.
Получится: IN AL,90Н (IN AX,90Н) или OUT AL,90Н (OUT AX,90Н). При этом заморгают диоды на выходах одного или другого триггеров.
Так же можно проверить и вывод /MWR, но для этого нужен 1..2 байтный код, который будет записывать в память.
Тут хорошо подходят команды группы PUSH хх: 50Н ... 57Н. Выставляем эти коды резисторами на шине данных D0...D7.
А сигнал /MWR подключаем на вход С одного из триггеров.
Процессор будет выполнять: PUSH хх, NOP. Неизвестно, правда, где у него по старту стек, но у нас все-равно
и памяти-то ему под стек никакой нет... Так что для теста - подойдёт.
|
02 Dec 2014 11:35 |
|
|
Stan
Banned
Joined: 04 Jan 2013 10:09 Posts: 397 Location: 95.24.178.158
|
На следующем этапе добавим в схему устройство пошагового прохождения "программы".
Увеличить
Для этого в одновибраторе заменяем ёмкость С3 = 1uF на 360 pF, добaваляем кнопку
с резистором R8, RS-триггер и цепь его сброса: R6, R7, C4, VD3.
Светодиод VD9 своим свечением индицирует, что процессор находится в состоянии ожидания - WAIT.
Он не очень информативен, т.к. процессор срабатывает очень быстро и погашенный диод
глаз не успевает заметить.
Я добавил диод лишь для того, чтобы никто не запутался с RS-триггером: если диод горит,
то всё правильно - процессор в основном ждёт.
В принципе у кого есть место на плате (а у меня на макетке оно очень ограниченно)
всю цепь сброса: R6, R7, C4, VD3, обведенную синим контуром, можно заменить на
точно такой-же одновибратор, как у кнопки STEP.
Работает вся схема так: процессор первым же обращением к памяти сигналом /MRD коротким
импульсом, сформированным цепью сброса: R6, R7, C4, VD3 сбрасывает RS-триггер в состояние "0"
по выходу RDY1, и останавливается, выполняя такты ожидания WAIT.
Нажимая на кнопку STEP, коротким импульсом одновибратора мы выводим процессор из этого
состояния, он считывает слово с шины данных, быстро исполняет считанный код, увеличивает
программный счетчик и следующим обращением сигналом /MRD за кодом операции снова
сбрасывает RS-триггер и снова останавливается, выполняя такты ожидания WAIT.
Теперь можно подключать светодиоды на младшие адресные линии и пошагово смотреть,
как процессор их меняет, нажимая на кнопку STEP.
Адресная линия А0 всегда = "0", т.к. процеcсор читает код операции словами по 2 байта.
В пошаговом режиме можно проследить нет ли замыканий на всех шинах, и можно поэкспериментировать,
выставляя на шину данных различные коды команд.
Команды можно выставлять резисторами те, что упоминали выше, а можно попробовать
и другие с одним ограничением: код операции не должен превышать 2 байта.
В принципе - можно и любые другие команды, но тогда на следующем шаге код команды
надо будет изменить резисторами на необходимый.
Кнопка STEP в данной схеме не защищена от дребезга контактов, поэтому кнопку желательно
поставить " хорошую" - хотя бы вот такую, как у меня:
Иначе процессор будет проскакивать по нескольку шагов. Он - шустрый, он успевает!
Можно собрать и более традиционную схему пошагового прохождения, но одновибратор
может нам понадобиться в дальнейшем для формирования состояния WAIT при обращени
процессора к " медленным" устройствам ввода-вывода, когда остальная пошаговая схема
будет уже не нужна.
P.S. Две трети большой макетки уже занято всего лишь стандартной обвеской процессора. Поэтому никогда и не хотелось делать что-то на КР1801ВМ86. И поедает это всё вместе уже порядка 1.5 А ! А то еще кто-то тут говорил, что К580ВМ80 имеет сложную обвеску. Да он при желании - "голый" работать будет!
|
02 Dec 2014 13:07 |
|
|
Shaos
Admin
Joined: 08 Jan 2003 23:22 Posts: 22827 Location: Silicon Valley
|
Традиционная схема это на двух гейтах ЛА3 включенных в виде триггера и кнопка-переключатель...
|
02 Dec 2014 13:37 |
|
|
Stan
Banned
Joined: 04 Jan 2013 10:09 Posts: 397 Location: 95.24.178.158
|
Ну а здесь - кнопка замыкатель. Поэтому и сделан формирователь короткого импульса, который нам далее и сам по себе понадобится.
|
02 Dec 2014 14:11 |
|
|
Stan
Banned
Joined: 04 Jan 2013 10:09 Posts: 397 Location: 95.24.178.158
|
Ну а теперь перейдём к самому " вкусному", к тому, где нам этот одновибратор понадобится,
а, собственно, это " вкусное" и было основной причиной того, что я взялся воплотить этот
совершенно не нужный мне проект с процессором КР1810ВМ86.
Скажем так, что ситуация это довольно частая - собрали проект на каком-либо процессоре,
хочется попробовать его работу, но тут надо " прошить" ПЗУ, а " прошивать" в ПЗУ пока ещё
и нечего, а у кого-то и " прошивалки" нет, а, может быть, и ПЗУ подходящей нет...
В этом случае и может оказаться полезным способ, который здесь на форуме как-то обсуждали,
но никто не решился его воплотить. А способ мне понравился, и я решил его в значительной мере
улучшить, чтобы он не нуждался ни в каких дополнительных переключениях, а работал в качестве
" эмулятора ПЗУ", хотя и с некотороми ограничениями.
Основная идея следующая: раз уж у нас есть схема пошагового режима, управляемая кнопкой STEP,
и мы можем выполнять коды, выставляемые резисторами на шине данных, то почему бы не поручить
эту операцию выполнять параллельному порту другого коппьютера?
Всё равно в конструкции таких SBC-поделок обычно закладывается отладочный последовательный
интерфейс, через который идёт обычно загрузка программ пользователя. Но этот интерфейс нуждается
в программной поддержке, а у нас будет загрузка и исполнение кодов безо всякого ПО на плате.
Смотрим принципиальную схему:
Увеличить
Я ввёл 2 дополнительных регистра типа 580ИР82, которые своими тристабильными выходами подключены
к шине данных системы, а на входы их через разряды данных LPT-коннектора можно выдавать байты и
фиксировать их отдельными стробами - /AUTOF и /STROBE, соответственно.
После того, как старший и младший байты кода операции зафиксированы в регистрах, подается
сигнал INIT в виде строба низкого уровня, который выводит процессор из состояния WAIT,
процессор считывает из регистров 2 байта кода, исполняет их, если их достаточно, и снова
обращется к памяти за новым кодом или продолжением предыдущего кода. Этим он снова загоняет
себя в состояние WAIT, перебросив RS-триггер, но этот же триггер снимает активный сигнал BUSY для LPT-порта.
Теперь снова можно подать процессору через регистры младший и старший байты нового кода, и снова
разрешить его работу стробом INIT, управляющим через одновибратор пошаговым RS-триггером.
Вся прелесть решения заключается в том, что я использовал адресную линию А15 в качестве селектора
адресного пространства в сегменте.
По адресам 8000H-0FFFFH А15 = "1" и эта логическая "1" пропускает сигнал /MRD на пошаговый RS-триггер.
А в диапазоне 0000H-7FFFH процессор этим триггером не тормозится, поскольку А15 = "0" и /MRD не
командует триггером, а значит не загоняет себя в состояние WAIT.
Значит, получается следующая карта памяти в пределах одного сегмента:
В нижних 32 КБайт можно расположить ОЗУ, которое будет работать самым обычным образом.
В верхних 32 КБайт процессор натыкается на " псевдо-ПЗУ" и работает в старт-стопном режиме.
В принципе такую дешифрацию можно изменить, применив дополнительные схемы селекции, но я
был очень ограничен местом на макетке.
Итак, процессор КР1810ВМ86 стартует с адреса 0FFF0H в старшем сегменте и там он сразу попадает
в режим чтения-исполнения команд по интерфейсу LPT, которыми мы можем загрузить программу
в нижние 32 КБайт ОЗУ и передать на них управление, где программа выполняется самым обычным образом.
Для того, чтобы выполнение команд было как-то визуально заметно, я временно добавил в систему
один единственный порт вывода на регистре типа 580ИР82, в который мы попадаем командами OUT
по любому адресу из 65536 возможных.
На выходе этого порта визуализацию записанных в него данных осуществляют 8 светодиодов.
И тут выяснилась весьма интересная и забавная вещь, что сконструированная мной система и безо
всякого ОЗУ позволяет выполнять программы, хотя и с некоторыми ограничениями, но позволяющие
вынести суждение об исправности уже собранной микропроцессорной системы.
Но о программах я расскажу далее...
|
04 Dec 2014 13:00 |
|
|
Stan
Banned
Joined: 04 Jan 2013 10:09 Posts: 397 Location: 95.24.178.158
|
Софтом для этого поделия для меня первоначально послужила вот эта весьма полезная программа:
LPT_VB.exe - Parallel port monitor by Nail Fraser.
У меня довольно старый вариант, но, говорят, что у автора (или авторов) есть варианты этого
монитора LPT-портов даже для Windows 7 (64).
Я этого не проверял, мне хватило для старта и своего экземпляра, но, думаю, кому понадобится,
найти подходящий экземпляр этой программы будет нетрудно.
---------
Потыкался я мышью в биты данных и стробы, транслируя коды при помощи вьюера HIEW, поскольку
очень мне самому не терпелось всё это увидеть в работе...
И навскидку оно всё очень неплохо даже и заработало! Хотя некоторые погрешности были, но это
уже учтено мной в схеме, показанной здесь выше.
А поскольку мне очень хотелось скорее увидеть всё в динамике ( а сделал я это всё ещё в эти выходные - на рисование схемы больше времени ушло ), то я решил не связывать себя всякими
драйверами Винды, хорошими или менее хорошими, а запустить это всё под " голым DOS", дабы
быть уверенным, что если что работает не так, как хотелось, то это мои ошибки, а не происки
коварства Винды, пытающейся помешать мне (или помочь) работать с портами.
Поэтому я выбрал даже не компилятор, а интерпретатор QBasic, который раньше даже был в
дистибутивах Винды, вроде как до версии 98. Ну, благо, критичного ничего в протоколе работы
с этой железкой нет.
Ну и вот что у меня получилось:
| | | | Code: '>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> COD2LPT <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<'
DECLARE SUB SETHIGH (WORD%) DECLARE SUB SENDLOW (WORD%) DECLARE SUB SETINIT () DECLARE SUB DELAY (TIME!)
DEFINT A-Z DIM SHARED PRTRBASE, PRTSTATS, PRTDRIVE AS INTEGER
SCREEN 0: WIDTH 80, 25: CLS
'----------------------------------- ищем базовый адрес LPT1 DEF SEG = &H40 '---- указываем на область BIOS PRTRBASE = PEEK(9) * 256 + PEEK(8) '--- адрес регистра данных, базовый LPT1 DEF SEG PRTSTATS = PRTRBASE + 1 '--- адрес регистра статуса PRTDRIVE = PRTRBASE + 2 '--- адрес регистра управления PRINT HEX$(PRTRBASE); "H, "; HEX$(PRTSTATS); "H, "; HEX$(PRTDRIVE); "H "'--- DO: LOOP WHILE INKEY$ = "" CLS OUT PRTDRIVE, INP(PRTDRIVE) AND &HFC '--- /STROBE = 1, /AUTO = 1 OUT PRTDRIVE, INP(PRTDRIVE) OR &H4 '--- INIT = 1 DO SETHIGH (&H55) '--- MOV AL,55H SENDLOW (&HB0) SETINIT
SETHIGH (&HEA) '--- NOP, JMP FAR 08000H SENDLOW (&H90) '--- чтобы не уйти в нижние 32 Кбайт SETINIT
SETHIGH (&H80) SENDLOW (&H0) SETINIT
SETHIGH (&H0) SENDLOW (&H0) SETINIT
SETHIGH (&HFF) '--- OUT 0FFH,AL SENDLOW (&HE6) SETINIT
SETHIGH (&HFF) '--- OUT 0FFH,AL SENDLOW (&HE6) SETINIT DELAY (.2) '--- задержка по таймеру
SETHIGH (&HAA) '--- MOV AL,0AAH SENDLOW (&HB0) SETINIT
SETHIGH (&HEA) '--- NOP, JMP FAR 0F000H SENDLOW (&H90) '--- чтобы "поморгать" светодиодами SETINIT '--- старших линий адреса
SETHIGH (&HF0) SENDLOW (&H0) SETINIT
SETHIGH (&H0) SENDLOW (&H0) SETINIT
SETHIGH (&HFF) '--- OUT 0FFH,AL SENDLOW (&HE6) SETINIT
SETHIGH (&HFF) '--- OUT 0FFH,AL SENDLOW (&HE6) SETINIT DELAY (.2) '--- задержка по таймеру
LOCATE 1, 1 PRINT "---------------------------------------------------" LOOP WHILE INKEY$ <> CHR$(&H1B) '--- выход по клавише [ESC]
END '------------------------SUBROUTINES--------------------------- SUB DELAY (TIME!) TIMER ON Start! = TIMER DO LOOP UNTIL TIMER > Start! + TIME! ' = .1 TIMER OFF END SUB
SUB SENDLOW (WORD%) OUT PRTRBASE, WORD% OUT PRTRBASE, WORD%
OUT PRTDRIVE, INP(PRTDRIVE) OR &H1 '--- /STROBE = 0 OUT PRTDRIVE, INP(PRTDRIVE) OR &H1 '--- /STROBE = 0
OUT PRTDRIVE, INP(PRTDRIVE) AND &HFE '--- /STROBE = 1 OUT PRTDRIVE, INP(PRTDRIVE) AND &HFE '--- /STROBE = 1 END SUB
SUB SETINIT PRINT HEX$(INP(PRTSTATS) AND &H80); "--> ";
OUT PRTDRIVE, INP(PRTDRIVE) AND &HFB '--- INIT = 0 OUT PRTDRIVE, INP(PRTDRIVE) AND &HFB '--- INIT = 0
PRINT HEX$(INP(PRTSTATS) AND &H80); "-__ "; DO Key$ = INKEY$ '--- выход по клавиатуре если железо зависло Stat = INP(PRTSTATS) AND &H80 '--- "слушаем" BUSY PRINT "-"; LOOP WHILE ((Key$ = "") AND (Stat = 0))
OUT PRTDRIVE, INP(PRTDRIVE) OR &H4 '--- INIT = 1 OUT PRTDRIVE, INP(PRTDRIVE) OR &H4 '--- INIT = 1 PRINT HEX$(INP(PRTSTATS) AND &H80); " " 'DO 'Key$ = INKEY$ '--- для пошагового выполнения кодов "программы" 'LOOP WHILE Key$ <> CHR$(32) '--- по нажатию на ["Пробел"] END SUB '------------------------SUBROUTINES END--------------------------- | | | | |
Двойные обращения к портам инструкцией OUT должны по идее воплотить следующий механизм программирования вывода:
Так советуют работать с выводом на процессорах х86, если задержки при обращении
к порту нет, или она недостаточна.
А по осциллографу сигналы LPT фронтами не ахти и весьма шумные, поэтому я их
и притянул к +5В и пропустил через вентили.
Кстати, на схеме не отразил, но и линии данных с LPT тоже притянуты резисторами 1.2 кОм к +5В питания.
Программа выводит в порт попеременно сигнатуры 55Н, 0ААН, что и отображает
следующая фотография:
Предвижу замечания типа, что LPT-порт сейчас фиг где найдёшь, но видел я здесь,
что Tronix нашел, когда понадобилось - это во-первых...
А во-вторых, я продумывал эту железку, чтобы можно было использовать ЛЮБЫЕ переходники типа USB-2-LPT, даже те, что не имеют номеров портов и не дают
" поморгать" отдельными битами. Но они же протокол Centronics воплощают понятным
для принтеров образом - а этого, как мне кажется, вполне достаточно в дальнейшем.
P.S. Я себе, конечно же, и ещё управляющих программ написал, в том числе и с чтением кодов из файла, но не думаю, что они здесь будут интересны. Из того, что приведено выше, основной принцип понятен, и каждый может написать себе сам с любимым компилятором и привычными библиотеками работы с портами. Единственное, что следует помнить при работе с "псевдо-ПЗУ" - программа должна быть выровнена на слово, программа выполняется линейно, что бы мы не писали в качестве JMP или CALL, - а по нему, конечно же, не будет возврата.
|
04 Dec 2014 14:26 |
|
|
Lavr
Supreme God
Joined: 21 Oct 2009 08:08 Posts: 7777 Location: Россия
|
newold86, а у Вас вот этот осциллограф самодельный или фирменный какой?
А то попадалось мне как-то по пути довольно похожее изделие...
-------
_________________ iLavr
|
07 Dec 2014 09:52 |
|
|
newold86
Devil
Joined: 30 Nov 2013 11:08 Posts: 709 Location: WWW
|
|
07 Dec 2014 11:15 |
|
|
Lavr
Supreme God
Joined: 21 Oct 2009 08:08 Posts: 7777 Location: Россия
|
| | | | Stan wrote: Мультивибратор на К155ЛА3 формирует меандр в звуковом диапазоне частот. Его работу на слух контролируем по пьезо-спикеру или высокоомному телефону типа "Тон" или "Октава" (у меня был последний - 1700 Ом). Телефон нужен просто, чтобы подобрать генерацию в низкочастотном диапазоне на слух из интервала 400...1000Гц. Эта частота " модулирует" (а на самом деле формирует пачки импульсов) частоту, сформированную задающим генератором КР1810ГФ84, и её можно легко услышать по китайскому приемнику с частотомером, которых полно в разных ларьках. -----Можно и любым другим приёмником, поскольку у меандра широкий спектр, он слышен даже в ФМ (ЧМ) диапазоне, по крайней мере включение довольно ощутимо регистрируется моим приемником, по которому я дома слушаю ФМ станции. Частоты подходящих для схемы кварцев попадают в диапазон коротких волн с частотой от 3 МГц (длина волны 100 м) до 30 МГц (длина волны 10 м). | | | | |
Вот эта затея с приемником мне дюже понравилась, и когда я собирал свой Nedo-"Специалист" на UB880, то специально не пользовался осциллографом, хотя и купил USB-приставку... Что неприятно при измерении частоты приемником - не всегда основная частота и гармоники попадают в границы вещательных диапазонов. Я призадумался, как это побороть, и, как мне кажется, нашел довольно простое решение: есть такая чисто цифровая несложная схема: Преобразователь меандра в синусоиду-----Операционник на 8...16 МГц нужно заменить ВЧ транзистором, включенным как эмиттерный повторитель. И с эмиттера через емкость уже цеплять провод-антенну. Основной кайф от этой схемы, что на выходе она выдает псевдо-синус с частотой Fвх/3. Значит повышается вероятность услышать генератор в вещательном диапазоне. И еще один момент... на мой взгляд, вот здесь ошибка в схеме подключения регистра ИР82: Ошибка может быть незаметна, если в порт постоянно что-то пишут - светодиоды не успевают "погаснуть" для глаз, а может быть коллега Stan просто ошибся, рисуя схему. Я тоже чуть было не совершил похожую ошибку, поскольку в своей схеме на UB880 хотел изначально поставить регистры ИР22, ИР23 - они жрут меньше. Но они неудобны при макетировании на беспаечной макетке - входы и выходы идут подряд на каждой стороне. У ИР82 - входы с одной стороны, а выходы - с другой, но сигналы управления отличаются немного (даже у ИР22 от ИР23). P.S. Посчитал, идея вполне работоспособная с эмиттерным повторителем - его включать, как в самодельных компьютерах формируют полный телевизионный сигнал.Синус, конечно, будет не ахти какой синусоидальный, но при такой аппроксимации - вполне ничего...
_________________ iLavr
Last edited by Lavr on 16 Oct 2016 09:37, edited 4 times in total.
|
16 Nov 2015 11:01 |
|
|
jdigreze
God
Joined: 02 Jan 2006 02:28 Posts: 1388 Location: Abakan
|
|
16 Nov 2015 21:21 |
|
|
Shaos
Admin
Joined: 08 Jan 2003 23:22 Posts: 22827 Location: Silicon Valley
|
Интересная штука надо попробовать - тока XOR можно на 4 NAND-ах построить: http://www.eeweb.com/electronics-quiz/create-xor-logic-with-nand-gatesP.S. Если в схеме есть конденсатор в обратной связи операционника, то это уже на активный фильтр похоже... P.P.S. Да так и есть - Low Pass Filter: http://www.swarthmore.edu/NatSci/echeeve1/Ref/FilterBkgrnd/Filters.html
|
17 Nov 2015 10:18 |
|
|
Who is online |
Users browsing this forum: No registered users and 1 guest |
|
You cannot post new topics in this forum You cannot reply to topics in this forum You cannot edit your posts in this forum You cannot delete your posts in this forum You cannot post attachments in this forum
|
|