 |
nedoPC.orgElectronics hobbyists community established in 2002 |
 |
i8080: возможно ли реализовать прерывания без доп. обвязки?
Author |
Message |
vital72
Novelist
Joined: 17 Jun 2014 04:29 Posts: 44 Location: 93.80.157.217
|
Спаял небольшую схемку-тестер процессора 8080, портов 8255 и таймера 8253, для отображения информации используются 4 7-сегментных индикатора. Все уже работает, так вот хотелось бы вывод информации на этот индикатор реализовать по прерыванию.
Интересует такой вопрос: возможно ли без доп микросхем (контроллер шины, контроллер прерываний) создать простую систему прерываний? По задумке прерывания будет слать таймер, вектор прерывания будет всегда один - RST 7 (0ffh), формируется резисторами.
|
21 Jul 2014 17:26 |
|
 |
Lavr
Supreme God
Joined: 21 Oct 2009 08:08 Posts: 7777 Location: Россия
|
Ну так и было сделано, в частности, в схеме "ЮТ-88". Трюк проверенный...
_________________ iLavr
|
21 Jul 2014 21:52 |
|
 |
petrenko
Doomed
Joined: 10 Mar 2012 16:21 Posts: 598 Location: РФ
|
Чистое любопитство - на каком адресе "повесили" семисегментние ? 
|
22 Jul 2014 06:53 |
|
 |
vital72
Novelist
Joined: 17 Jun 2014 04:29 Posts: 44 Location: 93.80.157.217
|
7-сегментные индикаторы управляются двумя регистрами, которые сидят в общем адресном пространстве с ОЗУ (а-ля РК-шка).
Так ли важно по каким адресам они находятся?
|
23 Jul 2014 05:25 |
|
 |
vital72
Novelist
Joined: 17 Jun 2014 04:29 Posts: 44 Location: 93.80.157.217
|
что-то пока не получается с прерываниями. т.е. прерывание срабатывает, но в стек вместо адреса возврата пишется какая то хрень, в результате из процедуры прерывания возврат происходит черт знает куда.
для ясности как оно у меня устроено: программа на программаторе записывается в статическое ОЗУ с батарейкой, вставляю ОЗУ в свою платку, запускаю, вынимаю, смотрю, что записалось в память. для теста использую следующую простейшую подпрограмму прерывания: все регистры заносятся в стек и далее программа входит в бесконечный цикл. первым словом в стеке должен быть адрес возврата, далее регистры. регистры сохраняются как надо, а вот с адресом беда.
у кого-нибудь есть соображения по этому поводу?
|
23 Jul 2014 08:45 |
|
 |
petrenko
Doomed
Joined: 10 Mar 2012 16:21 Posts: 598 Location: РФ
|
Смогут появиться при виде кода ( хоть в hex хоть в любых мнемониках ассемблера - что менее затруднит - ежели секретный код можно даже в лс. )
А за адрес спросил действительно только из любопытства.
|
23 Jul 2014 12:06 |
|
 |
Lavr
Supreme God
Joined: 21 Oct 2009 08:08 Posts: 7777 Location: Россия
|
А стек-то явно установлен в Вашей ОЗУ?
И есть ли по адресу прерывания RST7 - 0038h первая команда DI ?
А то прерывание простейшее - ничего не привязано к тактам ЦПУ - может там многократно
срабатывает прерывание?
Ну и если это чисто тестовый вариант - поставить после "регистров в стек" - команду HLT.
Переносить ОЗУ-шку на ней.
Такие вот мысли, хотя издалека очень трудно угадывать, и я бы еще посоветовал пройти всё
пошагово с помощью вот такой или аналогичной штуки:
И проверить - нет ли чего-либо " нехорошего" на шинах?
_________________ iLavr
|
23 Jul 2014 12:51 |
|
 |
vital72
Novelist
Joined: 17 Jun 2014 04:29 Posts: 44 Location: 93.80.157.217
|

