nedoPC.org

Electronics hobbyists community established in 2002
Atom Feed | View unanswered posts | View active topics It is currently 28 Mar 2024 14:41



Reply to topic  [ 45 posts ]  Go to page 1, 2, 3  Next
i8080: возможно ли реализовать прерывания без доп. обвязки? 
Author Message
Senior
User avatar

Joined: 17 Jun 2014 04:29
Posts: 126
Location: 93.80.157.217
Reply with quote
Спаял небольшую схемку-тестер процессора 8080, портов 8255 и таймера 8253, для отображения информации используются 4 7-сегментных индикатора. Все уже работает, так вот хотелось бы вывод информации на этот индикатор реализовать по прерыванию.
Интересует такой вопрос: возможно ли без доп микросхем (контроллер шины, контроллер прерываний) создать простую систему прерываний? По задумке прерывания будет слать таймер, вектор прерывания будет всегда один - RST 7 (0ffh), формируется резисторами.


21 Jul 2014 17:26
Profile WWW
Supreme God
User avatar

Joined: 21 Oct 2009 08:08
Posts: 7777
Location: Россия
Reply with quote
vital72 wrote:
Интересует такой вопрос: возможно ли без доп микросхем (контроллер шины, контроллер прерываний) создать простую систему прерываний? По задумке прерывания будет слать таймер, вектор прерывания будет всегда один - RST 7 (0ffh), формируется резисторами.

Ну так и было сделано, в частности, в схеме "ЮТ-88". Трюк проверенный...

_________________
iLavr


21 Jul 2014 21:52
Profile
Doomed

Joined: 10 Mar 2012 16:21
Posts: 598
Location: РФ
Reply with quote
Post 
Чистое любопитство - на каком адресе "повесили" семисегментние ? :roll:


22 Jul 2014 06:53
Profile
Senior
User avatar

Joined: 17 Jun 2014 04:29
Posts: 126
Location: 93.80.157.217
Reply with quote
Post 
7-сегментные индикаторы управляются двумя регистрами, которые сидят в общем адресном пространстве с ОЗУ (а-ля РК-шка).
Так ли важно по каким адресам они находятся?


23 Jul 2014 05:25
Profile WWW
Senior
User avatar

Joined: 17 Jun 2014 04:29
Posts: 126
Location: 93.80.157.217
Reply with quote
Post 
что-то пока не получается с прерываниями. т.е. прерывание срабатывает, но в стек вместо адреса возврата пишется какая то хрень, в результате из процедуры прерывания возврат происходит черт знает куда.
для ясности как оно у меня устроено: программа на программаторе записывается в статическое ОЗУ с батарейкой, вставляю ОЗУ в свою платку, запускаю, вынимаю, смотрю, что записалось в память. для теста использую следующую простейшую подпрограмму прерывания: все регистры заносятся в стек и далее программа входит в бесконечный цикл. первым словом в стеке должен быть адрес возврата, далее регистры. регистры сохраняются как надо, а вот с адресом беда.
у кого-нибудь есть соображения по этому поводу?


23 Jul 2014 08:45
Profile WWW
Doomed

Joined: 10 Mar 2012 16:21
Posts: 598
Location: РФ
Reply with quote
Post 
Смогут появиться при виде кода ( хоть в hex хоть в любых мнемониках ассемблера - что менее затруднит - ежели секретный код можно даже в лс. )
А за адрес спросил действительно только из любопытства.


23 Jul 2014 12:06
Profile
Supreme God
User avatar

Joined: 21 Oct 2009 08:08
Posts: 7777
Location: Россия
Reply with quote
Post 
vital72 wrote:
что-то пока не получается с прерываниями. т.е. прерывание срабатывает, но в стек вместо адреса возврата пишется какая то хрень, в результате из процедуры прерывания возврат происходит черт знает куда.

А стек-то явно установлен в Вашей ОЗУ?
И есть ли по адресу прерывания RST7 - 0038h первая команда DI ?
А то прерывание простейшее - ничего не привязано к тактам ЦПУ - может там многократно
срабатывает прерывание?

Ну и если это чисто тестовый вариант - поставить после "регистров в стек" - команду HLT.
Переносить ОЗУ-шку на ней.

