Важная информация

User Tag List

Страница 1 из 2 12 ПоследняяПоследняя
Показано с 1 по 10 из 14

Тема: Z80 PIO не генерирует прерывание

  1. #1
    Junior
    Регистрация
    13.08.2021
    Адрес
    г. Краснодар
    Сообщений
    10
    Спасибо Благодарностей отдано 
    1
    Спасибо Благодарностей получено 
    0
    Поблагодарили
    0 сообщений
    Mentioned
    0 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию Z80 PIO не генерирует прерывание

    Всем здраствуте.
    Вот изобретаю спой велосипед с нуля для разминки мозга.

    Столкнулся с проблемой при подключении PS/2 клавы.
    Перепробовал все... 2 недели шаманю, а воз и ныне там. Хоть бросай все.

    Вот сама схемка (неммного упрощенная). ~STB даю кнопкой а не с HC595 как в оригинале... Что б избежать конфлита LS и HC серии. Все на LS.
    https://zx-pk.ru/attachment.php?atta...6&d=1629067257

    Вот что на осцилографе (желтый - ~STB строб, красный - ~INT)
    https://zx-pk.ru/attachment.php?atta...7&d=1629067267

    Для уверенности в самом начале гружу в А 55H, что и видно на порту А.
    https://zx-pk.ru/attachment.php?atta...8&d=1629067273

    Вот собственно ПЗУ прошито этим.

    0001 0000 ; Test #08
    0002 0000 ; Test PIO interrupt on port B
    0003 0000
    0004 0000 PORTA .equ 80h ; port A data
    0005 0000 CNTRLA .equ 81h ; port A control
    0006 0000 PORTB .equ 82h ; port B data
    0007 0000 CNTRLB .equ 83h ; port B control
    0008 0000
    0009 0000 .org 0h ; RESET
    0010 0000 31 F0 FF ld sp, 0fff0h
    0011 0003
    0012 0003 ED 5E im 2 ; cpu interrupt mode 2 (vectored)
    0013 0005 3E 00 ld a, 0h
    0014 0007 ED 47 ld i, a
    0015 0009
    0016 0009 3E 0F ld a, 0fh ; output
    0017 000B D3 81 out (CNTRLA), a
    0018 000D
    0019 000D 3E 4F ld a, 4fh ; input
    0020 000F D3 83 out (CNTRLB), a
    0021 0011
    0022 0011 3E 28 ld a, 28h ; vector address
    0023 0013 D3 83 out (CNTRLB), a
    0024 0015
    0025 0015 3E 87 ld a, 10000111b ; 87h, 83h - enable interrupts 10000111b
    0026 0017 D3 83 out (CNTRLB), a
    0027 0019
    0028 0019 3E 55 ld a, 55h
    0029 001B 21 00 80 ld hl, 8000h
    0030 001E 77 ld (hl), a
    0031 001F
    0032 001F FB ei
    0033 0020
    0034 0020 7E MAIN: ld a, (hl)
    0035 0021 D3 80 out (PORTA), a
    0036 0023 C3 20 00 jp MAIN
    0037 0026
    0038 0026
    0039 0028 .org 28h
    0040 0028 08 ex af, af' ; save A, FLAGS
    0041 0029 7E ld a, (hl)
    0042 002A 3C inc a
    0043 002B 77 ld (hl), a
    0044 002C 08 ex af, af' ; restore A, FLAGS
    0045 002D FB ei
    0046 002E ED 4D reti
    0047 0030
    0048 0030 .END

    Схему саму прозвонил раз 20, все правильно (соответствует задуманной).... Код тоже перепробовал разный... 87h, 83h для включения прерываний.
    По адресам тоже вроде, как видно в .lst файле.

    Если написать без прерываний, просто выдавать входной порт на выходной - работает.

    Посмотрите свежим глазом, может я какого-нить костыля не вижу... глаз замылился?
    Последний раз редактировалось fromzero2infinity; 16.08.2021 в 01:56.

  2. #1
    С любовью к вам, Yandex.Direct
    Размещение рекламы на форуме способствует его дальнейшему развитию

  3. #2
    Guru Аватар для Sayman
    Регистрация
    16.02.2006
    Адрес
    Новосибирск
    Сообщений
    3,280
    Спасибо Благодарностей отдано 
    17
    Спасибо Благодарностей получено 
    91
    Поблагодарили
    54 сообщений
    Mentioned
    2 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    fromzero2infinity, по адресу 0x38 попробуй воткнуть обработчик прерываний либо используй свой вектор, но в IM2 режиме.
    0A заповедей:
    I. Не удаляй каталог свой.
    II. Не удаляй до времени ни одного файла.
    III. Не кради файлы.
    IV. Не желай программы ближнего своего.
    V. Почитай BDOS и BIOS как родителей своих ...
    ---
    Sprinter resurrect:
    Telegram
    Discord
    Repo
    Forum

  4. #3
    Veteran Аватар для Serg6845
    Регистрация
    30.12.2018
    Адрес
    г. Москва
    Сообщений
    1,016
    Спасибо Благодарностей отдано 
    8
    Спасибо Благодарностей получено 
    255
    Поблагодарили
    235 сообщений
    Mentioned
    0 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    Цитата Сообщение от fromzero2infinity Посмотреть сообщение

    0039 0028 .org 28h
    0040 0028 08 ex af, af' ; save A, FLAGS
    0041 0029 7E ld a, (hl)
    0042 002A 3C inc a
    0043 002B 77 ld (hl), a
    0044 002C 08 ex af, af' ; restore A, FLAGS
    0045 002D FB ei
    0046 002E ED 4D reti
    0047 0030
    0048 0030 .END


    Посмотрите свежим глазом, может я какого-нить костыля не вижу... глаз замылился?
    картинки не видно - грузится gif 1x1 pixel

    ну и в IM2 Z80 не переходит по адресу вектора, а берет по этому адресу 16-битный адрес перехода, по которому уже идет дальше. то есть при такой прошивке улетит на адрес 0x7e08.

    Зверинецъ

    Специалист (был когда-то "совсем стандарт") - 1988-2023
    Ленинград1 +256К +AY+BDI+VGA выход +Ethernet (Speccyboot) +Xmodem (115200)+divmmc
    Ленинград2 + CF карта
    Платформа 8085+Z80+CPLD (Специалист МХ2 +SD +FDD +PS/2kbd)
    БК0010-01 стоковый
    [свернуть]

  5. #4
    Guru Аватар для Sayman
    Регистрация
    16.02.2006
    Адрес
    Новосибирск
    Сообщений
    3,280
    Спасибо Благодарностей отдано 
    17
    Спасибо Благодарностей получено 
    91
    Поблагодарили
    54 сообщений
    Mentioned
    2 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    Цитата Сообщение от Serg6845 Посмотреть сообщение
    берет по этому адресу 16-битный адрес перехода
    там немного не так. мы привыкли, что на Спектруме, когда задаём таблицу векторов для im2, то мы задаём как правило только старшую часть адреса. Для Z80PIO, когда мы указываем контроллеру адрес вектора для прерываний, мы указываем младшую часть. Таким образом, для примера, мы установили вектор на адрес #a000 (условно, конечно, адрес будет выглядеть как #a0a0), а для PIO адрес #10, то при приходе прерываний будет обращение по адресу #a010. Проц возьмёт от туда 2 байта и выполнит туда jp.в итоге может быть так, что экранные прерывания прилетают на im2 вектор, который мы указали процу, а прерывания от PIO прилетают по другому вектору, но в диапазоне 256.
    т.е. в данном примере:
    im 2 ; cpu interrupt mode 2 (vectored)
    ld a, 0h
    ld i, a

    ld a, 0fh ; output
    out (CNTRLA), a
    ld a, 4fh ; input
    out (CNTRLB), a

    ld a, 28h ; vector address
    out (CNTRLB), a
    будет вектор по адресу #0028, что в примере и указано, но в примере по этому адресу должны лежать 2 байта, что то вроде
    .org 28h
    dw procedure_addr
    проц берёт этот адрес и делает jp
    Последний раз редактировалось Sayman; 16.08.2021 в 12:40.
    0A заповедей:
    I. Не удаляй каталог свой.
    II. Не удаляй до времени ни одного файла.
    III. Не кради файлы.
    IV. Не желай программы ближнего своего.
    V. Почитай BDOS и BIOS как родителей своих ...
    ---
    Sprinter resurrect:
    Telegram
    Discord
    Repo
    Forum

  6. #5
    Junior
    Регистрация
    13.08.2021
    Адрес
    г. Краснодар
    Сообщений
    10
    Спасибо Благодарностей отдано 
    1
    Спасибо Благодарностей получено 
    0
    Поблагодарили
    0 сообщений
    Mentioned
    0 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    Cпасибо за ответы. Проблеск надежды появился.

    При програмировании четко следовал этому - https://zilog.com/docs/z80/UM0080.pdf
    стр. 34
    В hex файле вот это:
    :2000000031F0FFED5E3E00ED473E0FD3813E4FD3833E28D38 33E87D3833E5521008077FB02
    :110020007ED380C320000000087E3C7708FBED4D00A5
    :00000001FF

    Первая инструкция обработчика - ex af, af' ; save A, FLAGS (08h) - по адреcу 0028H. При RESET адрес таблицы в I сбрасывается в 0H, но я дле перестраховки явно туда 0h положил.

    Смущает пока что при всем при том, я не вижу прерывания по восходящему фронту ~BSTB, что по документации должно происходить. По негативному фронту - латч в порт, по восходящему - ~INT для процессора.
    Вот осцилограмма - https://zx-pk.ru/attachment.php?atta...7&d=1629067267

    Я допустил бы, что неисправен PIO, но не 5 из имеющихся, что я опробовал.

    Конечно, можно запилить на avr8 входной порт, но это уже отход от РЕТРО компьютера

  7. #6
    Veteran Аватар для Serg6845
    Регистрация
    30.12.2018
    Адрес
    г. Москва
    Сообщений
    1,016
    Спасибо Благодарностей отдано 
    8
    Спасибо Благодарностей получено 
    255
    Поблагодарили
    235 сообщений
    Mentioned
    0 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    Цитата Сообщение от fromzero2infinity Посмотреть сообщение
    Cпасибо за ответы. Проблеск надежды появился.

    При програмировании четко следовал этому - https://zilog.com/docs/z80/UM0080.pdf
    стр. 34
    ну там все правильно написано. только понято неправильно...
    вот другими словами то же самое:

    https://zilog.com/docs/z80/UM0081.pdf
    стр. 199

    Первая инструкция обработчика - ex af, af' ; save A, FLAGS (08h) - по адреcу 0028H.
    а должна быть не по адресу 0028H, а по адресу, равному слову, лежащему по адресу 0028H. примерно так:

    .org 0028
    dw isr_start
    ...
    isr_start: ex af,af'
    ...


    Смущает пока что при всем при том, я не вижу прерывания по восходящему фронту ~BSTB, что по документации должно происходить. По негативному фронту - латч в порт, по восходящему - ~INT для процессора.
    Вот осцилограмма - https://zx-pk.ru/attachment.php?atta...7&d=1629067267
    а со схемой все нормально? картинки не открываются (4 разных ОС, разные браузеры)
    в частности вход IEI куда зацеплен?

    Зверинецъ

    Специалист (был когда-то "совсем стандарт") - 1988-2023
    Ленинград1 +256К +AY+BDI+VGA выход +Ethernet (Speccyboot) +Xmodem (115200)+divmmc
    Ленинград2 + CF карта
    Платформа 8085+Z80+CPLD (Специалист МХ2 +SD +FDD +PS/2kbd)
    БК0010-01 стоковый
    [свернуть]

  8. #7
    Junior
    Регистрация
    13.08.2021
    Адрес
    г. Краснодар
    Сообщений
    10
    Спасибо Благодарностей отдано 
    1
    Спасибо Благодарностей получено 
    0
    Поблагодарили
    0 сообщений
    Mentioned
    0 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    Вот жеж... И впрямь на стр. 199 по PIO разговор про ТАБЛИЦУ. Но... редкая птица долетит до 199 страницы мануала СПАСИБО, что подняли мне веки
    Это огромный прогресс по выходу из тупика.
    Переписал на вот такое:

    .org 0h ; RESET
    ld sp, 0fff0h
    im 2 ; cpu interrupt mode 2 (vectored)
    ld a, 0h
    ld i, a
    ld a, 0fh ; output
    out (CNTRLA), a
    ld a, 4fh ; input
    out (CNTRLB), a
    ld a, 40h ; vector address
    out (CNTRLB), a
    ld a, 10000111b ; 87h, 83h - enable interrupts 10000111b
    out (CNTRLB), a
    ld a, 55h
    ld hl, 8000h
    ld (hl), a
    ei
    MAIN: ld a, (hl)
    out (PORTA), a
    jp MAIN
    .org 28h
    ex af, af' ; save A, FLAGS
    ld a, (hl)
    inc a
    ld (hl), a
    ex af, af' ; restore A, FLAGS
    ei
    reti
    .org 40h
    INTTBL: .WORD 0028h



    Пока результат тот же... не пашет... IEI зацеплен на +5В.





    Красный - ~INT идет на ~INT CPU (пин16) подтянутый 1КОм на питание, желтый - ~BSTB
    Последний раз редактировалось fromzero2infinity; 18.08.2021 в 07:12.

  9. #8
    Guru Аватар для Sayman
    Регистрация
    16.02.2006
    Адрес
    Новосибирск
    Сообщений
    3,280
    Спасибо Благодарностей отдано 
    17
    Спасибо Благодарностей получено 
    91
    Поблагодарили
    54 сообщений
    Mentioned
    2 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    Цитата Сообщение от fromzero2infinity Посмотреть сообщение
    ld a, 40h ; vector address
    Цитата Сообщение от fromzero2infinity Посмотреть сообщение
    ld a, 10000111b ; 87h, 83h - enable interrupts 10000111b
    поменяй эти 2 строчки местами. надо сначала включить прерывание, а потом уже вектор кидать, а ты наоборот сделал, кинул вектор при выключенных прерываниях.
    0A заповедей:
    I. Не удаляй каталог свой.
    II. Не удаляй до времени ни одного файла.
    III. Не кради файлы.
    IV. Не желай программы ближнего своего.
    V. Почитай BDOS и BIOS как родителей своих ...
    ---
    Sprinter resurrect:
    Telegram
    Discord
    Repo
    Forum

  10. #9
    Junior
    Регистрация
    13.08.2021
    Адрес
    г. Краснодар
    Сообщений
    10
    Спасибо Благодарностей отдано 
    1
    Спасибо Благодарностей получено 
    0
    Поблагодарили
    0 сообщений
    Mentioned
    0 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    Поменял.... пока так же....
    Пока поэтапно тестировал сигналы, обнаружил, что клава шлет селф-тест последовательности при подаче питания. Присмотрелся - да.. вроде ~INT по ~STB + фронту... Какой-то короткий, но все же получается есть. Масштаб = 10uS, значит ~INT примерно 2 uS.
    Генерится только при первом ~STB, потом хоть выспись - жми 100 раз - ничего на ~INT.
    Что,похоже свидетельствует о програмной ошибке.
    Последний раз редактировалось fromzero2infinity; 18.08.2021 в 19:50.

  11. #10
    Guru Аватар для Sayman
    Регистрация
    16.02.2006
    Адрес
    Новосибирск
    Сообщений
    3,280
    Спасибо Благодарностей отдано 
    17
    Спасибо Благодарностей получено 
    91
    Поблагодарили
    54 сообщений
    Mentioned
    2 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    fromzero2infinity,
    ну можно слегка поэксперементировать...
    Код:
    		org 0h			; RESET
    
    		ld sp,0fff0h
    		im 1			; cpu interrupt mode 1 (vectored)
    
    		ld a,0x30			;error reset, select WR0
    		out (CNTRLA),a
    		ld a,0x18			;channel reset
    		out (CNTRLA),a
    		ld a,0
    		out (CNTRLA),a
    		ld a,0x38
    		out (CNTRLA),a
    		ld a,1				;select WR1
    		out (CNTRLA),a
    		ld a,0				;no INT`s on CH_A
    		out (CNTRLA),a
    		ld a,3				;select WR3
                    out (CNTRLA),a
    		ld a,0xc1			;RX 8 bit`s, RX enabled
    		out (CNTRLA),a
    		ld a,4				;select reg4
    		out (CNTRLA),a
    		ld a,7				;Parity enabled, parity odd (?), 1 stop bit		
    		out (CNTRLA),a
    		ld a,5				;select reg5
    		out (CNTRLA),a
    		ld a,0x60			;TX 8 bit/Character
    		out (CNTRLA),a
    
    		ld a,55h
    		ld hl,8000h
    		ld (hl),a
    		ei
    MAIN:		ld a,(hl)
    		out (PORTA),a
    		jp MAIN
    
    
    		ds 38h-$		;вместо org
    
    ISR0:		push af
    		in a,(CNTRLA)
    		bit 0,a
    		jr z,_exit_isr
    		in a,(SIO_DATA_A)		;получить данные от клавы
    _exit_isr:	ld (hl),a
    		pop af
    		ret
    прерывания обычные, прилетают на 38h. на каждом прерывании чтение статуса клавы. если бит0 есть, значит есть данные. протести этот вариант, что там будет...
    0A заповедей:
    I. Не удаляй каталог свой.
    II. Не удаляй до времени ни одного файла.
    III. Не кради файлы.
    IV. Не желай программы ближнего своего.
    V. Почитай BDOS и BIOS как родителей своих ...
    ---
    Sprinter resurrect:
    Telegram
    Discord
    Repo
    Forum

Страница 1 из 2 12 ПоследняяПоследняя

Информация о теме

Пользователи, просматривающие эту тему

Эту тему просматривают: 1 (пользователей: 0 , гостей: 1)

Похожие темы

  1. z80-ftpclient
    от asve79 в разделе Софт
    Ответов: 3
    Последнее: 28.02.2019, 08:13
  2. Аппаратное прерывание в КР580ВМ80А
    от DenSam в разделе Разное
    Ответов: 1
    Последнее: 17.02.2017, 21:56
  3. Особенности программирования Z80 PIO
    от dk_spb в разделе Для начинающих
    Ответов: 2
    Последнее: 07.05.2014, 21:36
  4. Справочник Z80
    от goblinish в разделе Программирование
    Ответов: 8
    Последнее: 26.08.2012, 17:52
  5. Вопрос про прерывание LDIRа
    от ZEK в разделе Программирование
    Ответов: 2
    Последнее: 02.07.2006, 19:02

Ваши права

  • Вы не можете создавать новые темы
  • Вы не можете отвечать в темах
  • Вы не можете прикреплять вложения
  • Вы не можете редактировать свои сообщения
  •