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

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

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

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

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

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


 
Опции темы
Непрочитано 27.08.2017, 14:23  
supercelt
Прописка
 
Регистрация: 29.03.2007
Сообщений: 185
Сказал спасибо: 11
Сказали Спасибо 1 раз в 1 сообщении
supercelt на пути к лучшему
По умолчанию Re: Оцените алгоритм опроса матричной клавы

H4LF, оптимизация Level0. И сейчас такая же.
П.С. я прочитал документ. А нет полной версии с примером реализации? А то там много нет, например автор так и пишет, что функции скана нет, так как она проста. И не приводит её. А именно со сканом у меня и проблема. А я не такой шаристый что бы додумать))
Реклама:

Последний раз редактировалось supercelt; 27.08.2017 в 14:32.
supercelt вне форума  
Непрочитано 27.08.2017, 14:26  
supercelt
Прописка
 
Регистрация: 29.03.2007
Сообщений: 185
Сказал спасибо: 11
Сказали Спасибо 1 раз в 1 сообщении
supercelt на пути к лучшему
По умолчанию Re: Оцените алгоритм опроса матричной клавы

МВА, расскажите пожалуйста поподробнее? Что такое интегрирование в данном случае? Какой тогда при этом будет алгоритм?
supercelt вне форума  
Непрочитано 27.08.2017, 15:33  
МВА
Гражданин KAZUS.RU
 
Регистрация: 15.08.2010
Адрес: Днепр
Сообщений: 842
Сказал спасибо: 74
Сказали Спасибо 199 раз(а) в 174 сообщении(ях)
МВА на пути к лучшему
По умолчанию Re: Оцените алгоритм опроса матричной клавы

Сообщение от supercelt Посмотреть сообщение
МВА, расскажите пожалуйста поподробнее? Что такое интегрирование в данном случае? Какой тогда при этом будет алгоритм?
Я написал несколько функций для обработки отдельно взятого входа. Одну из них, для примера прилагаю.
PHP код:
//пользовательские типы==============================================  ======================
volatile typedef struct{
    
int count//Счетчик интегратора
    
int lim;      //лимит счетчика интегратора. В программе обязательно инициализировать значением не равным 0 (иначе не будет работать)
    
bool real//Реальное состояние входа
    
bool bef;  //предыдущее состояние входа
    
bool rloP//меркер положительного фронта
    
bool rloN//меркер отрицательного фронта.
}TypeFR;
//прототипы функций===========================================  ==============================
void FPN(TypeFR*, u8u8); 
PHP код:
#include "main.h"

/*
//functions=========================================  =====================================
//выделение отрицательного фронта и определение высокого уровня................................
void FN(TypeFR* fr, u8 port, u8 pin)
{
    if((port&1‹‹pin)&&(fr-›count‹fr-›lim))
        fr-›count++;
    if(!(port&1‹‹pin))
        fr-›count=0;
    if(fr-›count==fr-›lim)
        fr-›real=true;
    if(!fr-›count)
        fr-›real=false;
    if(!fr-›real && fr-›bef){
        fr-›rloN=true;
    }else{fr-›rloN=false;}
//...........................
    fr-›bef=fr-›real;
return;
};            */
/*
//выделение положительного фронта и определение высокого уровня................................
void FP(TypeFR* fr, u8 port, u8 pin)
{
    if((port&1‹‹pin)&&(fr-›count‹fr-›lim))
        fr-›count++;
    if(!(port&1‹‹pin))
        fr-›count=0;
    if(fr-›count==fr-›lim)
        fr-›real=true;
    if(!fr-›count)
        fr-›real=false;
    if(fr-›real && !fr-›bef){
        fr-›rlo=true;
    }else{fr-›rlo=false;}
//...........................
    fr-›bef=fr-›real;
return;
};
*/
//Выделение отрицательного и положительного фронтов в одной функции.........................
void FPN(TypeFRfru8 portu8 pin)
{
    if((
port&1‹‹pin)&&(fr-›countfr-›lim))
        
fr-›count++;
    if(!(
port&1‹‹pin))
        
fr-›count=0;
    if(
fr-›count==fr-›lim)
        
fr-›real=true;
    if(!
fr-›count)
        
fr-›real=false;
    if(!
fr-›real && fr-›bef){
        
fr-›rloN=true;
    }else{
fr-›rloN=false;}
    
    if(
fr-›real && !fr-›bef){
        
fr-›rloP=true;
    }else{
fr-›rloP=false;}
//...........................
    
fr-›bef=fr-›real;
return;
}; 
Это я писал под AVR, но для STM можно использовать тот же принцип.
Интегрирование осуществляется накоплением значения в переменной count.
Структура содержит в себе счетчик, лимит (значение до которого идет счет) и флаги:
Real - состояние входа на текущее время
bef - предыдущее состояние
rloP - флаг переднего фронта
rloN - флаг заднего фронта.
Если запустить функции(по количеству проверяемых входов) вначале основного цикла, то дальше в программе можно пользоваться только флагами. Причем есть флаги обеих фронтов.
Если не надо определять сочетание нажатий нескольких кнопок, то можно использовать только одну функцию.
Если матрица 4X4, то 4 входа и 4 выхода. Загружаем состояние порта в переменную, отжимаем маской биты входа. Создаем виртуальный флаг, который будем интегрировать, и устанавливаем его, если не 0 или сбрасываем, если 0. Тогда функция еще больше упроститься. По переднему фронту записываем в буфер код с матрицы, а по заднему (при отпускании кнопки выводим на индикацию).

