реклама на сайте
подробности

 
 
6 страниц V  « < 2 3 4 5 6 >  
Reply to this topicStart new topic
> Опрос клавиатуры на С, Как написать компактный и "красивый" код?
Forger
сообщение Jun 26 2018, 05:25
Сообщение #46


Профессионал
*****

Группа: Свой
Сообщений: 1 215
Регистрация: 22-02-05
Пользователь №: 2 831



Цитата(AlexandrY @ Jun 26 2018, 08:17) *
Что за блажь использовать низкоомную подтяжку для механических контактов.

В чем проблема?



--------------------
Кругозор некоторых людей - круг с нулевым радиусом. Они называют его "точкой зрения".
Go to the top of the page
 
+Quote Post
iliusmaster
сообщение Jun 26 2018, 05:30
Сообщение #47


Частый гость
**

Группа: Участник
Сообщений: 181
Регистрация: 15-04-17
Пользователь №: 96 556



Цитата(AlexandrY @ Jun 26 2018, 08:17) *
Что за блажь использовать низкоомную подтяжку для механических контактов.
Кто этот миф распускает, интересно?
Т.е. интересует первоисточник.



Например.http://omronfs.omron.com/en_US/ecb/products/pdf/en-b3sn.pdf. Советские ТУ на кнопочные переключатели.

Есть такое понятие как минимальный ток срабатывания. У нормальных(грамотных) производителей на любое контактное соединение оно приводится.
Контакты у реле, кнопок и контакторов не идеальные, образуется оксидная пленка, которая при малом токе не разрушается и контакта полноценного не образуется.
Вот для нормального функционирования кнопок с незолотыми и палладиевыми контактамии нужен увеличенный ток через контактную группу. Да и для золотых и палладиевых есть проблемы при токах меньше 1-10 мка.
Go to the top of the page
 
+Quote Post
=L.A.=
сообщение Jun 26 2018, 05:44
Сообщение #48


Знающий
****

Группа: Участник
Сообщений: 794
Регистрация: 4-09-06
Из: Москва(ЗелАО), РФ
Пользователь №: 20 055



Цитата(iliusmaster @ Jun 26 2018, 08:30) *
Есть такое понятие как минимальный ток срабатывания. У нормальных(грамотных) производителей на любое контактное соединение оно приводится.
Контакты у реле, кнопок и контакторов не идеальные, образуется оксидная пленка, которая при малом токе не разрушается и контакта полноценного не образуется.
Вот для нормального функционирования кнопок с незолотыми и палладиевыми контактамии нужен увеличенный ток через контактную группу. Да и для золотых и палладиевых есть проблемы при токах меньше 1-10 мка.

*
Вообще-то оксидная пленка пробивается не током , а НАПРЯЖЕНИЕМ, минимальное значение которого и указывают для коммутационных устройств. Писанина про "минимальный ток" - бессмысленное словоблудие.
Единственный физический эффект, который может создать сверхмалый ток -это дробовой шум, вызванный неравномерностью потока электронов и дискретностью их заряда. Но этот шум никак не влияет на наличие контакта.

Сообщение отредактировал =L.A.= - Jun 26 2018, 05:48


--------------------
-Кто-то работает на совесть, а кто-то на других заказчиков.-
Go to the top of the page
 
+Quote Post
haker_fox
сообщение Jun 26 2018, 06:32
Сообщение #49


Познающий...
******

Группа: Свой
Сообщений: 2 963
Регистрация: 1-09-05
Из: г. Иркутск
Пользователь №: 8 125



QUOTE (=L.A.= @ Jun 26 2018, 13:44) *
Писанина про "минимальный ток" - бессмысленное словоблудие.

И тем не менее в документе на кнопку есть
CODE
Minimum applicable load (reference value) 10 μA at 1 VDC (resistive load)

Видимо ток играет роль.


--------------------
Выбор.
Go to the top of the page
 
+Quote Post
Forger
сообщение Jun 26 2018, 06:52
Сообщение #50


Профессионал
*****

Группа: Свой
Сообщений: 1 215
Регистрация: 22-02-05
Пользователь №: 2 831



Имхо, физика процесса тут не очень однозначная: разрушение тонкой пленки может происходить как от пробоя так и от ее выгорания (или и то и то).

