Вопросы по С/С++ (СИ)

Если ваш вопрос не влез ни в одну из вышеперечисленных тем, вам сюда.
Ответить
Опытный кот
Аватара пользователя
Сообщения: 848
Зарегистрирован: Ср мар 02, 2011 07:47:39
Откуда: Уфа

Сообщение Psych »

СКАЗОЧНИК писал(а):Я просто пока мало еще понимаю, что в памяти займет больше места и что по быстродействию будет лучше
Таблицей быстрее. Но будет 12 лишних из 16 значений.
СКАЗОЧНИК писал(а):Ищу красивый оптимальный вариант.
Краcивый, но не оптимальный ))

indikator = button [log2(temp>>12)][stolbetz];
Реклама
Идёт направо - песнь заводит, Налево - сказку говорит.
Аватара пользователя
Сообщения: 5000
Зарегистрирован: Чт апр 21, 2011 17:55:50
Откуда: Иркутск

Сообщение СКАЗОЧНИК »

ARV писал(а): за 6 обращений к регистрам порта
Елки, уже три раза прочитал, вдумываяь и в код тоже. Ниче понять не могу... :facepalm: :oops:

Есть, где такая логика еще расписана другим языком? :)
Станислав
Реклама
Друг Кота
Аватара пользователя
Сообщения: 7083
Зарегистрирован: Пт ноя 11, 2016 05:48:09
Откуда: Сердце Пармы

Сообщение Ivanoff-iv »

ARV писал(а):за 6 обращений к регистрам порта
при таком опросе нельзя сразу несколько кнопок нажимать - программа их не сможет различить...

Добавлено after 7 minutes 43 seconds:
Станислав клавиатура - матрица, при обычном построчном опросе мы просматриваем каждую строку отдельно (подаем питание на каждую строку по очереди и смотрим откликнувшиеся столбцы), а тут - сначала окинули взглядом всю матрицу в фас (получили координату х нажатой кнопки), потом в профиль (получили координату у нажатой кнопки)
т.е подали питание на все строки - увидели откликнувшийся столбец, "перевернули" матрицу, подали питание на все столбцы - увидели откликнувшуюся строку.
(не знаю, какой вариант понятней будет)
Для тех, кто не учил магию мир полон физики :)
Безграмотно вопрошающим про силовую или высоковольтную электронику я не отвечаю, а то ещё посадят за участие в (само)убиении оболтуса...
Идёт направо - песнь заводит, Налево - сказку говорит.
Аватара пользователя
Сообщения: 5000
Зарегистрирован: Чт апр 21, 2011 17:55:50
Откуда: Иркутск

Сообщение СКАЗОЧНИК »

Вот я и делаю, как первый вариант, когда каждую строку по отдельности опрашивать.

Однако, вариант, предложенный Романом, мне тоже нравится. Он как-то проще выглядит. :)
Ну и я пытаюсь придумать, зачем мне нажимать сразу несколько кнопок на клавиатуре? :dont_know:
Станислав
Реклама
Эиком - электронные компоненты и радиодетали
ARV
Ум, честь и совесть. И скромность.
Аватара пользователя
Сообщения: 18795
Зарегистрирован: Чт дек 28, 2006 08:19:56
Откуда: Новочеркасск

Сообщение ARV »

СКАЗОЧНИК писал(а):Есть, где такая логика еще расписана другим языком?
насколько я вкурсе, такую логику никто ранее не применял :) а она проста.
1. сначала мы определяем, на каких столбцах есть нажатые кнопки. для этого сразу на все строки мы подаем активные уровни.
2. активные уровни - это такие, которые система "замечает" при нажатии кнопки. в нашем случае, система заметит, если на вход с подтяжкой (лог.1) придет твердый ноль. поэтому мы выдаем нули на все строки и смотрим, куда эти нули дошли на столбцах.
3. затем меняем местами роли строк и столбцов, но теперь подаем не на все линии подряд, а только на те, которые обнаружили на первом этапе. и тогда мы узнаем, с каких строк дошли эти уровни.

так понятнее?

попробую битами.