полуваттники - это круто  )
Про пошаговую схему я в курсе, использовать ее хотел в крайнем случае.
В процессе испытаний обнаружилась пара необъяснимых моментов.
1. Как я писал, при прерывании в стек записывается какая-то хрень, так вот я выяснил что это за хрень. Основную программу я ввожу в бесконечный цикл командой JMP, так вот в стек (SP - 1) кладется код этой команды C3, а следом (SP - 2) идет код на единицу больше - C4. Если команду безусловного перехода поменять на команду условного - в стек запишет ее код, а следом на 1 больше.
2. Если программу не зацикливать, а останавливать командой HLT, то в стек вообще ничего не кладется О_О.
3. Сложилось такое ощущение, что прерывание срабатывает только при выполнении команды перехода (и останова). Что привело меня к такому выводу. Решил сделать переход команды не на саму себя, а добавил в цикле однобайтовых команд (можно нопы). Так вот чем больше пустых команд тем, хуже срабатывает прерывание, если поставить штук 20, то прерывание почти наверняка не вызовется, хотя сигнал INTE процессора сбрасывается, т.е. прерывание он видит, но процедуру прерывания не вызывает.
На счет DI. Где то читал, что процессор сам запрещает прерывание при срабатывании оного, об этом свидетельствует сброшенный INTE, а также пишут, что по перед выходом из процедуры прерывания надо ставить команду EI.
Секрета в коде никакого нет, просто он на столько прост, что думал описания достаточно.
и asm:  |  |  |  | Code: lxi sp,0500h ; указатель стека mvi a,30h ; нулевой канал таймера в нулевой режим sta 0e0003h mvi a,00h ; максимальный счет (тут это неважно) sta 0e0000h mvi a,00h sta 0e0000h lxi b,3412h ; просто какие то числа lxi d,7856h lxi h,0bc9ah l1: jmp l1 ; вечный цикл
org 38h rst7: push psw ; чтобы глянуть стек push b push d push h mvi a,0f7h ; просто что то зажжем на индикаторе, чтобы sta 9000h ; понять, что прерывание сработало mvi a,c9h sta 8000h l2: jmp l2 ; вечный цикл
|  |  |  |  |
И вот что в стеке в результате:
Ну в общем, проверялка свою функцию выполнила - проверила процы и порты, а прерывания - это я так, решил выпендриться.
Распределение памяти моего девайса:
0000-7FFF - ОЗУ (хотя реально стоит ОЗУ на 2к)
8000 - регистр сегментов индикаторов
9000 - регистр разрядов индикаторов
A000 - нет ничего тут
B000 - нет ничего тут
C000 - первый порт
D000 - второй порт
E000 - таймер
F000 - нет ничего тут
фото девайса:

|
25 Jul 2014 07:18 |
|
 |
Mixa64
Doomed
Joined: 25 Aug 2009 07:02 Posts: 449 Location: Москва
|
А команда EI где? INTE по ресету сбрасывается и запрещает прерывания.
|
25 Jul 2014 14:33 |
|
 |
petrenko
Doomed
Joined: 10 Mar 2012 16:21 Posts: 598 Location: РФ
|
Да, EI обязатяльно нужно.
А вот в п.1 неверное утверждение ="так вот в стек (SP - 1) кладется код этой команды"  -на самом деле в стек кладётся содержимое счётчика, то есть {адрес_последней_команды+её_длина} и это всегда ДВА байта ( ибо счётчик 16-битовый ).
Разъяснить ситуацию помогло бы явное " org **h" программы
( Вот у подпрограммы для RST7 есть же правильное "org 38h"  )
|
25 Jul 2014 15:21 |
|
 |
vital72
Novelist
Joined: 17 Jun 2014 04:29 Posts: 44 Location: 93.80.157.217
|
то ли вы читаете по диагонали, то ли я не доходчиво объясняю.
как оно должно быть я знаю и не писал бы если бы оно было так.
а как оно у меня происходит на самом деле все изложено.
|
25 Jul 2014 17:24 |
|
 |
Lavr
Supreme God
Joined: 21 Oct 2009 08:08 Posts: 7777 Location: Россия
|

Да нет - читаем-то мы нормально, просто если процессор, которому "в обед 100500 лет" работает не так, как это положено, то либо процессор дефектный, либо что-то спаяно не так... Если после сброса процессора нигде нет команды EI, то прерываний и вовсе происходить не должно, запрещены они по "ресету". Непонятно, после чего " сигнал INTE процессора сбрасывается", тогда как он не был взведен через EI? Специально здесь выясняли этот момент, и выяснили даже экспериментально ( VituZz проверял), что DI аппаратно не делается, хотя действительно, есть источники, где об этом прямо пишут. Перед выходом из процедуры прерывания надо ставить команду EI обязательно, что очевидно. На словах-то мы Вас отлично поняли, но на деле выходит, что « Если на клетке со львом написано «Осел» – не верь глазам своим!» (с) Хотя, если Вы считаете, что для проверки работоспособности всего этого достатчно - не смеем навязываться, мы лишь высказали предположения на заданную тему:
PS. Обсуждали мы "неувязочку" с прерыванием вот здесь. А вот здесь был разговор о другой "неувязочке". Общий вывод - не все камни, обозначенные как i8080(А) и (K)580ВМ(ИК)80(А) ведут себя идентичным образом. Возможно, у Вас как раз один из "артефактов".
_________________ iLavr
|
25 Jul 2014 22:49 |
|
 |
Stan
Banned
Joined: 04 Jan 2013 10:09 Posts: 397 Location: 95.24.178.158
|
А чисто уже из спортивного интересу, раз уж такая "зогатка" случилась, а каковы у Вас номиналы этих резисторов?
А то, возможно, просто шина перегружена?
|
26 Jul 2014 05:49 |
|
 |
vital72
Novelist
Joined: 17 Jun 2014 04:29 Posts: 44 Location: 93.80.157.217
|
10k
Но всеж таки, основная загадка, почему в стек заносится код команды, а не адрес возврата.
|
26 Jul 2014 12:08 |
|
 |
Lavr
Supreme God
Joined: 21 Oct 2009 08:08 Posts: 7777 Location: Россия
|
Для меня б Ольшая загадка, почему в принципе прерывания срабатывают, в то время, когда они не разрешены ни одной командой EI с момента старта процессора.
_________________ iLavr
|
26 Jul 2014 12:33 |
|
|
Who is online |
Users browsing this forum: No registered users and 3 guests |
|
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
|
|