Разрушения этой пленки можно добиться лишь подняв до максимума напряжения на контакта нажатой кнопки с такими контактами.
По сути в таком виде кнопка в нажатом состоянии имеет некое сопротивление, скажем, несколько кОм.
Если резистор подтяжки будет сравним с сопротивлением нажатой кнопки с такими "окисленными" контактами, то схема попросту не "увидит" состояние кнопки.
Чтобы уменьшить сопротивление такой нажатой кнопки, нужно "пробить/сжечь" эту пленку.
Самый простой путь: значительно уменьшить сопротивление подтягивающего резистора - в разы меньше, чем сопротивление "окисленной" нажатой кнопки.
Тогда на ней будет напряжение, близкое к напряжению питания.
Вижу два варианта исхода:
1) кратковременный локальный разогрев этого паразитного сопротивления нажатой кнопки и оксидный слой выгорит от перегрева.
2) слой будет разрушен от пробоя более высоким напряжением.

Я считаю, что в реальных схемах с относительно невысоким напряжением питания 1й вариант более вероятен.

Цитата
В любом случае образование тонких высокоомных слоев на поверхности контактов мощных реле неизбежно и требует учета при разработке и эксплуатации реле.

Пленки оксидов и сульфидов обладают свойствами изоляторов или даже полупроводников, но благодаря туннельному эффекту тонкие слои оказывают незначительное влияние на рост переходного сопротивления.
При увеличении толщины слоя (например, при работе негерметичного реле на открытом воздухе) растет его сопротивление.
Для создания надежного контакта непроводящий слой при срабатывании реле должен быть разрушен.
В правильно спроектированных реле разрушение слоя происходит механическим путем (контакты ударяются и трутся друг о друга) и термоэлектрическим способом при протекании тока большой величины через контакты.

Взято тут: https://www.atof.ru/pea/relay/rl_010.shtml


--------------------
Кругозор некоторых людей - круг с нулевым радиусом. Они называют его "точкой зрения".
Go to the top of the page
 
+Quote Post
AlexandrY
сообщение Jun 26 2018, 07:42
Сообщение #51


Ally
******

Группа: Модераторы
Сообщений: 6 232
Регистрация: 19-01-05
Пользователь №: 2 050



Цитата(iliusmaster @ Jun 26 2018, 08:30) *
Например.http://omronfs.omron.com/en_US/ecb/products/pdf/en-b3sn.pdf. Советские ТУ на кнопочные переключатели.

А подумать?
"Minimum applicable load" в 10 мкА означает что при меньшем токе вы будете ловить токи утечки кнопки, поскольку у нее довольно маленькое сопротивление утечки, всего 100Мом.
Т.е. при 250 В вы получите 2.5 мкА утечки. Вот ребята вас и предупреждают.

Токи величиной в микроамперы гуляют по воздуху туда сюда просто из-за атмосферного электричества и электромагнитных полей.

Я же под низкоомной нагрузкой полагал сопротивление максимум в пару десятков Ом.
Вот где такие рекомендации?

А загрязнение контактов реле отдельная тема.
Если посмотреть на эти контакты под микроскопом, то видно что основная проблема у них - это эрозия и выгорание от коммутации больших токов.
Грязь там появляется вследствии горения.

Поэтому совет противоположный - никогда не коммутировать при низкоомной нагрузке.
Go to the top of the page
 
+Quote Post
Forger
сообщение Jun 26 2018, 07:49
Сообщение #52


Профессионал
*****

Группа: Свой
Сообщений: 1 215
Регистрация: 22-02-05
Пользователь №: 2 831



Цитата(AlexandrY @ Jun 26 2018, 10:42) *
Поэтому совет противоположный - никогда не коммутировать при низкоомной нагрузке.

Видать, вы еще не сталкивались с подобными проблемами коммутации контактов относительно мощных концевиков/переключателей.

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


--------------------
Кругозор некоторых людей - круг с нулевым радиусом. Они называют его "точкой зрения".
Go to the top of the page
 
+Quote Post
k155la3
сообщение Jun 26 2018, 08:41
Сообщение #53


Профессионал
*****

Группа: Свой
Сообщений: 1 123
Регистрация: 8-03-09
Из: Днепр
Пользователь №: 45 848



