Можно и продублировать посадочные места под резисторы, конденсатор и диоды SMD исполнения. Повторяю они будут располагаться с обратной стороны платы. Там будут только выступать длинные выводы панельки под ВВ55. Вот такую нужно панельку. А лучше, чтоб наверняка можно было вставить на основную плату в панельку ВВ55 приобрести с удлинёнными выводами. Атмегу8 лучше сразу запаять, разъём для подключения программатора расположен с правой стороны платы.
Сегодня сел на 30 минут за контроллер... и понял в чем дело. Я поставил подтягивающие резисторы на 8 ком и этого оказалось недостаточно. Слишком долго появляется единица, когда микроконтроллер отпускает землю. Я вставил в код прерывания NOP-ы и всё заработало.
Завтра перепаяю резисторы и продолжу доводить до ума контроллер.
UPD: Надо платы сделать, которые еще месяц назад обещал людям, так что в пятницу продолжу.
Последний раз редактировалось vinxru; 31.01.2013 в 01:03.
Оптимизировал прерывание:
- 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 }
С любовью к вам, Yandex.Direct
Размещение рекламы на форуме способствует его дальнейшему развитию
Всё прекрасно! Вопрос возник. А сколько занимает таблица перекодировки. Сколько раскладок можно хранить в памяти Атмеги8?
Две настраиваемых. Хранятся в еепром. Одна таблица занимает 208 байт. Еепром обьемом 512 байт. И еще 2 дефолтных, которые можно скопировать в настраиваемые. Хранятся в основном ПЗУ.
---------- Post added at 20:23 ---------- Previous post was at 20:04 ----------
но если надо, могу сделать 10 таблиц
Думаю нужно две раскладки: кириллица и латиница. Переключение по Alt. Не знаю какое у тебя соответствие, а я в Специалисте на FPGA делал так:
Русская раскладка:
Кнопки ТЕСТ, РЕЖИМ, TURBO и NORMAL - чисто программно реализованные переключения в плисине и нам не пригодятся.
Последний раз редактировалось fifan; 02.02.2013 в 21:37.
Настрой пару раскладок с помощью этой программы, я её встрою в МК.
Последний раз редактировалось vinxru; 03.02.2013 в 00:38.
Эту тему просматривают: 1 (пользователей: 0 , гостей: 1)