P.S. Прошу прощения, не указал, что эта функция предназначена для входов настроенных на подтяжку к VCC и замыканию кнопкой на землю. Если же через кнопку подается высокий уровень, то надо сразу же в счетчик записывать лимит, а при низком на входе - производить декремент. Соответственно должны быть поменяны и условия записи лимита и декремента.
И еще... Перед использованием этой функции, сразу после инициализации контроллера, до входа в главный цикл, нужно в цикле for() произвести инициализацию флагов количеством циклов Lim, а еще лучше Lim + 1, чтобы в программу структура вошла с действительными значениями флагов.

Последний раз редактировалось МВА; 27.08.2017 в 17:41.
МВА вне форума  
Непрочитано 28.08.2017, 00:39  
supercelt
Прописка
 
Регистрация: 29.03.2007
Сообщений: 185
Сказал спасибо: 11
Сказали Спасибо 1 раз в 1 сообщении
supercelt на пути к лучшему
По умолчанию Re: Оцените алгоритм опроса матричной клавы

Спасибо, поразбираюсь) Но я правда не сказал одну важную деталь. По условию, клава должна иметь возможность подключаться абсолютно к разным ножкам разных портов. То есть состояние порта по маске не загнать в переменную, так как например строки клавы могут быть подключены к разным портам.
supercelt вне форума  
Непрочитано 28.08.2017, 01:42  
mike-y-k
Модератор
 
Регистрация: 04.08.2010
Адрес: Москва СЗАО
Сообщений: 11,257
Сказал спасибо: 11,170
Сказали Спасибо 3,858 раз(а) в 2,928 сообщении(ях)
mike-y-k на пути к лучшему
По умолчанию Re: Оцените алгоритм опроса матричной клавы

supercelt, на тему снижения геморроя отдельным устройством с нормальным интерфейсом уже написал, там и опрашивать в Вашем МК ничего не нужно - есть прерывание. Один раз запрограммировать тот чип и пользоваться. И можно даже несколько таких клавиатур подключить, главное с адресами и прерываниями разобраться. Тут на той же шине расширитель портов поможет для множества линий прерывания. И вся логика в МК только в инициализации интерфейса, обработке прерывания и чтении результата по интерфейсу. А в контроллере клавиатуры и нажатия, и отпускания реализуются с защитой от дребезга. Длительность нажатия уже просто по времени между событиями в основном МК.
Два классических конечных автомата…
Этот вариант кстати будет прекрасно переносится…
__________________
rtfm forever должно быть основой для каждого. Альтернатива грустна, поскольку метод слепого щенка успешно работает при весьма малом числе вариантов…

