Реклама на сайте English version  DatasheetsDatasheets

KAZUS.RU - Электронный портал. Принципиальные схемы, Datasheets, Форум по электронике

Новости электроники Новости Литература, электронные книги Литература Документация, даташиты Документация Поиск даташитов (datasheets)Поиск PDF
  От производителей
Новости поставщиков
В мире электроники

  Сборник статей
Электронные книги
FAQ по электронике

  Datasheets
Поиск SMD
Он-лайн справочник

Принципиальные схемы Схемы Каталоги программ, сайтов Каталоги Общение, форум Общение Ваш аккаунтАккаунт
  Каталог схем
Избранные схемы
FAQ по электронике
  Программы
Каталог сайтов
Производители электроники
  Форумы по электронике
Помощь проекту

AVR Раздел по микроконтроллерам компании Atmel - AVR / ATtiny / ATmega / ATMega128 / ATxmega, вопросы по программированию в AVR studio и все, относящееся к AVR...

 
Опции темы
Непрочитано 26.01.2014, 23:33  
Laguna_x
Прохожий
 
Регистрация: 14.01.2009
Сообщений: 8
Сказал спасибо: 0
Сказали Спасибо 0 раз(а) в 0 сообщении(ях)
Laguna_x на пути к лучшему
По умолчанию Обработка клавиатуры. мозг в ступоре

имеем проектик (в архиве для атмел студии 6й и схемка проект в протеус) Atmega16.
разбираться вам конечно полагаю будет долго: краткий курс:
клавиатура 4х4. с каждых 8ми кнопок получаем на портА значение нажатой кнопки + прерывание INT0|INT1.
при прерывании заводим таймер1 на 50мсек в режиме стс. прерывание таймера1 - проверяем действительно ли нажата - если да то обрабатываем что за клавиша и запускаем таймер для проверки отпускания (защита от повторного срабатывания), нет - то сброс таймера и выход.
в обработке клавиш - если режим сценариев включен - запуск сценария, если нет то тупо инвертируется бит на PORTC/PORTB. если была нажата клавиша 12 (INT1, на PORTA значение 0b01000111) - включается режим сценариев (взводим соответствующий бит(_const_scenario) в _var_params).
в принципе остальное полагаю не суть важно. главная теперь проблема:
1-в протеусе откомпилированый кекс отрабатывает всё красиво,
2-после заливки кекса в атмегу случается беда в большинстве случаев нажатие любой клавиши обрабатывается как нажатая первая клавиша в режиме сценариев. один раз удалось таки поинвертировать выходы, но зачастую нажатие клавиш обрабатывается как нажатие первой клавиши.
Вложения:
Тип файла: zip Bcontrol v2 atmel studio.zip (124.2 Кб, 57 просмотров)
Реклама:
Laguna_x вне форума  
Непрочитано 26.01.2014, 23:48  
Easyrider83
Гуру портала
 
Аватар для Easyrider83
 
Регистрация: 27.10.2008
Адрес: ЕС
Сообщений: 10,835
Сказал спасибо: 918
Сказали Спасибо 4,308 раз(а) в 2,573 сообщении(ях)
Easyrider83 на пути к лучшему
По умолчанию Re: Обработка клавиатуры. мозг в ступоре

Не нужен там никакой INT1. Тупо 10 раз в секунду опрашивайте по таймеру и все.
Но правильнее, конечно, в прерывании поднимать флаг и в теле опрашивать клавиатуру:
Код:
#include "Keyboard4x4.h"

#define Row0	GPIOB, GPIO_Pin_1
#define Row1	GPIOB, GPIO_Pin_0
#define Row2	GPIOC, GPIO_Pin_5
#define Row3	GPIOC, GPIO_Pin_4
#define Col0	GPIOA, GPIO_Pin_7
#define Col1	GPIOA, GPIO_Pin_6
#define Col2	GPIOA, GPIO_Pin_5
#define Col3	GPIOA, GPIO_Pin_4

u8 KeyPressed=0;

