caro, какую прошивку лучше взять за исходную для модификации под 16ю атмегу?
caro, какую прошивку лучше взять за исходную для модификации под 16ю атмегу?
Схема полностью такая же как и оригинальная kbd_or12.png (в архиве первом посте), добавленные диоды - просто развязка аналогично тому как в оригинале стоит диод на reset Ориона. {схема с диодами потерялась со смертью savepic, этот обмылок из кэша гуглопоиска} Механическая матрица УКНЦ такая, подключение к ориону такое.
Последний раз редактировалось Error404; 18.04.2018 в 10:24.
Лучше сделать и жалеть, чем не сделать и жалеть.
Некоторые из моих поделок тут: https://github.com/serge-404
Посмотрел все схемы и прошивку и пришел к не утешительному выводу, что текущая схема на ATMega48,
которая работает на частоте 8 МГц от встроенного генератора не обеспечивает требуемую скорость реакции
контроллера на опрос двух портов клавиатуры.
Предлагаю перейти к варианту контроллера выполненного на базе ATMega164 (40/44 выводной корпус),
работающий на частоте 20 МГц.
На 20 МГц работают и Меги48 (если с внешним кварцем). Опрос же там работает по прерыванию от изменения потенциала на ножках? Порт генерирующий прерывание остался ровно тот же (Орион выводит скан-код одинаково для обоих типов клавиатур: 8-битный сканкод в порт "А" ВВ55). Меняется только обработка 3х битов порта "C" (это выход Меги48 и вход Ориона).
На самом деле я не очень понимаю почему должно стать намного медленнее. Конечно, я не знаю как написан код, но если бы делал сам, то сделал бы так:
- в основном цикле непрерывно сканировал PS-2 клавиатуру и постоянно поддерживал в актуальном состоянии "полуфабрикат" ответов на входящий скан-код (т.е. вёл бы таблицу со всеми возможными вариантами ответов - их 256). Эта процедура на контроллере в 1МИПС вообще не критична по времени т.к. гарантированно успевает выполниться много раз в секунду (чаще чем мы сможем нажимать кнопки). Для РК86 в этом же цикле можно выводить 3 бита статуса упр. кнопок ctrl+shift+ruslat т.к. для РК86 они не зависят от скан-кода.
- по прерыванию (поступлению 8-битного скан-кода) используя скан-код как индекс просто брать из подготовленной ранее таблицы результат и выводить его в выходные порты (три команды на ассемблере). Для РК86 эта таблица содержит байты, а для УКНЦ - слова (надо по 11 бит, но придется по 16), т.е. для УКНЦ возможно придется использовать Мегу88 т.к. у неё 1кб RAM против 512b у Меги 48 (но она хотя бы по ножкам совместима - это очень важно учитывая что уже выпущено 4 десятка плат УКНЦ под такой корпус Меги).
Т.е. для 64 кнопок совпадающих с матрицей РК86 прошивка УКНЦ покажет ровно такую же скорость, а вот дополнительные 3 бита (24 кнопки) по прерыванию (скан-коду) будут выданы на 2 команды (2 такта Меги) позже, но не факт что это станет заметно Ориону - попробовать надо!
Лучше сделать и жалеть, чем не сделать и жалеть.
Некоторые из моих поделок тут: https://github.com/serge-404
Получилось 2 мксек.Код:;========================================================== ; На линиях PORTD фиксируются изменения состояния адресов ;4 PCINT2 PORTD in YL,PIND ;+1 адрес сканирования ld scanFF,Y ;+2 скан код из текущего буфера out PORTB,scanFF ;+1 выдать в порт данных ;=8 тактов => 1 Мксек при 8 МГц ; Регистровая пара Y по умолчанию указывает на 256 байтный буфер, ; в котором сформирована таблица с кодами нажатых клавиш ; Это в случае матрицы 8*8 ; ---- ; Для дополнительных 3 бит нужно будет сформировать еще один буфер на 256 байт ; Для ускорения работы сделаем его со старшим байтом адреса, отличающимся ; на 1 бит от первого буфера, например 0200h и 0300h sbr YH,1<<0 ;+1 -> Y=03xx ; теперь прочитаем код нажатых клавиш из нового буфера ld scanFF,Y ;+2 ; а вот теперь надо обязательно запомнить регистр статуса МК in tempS,SREG ;+1 сохранить СТАТУС in port_C,PINC ;+1 текущее состояние порта C andi port_C,0xF8 ;+1 обнулить 3 мл. бита or scanFF,port_C ;+1 добавим 3 бита из буфера клавиш out PORTC,scanFF ;+1 ;= 16 тактов => 2 мксек ; завершили выдачу во второй порт клавиатуры cbr YH,1<<0 ; Y=02xxh out SREG,tempS ; восстановить СТАТУС reti ;+4 возврат ;**********************************************************
Посмотри, если есть возможность, сколько времени в ОРИОНЕ занимает чтение порта клавиатуры.
Если больше 2 мксек до момента фиксации данных, то может и пройдет.
На спектруме, при тактовой частоте 3.5 Мгц реакция должна быть не более 0.7 мксек.
А у Ориона по моему тактовая = 2 МГц если я не ошибаюсь?
Последний раз редактировалось caro; 18.04.2018 в 21:19.
"Байт-48"
Самая короткая (скоростная) последовательность чтения с клавиатуры для Ориона будет такая:
как видим, порядка 10 тактов на реакцию от контроллера, т.е. для частот до 5 Мгц вполне умещаемся.Код:ld hl,0F400h ; base PPA address ld a,scancode ; 8 bits ld (hl),a ; 7 tstates inc l ; 4 tstates ld b,(hl) ; 7 tstates inc l ; 4 tstates ld c,(hl) ; BC[15..5]=resulting inkey bits
Причем, это минимальная подпрограмма, большинство прочих написано куда как менее оптимально.
Лучше сделать и жалеть, чем не сделать и жалеть.
Некоторые из моих поделок тут: https://github.com/serge-404
Эту тему просматривают: 1 (пользователей: 0 , гостей: 1)