Цитата(Make_Pic @ Jun 23 2018, 08:17) *
. . . .Как написать компактный и "красивый" код? . . . Дайте pls примеры . . . .
Вот пример моего кода (из первых версий), без претензий на красивость и компактность. Скорее наоборот. Претензии - на функциональность. (обработка в "событийном" режиме, очередь, скан-коды, обработка удержания).
Без комментариев sm.gif Обрабатывать напильником до требуемой формы.
CODE
// MSP430, S_M_V
// -------- keyb ---------
#define S_PORT_KEYB_IN P6IN
#define S_PORT_KEYB_OUT P6OUT
// P6.0 . . . P6.3 - входные линии матрицы, подтянуты через 100к на GND
// P6.4 . . . P6.7 - выходные линии матрицы (опрос линии установкой в 1)

static char key_wr = 0, key_rd = 0, keyCodeScan_old = 0;
char keyCodeScan = 0, KeyCode = 0;
char KeyCodeRep = 0; // запомнить код удерживаемой клавиши
char f_repeat = 0; // флаг удержания нажатия

t16_sint time_repeat; // таймаут удержания клавиши, после которого работает автоповтор

// процедура сканирования клавиатуры (аппаратный опрос линий)
// void OS::system_timer_user_hook()
// Периодически вызывается в тиках OS или в обработчике таймера
void KEY_Scan_R(void)
{
static char F_Press_now = 0, F_Press_old = 0, KKeyCode = 0;
// ================== KEY ===================================
SOUND_OFF;

keyCodeScan_old = keyCodeScan; // проверка изменения коорд. нажатия
F_Press_old = F_Press_now; // контроль событий нажатия-отжатия

key_rd = S_PORT_KEYB_IN & 0x0F; // Read keyLines 0...3 (InData) from PORT
keyCodeScan = (key_wr << 4) & 0xF0; // номер скан-линии 0 1 2 3 (row)
keyCodeScan |= key_rd & 0x0F; // считанные столбцы (col)

if( keyCodeScan & 0x0F ) // нажата как минимум 1 клавиша
{ // нажата ли любая кнопка ? 0F маска - читаем из порта только "приемные" линии
F_Press_now = 1;
if( keyCodeScan != keyCodeScan_old ) // изменен скан-код ?
{ // первый вход по нажатию клавиши
time_repeat = 0; // сбросить таймаут
f_repeat = 0;

}
else // повторные входы по нажатой клавише
{
if( f_repeat == 0 ) // пока нет события "удержание", ++ таймера
{
if( time_repeat > 62 ) //4 // 62 цикла по 16 мс - около 1с
{
time_repeat = 0; // сбросить таймаут
f_repeat = 1;
}
else
time_repeat++;

}
}

}
else // клавиша не нажата
{
F_Press_now = 0; // холостой проход - без нажатий
}

// ---------- выдать скан-линию для следующего цикла --------
if( !F_Press_now ) // продолжаем сканировать линии - тк нет нажатия
{ // далее только если не нажата кнопка
if( key_wr == 3 )
key_wr = 0;
else
key_wr++; // счетчик скан-линий ++
// ----------------------
if( key_wr == 3 ) S_PORT_KEYB_OUT = 0x80; // A B C D выбор столбца D0 D1 D2 D3
if( key_wr == 2 ) S_PORT_KEYB_OUT = 0x40; // 3 6 9 #
if( key_wr == 1 ) S_PORT_KEYB_OUT = 0x20; // 2 5 8 0
if( key_wr == 0 ) S_PORT_KEYB_OUT = 0x10; // 1 4 7 *
}

// заменить switch на перекодировку по ассоц.массиву
// ------- скан для матрицы 4x4 ---------------------
// перекодировка в KKeyCode - для PCB F5438A с подключением на мембр. кл-ру 4x4
// кабелем 9-w и HDR'10 на PCB
switch( keyCodeScan )
{
// key_wr == 0 1 4 7 *
case (0x00 | 0x01): KKeyCode = 0x31; break; // 1
case (0x00 | 0x02): KKeyCode = 0x34; break; // 4
case (0x00 | 0x04): KKeyCode = 0x37; break; // 7
case (0x00 | 0x08): KKeyCode = 0x2E; break; // * ekeyPoint
// ----------------
// key_wr == 1 2 5 8 0
case (0x10 | 0x01): KKeyCode = 0x32; break; // 2
case (0x10 | 0x02): KKeyCode = 0x35; break; // 5
case (0x10 | 0x04): KKeyCode = 0x38; break; // 8
case (0x10 | 0x08): KKeyCode = 0x30; break; // 0
// ----------------
// key_wr == 2 3 6 9 #
case (0x20 | 0x01): KKeyCode = 0x33; break; // 3
case (0x20 | 0x02): KKeyCode = 0x36; break; // 6
case (0x20 | 0x04): KKeyCode = 0x39; break; // 9
case (0x20 | 0x08): KKeyCode = 0x04; break; // # ekeyEnter
// ----------------
// key_wr == 3 A B C D
case (0x30 | 0x01): KKeyCode = 0x01; break; // A F1
case (0x30 | 0x02): KKeyCode = 0x02; break; // B F2
case (0x30 | 0x04): KKeyCode = 0x03; break; // C F3
case (0x30 | 0x08): KKeyCode = 0x05; break; // D F4

default: KKeyCode = 0x00; break; // ekeyNO
}

KeyCode = KKeyCode;
// ================= /KEY ===================================

if( F_Press_old && !F_Press_now ) // KEY_OFF
{ // обработка отжатия
time_repeat = 0;

if ( f_repeat == 2 ) // если был режим "отпуск-удержания" (2)
{
KEY_push( (t16_sint) (KeyCodeRep | 0x4000) ); // (стоп удержания) маска 0x40
//KEY_pushBf( (t16_sint) ( 0x99 | 0x4000) );

f_repeat = 0;

}
}

if( !F_Press_old && F_Press_now ) // KEY_ON
{ // обработка нажатия

SOUND_ON;

KEY_push( (t16_sint) KKeyCode ); // тк буфер 16-битный

}

if( F_Press_old && F_Press_now ) // KEY_ON_ON_ON
{ // обработка удержания

if( f_repeat == 1 )
{
f_repeat = 2; // положить в буфер код "удержания", переключиться в след. цикле на
// ожидание "отпуск-удержания" (режим 2)

KEY_push( (t16_sint) (KKeyCode | 0x8000) ); // (старт удержания) маска 0x80

// --------- системный ресет --------------------
if( KKeyCode == 0x31 ) // Reset на удержание клавиши <1>
{
SLEEP(100);
WDTCTL = WDTPW | WDTHOLD;
asm ("push &0xfffe");
asm ("ret");
}
// -------- /системный ресет --------------------

KeyCodeRep = KeyCode; // сохранить для выдачи кода отжатия
}
}

}// KEY_Scan(void)
Go to the top of the page
 