Последний раз редактировалось mike-y-k; 28.08.2017 в 12:55.
mike-y-k вне форума  
Непрочитано 28.08.2017, 01:56  
H4LF
Вид на жительство
 
Аватар для H4LF
 
Регистрация: 10.06.2007
Сообщений: 429
Сказал спасибо: 34
Сказали Спасибо 51 раз(а) в 47 сообщении(ях)
H4LF на пути к лучшему
По умолчанию Re: Оцените алгоритм опроса матричной клавы

supercelt, а почему бы не разделить непосредственно сканирование и остальной алгоритм(он будет аппаратно независимым), как это сделано в статье. Функция сканирования получает только текущее состояние кнопок и возвращает битовое поле где каждой физической кнопке соответствует свой бит. 16 кнопок - два байта. При смене МК или ног - переписывается только эта функция. А остальным - антидребезгом, автоповтором, распознаванием сочетаний кнопок - занимается отдельный конечный автомат. Зачем эти две разные функции (сканирование и обработка) мешать в кучу - неудобно же...
H4LF вне форума  
Непрочитано 28.08.2017, 11:29  
6ap6oc
Прописка
 
Регистрация: 02.03.2010
Сообщений: 139
Сказал спасибо: 12
Сказали Спасибо 49 раз(а) в 26 сообщении(ях)
6ap6oc на пути к лучшему
По умолчанию Re: Оцените алгоритм опроса матричной клавы

Что то вы мудрите слишком

Делал по прерываниям выводов - на столе работало отлично, в реальных условиях помех на выводах уже намного хуже.
Сделал на таймере. На встроенном в ядро cortex таймере.
Прекрасно работает на нештатных 88 МГц на 72 МГц чипе, без премудростей.

Инициализация:
SysTick-›LOAD = 8800000; // 88MHz/10Hz
SysTick-›CTRL = 0b111; //HCLK/1 enableIRQ enableCount
//глобально разрешаем прерывания NVIC
__enable_irq();

Обработка прерывания, оставил только то что к клавиатуре, для матричной на одно условие будет больше в алгоритме. В прерывании ставим только флаги и счетчики, остальное в основной программе.

