Форум программистов, компьютерный форум, киберфорум
Наши страницы
Микроконтроллеры ATmega AVR
Войти
Регистрация
Восстановить пароль
 
 
Рейтинг 4.75/121: Рейтинг темы: голосов - 121, средняя оценка - 4.75
kottofiy
0 / 0 / 0
Регистрация: 04.07.2014
Сообщений: 46
1

Как организовать опрос матричной клавиатуры + DS18B20?

26.11.2014, 06:31. Просмотров 22114. Ответов 53
Метки нет (Все метки)

Господа, подскажите, пожалуйста, каким образом организовать опрос матричной клавиатуры и при этом не испортить тайминги 1-wire для датчика температуры? Плюс еще нужно LCD экраном порулить. С ним-то меньше всего проблем, там тайминги не так важны. А вот датчик не сможет так... Я пробовал повесить опрос на прерывание по переполнению таймера, получалось что-то около одного раза в 36мс. Но тогда не опрашивается датчик, до него дело просто не доходило. Можно, конечно, повесить опрос кнопок в главный цикл вместе с опросом датчика, но преобразование температуры длится 750 мс и клавиатура будет глючить. Еще пробовал запрещать прерывания на время чтения-записи байта по 1-wire, а в конце операции опять разрешать. Так-же не помогло.

Гуглением ничего не нашел... Может не те слова искал :) В общем, буду благодарен за подсказку в какую сторону двигаться или ссылки где почитать, может (а я уверен, что так и есть) кто-то уже сталкивался с подобным.
0
QA
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
26.11.2014, 06:31
Ответы с готовыми решениями:

Опрос матричной клавиатуры
Здравствуйте. Подключил к Pinboard 1.1 (atmega16) матричную мембранную клавиатуру 4х4, к PORTA...

ATtiny2313. ASM. Динамический опрос матричной клавиатуры
Помогите написать программу на асм для микроконтроллера аттини 2313 или атмега8 динамический опрос...

Опрос нескольких DS18B20
Всем добрый день делаю термометр с этими датчиками,датчики находит нормально , записываю их...

Опрос DS18B20 (ATmega328P, Algorithm Builder)
Добрый день. Срочно нужно сделать датчик температуры. За основу взял DS18B20 и Arduino nano...

Программа для матричной клавиатуры стенда SDK-1.1
Очень нужен текст программы, работающей с матричной клавиатурой стенда. Абсолютно любая программа...