Такие вот мысли, хотя издалека очень трудно угадывать, и я бы еще посоветовал пройти всё
пошагово с помощью вот такой или аналогичной штуки:

Image

И проверить - нет ли чего-либо "нехорошего" на шинах?

_________________
iLavr


23 Jul 2014 12:51
Profile
Senior
User avatar

Joined: 17 Jun 2014 04:29
Posts: 126
Location: 93.80.157.217
Reply with quote
Post 
полуваттники - это круто :))
Про пошаговую схему я в курсе, использовать ее хотел в крайнем случае.
В процессе испытаний обнаружилась пара необъяснимых моментов.
1. Как я писал, при прерывании в стек записывается какая-то хрень, так вот я выяснил что это за хрень. Основную программу я ввожу в бесконечный цикл командой JMP, так вот в стек (SP - 1) кладется код этой команды C3, а следом (SP - 2) идет код на единицу больше - C4. Если команду безусловного перехода поменять на команду условного - в стек запишет ее код, а следом на 1 больше.
2. Если программу не зацикливать, а останавливать командой HLT, то в стек вообще ничего не кладется О_О.
3. Сложилось такое ощущение, что прерывание срабатывает только при выполнении команды перехода (и останова). Что привело меня к такому выводу. Решил сделать переход команды не на саму себя, а добавил в цикле однобайтовых команд (можно нопы). Так вот чем больше пустых команд тем, хуже срабатывает прерывание, если поставить штук 20, то прерывание почти наверняка не вызовется, хотя сигнал INTE процессора сбрасывается, т.е. прерывание он видит, но процедуру прерывания не вызывает.
На счет DI. Где то читал, что процессор сам запрещает прерывание при срабатывании оного, об этом свидетельствует сброшенный INTE, а также пишут, что по перед выходом из процедуры прерывания надо ставить команду EI.

Секрета в коде никакого нет, просто он на столько прост, что думал описания достаточно.

Code:
0000: 31 00 05 3E 30 32 03 E0 3E FF 32 00 E0 3E 00 32
0010: 00 E0 FB 01 12 34 11 56 78 21 9A BC C3 1C 00 00
0020: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
0030: 00 00 00 00 00 00 00 00 F5 C5 D5 E5 3E F7 32 00
0040: 90 3E C9 32 00 80 C3 46 00 00 00 00 00 00 00 00

и 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             ;  вечный цикл


И вот что в стеке в результате:
Code:
04F0: 00 00 00 00 00 00 9A BC 56 78 12 34 02 00 C4 C3


Ну в общем, проверялка свою функцию выполнила - проверила процы и порты, а прерывания - это я так, решил выпендриться.

Распределение памяти моего девайса:
0000-7FFF - ОЗУ (хотя реально стоит ОЗУ на 2к)
8000 - регистр сегментов индикаторов
9000 - регистр разрядов индикаторов
A000 - нет ничего тут
B000 - нет ничего тут
C000 - первый порт
D000 - второй порт
E000 - таймер
F000 - нет ничего тут

фото девайса:
Image


25 Jul 2014 07:18
Profile WWW
Doomed

Joined: 25 Aug 2009 07:02
Posts: 459
Location: Москва
Reply with quote
Post 
vital72 wrote:
Code:


А команда EI где? INTE по ресету сбрасывается и запрещает прерывания.


25 Jul 2014 14:33
Profile
Doomed

Joined: 10 Mar 2012 16:21
Posts: 598
Location: РФ
Reply with quote
Post 
Да, EI обязатяльно нужно. :idea:

А вот в п.1 неверное утверждение ="так вот в стек (SP - 1) кладется код этой команды" :( -на самом деле в стек кладётся содержимое счётчика, то есть {адрес_последней_команды+её_длина} и это всегда ДВА байта ( ибо счётчик 16-битовый ).
Разъяснить ситуацию помогло бы явное " org **h" программы
( Вот у подпрограммы для RST7 есть же правильное "org 38h" :wink: )


25 Jul 2014 15:21
Profile
Senior
User avatar

Joined: 17 Jun 2014 04:29
Posts: 126
Location: 93.80.157.217
Reply with quote
Post 
то ли вы читаете по диагонали, то ли я не доходчиво объясняю.
как оно должно быть я знаю и не писал бы если бы оно было так.
а как оно у меня происходит на самом деле все изложено.


25 Jul 2014 17:24
Profile WWW
Supreme God
User avatar

Joined: 21 Oct 2009 08:08
Posts: 7777
Location: Россия
Reply with quote
Post 
vital72 wrote:
то ли вы читаете по диагонали, то ли я не доходчиво объясняю.

Да нет - читаем-то мы нормально, просто если процессор, которому "в обед 100500 лет" работает не так, как это положено, то либо процессор дефектный, либо что-то спаяно не так...
vital72 wrote:
Так вот чем больше пустых команд тем, хуже срабатывает прерывание, если поставить штук 20, то прерывание почти наверняка не вызовется, хотя сигнал INTE процессора сбрасывается, т.е. прерывание он видит, но процедуру прерывания не вызывает.

Если после сброса процессора нигде нет команды EI, то прерываний и вовсе происходить не должно, запрещены они по "ресету". Непонятно, после чего "сигнал INTE процессора сбрасывается", тогда как он не был взведен через EI?
vital72 wrote:
На счет DI. Где то читал, что процессор сам запрещает прерывание при срабатывании оного, об этом свидетельствует сброшенный INTE, а также пишут, что по перед выходом из процедуры прерывания надо ставить команду EI.

Специально здесь выясняли этот момент, и выяснили даже экспериментально (VituZz проверял), что DI аппаратно не делается, хотя действительно, есть источники, где об этом прямо пишут.
Перед выходом из процедуры прерывания надо ставить команду EI обязательно, что очевидно.

На словах-то мы Вас отлично поняли, но на деле выходит, что «Если на клетке со львом написано «Осел» – не верь глазам своим!» (с)
Хотя, если Вы считаете, что для проверки работоспособности всего этого достатчно - не смеем навязываться, мы лишь высказали предположения на заданную тему:
vital72 wrote:
у кого-нибудь есть соображения по этому поводу?




PS. Обсуждали мы "неувязочку" с прерыванием вот здесь. А вот здесь был разговор о другой "неувязочке".
Общий вывод - не все камни, обозначенные как i8080(А) и (K)580ВМ(ИК)80(А) ведут себя идентичным образом.
Возможно, у Вас как раз один из "артефактов".

_________________
iLavr


25 Jul 2014 22:49
Profile
Banned
User avatar

Joined: 04 Jan 2013 10:09
Posts: 397
Location: 95.24.178.158
Reply with quote
vital72 wrote:
вектор прерывания будет всегда один - RST 7 (0ffh), формируется резисторами.

А чисто уже из спортивного интересу, раз уж такая "зогатка" случилась, а каковы у Вас номиналы этих резисторов?

А то, возможно, просто шина перегружена?


26 Jul 2014 05:49
Profile
Senior
User avatar

Joined: 17 Jun 2014 04:29
Posts: 126
Location: 93.80.157.217
Reply with quote
Stan wrote:
vital72 wrote:
вектор прерывания будет всегда один - RST 7 (0ffh), формируется резисторами.

А чисто уже из спортивного интересу, раз уж такая "зогатка" случилась, а каковы у Вас номиналы этих резисторов?

А то, возможно, просто шина перегружена?


10k

Но всеж таки, основная загадка, почему в стек заносится код команды, а не адрес возврата.


26 Jul 2014 12:08
Profile WWW
Supreme God
User avatar

Joined: 21 Oct 2009 08:08
Posts: 7777
Location: Россия
Reply with quote
vital72 wrote:
Но всеж таки, основная загадка, почему в стек заносится код команды, а не адрес возврата.

Для меня бОльшая загадка, почему в принципе прерывания срабатывают, в то время, когда они не разрешены ни одной командой EI с момента старта процессора.

_________________
iLavr


26 Jul 2014 12:33
Profile
Display posts from previous:  Sort by  
Reply to topic   [ 45 posts ]  Go to page 1, 2, 3  Next

Who is online

Users browsing this forum: No registered users and 9 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

Search for:
Jump to:  
Powered by phpBB® Forum Software © phpBB Group
Designed by ST Software.