u8 Keyboard4x4_Handle (void)
{	
	u8 Rows=0; 
	u8 Cols=0;
	
	PIN_IN_PU(Col0);
	PIN_IN_PU(Col1);
	PIN_IN_PU(Col2);
	PIN_IN_PU(Col3);
	
	PIN_OUT_PP(Row0);
	PIN_OUT_PP(Row1);
	PIN_OUT_PP(Row2);
	PIN_OUT_PP(Row3);
	
	PIN_OFF(Row0);
	PIN_OFF(Row1);
	PIN_OFF(Row2);
	PIN_OFF(Row3);
	
	if (PIN_SYG(Col0)) Rows|=(1‹‹0); 
	if (PIN_SYG(Col1)) Rows|=(1‹‹1); 
	if (PIN_SYG(Col2)) Rows|=(1‹‹2); 
	if (PIN_SYG(Col3)) Rows|=(1‹‹3); 

	PIN_IN_PU(Row0);
	PIN_IN_PU(Row1);
	PIN_IN_PU(Row2);
	PIN_IN_PU(Row3);
	
	PIN_OUT_PP(Col0);
	PIN_OUT_PP(Col1);
	PIN_OUT_PP(Col2);
	PIN_OUT_PP(Col3);

	PIN_OFF(Col0);
	PIN_OFF(Col1);
	PIN_OFF(Col2);
	PIN_OFF(Col3);

	if (PIN_SYG(Row0)) Cols|=(1‹‹0); 
	if (PIN_SYG(Row1)) Cols|=(1‹‹1); 
	if (PIN_SYG(Row2)) Cols|=(1‹‹2); 
	if (PIN_SYG(Row3)) Cols|=(1‹‹3); 	

	Rows=~(Rows|(Cols‹‹4));
	if ((Rows!=0)&(KeyPressed!=0)) return 0; //button already pressed
	if (Rows==0) KeyPressed=0;	//button released
		else KeyPressed=1;
	
	return Rows;
}

Последний раз редактировалось Easyrider83; 26.01.2014 в 23:55.
Easyrider83 вне форума  
Непрочитано 26.01.2014, 23:54  
gary2007
Почётный гражданин KAZUS.RU
 
Аватар для gary2007
 
Регистрация: 24.09.2007
Адрес: Полтава, UA
Сообщений: 2,450
Сказал спасибо: 376
Сказали Спасибо 1,060 раз(а) в 624 сообщении(ях)
gary2007 на пути к лучшему
По умолчанию Re: Обработка клавиатуры. мозг в ступоре

Если нужно чтобы МК выходил из SLEEP по нажатию, то таймером не получится.
Схему дайте в графическом виде.
__________________
Мелочи не решают главного. Они решают всё!
gary2007 вне форума  
Непрочитано 26.01.2014, 23:59  
Easyrider83
Гуру портала
 
Аватар для Easyrider83
 
Регистрация: 27.10.2008
Адрес: ЕС
Сообщений: 10,835
Сказал спасибо: 918
Сказали Спасибо 4,308 раз(а) в 2,573 сообщении(ях)
Easyrider83 на пути к лучшему
По умолчанию Re: Обработка клавиатуры. мозг в ступоре

Еще как получится. Никакой разницы. Включаем прерывание, засыпаем. Пробуждаемся, выключаем прерывание.
Easyrider83 вне форума  
Непрочитано 26.01.2014, 23:59  
Laguna_x
Прохожий
 
Регистрация: 14.01.2009
Сообщений: 8
Сказал спасибо: 0
Сказали Спасибо 0 раз(а) в 0 сообщении(ях)
Laguna_x на пути к лучшему
По умолчанию Re: Обработка клавиатуры. мозг в ступоре

таймеры нужны для других целей (схема будет расширяться). и вопрос больше в другом - происходит проверка переменной в .data, которая изначально = 0. в протеусе вся эта проверка проходит на ура и первое нажатие - соответственно инвертирует выход портов В и С. в контроллере он почемуто считает что там установлены биты/бит и пускает сценарий (про номера кнопок я уже не заморачиваюсь).. к сожалению отсутствует железный дебагер, так бы на нем посмотреть бы что происходит.
и колличество клавиш будет увеличиваться, поэтому от скана ряд/столбец отказался.

Последний раз редактировалось Laguna_x; 27.01.2014 в 00:21.
Laguna_x вне форума  
Непрочитано 27.01.2014, 08:52  
Laguna_x
Прохожий
 