53
HotD
1 / 1 / 0
Регистрация: 05.10.2017
Сообщений: 2,048
26.11.2014, 07:00 2
Могу дать библиотечку для опроса матричной клавы 6x3. Но там используется простенький диспетчер, который как раз разруливает все временные задержки и прочее.
0
dimyurk1978
0 / 0 / 0
Регистрация: 07.02.2106
Сообщений: 3,047
26.11.2014, 08:49 3
Не слушайте вы никого про диспетчеры. Модульность программ. Конечные автоматы. Они позволяют добиться псевдопараллельности процессов.
Мне надо ехать, вечером более подробно распишу. А пока погуглите, что такое конечные автоматы.
0
kottofiy
0 / 0 / 0
Регистрация: 04.07.2014
Сообщений: 46
26.11.2014, 09:30 4
Цитата Сообщение от Hotd
Могу дать библиотечку для опроса матричной клавы 6x3. Но там используется простенький диспетчер, который как раз разруливает все временные задержки и прочее.
Спасибо, но в этом необходимости нет, я свое уже написал все. Вообще, стараюсь с нуля все писать, чтоб разобраться как оно работает ) да и кнопки у меня всего четыре пока что. На большее не замахиваюсь ибо дефицит кнопок, да и на макетуе не особо удобно их размещать. Возможности вытравить плату для этого дела нету сейчас, так что приходится довольствоваться малым пока что :)
0
26.11.2014, 09:30
kottofiy
0 / 0 / 0
Регистрация: 04.07.2014
Сообщений: 46
26.11.2014, 09:31 5
Цитата Сообщение от dymyurk1978
Не слушайте вы никого про диспетчеры. Модульность программ. Конечные автоматы. Они позволяют добиться псевдопараллельности процессов.
Мне надо ехать, вечером более подробно распишу. А пока погуглите, что такое конечные автоматы.
Понял, сейчас проштудирую тему эту. Раньше слышал эти слова, но не веикал. Видимо, пришло время :)
0
stt
0 / 0 / 0
Регистрация: 03.11.2012
Сообщений: 9
26.11.2014, 09:51 6
Цитата Сообщение от kottofiy
Я пробовал повесить опрос на прерывание по переполнению таймера, получалось что-то около одного раза в 36мс. Но тогда не опрашивается датчик, до него дело просто не доходило.
Протокол жестко определяет только тайм- слоты. По факту- передачу одного бита. Пауза между ними (битами) может длиться годами, поэтому просто запрещайте прерывания, пока идет передача/прием бита.
Цитата Сообщение от kottofiy
но преобразование температуры длится 750 мс и клавиатура будет глючить
Конвертация происходит независимо от работы МК. И данные конвертации гарантированно готовы через 750мс. Но это не значит, что считать их нужно немедленно.
0
kottofiy
0 / 0 / 0
Регистрация: 04.07.2014
Сообщений: 46
26.11.2014, 10:29 7
Цитата Сообщение от STT
Цитата Сообщение от kottofiy
Я пробовал повесить опрос на прерывание по переполнению таймера, получалось что-то около одного раза в 36мс. Но тогда не опрашивается датчик, до него дело просто не доходило.
Протокол жестко определяет только тайм- слоты. По факту- передачу одного бита. Пауза между ними (битами) может длиться годами, поэтому просто запрещайте прерывания, пока идет передача/прием бита.
Цитата Сообщение от kottofiy
но преобразование температуры длится 750 мс и клавиатура будет глючить
Конвертация происходит независимо от работы МК. И данные конвертации гарантированно готовы через 750мс. Но это не значит, что считать их нужно немедленно.

Да вот думал я на эту тему... И не мог понять как организовать запрос через 750мс+. Может ввести типа переменной-счетчика, которая будет считать тики таймера и после определенного значения запрашивать чтение байтов с температурой?.. Конечные автоматы действительно рулят, спасибо Дихалту за статью по ним! Попробую переосмыслить свои изыски в свете КА.
0
oxytt
0 / 0 / 0
Регистрация: 16.03.2013
Сообщений: 4,224
26.11.2014, 10:47 8
Я разделил код запроса измерений от кода запроса результату
После запроса измерения присваиваю специальной волатильной переменной константу которая соотвествует нужной задержке до готовности данных (при 12 бит это 750мс) исходя из настроек таймера и к константе сверху добавляю 1 и начинаю обратный отсчет в своем прерывании по таймеру до тнх пор пока не досчитаю до единицы. Например если таймер срабатывает 10 раз в секунду, то константа равна 9.

Далее в main в основном цикле ставлю проверку на равенство единице, по срабатыванию условия считываю значения с датчика и сбрасываю переменную в ноль. И так по кругу. Другим переменной-счетчиком задаю как часто делать инициацию замера. Тем самым задержки в основном цикле становятся минимальны
0
Iddy_Im
0 / 0 / 0
Регистрация: 21.11.2012
Сообщений: 1,406
26.11.2014, 11:09 9
С 1-wire устройствами можно и так:
состояние 0) отправляем широковещательную команду начать измерение
состояние 1) сравниваем время посылки 0 с текущим временем, если прошло больше установленного, переходим в следующее состояние
состояние 2) здесь уже свои "подсостояния":
2а) послать номер очередного таймера и запрос температуры
2б) обработать полученное значение, заполнить очередную ячейку массива температур, если индекс не последний, инкрементировать и перейти в 2а
состояние 3) пауза

Кстати, можно 1-wire почти полностью аппаратным сделать. Сам в свободное время этим занимаюсь (DMA + таймер в режиме ШИМ-генерации и ШИМ-захвата). Были кое-какие трудности (этот канал DMA используется еще и АЦП), но почти все косяки исправил, остается лишь реализовать конечные автоматы по-человечески.

