Только забивать под 1206, так как на его место прилично ставится 0805 и меньше, а вот уже на 0805 красиво посадить 1206 трудновато. Да и тяжело вручную паять все что меньше 1206.
Вид для печати
Можно и продублировать посадочные места под резисторы, конденсатор и диоды SMD исполнения. Повторяю они будут располагаться с обратной стороны платы. Там будут только выступать длинные выводы панельки под ВВ55. Вот такую нужно панельку. А лучше, чтоб наверняка можно было вставить на основную плату в панельку ВВ55 приобрести с удлинёнными выводами. Атмегу8 лучше сразу запаять, разъём для подключения программатора расположен с правой стороны платы.
Сегодня сел на 30 минут за контроллер... и понял в чем дело. Я поставил подтягивающие резисторы на 8 ком и этого оказалось недостаточно. Слишком долго появляется единица, когда микроконтроллер отпускает землю. Я вставил в код прерывания NOP-ы и всё заработало.
Завтра перепаяю резисторы и продолжу доводить до ума контроллер.
UPD: Надо платы сделать, которые еще месяц назад обещал людям, так что в пятницу продолжу.
Оптимизировал прерывание:
- 16 таков при сканировании горизонталей. Ок!
- 19 тактов при сканировании вертикалей. Плохо! Вероятность, что МК успеет среагировать 50%. То есть кнопка на тесте мерцает.
Возможно, что не хватает всего одного такта! завтра еще подумаю.
Я сделал компромиссный вариант.
- 14 тактов при сканировании вертикалей F5-F12. Ок!
- 21 такт при сканирвоании вертикалей F1-F4. Компьютер вообще не видит этих нажатий.
НО! Все выше написанное относится к самому быстрому способу сканирования клавиатуры, который вряд ли используется где либо. BIOS и все игрушки, что я пробовал, работают в любом случае.
Код:interrupt [EXT_INT0] void ext_int0() {
#asm
.EQU PIND = $10
.EQU DDRD = $11
.EQU PORTD = $12
.EQU PINC = $13
.EQU DDRC = $14
.EQU PORTC = $15
.EQU PINB = $16
.EQU DDRB = $17
.EQU PORTB = $18
; На входе R9 = 0
; На входе R29 = 2
; Можно использовать регистры R9, R28
; Переводим PORTC в режим ввода
OUT DDRC, R9 ; 1 1
; Сохраняем флаги попозже, что бы увеличить дистанцию до команды чтения
IN R8, SREG ; 1 2
; DDRB = c2b[PINC];
IN R28, PINC ; 1 3 Убрал команду ANDI R28, 0x3F, но может случаиться, что без неё работать не будет
CPI R28, 0x3F ; 1 4
BRNE _v12 ; 1/2 5
; Вариант 1 (не работаеют кнопки в столбцах F1..F4, если сканировать эти столбцы. Остальное ок.)
OUT DDRB, R9 ; 1 6 R9=0
IN R28, DDRD ; 1 7
ANDI R28, $CC ; 1 8 Инфа передается по линиям 00110011, сбрасываем их в 0
OUT DDRD, R28 ; 1 9
IN R28, PINB ; 1 10
LDI R29, 1 ; 1 11
LD R9, Y ; 2 13 Адрес 0x100+R28
OUT DDRC, R9 ; 1 14
IN R28, PIND ; 1 15 Глюка нет, если заменить на PINB
ORI R28, $CC ; 1 16 Инфа передается по линиям 00110011, поэтому маскируем остальные
LDI R29, 2 ; 1 17
LD R28, Y ; 2 19 Адрес 0x200+R28+192
OR R28, R9 ; 1 20
OUT DDRC, R28 ; 1 21
; Вариант 2 (мерцают все кнопки при сканировании столбцов. Сканирование строк ок.)
; IN R28, DDRD ; 1 6
; ANDI R28, $CC ; 1 7 Инфа передается по линиям 00110011, сбрасываем их в 0
; OUT DDRD, R28 ; 1 8
; OUT DDRB, R9 ; 1 9 R9=0
; DDRC = d2c[PIND & 0x33] | b2c[PINB]
; IN R28, PIND ; 1 10 Глюка нет, если заменить на PINB
; ORI R28, $CC ; 1 11 Инфа передается по линиям 00110011, поэтому маскируем остальные
; LD R9, Y ; 2 13 Адрес 0x200+R28+192
; IN R28, PINB ; 1 14
; LDI R29, 1 ; 1 15
; LD R28, Y ; 2 17 Адрес 0x100+R28
; OR R28, R9 ; 1 18
; OUT DDRC, R28 ; 1 19
; LDI R29, 2
; Выход
CLR R9
STS _wrd, R9
STS _fl, R29
OUT SREG, R8
RETI
_v12: ; - 6
; DDRB = c2b[PINC];
LD R9, Y ; 2 8 Адрес 0x200+R28
OUT DDRB, R9 ; 1 9
; DDRD = (DDRD & 0xCC) | c2d[PINC];
SUBI R28, -64 ; 1 10
LD R9, Y ; 2 12 Адрес 0x200+R28+64
IN R28, DDRD ; 1 13
ANDI R28, $CC ; 1 14 Инфа передается по линиям 00110011, поэтому зануляем их
OR R28, R9 ; 1 15
OUT DDRD, R28 ; 1 16
; Выход
CLR R9
SER R28
STS _wrd, R28
STS _fl, R28
OUT SREG, R8
#endasm
}
---------- Post added at 22:58 ---------- Previous post was at 22:51 ----------
Залипание кнопок само вылечилось...
Засунул обработчик прерывания прямо в таблицу прерывания, сэкономил 2 такта. Но кнопка на тесте все равно мерцают.
Еще один такт :)
---------- Post added at 18:06 ---------- Previous post was at 17:27 ----------
14 и 17 тактов. И -2 такта за счет размещения обработчика прямо в таблице прерывания. Все ок!
---------- Post added at 18:10 ---------- Previous post was at 18:06 ----------
Код:interrupt [EXT_INT0] void ext_int0() {
#asm
.EQU PIND = $10
.EQU DDRD = $11
.EQU PORTD = $12
.EQU PINC = $13
.EQU DDRC = $14
.EQU PORTC = $15
.EQU PINB = $16
.EQU DDRB = $17
.EQU PORTB = $18
; На входе R9 = 0
; На входе R29 = 2
; Можно использовать регистры R8, R9, R28, R29
; Переводим PORTC в режим ввода
OUT DDRC, R9 ; 1 1
; Сохраняем флаги попозже, что бы увеличить дистанцию до команды чтения
IN R8, SREG ; 1 2
; DDRB = c2b[PINC];
IN R28, PINC ; 1 3 Убрал команду ANDI R28, 0x3F, но может случаиться, что без неё работать не будет
CPI R28, 0x3F ; 1 4
BRNE _v2 ; 1 5 Если был переход, то 2 такта
OUT DDRD, _PREPARED_DDRD ; 1 6 Сначала записываем DDRD, что бы увеличить дистанцию до команды чтения
OUT DDRB, R9 ; 1 7 R9 равен 0
; DDRC = d2c[PIND & 0x33] | b2c[PINB]
IN R28, PIND ; 1 8 Глюка нет, если заменить на PINB
ORI R28, $CC ; 1 9 Инфа передается по линиям 00110011, поэтому маскируем остальные
LD R9, Y ; 2 11 Адрес 0x200+R28+192
IN R28, PINB ; 1 12
LDI R29, 1 ; 1 13
LD R28, Y ; 2 15 Адрес 0x100+R28
OR R28, R9 ; 1 16
OUT DDRC, R28 ; 1 17
; Выход
LDI R29, 2
CLR R9
STS _wrd, R9
STS _fl, R29
OUT SREG, R8
RETI
_v2: ; DDRB = c2b[PINC];
LD R9, Y ; 2 8 Адрес 0x200+R28
OUT DDRB, R9 ; 1 9
; DDRD = (DDRD & 0xCC) | c2d[PINC];
SUBI R28, -64 ; 1 10
LD R28, Y ; 2 12 Адрес 0x200+R28+64
OR R28, _PREPARED_DDRD ; 1 13
OUT DDRD, R28 ; 1 14
; Выход
CLR R9
SER R28
STS _wrd, R28
STS _fl, R28
OUT SREG, R8
#endasm
}
Всё прекрасно! Вопрос возник. А сколько занимает таблица перекодировки. Сколько раскладок можно хранить в памяти Атмеги8?
Две настраиваемых. Хранятся в еепром. Одна таблица занимает 208 байт. Еепром обьемом 512 байт. И еще 2 дефолтных, которые можно скопировать в настраиваемые. Хранятся в основном ПЗУ.
---------- Post added at 20:23 ---------- Previous post was at 20:04 ----------
но если надо, могу сделать 10 таблиц
Думаю нужно две раскладки: кириллица и латиница. Переключение по Alt. Не знаю какое у тебя соответствие, а я в Специалисте на FPGA делал так:
http://www.spetsialist-mx.ru/images/PS_2_keyboard1.png
Русская раскладка:
http://www.spetsialist-mx.ru/images/PS_2_keyboard2.png
Кнопки ТЕСТ, РЕЖИМ, TURBO и NORMAL - чисто программно реализованные переключения в плисине и нам не пригодятся.
Настрой пару раскладок с помощью этой программы, я её встрою в МК.