caro, какую прошивку лучше взять за исходную для модификации под 16ю атмегу?
Вид для печати
caro, какую прошивку лучше взять за исходную для модификации под 16ю атмегу?
Схема полностью такая же как и оригинальная kbd_or12.png (в архиве первом посте), добавленные диоды - просто развязка аналогично тому как в оригинале стоит диод на reset Ориона.Вложение 65057 {схема с диодами потерялась со смертью savepic, этот обмылок из кэша гуглопоиска} Механическая матрица УКНЦ такая, подключение к ориону такое.
Посмотрел все схемы и прошивку и пришел к не утешительному выводу, что текущая схема на 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 такта Меги) позже, но не факт что это станет заметно Ориону - попробовать надо!
Получилось 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 МГц если я не ошибаюсь?
Здесь принцип другой.
В Спеке данные сразу же и читаются, 1 командой процессора.
А в Орионе и подобных - много команд, поскольку всё идёт через ВВ55. А это как минимум 2 команды (3 для расширенного, больше чем 8х8): запись сканкода в порт А и чтение результата из портов B/C.
Самая короткая (скоростная) последовательность чтения с клавиатуры для Ориона будет такая:
как видим, порядка 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
Причем, это минимальная подпрограмма, большинство прочих написано куда как менее оптимально.