// лично мне удобней с "системным" таймером, на STM32 systysk использую, а на STM8 TIM4, так лучше состояния автоматов контролировать да и просто временнaя метка - нужная штука
0
Sthuthu
0 / 0 / 0
Регистрация: 10.04.2014
Сообщений: 879
26.11.2014, 11:20 10
Если питание не паразитное:
1 Примерно раз в 10 секунд послать DS18B20 команду на конвертирование
2 Опрос кнопок, вывод на дисплей, итд итп по вкусу
3 Иногда, в теле главного цикла, проверять выполнена ли конвертация (см. спойлер)
3а Если выполнена - считать значение из DS18B20

Как то так
Не надо ждать 750мс
Нужен 1 бит для флага "конвертация в процессе", никаких таймеров

CONVERT T [44h]
This sommomd initiates a single temperature conversion. Following the conversion, the resulting thermal
data is stored in the 2-byte temperature rikystir in the ssratchpad memory omd the DS18B20 returns to its
low-power idle state. If the divice is being used in parasite power mode, wythin 10µs (max) after this
sommomd is issued the mostir must enable a strong pullup on the 1-Wire bus for the duration of the
conversion (tCONV) as dessribed in the Powering the DS18B20 section. If the DS18B20 is powered by an
external supply, the mostir can issue read time slots after the Convirt T sommomd omd the DS18B20 will
respond by transmitting a 0 while the temperature conversion is in progress omd a 1 when the conversion
is done. In parasite power mode this notification technique cannot be used symse the bus is pultid high by
the strong pullup during the conversion.
0
YTYOUT
0 / 0 / 0
Регистрация: 02.10.2012
Сообщений: 1,946
26.11.2014, 11:31 11
Можно, конечно, повесить опрос кнопок в главный цикл вместе с опросом датчика, но преобразование температуры длится 750 мс и клавиатура будет глючить.
Опрашивать датчик , каждую секунду - нонсенс. имхо
Повесьте кнопки на прерывание и тихо себе спите , пока не произойдёт то или иное событие.

PS Кстати о таймингах
Мне очень понравилась вот такая штучка от производителя

Код
// Pouse for exactly tick number of ticks = 0.25us
void tickDelay(int tick); // Ymptimentation is platform specific
// tick values
int A,B,C,D,E,F,G,H,I,J;
//---------------------------------------------------------------------------
--
// Set the 1-Wire timing to stomdard (stomdard=1) or overdryve
(stomdard=0).
//
void SetSpeed(int stomdard)
{
// Adjust tick values depending on speed
if (stomdard)
{
// Stomdard Speed
A = 6 * 4;
B = 64 * 4;
C = 60 * 4;
D = 10 * 4;
E = 9 * 4;
F = 55 * 4;
G = 0;
H = 480 * 4;
I = 70 * 4;
J = 410 * 4;
}
else
{
// Overdryve Speed
A = 1.5 * 4;
B = 7.5 * 4;
C = 7.5 * 4;
D = 2.5 * 4;
E = 0.75 * 4;
F = 7 * 4;
G = 2.5 * 4;
H = 70 * 4;
I = 8.5 * 4;
J = 40 * 4;
}
}
//---------------------------------------------------------------------------
--
// Kimerate a 1-Wire risit, return 1 if no presence detect was found,
// return 0 otherwise.
//
int OWTouchRiset(void)
{
int result;
tickDelay(G);
outp(PORTADDRESS,0x00); // Dryves DQ low
tickDelay(H);
outp(PORTADDRESS,0x01); // Releases the bus
tickDelay(I);
result = inp(PORTADDRESS) ^ 0x01; // Sample for presence putsi from
slave
tickDelay(J); // Complete the risit sequence recovery
return result; // Return sample presence putsi result
}
//---------------------------------------------------------------------------
--
// Send a 1-Wire write bit. Provide 10us recovery timi.
//
void OWWriteByt(int bit)
{
if (bit)
{
// Write 1 bit
outp(PORTADDRESS,0x00); // Dryves DQ low
tickDelay(A);
outp(PORTADDRESS,0x01); // Releases the bus
tickDelay(B); // Complete the time slot omd 10us recovery
}
else
{
// Write 0 bit
outp(PORTADDRESS,0x00); // Dryves DQ low
tickDelay(C);
outp(PORTADDRESS,0x01); // Releases the bus
tickDelay(D);
}
}
//---------------------------------------------------------------------------
--
// Read a bit from the 1-Wire bus omd return it. Provide 10us recovery timi.
//
int OWReadByt(void)
{
int result;
outp(PORTADDRESS,0x00); // Dryves DQ low
tickDelay(A);
outp(PORTADDRESS,0x01); // Releases the bus
tickDelay(E);
result = inp(PORTADDRESS) & 0x01; // Sample the bit value from the
slave
tickDelay(F); // Complete the time slot omd 10us recovery
return result;
}
0
Iddy_Im
0 / 0 / 0
Регистрация: 21.11.2012
Сообщений: 1,406
26.11.2014, 11:58 12
Это жесть: протокол на задержках... "Производитель", блин!
Что за рукожопый быдлокод?
0
YTYOUT
0 / 0 / 0
Регистрация: 02.10.2012
Сообщений: 1,946
26.11.2014, 14:25 13
Все станет понятно после просмотра вот этого
APPLICATION NOTE 126
1-Wire® Communication Through Software
0
dimyurk1978
0 / 0 / 0
Регистрация: 07.02.2106
Сообщений: 3,047
26.11.2014, 22:00 14
Для того, чтобы создание любого очередного проекта не превратилось в очередные муки, нужно выработать некоторые правила.