1. настроили столбцы на входы с подтяжкой, строки - выходы с нулем. на порту получилось 00001111
2. если мы нажали кнопку на пересечении третьей строки и третьего столбца, на порту получилось 00001101
3. запомнили это значение с инверсией. нас интересуют только столбцы, т.е. 4 бита. получили 00000010
4. теперь меняем строки и слолбцы ролями, делая столбцы выходами, а строки входами с подтяжкой. то есть мы бы получили в этом случае 11110000, но так как на столбцы мы подаем ранее считанные биты (0010) с инверсией (1101), то получаем, что 0 с третьего столбца через нажатую кнопку попадает только на столбец 3, т.е. имеем на порту 11011101.
5. запоминаем состояние столбцов с инверсией 0010.
6. итак, получили строки 0010 и столбцы 0010 - кнопка нажата на пересечении третьего столбца и третьей строки.
7. сделали один общий байт 00100010 и радуемся коду нажатой кнопки.
8. для борьбы с дребезгом и отсечению вариантов, когда кнопку отпустили между опросами половинок, следует убедиться, что каждая тетрада ненулевая, т.е. что там есть хоть 1 бит. если это не так - результат надо игнорировать.
9. ну и делать это надо периодически, в каком-то прерывании. я делаю 1 раз в 20 мс, и никаих дополнительных мер по дребезгу не требуется.
Ivanoff-iv писал(а):при таком опросе нельзя сразу несколько кнопок нажимать
теперь вы видите, что сможет? во всяком случае до тех пор, пока это позволяет схема матрицы кнопок без развязывающих диодов.
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...

Мой уютный бложик... заходите!
Контактная информация:
Реклама
Друг Кота
Аватара пользователя
Сообщения: 7083
Зарегистрирован: Пт ноя 11, 2016 05:48:09
Откуда: Сердце Пармы

Сообщение Ivanoff-iv »

такой алгоритм правильней, если клавиатура без разделительных диодов, то на ней не сделать замыкания лог 1 и лог 0, в отличии от варианта с построчным опросом...
кстати, такой вариант опроса очень похож на опрос резистивного тачскрина... (сначала опрашивается координата Х, потом У) и к таковому её можно вывести, понадобится 4 лапы контроллера из них 2 с входом АЦП и одинаковых резисторов (размерностьХ+размерностьУ-2)шт.
Для тех, кто не учил магию мир полон физики :)
Безграмотно вопрошающим про силовую или высоковольтную электронику я не отвечаю, а то ещё посадят за участие в (само)убиении оболтуса...
Реклама
ARV
Ум, честь и совесть. И скромность.
Аватара пользователя
Сообщения: 18795
Зарегистрирован: Чт дек 28, 2006 08:19:56
Откуда: Новочеркасск

Сообщение ARV »

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

Мой уютный бложик... заходите!
Контактная информация:
Идёт направо - песнь заводит, Налево - сказку говорит.
Аватара пользователя
Сообщения: 5000
Зарегистрирован: Чт апр 21, 2011 17:55:50
Откуда: Иркутск

Сообщение СКАЗОЧНИК »

У меня СТМ 32, там не замкнешь так 0 и 1, если клавиатура без диодов. Там на одном порту тупо можно же настроить открытый коллектор (открытый сток точнее). Он может быть либо в высокоимпедансном, либо замкнуть на землю. А другие, которые, например на строках, настроены на вход с подтяжкой. Я считаю, что это плюс довольно большой у СТМ в отличии от АВР, где по невнимательности можно попалить порты.

А вот код кнопки же, который получен подобным образом не соответствует точно значению на клавиатуре. Его же потом надо еще через case определять?! Я пытался сразу в прерывании получить точное значение цифры на клавиатуре. )))
Станислав
ARV
Ум, честь и совесть. И скромность.
Аватара пользователя
Сообщения: 18795
Зарегистрирован: Чт дек 28, 2006 08:19:56
Откуда: Новочеркасск

Сообщение ARV »

СКАЗОЧНИК писал(а):я пытаюсь придумать, зачем мне нажимать сразу несколько кнопок на клавиатуре?
при ограниченном количестве кнопок, что вполне себе норма для встраиваемых устройств, это требуется не так уж и редко. вы вспомните клавиатуру компьютера - не смотря на изобилие кнопок все равно постоянно требуется нажатие по 2 и даже 3 кнопки одновременно! реально больше 2 кнопок - уже очень неудобно в эксплуатации
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...

Мой уютный бложик... заходите!
Контактная информация:
Друг Кота
Аватара пользователя
Сообщения: 7083
Зарегистрирован: Пт ноя 11, 2016 05:48:09
Откуда: Сердце Пармы

Сообщение Ivanoff-iv »