Регистрация: 14.01.2009
Сообщений: 8
Сказал спасибо: 0
Сказали Спасибо 0 раз(а) в 0 сообщении(ях)
Laguna_x на пути к лучшему
По умолчанию Re: Обработка клавиатуры. мозг в ступоре

Сообщение от gary2007 Посмотреть сообщение
Если нужно чтобы МК выходил из SLEEP по нажатию, то таймером не получится.
Схему дайте в графическом виде.
смотря какой режим выставить.
схема не суть в данном случае. выложил только чтоб могли в протеусе проэмулировать. но если действительно надо-выложу чуть позже.
Laguna_x вне форума  
Непрочитано 27.01.2014, 11:36  
gary2007
Почётный гражданин KAZUS.RU
 
Аватар для gary2007
 
Регистрация: 24.09.2007
Адрес: Полтава, UA
Сообщений: 2,450
Сказал спасибо: 376
Сказали Спасибо 1,060 раз(а) в 624 сообщении(ях)
gary2007 на пути к лучшему
По умолчанию Re: Обработка клавиатуры. мозг в ступоре

Мне все равно когда вы ее выложите.
Вам надо, не мне.
__________________
Мелочи не решают главного. Они решают всё!
gary2007 вне форума  
Непрочитано 23.03.2014, 17:02  
SaNeTaR
Прохожий
 
Регистрация: 23.03.2014
Сообщений: 3
Сказал спасибо: 0
Сказали Спасибо 0 раз(а) в 0 сообщении(ях)
SaNeTaR на пути к лучшему
По умолчанию Re: Обработка клавиатуры. мозг в ступоре

Цитата:
имеем проектик (в архиве для атмел студии 6й и схемка проект в протеус) Atmega16.
разбираться вам конечно полагаю будет долго: краткий курс:
клавиатура 4х4. с каждых 8ми кнопок получаем на портА значение нажат.........
Возможно здесь найдется разгадка некорректной работы клавиатуры(вся соль в видио):http://www.doneathome.ru/#/archives/435
SaNeTaR вне форума  
Непрочитано 28.03.2014, 22:31  
Laguna_x
Прохожий
 
Регистрация: 14.01.2009
Сообщений: 8
Сказал спасибо: 0
Сказали Спасибо 0 раз(а) в 0 сообщении(ях)
Laguna_x на пути к лучшему
По умолчанию Re: Обработка клавиатуры. мозг в ступоре

добрался в конце концов до проектика
По поводу вашего обработчика 4х4 -
1 он будет мне грузноват (планируется до 64х клавиш)
2 вопрос именно в обработке прерываний:
**а) для некоторых клавиш необходимо чтоб они обрабатывались и во время выполнения сценариев, что обеспечит только int0/int1 (либо таймер для опроса - но это только больше загрузит контроллер (постоянно выполнение сценариев будет прерываться для опроса клавиш)
**б) (не критичное, но всё же) для экономии энергии контроллер можно уводить в сон во время бездействия.
вот именно в обработке прерывания и заключается проблема. хотя подумываю немного переделать и задействовать всего 1 прерывание (6 ножек на сканкод + 1 ножка на прерывание). Еще планирую взять 16-4 енкодер - тогда можно задействовать 8 ножек на сканкод (8бит=256клавиш), но это уже фанатизм)))

хотя проще наверное тупо с клавиатуры контроллер выдрать
Миниатюры:
Нажмите на изображение для увеличения
Название: control1.jpg
Просмотров: 60
Размер:	192.4 Кб
ID:	61602  

Последний раз редактировалось Laguna_x; 28.03.2014 в 22:34.
Laguna_x вне форума  
 

Закладки
Опции темы

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

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.

Быстрый переход

Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
FAQ (ЧаВО) по PROTEUS для начинающих и не только dosikus Proteus 221 07.03.2024 22:45
Две PC клавиатуры ПАРАЛЕЛЬНО aleksandr-zh Микроконтроллеры, АЦП, память и т.д 6 01.12.2009 00:20
обработка клавиатуры? maxNTF Микроконтроллеры, АЦП, память и т.д 18 26.10.2007 23:44
способ сканирования клавиатуры genamatic Микроконтроллеры, АЦП, память и т.д 1 09.01.2006 00:24


Часовой пояс GMT +4, время: 05:32.


Powered by vBulletin® Version 3.8.4
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd. Перевод: zCarot