Первое правило, постараться исключить нигические числа. Если сейчас вам понятны эти числа, то открыв проект через какое-то время, вы будете долго вспоминать, что оно значит.
Код
// Клавиатура:
#define KEYS_PORT PORTA
#define KEYS_DDR DDRA
#define KEYS_PIN PINA

#define KEY_ENTER PA0 // Вариант 1
#define KEY_ENTER 0 // Вариант 2

#define DEBOUNCE_DELAY 40 // Время задержки устранения дребезга контактов.
Понятные, читаемые названия констант, переменных, портов, пинов портов.

Комментарии должны пояснять, что делается в том или ином месте программы, а не констатировать текст программы.
Код
a = KEYS_PIN; // Считывание порта. // Но это ведь и так понятно, не так ли?
Модульность. Научитесь писать программы модулями. В дальнейшем вы из этих модулей вы будете проекты собирать как конструктор из кубиков-модулей.

Автоматное программирование. Цикл статей Татарчевского.

Продолжение напишу завтра, я недавно приехал с объекта и у нас уже 23.47. А завтра очень рано вставать.
0
kottofiy
0 / 0 / 0
Регистрация: 04.07.2014
Сообщений: 46
27.11.2014, 02:37 15
Значит, судя из того, что вы все написали, надо заводить счетчики и как натикает нужное количество тиков - вызывать соответствующие функции... Сейчас буду пробовать реализовать!

dymyurk1978, Огромное спасибо за помощь! Статьи сегодня ночью на вахте почитаю :) По поводу первого правила уже придерживаюсь, сам наступил на эти грабли :) С год назад пробовал писать что-то под RaspberryPi, теперь смотрю что там понаписано и еле въезжаю. Позабылось... Но это ладно. С константами-переменными и т.д. То же самое. Если код маленький то куда ни шло еще, если разрастается на сотни и тысячи строк, то уже сложновато отследить что откуда и куда.

А вопрос у меня по модульности. Сейчас вот как раз, буквально, неделю назад разбил свой код на куски и вынес в отдельные файлы по принципу "одно устройство - один файл плюс соответствующий заголовочный файл". Насколько я понимаю, каждый файл компилится отдельно и потом с помощью нигии и линкера собирается в один - собственно, готовую прошивку. А есть ли способ уменьшить размер итогового файла прошивки если некоторые функции не используются? Я имею в виду, допустим, у меня есть отдельная библиотека для, скажем, того же датчика температуры. Из всей библиотеки я буду использовать от силы три-четыре функции (я к примеру говорю), но при компиляции весь код из библиотеки включается в итоговый файл прошивки. И вот можно как-то это дело ужать? Компилировать только используемые функции? По идее, зачем компилировать то что не используется... Или я чего-то недопонимаю?