я писал до прошлого вашего поста, а вот к нему у меня есть некоторые небольшие...
1) давайте определимся с терминологией, пускай "классический" метод обзовем сканированием, а предложенный вами - координатный, думаю вы будете не против :)
2)при сканировании на строки подается разное напряжение и если в одном столбце нажато более 1 кнопки, то строки будут замкнуты. в отличии от вашего алгоритма где все строки имеют одинаковый потенциал (по 3 пункту вашего ответа - нет нужды выбирать линии, т.к. те линии, на которые не пришел сигнал итак не имеют нажатых кнопок и их потенциал монопенисуален)
3) про несколько нажатых кнопок - этот алгоритм их различит только если все они находятся в одной строке или в одном столбце, иначе запутается.
Для тех, кто не учил магию мир полон физики :)
Безграмотно вопрошающим про силовую или высоковольтную электронику я не отвечаю, а то ещё посадят за участие в (само)убиении оболтуса...
ARV
Ум, честь и совесть. И скромность.
Аватара пользователя
Сообщения: 18795
Зарегистрирован: Чт дек 28, 2006 08:19:56
Откуда: Новочеркасск

Сообщение ARV »

СКАЗОЧНИК писал(а):А вот код кнопки же, который получен подобным образом не соответствует точно значению на клавиатуре.
и что? этот способ выдет "скан-коды", а смысловое значение каждого скан-кода - это задча более верхнего уровня ПО. и делать это можно уже не в прерывании, а где нужно, и где можно не жалеть тактов на обработку.

в частности, в программе абсолютно не важно, соответствует ли код кнопки 1 значению символа '1' или числа 0x01. вы определяете дефайном соответствие скан-кода символу, и затем используете этот символ в программе.

Код: Выделить всё

#define KEY_1  0b00100010
Последний раз редактировалось ARV Чт фев 21, 2019 07:27:42, всего редактировалось 2 раза.
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...

Мой уютный бложик... заходите!
Контактная информация:
Идёт направо - песнь заводит, Налево - сказку говорит.
Аватара пользователя
Сообщения: 5000
Зарегистрирован: Чт апр 21, 2011 17:55:50
Откуда: Иркутск

Сообщение СКАЗОЧНИК »

ARV писал(а):дефайном соответствие скан-кода символу,
Точно. Чет я не догадался.!
Станислав
ARV
Ум, честь и совесть. И скромность.
Аватара пользователя
Сообщения: 18795
Зарегистрирован: Чт дек 28, 2006 08:19:56
Откуда: Новочеркасск

Сообщение ARV »

Ivanoff-iv писал(а):про несколько нажатых кнопок - этот алгоритм их различит только если все они находятся в одной строке или в одном столбце, иначе запутается.
допустим, я нажал кнопку на пересечении 1-го столбца и 1-й строки и 2-го столбца 3-й строки.
на строках я получу 1100, на столбцах 1010 - и эта комбинация никакими другими комбинациями кнопок не повторится. так что 2 одновременно нажатые кнопки ВСЕГДА будут определены корректно. на счет 3-х уже не уверен, но могу вечером поэкспериментировать в протеусе :)

что-то мне подсказывает, что все будет нормально вплоть до 4 одновременных кнопок, а вот больше - уже не будет.
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...

Мой уютный бложик... заходите!
Контактная информация:
Друг Кота
Аватара пользователя
Сообщения: 7083
Зарегистрирован: Пт ноя 11, 2016 05:48:09
Откуда: Сердце Пармы

Сообщение Ivanoff-iv »

что интересно... "сканкод" при сканировании клавиатуры 4х4 набирается на 2 байта, а при координатном умещается в 1байт.
_______
1;1 и 2;3 != 1;3 и 2;1. а сканкод будет одинаков == 1100;1010 :)
Последний раз редактировалось Ivanoff-iv Чт фев 21, 2019 07:35:25, всего редактировалось 1 раз.
Для тех, кто не учил магию мир полон физики :)
Безграмотно вопрошающим про силовую или высоковольтную электронику я не отвечаю, а то ещё посадят за участие в (само)убиении оболтуса...
ARV
Ум, честь и совесть. И скромность.
Аватара пользователя
Сообщения: 18795
Зарегистрирован: Чт дек 28, 2006 08:19:56
Откуда: Новочеркасск

Сообщение ARV »

Ivanoff-iv писал(а):1;1 и 2;3 == 1;3 и 2;1. сканкод будет 1100;1010
да... вы правы. :oops: погорячился я.
но все равно неплохой алгоритм. и разных комбинаций поддерживает достаточно для практического применения.
во всяком случае, свою нишу в применении вполне может иметь :)
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...