void SysTick_Handler(void)
{
#define ksel (!(tt & 0x1000))
#define kminus (!(tt & 0x2000))
#define kplus (!(tt1 & 0x4000))
#define kok (!(tt1 & 0x8000))

u32 tt = GPIOB-›IDR;
u32 tt1 = GPIOA-›IDR;
if (ksel) //нижняя кнопка, смена режима
{

}
итд, проверка следующих кнопок
6ap6oc вне форума  
Непрочитано 28.08.2017, 12:54  
МВА
Гражданин KAZUS.RU
 
Регистрация: 15.08.2010
Адрес: Днепр
Сообщений: 842
Сказал спасибо: 74
Сказали Спасибо 199 раз(а) в 174 сообщении(ях)
МВА на пути к лучшему
По умолчанию Re: Оцените алгоритм опроса матричной клавы

Сообщение от supercelt Посмотреть сообщение
По условию, клава должна иметь возможность подключаться абсолютно к разным ножкам разных портов.
Без проблем. Кто же мешает создать виртуальный порт? Последнее время я только через них и работаю. Очень упрощается разводка платы. Просто о-очень.
МВА вне форума  
Непрочитано 28.08.2017, 14:03  
H4LF
Вид на жительство
 
Аватар для H4LF
 
Регистрация: 10.06.2007
Сообщений: 429
Сказал спасибо: 34
Сказали Спасибо 51 раз(а) в 47 сообщении(ях)
H4LF на пути к лучшему
По умолчанию Re: Оцените алгоритм опроса матричной клавы

Сообщение от supercelt Посмотреть сообщение
H4LF, оптимизация Level0. И сейчас такая же.
П.С. я прочитал документ. А нет полной версии с примером реализации? А то там много нет, например автор так и пишет, что функции скана нет, так как она проста. И не приводит её. А именно со сканом у меня и проблема. А я не такой шаристый что бы додумать))
С Level0 ясно, для интереса пробуйте включать оптимизацию - если без неё работало а с ней не заработает или заглючит - значит где-то в коде есть косяк. Но это не к данной проблеме, а так - на будущее (хотя некоторые просто никогда не включают оптимизацию, видимо по принципу "работает - не трогай").
Полной версии? Т.е. совсем готовое, чтобы только скопипастить? Не знаю, наверное и есть где-то, искать надо... Но эта функция действительно проста, особенно по сравнению с приведённым конечным автоматом. Не нужно быть шаристым, нужно быть начинающим, чтобы её написать. Вот примерный алгоритм без оптимизации(для случая выводов на разных портах), обозначения пинов из статьи:
Инициализация при запуске программы: Р1.0, Р1.1 и Р1.2 (строки) настраиваются на выход и устанавливаются в высокий уровень (для РР выхода нужны диоды как в статье, если есть OD то не обязательно.), а Р2.0, Р2.1, Р2.2 и Р2.3 (столбцы) настраиваются на вход с подтяжкой вверх.
Сама функция:
1) обнулить key_code(переменная скан-кода)
2) установить 0 на P1.0
3) сдвинуть key_code на разряд влево; считать P2.3 и если там 0 (кнопка "4" нажата) сделать key_code |= 1;
4) повторять пункт 3 для всех столбцов
5) установить 1 на P1.0 и установить 0 на P1.1 и повторить пункты 3 и 4. Ну и так до последней строки P1.2
Как то так - разве это сложно? Конечно я могу написать и код(но матричной клавы нет чтоб нормально проверить), но думаю, что Вам будет интересно написать самому. Или нет?
На быстрых процессорах (у которых ядро работает на большей частоте, чем периферийные модули) можно для надёжности устанавливать каждую строку (Р1.х) два раза подряд.
Ещё раз: эта функция просто должна вернуть(в статье она изменяет глобальную переменную key_code) мгновенное текущее состояние кнопок, где у каждой кнопки свой бит. Без всяких антадребезгов и прочих.

Последний раз редактировалось H4LF; 28.08.2017 в 14:06.
H4LF вне форума  
Непрочитано 28.08.2017, 14:42  
МВА
Гражданин KAZUS.RU
 
Регистрация: 15.08.2010
Адрес: Днепр
Сообщений: 842
Сказал спасибо: 74
Сказали Спасибо 199 раз(а) в 174 сообщении(ях)
МВА на пути к лучшему
По умолчанию Re: Оцените алгоритм опроса матричной клавы

H4LF,если бы нам нужно было бы сканировать один вход (например, вход данных по какой-то линии), то имеет смысл в цикле вести запись в крайний разряд и сдвигать данные. Но так, как проверка идет с разных входов, то не обязательно устанавливать бит в крайний разряд и делать сдвиг. По условию if() можно устанавливать бит сразу в нужный разряд, после предварительного сброса буфера. Этот буфер и будет виртуальным портом. Мне кажется так будет проще.

Примерно так:
PHP код:
unsigned char Vbuf//виртуальный порт



Vbuf=0;
if(
GPIOx-›IDR 1‹‹bit)    //х - буква сканируемого порта
    
Vbuf|=1‹‹0;    //bit - номер бита сканируемого порта
if(GPIOx-›IDR 1‹‹bit)
    
Vbuf|=1‹‹1;
if(
GPIOx-›IDR 1‹‹bit)
    
Vbuf|=1‹‹2;
if(
GPIOx-›IDR 1‹‹bit)
    
Vbuf|=1‹‹3;
if(
GPIOx-›IDR 1‹‹bit)
    
Vbuf|=1‹‹4;
if(
GPIOx-›IDR 1‹‹bit)
    
Vbuf|=1‹‹5;
if(
GPIOx-›IDR 1‹‹bit)
    
Vbuf|=1‹‹6;
if(
GPIOx-›IDR 1‹‹bit)
    
Vbuf|=1‹‹7

Последний раз редактировалось МВА; 28.08.2017 в 15:01.
МВА вне форума  
 

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

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

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

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


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


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