это кнопки, которые замыкаются на землю, типа /res или /turbo, можете повесить на них любые такие кнопки
это кнопки, которые замыкаются на землю, типа /res или /turbo, можете повесить на них любые такие кнопки
Добрый день!
РАЗОБРАЛСЯ, rdfe к номеру три на рисунке ниже, поменял несколько атмег и кварцев на 24 МГц - теперь работает как часы.
Собрал данную схему от EvgenRU. Но подключить к Пентагон 128к так и не получилось.
Клавиатру в начале один раз мигает, после чего включается нум-лок и скролл-лок.
Если подключать /RDFE от DD49.1 2нг., то проходит инициализация но потом не работает ресет по клавише принт-скрин и не действуют светодиоды.
Пробовал делать схему формирования /рдфе на логическом элементе ЛЛ1, но результата не дало.
Возможно нужно убрать диоды и резисторы?
Далее привожу схему вариантов подключения:
http://savepic.ru/13725287.png
П.С. Схема завелась только на одном экземпляре кварца 24МГц, на 16, 20, 27 не заработало, прошивки на каждый кварц своя. Atmega8A - DIP корпус.
- - - Добавлено - - -
Если не секрет, то какие фьюзы исправили?
На Atmega88Цитата:
Если не секрет, то какие фьюзы исправили?
lfuse:w:0xEE:m -U hfuse:w:0xD5:m
Я тут опробовал еще такой вариант, вроде как даже стабильнее работает
и в _RESET нужно поменятьКод:INT0_Handler:
in YL,PinD ; PinD -> YL receive data from bus ; 1 cycle
// ------- 2 cycle both -------------
sbic PinC,0x03 ; if (PinC.3=0) skip next line (IF KA10=0) ; 1/2 cycle, 2 byte instruction
bld YL,2 ; move bit 3 of port C to bit 2 of data from port D ; 1 cycle, 2 byte instruction
// ----------------------------------
sbic PinD,0x02 ;if PinD.2=0 skip rjmp
rjmp release_bus ; release data bus if no kbd interrupt
ldd r20,Y+0x00 ; put data to r20 from SRAM key table at 0x100+YL ; 2 cycles, 4 byte instruction
//4+5 cycles before set data on port FE
out DDRB,r20 ; 1 cycle, 2 byte instruction
reti ; 4 cycles
release_bus:
out DDRB,CONST00 ; turn data bus to HI-Z state ; 1 cycle, 2 byte instruction
reti ; 4 cycles
Код://ldi r16,ISC01 ; falling edge int 0
ldi r16,ISC00 ; any logical change on int 0
привет.
повторил вариант контроллера на мега328р 27мгц от внешнего генератора. компутер - ленинград2. не работает.
клавиатура и джойстик в моем ленинграде опрашиваются через мультиплексоры КП11, выборка клава-джой сделана с шины адреса А5. выборка-чтение мультиплексора сделано из А0 и А5 диодным ИЛИ, IORQ и RD через ЛЛ1. вижу 8 четких импульсов.
подключал в разъем клавиатуры, шину адреса после диодов подтягивал на +5в резисторами. не работает, некрасивый сигнал на входе мультиплексора, подтянул на +5в. все красиво. не работает.
брал шину адреса от процессора - не работает.
брал шину адреса и данных от процессора - не работает.
засинхронизировался по чтению порта клавы, на втором канале осц смотрю, что происходит на шине данных. после falling edge через примерно 350-400ns появляется низкий уровень от атмеги. я решил, что это долго. поставил генератор на 32мгц. ничего не изменилось особо. не работает.
мультиплексор родной клавиатуры особо не мешает появлению низкого уровня от атмеги. на всякий случай оторвал RDFE от него и посадил на лог 1. теперь мультик точно не мешает. не работает.
собрал сигнал чтения из А0, IORQ и RD через ЛЛ1. не работает.
обратил внимание, что при нажатии на кнопку механической клавиатуры в штатном режиме лог 0 на шине данных появляется только в одном из 8 импульсов чтения. после этого импульса следующий приходит с некоторой задержкой, это отрабатывает процедура чтения. от атмеги лог 0 появляется в каждом импульсе RDFE и самих импульсов может быть не 8, а 6 или 4 или 2.
к сожалению только одна из 3х клавиатур вообще завелась с этим контроллером, т.е. проходит инит и загораются 2 лампочки. реагирует на numlock, capslock.
мужики, куда копать?
Если на NumLock CapsLock реагирует, значит контроллер работает, подтягивать ничего не нужно, нужно проверить правильно ли ШД/ША подключены и попробовать прошивки под другие частоты, вроде как уже на предыдущих страницах у кого-то заработало с прошивкой под другую частоту. Тут как лотерея :)
перепробовал все прошивки, пересобирал сам с разными к-тами. не летит.
пока отложил, может еще какие мысли появятся. или придет клавиатура от "корвета".
Воспользовался куском прошивки для зажигания индикаторов в другом контроллере (DATA - PD2, CLOCK - PD3, Atmega48), но почему-то индикаторы не реагируют никак. Что я делаю не так?
Определения
Код:.def ps2_parity_cnt = r13 ; счетчик единиц в байте с PS/2 клавиатуры для контроля четности
.def temp = r16 ; временный регистр для основной программы и подпрограмм
.def cnt = r20 ; регистр для счетчиков циклов
.def KBD_IND = r23 ; состояние индикаторов клавиатуры
[свернуть]
Подпрограмма
Код:; Set keyboard staus indicators
KBD_SEND_INDICATORS:
ldi temp,0xED ; keyboard command Set status indicators
rcall KBD_SEND ; subroutine send command to keyboard
mov temp,KBD_IND ; indicatoes value
;---------------------------------------------------------------------------------------
; Запись байта в клавиатуру
;---------------------------------------------------------------------------------------
KBD_SEND:
rcall KBD_SEND_BYTE
ret
;-------------------------------------------------------------------------------------------
KBD_SEND_BYTE:
sbi DDRD,0x03 ; set CLK pin as output (=0)
rcall Delay100mS ; Wait 100ms
sbi DDRD,0x02 ; 1->DDRD.2 DATA (=0)
rcall Delay5mS ; 5ms
cbi DDRD,0x03 ; set CLK pin as input (=1)
rcall Delay100uS
; начинается тактирование CLK от клавиатуры
rcall WAIT_CLK0
rcall Delay100uS
; цикл отправки 8 бит данных -------------------------------
ldi cnt,0x08
clr ps2_parity_cnt
rjmp L02A5
READ_LOOP:
rcall WAIT_CLK0
L02A5:
ror temp ; KBD_BYTE>> (сдвиг вправо, выдвинутый бит помещается в C)
brcs SEND_1 ; если C=1
;Отправка бита = 0
sbi DDRD,0x02 ; 1->DDRD.2 (в режим записи, на пине 0, т.к. PortD.2 = 0)
rjmp L02AB
SEND_1: ; Отправка бита = 1
cbi DDRD,0x02 ; 0->DDRD.2 (в режим чтения) вроде как отправляется 1
inc ps2_parity_cnt ; вычисление бита четности
L02AB:
rcall WAIT_CLK1
dec cnt
brne READ_LOOP
; конец цикла отправки ---------------------------------------
; отправка бита четности
rcall WAIT_CLK0
cbi DDRD,0x02
sbrc ps2_parity_cnt,0x00
sbi DDRD,0x02
rcall WAIT_CLK1
; стоповый бит
rcall WAIT_CLK0
cbi DDRD,0x02
rcall WAIT_CLK1
; ACK
rcall WAIT_CLK0
rcall WAIT_CLK1
ret
;---------------------------------------------------------------------------------------
;----------------------------------------------------------------------------------------
; Подпрограммы ожидания смены уровня CLK
;
; Проверка переполнения таймера и CLK: цикл пока таймер не переполнится или CLK не станет равно 1
; Если таймер переполнился, значит таймаут и бит не принят
WAIT_CLK1:
sbis PinD,0x03 ; CLK=1 пропускаем jmp
rjmp WAIT_CLK1 ; loop
ret
; Проверка переполнения таймера и CLK: цикл пока таймер не переполнится или CLK не станет равно 0
WAIT_CLK0:
sbic PinD,0x03 ; CLK=0 пропускаем jmp
rjmp WAIT_CLK0
ret
[свернуть]
Инициализация
Код:; init indicators
ldi KBD_IND,0 ; 0 = все погашены
rcall KBD_SEND_INDICATORS
[свернуть]Вызов
Код:ldi temp,0x02
eor KBD_IND,temp ; XOR with indicator value for NumLock
rcall KBD_SEND_INDICATORS
[свернуть]
А инициализация клавиатуры сделана в начале? Плюс, нужно учитывать привязку к частоте кварца