+Quote Post
Jenya7
сообщение Jun 26 2018, 14:35
Сообщение #54


Профессионал
*****

Группа: Участник
Сообщений: 1 778
Регистрация: 29-03-12
Пользователь №: 71 075



В последних проектах юзаем ADP5589. Изначально я был против. Теперь - категорически рекомендую.Опрос клавиатуры на С получается красивый и лаконичный.
Go to the top of the page
 
+Quote Post
Forger
сообщение Jun 26 2018, 15:24
Сообщение #55


Профессионал
*****

Группа: Свой
Сообщений: 1 215
Регистрация: 22-02-05
Пользователь №: 2 831



Цитата(Jenya7 @ Jun 26 2018, 17:35) *
В последних проектах юзаем ADP5589. Изначально я был против. Теперь - категорически рекомендую.Опрос клавиатуры на С получается красивый и лаконичный.

Код в студию!

Имхо, за цену этой чудо-микросхемы можно купить довольно "толстый" МК, которого за глаза хватит для этой задачи. Код получает не менее лаконичный.


--------------------
Кругозор некоторых людей - круг с нулевым радиусом. Они называют его "точкой зрения".
Go to the top of the page
 
+Quote Post
haker_fox
сообщение Jun 27 2018, 02:32
Сообщение #56


Познающий...
******

Группа: Свой
Сообщений: 2 963
Регистрация: 1-09-05
Из: г. Иркутск
Пользователь №: 8 125



QUOTE (Forger @ Jun 26 2018, 23:24) *
Имхо, за цену этой чудо-микросхемы можно купить довольно "толстый" МК, которого за глаза хватит для этой задачи.