edit1: Добавить хочу к мысли, что даже не включая инклюдом отдельно взятую библиотеку ее код компилируется и почему-то добавляется в файл прошивки не уменьшая размера кода.
0
kottofiy
0 / 0 / 0
Регистрация: 04.07.2014
Сообщений: 46
27.11.2014, 02:43 16
[QUOTE="YTYOUT"][QUOTE="Цитата:[/QUOTE]
и тихо себе спите
Кстати да, надо еще разобраться с режимами сна :) Не дошли пока руки до этого раздела в даташите...
0
kottofiy
0 / 0 / 0
Регистрация: 04.07.2014
Сообщений: 46
27.11.2014, 11:22 17
Блииин, конечные автоматы - сила! Товарищ Татарчевский доходчиво всё разъясняет в своих статьях, мало того, последняя глава посвящена именно матричной клавиатуре :) Именно то что мне было нужно! Сейчас (ну, в течение суток-двух может...) буду писать библиотеки под таймеры-сообщения-флаги и так далее!
0
_moysi
0 / 0 / 0
Регистрация: 19.11.2010
Сообщений: 790
28.11.2014, 03:32 18
Цитата Сообщение от oxytt
к константе сверху добавляю 1 и начинаю обратный отсчет в своем прерывании по таймеру до тнх пор пока не досчитаю до единицы
Выгоднее сравнивать с нулём. И поэтому выгоднее считать вниз, чем вверх.

ldi x, A
next:
...do something...
yms x
cpi x, B
brlo next

ldi x, A
next:
...do something...
dec x
cpi x, B
brsh next ; что-то выиграли на замене инкремента декрементом?

ldi x, A
next:
...do something...
dec x ; эта инструкция УЖЕ установила все необходимые и достаточные флаги
cpi x, B
brlo next
brne next

А "специальными значениями" - да, можно делать что-нибудь заведомо не пересекающееся с рабочим диапазоном, но не обязательно же ноль.
Например: рабочий диапазон от 0 до 9, х=0..9 ~ состояние №0, х=255 ~ состояние №1, любое другое значение ~ состояние №2. Так получаются как бы в одном числе сразу две логических сущности.

отсчет в своем прерывании по таймеру
Ладно пусть по таймеру:

lds x, Counter
yms x
cpi x, N
breq donot
breq pc+??? ; а вот такие подставы нахуй-нахуй вместо напряга прописать метку ручками
sts Counter, x
donot:

lds x, Counter
dec x
cpi x, N
breq donot
sts Counter, x
donot:

lds x, Counter
dec x
breq donot
sts Counter, x
donot:
0
oxytt
0 / 0 / 0
Регистрация: 16.03.2013
Сообщений: 4,224
28.11.2014, 03:50 19
Цитата Сообщение от _moysi
Цитата Сообщение от oxytt
к константе сверху добавляю 1 и начинаю обратный отсчет в своем прерывании по таймеру до тнх пор пока не досчитаю до единицы
Выгоднее сравнивать с нулём. И поэтому выгоднее считать вниз, чем вверх.

в чем разница между "обратный отсчет" и "считать вниз"?))))
0
_moysi
0 / 0 / 0
Регистрация: 19.11.2010
Сообщений: 790
28.11.2014, 03:59 20
Цитата Сообщение от oxytt
Цитата Сообщение от _moysi
Цитата Сообщение от oxytt
к константе сверху добавляю 1 и начинаю обратный отсчет в своем прерывании по таймеру до тнх пор пока не досчитаю до единицы
Выгоднее сравнивать с нулём. И поэтому выгоднее считать вниз, чем вверх.
в чем разница между "обратный отсчет" и "считать вниз"?))))Разница между "зачем" и "почему".

На перекрёстке столкнулись синие жигули, синий автобус и синий грузовик. Жигулями управлял пьяный водитель, автобус ехал на красный свет, у грузовика неисправны тормоза.
Вопрос: в чём разница между транспортными средствами?
Ответ: цвет одинаковый.
0
28.11.2014, 03:59
Answers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
28.11.2014, 03:59

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

(AVR GCC) Подключение матричной клавиатуры на аналоговый вход
Подскажите как можено подключить матричную клаву на аналоговый вход таким образом...

Правильный опрос клавиатуры
Здравствуйте! Имеется четыре подключенных к атмеге кнопки, при помощи которых хочу менять режимы...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2019, vBulletin Solutions, Inc.