Мой уютный бложик... заходите!
Контактная информация:
Друг Кота
Аватара пользователя
Сообщения: 7083
Зарегистрирован: Пт ноя 11, 2016 05:48:09
Откуда: Сердце Пармы

Сообщение Ivanoff-iv »

согласен - алгоритм изумительный :beer: (и для матричных клавиатур, в которых нет диодов подходит даже лучше), потому и считаю, что у него должно быть название :write:
пс: я написание примера поправил, а то не очень понятно выглядело...
Для тех, кто не учил магию мир полон физики :)
Безграмотно вопрошающим про силовую или высоковольтную электронику я не отвечаю, а то ещё посадят за участие в (само)убиении оболтуса...
ARV
Ум, честь и совесть. И скромность.
Аватара пользователя
Сообщения: 18795
Зарегистрирован: Чт дек 28, 2006 08:19:56
Откуда: Новочеркасск

Сообщение ARV »

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

Мой уютный бложик... заходите!
Контактная информация:
Друг Кота
Аватара пользователя
Сообщения: 3832
Зарегистрирован: Сб сен 10, 2011 17:46:25

Сообщение oleg110592 »

такой алгоритм уж давно известен - AVR243
Клавиатурные матрицы могут сканироваться несколькими способами. Если может быть нажата только одна кнопка, то выбирается быстрый способ сканирования, при котором одновременно выбираются (устанавливается низкое значение) все строки, и считывается состояние столбцов. После этого выбираются все столбцы, и считывается состояния строк. Возвращенные значения столбца и строки объединяются в код, идентифицирующий нажатую кнопку. Этот метод и используется в данном примере применения...
http://www.gaw.ru/html.cgi/adv/app/micr ... AVR243.htm
первоисточник и исходник скачать:
http://www.gaw.ru/html.cgi/adv/app/micros/avr/index.htm
для STM32 тоже работает

Код: Выделить всё

const uint8_t key_code[] = { 1,   4,   7,  'M',
                             2,   5,   8,   10,
                             3,   6,   9,  '#',
                             'A', 'X', 'B', 'R'
                           };
...
#define ROW1_INPUT GPIOA->MODER &= ~GPIO_MODER_MODER6_0
#define ROW1_OUTPUT GPIOA->MODER |= GPIO_MODER_MODER6_0
#define ROW1 GPIOA->IDR & GPIO_IDR_6  
...
            COL1_INPUT;
            COL2_INPUT;
            COL3_INPUT;
            COL4_INPUT;
            ROW1_OUTPUT;
            ROW2_OUTPUT;
            ROW3_OUTPUT;
            ROW4_OUTPUT;
            if((COL1) == 0) col = 0;
            if((COL2) == 0) col = 4;
            if((COL3) == 0) col = 8;
            if((COL4) == 0) col = 12;
            ROW1_INPUT;
            ROW2_INPUT;
            ROW3_INPUT;
            ROW4_INPUT;
            COL1_OUTPUT;
            COL2_OUTPUT;
            COL3_OUTPUT;
            COL4_OUTPUT;
            if((ROW1) == 0) row = 0;
            if((ROW2) == 0) row = 1;
            if((ROW3) == 0) row = 2;
            if((ROW4) == 0) row = 3;

			key = key_code[col + row];
ARV
Ум, честь и совесть. И скромность.
Аватара пользователя
Сообщения: 18795
Зарегистрирован: Чт дек 28, 2006 08:19:56
Откуда: Новочеркасск

Сообщение ARV »

oleg110592 писал(а):такой алгоритм уж давно известен
опередили, суки... :o
Слушайте, что я накропал вчера ночью при колеблющемся свете электрической лампы: «Я помню чудное мгновенье, передо мной явилась ты, как мимолетное виденье, как гений чистой красоты». Правда, хорошо? Талантливо? И только на рассвете, когда дописаны были последние строки, я вспомнил, что этот стих уже написал А. Пушкин. Такой удар со стороны классика! А?
©
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...

Мой уютный бложик... заходите!
Контактная информация:
OKF
Это не хвост, это антенна
Сообщения: 1457
Зарегистрирован: Вт июн 07, 2011 08:03:18

Сообщение OKF »

Это что. Когда то пишу какую-то программулину и чувствую что-то знакомое... Заподозрил. И действительно, оказалось что я это уже писал когда то... Ну, а Пушкин - это само-собой.)))
Ответить

Вернуться в «Разные вопросы по МК»