Ну это зависит от цены проекта и стоимости часа разработчика rolleyes.gif


--------------------
Выбор.
Go to the top of the page
 
+Quote Post
Forger
сообщение Jun 27 2018, 04:35
Сообщение #57


Профессионал
*****

Группа: Свой
Сообщений: 1 215
Регистрация: 22-02-05
Пользователь №: 2 831



Цитата(haker_fox @ Jun 27 2018, 05:32) *
Ну это зависит от цены проекта и стоимости часа разработчика rolleyes.gif

Спорно. С этой чудо-микросхемой плата выйдет сложнее и само собой дороже.
Код - тоже спорно: с чудо-микросхемой нужно читать-писать соотв. регистры по I2C, т.е. писать по сути для нее драйвер.
Без нее - простой цикл опроса матричной клавиатуры (см. второй пост этой темы).
Короче, из пушки по воробьям cool.gif

Имхо, вижу единственное разумное применение такой "микрульки" - батарейное питание: проц. всегда спит и просыпается по прерыванию от этой микросхемы, которая в режиме ожидания потребляет около 1мкА.
Но это решаемо и без нее: перед входом в сон "тянем" вниз все линии клавиатуры (скажем, строки), и ждем прерывания по любому из столбцов. Т.е. ждем нажатия любой кнопки.
После просыпания делает все по обычной схеме, определяя какая именно кнопка нажата.


--------------------
Кругозор некоторых людей - круг с нулевым радиусом. Они называют его "точкой зрения".
Go to the top of the page
 
+Quote Post
AlexandrY
сообщение Jun 27 2018, 05:08
Сообщение #58


Ally
******

Группа: Модераторы
Сообщений: 6 232
Регистрация: 19-01-05
Пользователь №: 2 050



Цитата(Jenya7 @ Jun 26 2018, 17:35) *
В последних проектах юзаем ADP5589. Изначально я был против. Теперь - категорически рекомендую.Опрос клавиатуры на С получается красивый и лаконичный.

Я выбрал AS1115-BSST
Дополнительно поддерживает еще и семисегментный дисплей.

Тема неплохо экономит ресурсы.
Когда управляешь двигателями и кучкой SMPS-ов одновременно то реально не хватает ног да и лишние прерывания ни к чему.
Go to the top of the page
 
+Quote Post
arhiv6
сообщение Jun 27 2018, 05:34
Сообщение #59


Знающий
****

Группа: Свой
Сообщений: 633
Регистрация: 21-05-10
Из: Томск
Пользователь №: 57 423



Цитата(Make_Pic @ Jun 25 2018, 09:06) *
Тема ушла куда то "налево" sad.gif А хотелось просто увидеть код хорошего простого решения по клавиатуре...

Встречал эти библиотеки:
http://chipenable.ru/index.php/programming...osa-knopok.html
https://github.com/Celeron/gcc-celeronkeyinputlib
Сам эти библиотеки не пробовал, но можно на их примере посмотреть, как другие делают.


--------------------
Go to the top of the page
 
+Quote Post
k155la3
сообщение Jun 27 2018, 06:36
Сообщение #60


Профессионал
*****

Группа: Свой
Сообщений: 1 123
Регистрация: 8-03-09
Из: Днепр
Пользователь №: 45 848



Цитата(Forger @ Jun 26 2018, 18:24) *
Код в студию! . . .
чип полезный в хозяйстве, но малодоставабельный, по крайней мере у нас. Разве что для фирмы брать партией.
Решение с таким чипом полезно, когда "морда" прибора имеет клавиатуру и дисплей на отдельной PCB. Если у обоих - I2C (например LCD TIC32) то получится очень неплохо.
Хотя сейчас пошли в работу емкостные матрицы как на спец. контроллерах, так и на базе обычных контроллеров или с узлом периферии touch-sense (см. Texas instr. MSP430 и тд)
Go to the top of the page
 
+Quote Post

6 страниц V  « < 2 3 4 5 6 >
Reply to this topicStart new topic
2 чел. читают эту тему (гостей: 2, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 28th April 2024 - 21:28
Рейтинг@Mail.ru


Страница сгенерированна за 0.0146 секунд с 7
ELECTRONIX ©2004-2016