User Tag List

Страница 6 из 8 ПерваяПервая ... 2345678 ПоследняяПоследняя
Показано с 51 по 60 из 72

Тема: ZXeretic

  1. #51

    Регистрация
    06.05.2006
    Адрес
    Ливны, Орловская обл
    Сообщений
    1,169
    Спасибо Благодарностей отдано 
    0
    Спасибо Благодарностей получено 
    0
    Поблагодарили
    0 сообщений
    Mentioned
    0 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    Фильтрация нескольких случайных нажатий одной кнопки.

  2. #52

    Регистрация
    02.04.2005
    Адрес
    Минск
    Сообщений
    378
    Спасибо Благодарностей отдано 
    0
    Спасибо Благодарностей получено 
    1
    Поблагодарили
    1 сообщение
    Mentioned
    0 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    С какой частотой обычно происходят эти нажатия?
    Сферический ламер в вакууме

  3. #53

    Регистрация
    06.05.2006
    Адрес
    Ливны, Орловская обл
    Сообщений
    1,169
    Спасибо Благодарностей отдано 
    0
    Спасибо Благодарностей получено 
    0
    Поблагодарили
    0 сообщений
    Mentioned
    0 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    Ну это же абсолютно бессистемно, на то он и дребезг. Фильтровать (если) надо нажатия чаще герц наверное 10-20 -- за три-четыре прерывания.

  4. #54

    Регистрация
    25.01.2005
    Адрес
    Miass, Chelyabinsk region
    Сообщений
    4,094
    Спасибо Благодарностей отдано 
    0
    Спасибо Благодарностей получено 
    2
    Поблагодарили
    2 сообщений
    Mentioned
    0 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    Цитата Сообщение от Дмитрий Посмотреть сообщение
    Да и в случае SNA, многие переменные барсика и тырдоса не инициализированы, что иногда создает грабли.
    у ужасма все инициализировано. тем он и хорош

    Цитата Сообщение от Soplik Посмотреть сообщение
    С какой частотой обычно происходят эти нажатия?
    обычно сразу после срабатывания в течение единиц-десятков мс могут быть многократные замыкания-размыкания. для хороших клавиатур достаточно опрашивать раз в прерывание (не чаще!), для плохих - и того реже. у меня была одна такая клава - многие проги с ней глючили, нажимаешь 1 раз, срабатывает 10 раз, ввести ничего невозможно. но это исключение.

    да и не везде нужен антидребезг, так-то.

  5. #55

    Регистрация
    02.04.2005
    Адрес
    Минск
    Сообщений
    378
    Спасибо Благодарностей отдано 
    0
    Спасибо Благодарностей получено 
    1
    Поблагодарили
    1 сообщение
    Mentioned
    0 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    Я чаще раза в прерывание и не буду, вы что.
    Я думаю либо раз в прерывание опрашивать, а обрабатывать раз в кадр все 4--5 дампов,
    или вообще опрашивать раз в кадр.

    ---------- Post added at 22:08 ---------- Previous post was at 21:53 ----------

    Я решил перед написанием ZXeretic-а сделать другую игру, попроще, не 3D.
    И обкатать часть процедур на ней.

    ---------- Post added 29.09.2013 at 00:00 ---------- Previous post was 28.09.2013 at 22:08 ----------

    А как в аласме записать код на диск?
    Сферический ламер в вакууме

  6. #56

    Регистрация
    28.12.2012
    Адрес
    Leesburg, VA, USA
    Сообщений
    974
    Спасибо Благодарностей отдано 
    0
    Спасибо Благодарностей получено 
    1
    Поблагодарили
    1 сообщение
    Mentioned
    1 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    Смотри, вот кусок кода, которым я опрашиваю клаву на контроллере.
    Его можно свободно портировать под нужды спектрума.

    Код:
    #define KDAT_PORT	PORTC
    #define KDAT_DIR	DDRC
    #define KDAT_PIN	PINC
    #define KROW_PORT	PORTB
    #define KROW_DIR	DDRB
    #define KROW_PIN	PINB
    #define DEBOUNCE_MASK	7			// Keyboard de-bouncing, as larger is bitmask as stronger is de-bouncing, but longer key response (1 to 7 LSBs)
    #define KDB_DELAY		4			// Delay in microseconds so voltage from address line could propagate
    #define MAX_KEYS		37
    
    volatile U8 key[MAX_KEYS];
    
    void poll_kbd(void)
    {
    	U8 i, j, k, key_pin;
    	U8 row = 1;
    	U8 key_num = 0;
    	
    	for (i = 0; i < 8; i++)
    	{
    		KROW_PORT = row;		// assert address line */
    		delay_us(KDB_DELAY);
    		key_pin = KDAT_PIN;		// poll keyboard data */
    		KROW_PORT = 0;			// deassert address line to reduce current */
    		row <<= 1;
    		
    		for (j = 0; j < 8; j++)
    		{
    			k = key[key_num];
    			k = (k & 0x80) | ((k << 1) & 0x7E) | (key_pin & 1);
    			key_pin >>= 1;
    			
    			if (!(k & DEBOUNCE_MASK) && (k & 0x80))
    			{
    				/* key was pressed */
    				send_note_on(key_num);
    				k &= 0x7F;
    			}
    				
    			else if (!(~k & DEBOUNCE_MASK) && !(k & 0x80))
    			{
    				/* key was released */
    				send_note_off(key_num);
    				k |= 0x80;
    			}	
    			
    			key[key_num++] = k;
    			if (key_num == MAX_KEYS)
    				break;
    		}
    		if (key_num == MAX_KEYS)
    			break;
    	}
    }
    Вот здесь:
    k = (k & 0x80) | ((k << 1) & 0x7E) | (key_pin & 1);
    происходит вдвиг бита статуса клавиши в переменную, после чего по маске определяется - считать ли клавишу нажатой или отжатой (все N бит по маске должны быть либо 0, либо 1), при этом старший бит определяет разовость этого события.
    Выбирая маску, можно добиться нужной дребезгоустойчивости.

  7. #57

    Регистрация
    07.02.2008
    Адрес
    г. Рязань
    Сообщений
    2,928
    Спасибо Благодарностей отдано 
    37
    Спасибо Благодарностей получено 
    124
    Поблагодарили
    44 сообщений
    Mentioned
    5 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    Цитата Сообщение от TSL Посмотреть сообщение
    Смотри, вот кусок кода, которым я опрашиваю клаву на контроллере.
    Блин, тут даже меня сподобило задуматься...
    Цитата Сообщение от psb Посмотреть сообщение
    да и не везде нужен антидребезг, так-то.
    На самом деле, антидребезг жизненно необходим, если:
    • с клавиатуры редактируется текст;
    • для переназначения кнопок в частности;
    • если в программе критично каждое отдельное нажатие на кнопку, а не общее время нажатия.

    Антидребезг совсем не нужен если прога ориенитирована на эмулятор или на PC-клавиатуру.
    Одним из лучших антидребезговых механизмов на Спекртуме признан метод опроса кнопок в ПЗУ. Если убрать из него всякую гибкость, то суть примерно такова: если порт полуряда в течение 5 прерываний подряд возвращает одну и ту же комбинацию нажатых клавиш, это означает, что нажатие действительно произошло и колебательные процессы на контактах кончились.

    Цитата Сообщение от Soplik Посмотреть сообщение
    А как в аласме записать код на диск?
    А смотря что тебе надо. Смотри help'ы по таким командам:
    SAVEBIN - сохраняет код в файл в файловую систему PC;
    SAVESNA - сохраняет код в снапшот с инициализированными системными переменными;
    SAVEHOB - сохраняет код в HOBETA-файл;
    SAVETRD - добавляет код как ZX-файл к существующему TRD-файлу;

  8. #58

    Регистрация
    28.12.2012
    Адрес
    Leesburg, VA, USA
    Сообщений
    974
    Спасибо Благодарностей отдано 
    0
    Спасибо Благодарностей получено 
    1
    Поблагодарили
    1 сообщение
    Mentioned
    1 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    Цитата Сообщение от Alex Rider Посмотреть сообщение
    если порт полуряда в течение 5 прерываний подряд возвращает одну и ту же комбинацию нажатых клавиш, это означает, что нажатие действительно произошло и колебательные процессы на контактах кончились.
    Я извиняюсь, прошу показать мне это место в ПЗУ бейсика.

  9. #59

    Регистрация
    07.02.2008
    Адрес
    г. Рязань
    Сообщений
    2,928
    Спасибо Благодарностей отдано 
    37
    Спасибо Благодарностей получено 
    124
    Поблагодарили
    44 сообщений
    Mentioned
    5 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    Цитата Сообщение от TSL Посмотреть сообщение
    Я извиняюсь, прошу показать мне это место в ПЗУ бейсика.
    Ok, наврал, не значение из порта там проверяется 5 прерываний, а порядковый номер нажатой кнопки на клавиатуре. Суть метода при это остается той же.

  10. #60

    Регистрация
    28.12.2012
    Адрес
    Leesburg, VA, USA
    Сообщений
    974
    Спасибо Благодарностей отдано 
    0
    Спасибо Благодарностей получено 
    1
    Поблагодарили
    1 сообщение
    Mentioned
    1 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    Ну покажи, где там проверяется 5 прерываний. Не важно чего.

Страница 6 из 8 ПерваяПервая ... 2345678 ПоследняяПоследняя

Информация о теме

Пользователи, просматривающие эту тему

Эту тему просматривают: 1 (пользователей: 0 , гостей: 1)

Ваши права

  • Вы не можете создавать новые темы
  • Вы не можете отвечать в темах
  • Вы не можете прикреплять вложения
  • Вы не можете редактировать свои сообщения
  •