Портал для радиолюбителей и разработчиков электроники · с 2003 годаРеклама на сайте
Найти компонент, схему или даташит

Даташиты, справочник отечественных приборов, схемы с разбором и живой форум

Микроконтроллеры, АЦП, память и т.д Темы касающиеся микроконтроллеров разных производителей, памяти, АЦП/ЦАП, периферийных модулей...

 
Опции темы

Помогите решить глюк с клавиатурой

Непрочитано 11.12.2009, 08:00  
Vetal-soft
Временная регистрация
 
Регистрация: 04.08.2006
Сообщений: 67
Сказал спасибо: 2
Сказали Спасибо 20 раз(а) в 11 сообщении(ях)
Vetal-soft на пути к лучшему
По умолчанию Re: Помогите решить глюк с клавиатурой

У вас проблемы в программе и подходе написания кода. Вам нужно осознать чего вы хотите добиться. И еще следует перестать пользоваться генераторами кода и разобраться в настройках перефирии.

Конкретно по программе:
1. Преравание INT1 при нажатии кнопки будет вызываться постоянно и последний раз когда кнопка уже отпущена. первый раз при нажатии, остальные при скане кнопок.
2. Задержка после установки бита порта нужна обязательно, минимум NOP, т.к. изменения на выводах происходят с задержкой в такт.
3. У вас весма "своеобразный" подход к написанию подпрограмм. )))
Реклама:
Vetal-soft вне форума  
Непрочитано 12.12.2009, 01:24  
os1n
Частый гость
 
Регистрация: 09.12.2009
Сообщений: 17
Сказал спасибо: 5
Сказали Спасибо 1 раз в 1 сообщении
os1n на пути к лучшему
По умолчанию Re: Помогите решить глюк с клавиатурой

В том варианте, который я выложил подпрограмма была убрана совсем, если вы не заметили )
Вся подпрограмма была внесена в область выполнения прерывания.

2. настройки периферии тут не при чем, потому как эта самая периферия тут не участвует, и потому как та же периферия на AT90S8535 работает гладко, даже очень гладко.

А с остальным - спасибо, это дельный совет, попробую разобраться.

Но что интересно, раз уж вы смотрели код и нашли время его покритиковать, так может вы нашли время его сделать правильно и добиться работоспособности программы? Буду Очень благодарен, если поделитесь.
os1n вне форума  
Непрочитано 12.12.2009, 18:49  
MasterMushi
Вид на жительство
 
Регистрация: 14.10.2009
Сообщений: 338
Сказал спасибо: 35
Сказали Спасибо 92 раз(а) в 73 сообщении(ях)
MasterMushi на пути к лучшему
По умолчанию Re: Помогите решить глюк с клавиатурой

У меня не открылся проект в протеусе. Поэтому такой вопрос - на киборду навешаны резисторы?

З.Ы. Матрица кнопок по внешнему прерыванию это худшее из возможных вариантов. Лучше запускать процедуру от таймера.
MasterMushi вне форума  
Непрочитано 13.12.2009, 00:31  
os1n
Частый гость
 
Регистрация: 09.12.2009
Сообщений: 17
Сказал спасибо: 5
Сказали Спасибо 1 раз в 1 сообщении
os1n на пути к лучшему
По умолчанию Re: Помогите решить глюк с клавиатурой

Сообщение от MasterMushi Посмотреть сообщение
У меня не открылся проект в протеусе. Поэтому такой вопрос - на киборду навешаны резисторы?

З.Ы. Матрица кнопок по внешнему прерыванию это худшее из возможных вариантов. Лучше запускать процедуру от таймера.
На киборд никаких резисторов не вешал, а зачем собственно?

И если есть вариант запуска по таймеру - подскажите пожалуйста почему и где я могу об этом почитать, желательно с примером.

Спасибо за помощь!
os1n вне форума  
Непрочитано 13.12.2009, 04:12  
picavr
Почётный гражданин KAZUS.RUN
 
Аватар для picavr
 
Регистрация: 07.10.2007
Адрес: Луганск
Сообщений: 1,815
Сказал спасибо: 13
Сказали Спасибо 399 раз(а) в 214 сообщении(ях)
picavr на пути к лучшему
По умолчанию Re: Помогите решить глюк с клавиатурой

Сообщение от Vetal-soft Посмотреть сообщение
У вас весма "своеобразный" подход к написанию подпрограмм.
Имхо начинающий.. ещё немало шишек набьёт пока выработает...

Сообщение от os1n Посмотреть сообщение
На киборд никаких резисторов не вешал, а зачем собственно?
Для надёжного считывания состояния ОТПУЩЕНЫХ клавишь, минимизация помех


Сообщение от os1n Посмотреть сообщение
И если есть вариант запуска по таймеру
Да хоть по ВАЧДОГ таймеру... тогда процесор может спать.. а по ВАЧДОГ просыпатся и сканить клавиши... и не нужно никаких внешних прерываний.. будет работать на любом контролере.

Так делал датчик на PIC10F200, питающийся от 3в батарейки. потребление в ожидании получилось до 1 мка при замкнутом датчике обрыва. Срабатывает при замыкании ножки и по RF каналу на 50 метров посылает кодированую посылку о срабатывании, ежеминутно посылает посылку о том что ещё живой. Период посылки по табличке псевдослучайной что бы 20-30 датчиков не мешались.

Алгоритм: Применяется с небольшими модификациями (срабатывание на отпускание или нажатие, повторное срабатывание при удержании, ускорение срабатывания повтора при удержании клавиш и.т.д.) уже лет 8... и для PIC и для AVR

Вызовы процедуры с произвольным периодом 1-30 милисек, подкоректировать константы времени на срабатывание и на повтороное срабатывание, обычно первое срабатываени 30-80 милисек, повторноесрабатываение (при удержании) 0,15-0,3 сек

0) Если флаг нажатия установлен (клавиши не обработаны) вываливаемся из процедуры.
1) считываем состояние клавишь с портов.
2) сравниваем с состоянием, когда все отпущены.
если равно:
a)устанавливаем счётчик срабатывания = начальное значение.
b)в предыдущее состояние клавиш записываем = отпущеное состояние.
с) вываливаемся из процедуры.

если не равно идём дальше:
3) сравниваем с состоянием клавиш в предыдущем проходе
если не равно:
a)устанавливаем счётчик срабатывания = начальное значение.
b)в предыдущее состояние клавиш записываем = текущее состояние.
с) вываливаемся из процедуры.

если равно идём дальше:
4) уменьшаем счётчик совпадений считаннного состояния клавишь.
5) Если счётчик = 0, выставляем флаг = нажата клавиша (для процедур реагирующих на нажатие)
6) в счётчик записываем значение времени для повторного срабатывания клавиши.
7) вываливаемся из процедуры.

На прохождение всей процедуры обычно тратится 5-30-60 команд(не нажаты быстрее - нажаты дольше) в зависимости от количества ножек портов и способа их чтения.

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

Последний раз редактировалось picavr; 13.12.2009 в 04:37.
picavr вне форума  
Эти 3 пользователя(ей) сказали Спасибо picavr за это сообщение:
MasterMushi (13.12.2009), os1n (14.12.2009)
Непрочитано 13.12.2009, 05:10  
MasterMushi
Вид на жительство
 
Регистрация: 14.10.2009
Сообщений: 338
Сказал спасибо: 35
Сказали Спасибо 92 раз(а) в 73 сообщении(ях)
MasterMushi на пути к лучшему
По умолчанию Re: Помогите решить глюк с клавиатурой

Резисторы на считывающих столбцах (строках) помогают избавиться от дребезга согласует сигналы предотвращая блипы на фронте сигнала, который в твоем случае выводит МКху в дикий перманентный INT.

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

Пример...

Код:
#define PORTx PORTC
#define DDRx DDRC
#define PINx PINC

char pressedkeycode;
// Timer 0 overflow interrupt service routine in CVAVR
interrupt [TIM0_OVF] void timer0_ovf_isr(void)
{
//Сохраняем значения на порту, мы же наверно еще для чегото его используем а не только для кнопок 
//Пример как это красиво аппаратно сделать есть в апноуте AVR242
unsigned int saved_port, saved_direction;
char icount=0;
saved_port=PORTx;
saved_direction=DDRx; 
TCNT0=0xFF; //Таймер по "нулям"
DDRx=0b11110000; //Строки на старших питаем и столбцы на младших разрядах читаем

while (icount‹4) 
{
  icount++; //Для надежного считывания прокрутим циклом 4 скана
  delay_ms(10);
  PORTx=0b10000000;
  if (PINx.3) pressedkeycode="1";
  if (PINx.2) pressedkeycode="2";
  if (PINx.1) pressedkeycode="3";
  if (PINx.0) pressedkeycode="a";
  delay_ms(10);
  PORTx=0b01000000;
  if (PINx.3) pressedkeycode="4";
  if (PINx.2) pressedkeycode="5";
  if (PINx.1) pressedkeycode="6";
  if (PINx.0) pressedkeycode="b";
  delay_ms(10);
  PORTx=0b00100000;
  if (PINx.3) pressedkeycode="7";
  if (PINx.2) pressedkeycode="8";
  if (PINx.1) pressedkeycode="9";
  if (PINx.0) pressedkeycode="0";
  PORTx=0b00010000;
  if (PINx.3) pressedkeycode="c";
  if (PINx.2) pressedkeycode="d";
  if (PINx.1) pressedkeycode="e";
  if (PINx.0) pressedkeycode="f";
}
PORTx=saved_port; // Вернем на родину наш порт
DDRx=saved_direction;
}
Банально неправдали?


Блин я хреновый подсказчик, запостил это, врубил схему которую отлаживаю... из за неправильного тыка который по идее не должен был убить ничего.... мега16я и LCD экран почили в вечной славе павшим героям бесчеловечных экспериментов над железом.

ПЕРЕД ВКЛЮЧЕНИЕМ ТРИЖДЫ ПРОВЕРИТЬ!
и Не ленитесь паять разъемы питания в которые трудно ткнуть неправильно.

Последний раз редактировалось MasterMushi; 13.12.2009 в 05:25.
MasterMushi вне форума  
Эти 2 пользователя(ей) сказали Спасибо MasterMushi за это сообщение:
os1n (14.12.2009)
Непрочитано 13.12.2009, 05:57  
picavr
Почётный гражданин KAZUS.RUN
 
Аватар для picavr
 
Регистрация: 07.10.2007
Адрес: Луганск
Сообщений: 1,815
Сказал спасибо: 13
Сказали Спасибо 399 раз(а) в 214 сообщении(ях)
picavr на пути к лучшему
По умолчанию Re: Помогите решить глюк с клавиатурой

Сообщение от MasterMushi Посмотреть сообщение
Банально неправдали?
Это будет работать, пока вы не добрались до многозадачных проектов, когда паралельно обрабатывается по 10 - 30 процесов. С таким подходом писать програмы для поиграться.

Мой пример тратит порядка 1-20 микросекунд с паузой в 10-30 милисек, то есть 0,1% времени. А остальное время процессора на другие задачи.

Последний раз редактировалось picavr; 13.12.2009 в 06:05.
picavr вне форума  
Непрочитано 13.12.2009, 15:14  
MasterMushi
Вид на жительство
 
Регистрация: 14.10.2009
Сообщений: 338
Сказал спасибо: 35
Сказали Спасибо 92 раз(а) в 73 сообщении(ях)
MasterMushi на пути к лучшему
По умолчанию Re: Помогите решить глюк с клавиатурой

Сообщение от picavr Посмотреть сообщение
С таким подходом писать програмы для поиграться.
True )

Но как-то раньше под многозадачные мне не приходилось юзать серьезных ухищрений для режимов энергосбережения. Не было нужды. Теперь буду знать.

ЗЫ а вообще я матрицу кнопок использую только когда ну вообще уже никак без этого. Потому что всегда есть UART связь и PS/2 клавиатуры которые без лишних ухищрений и лишнего кода можно использовать как душе угодно. Плату из клавиатуры вытянул, нужные кнопки на текстолит отдельный развел вот и счастье.)))
MasterMushi вне форума  
Непрочитано 14.12.2009, 19:59  
Gai000login
Прописка
 
Регистрация: 09.05.2005
Сообщений: 98
Сказал спасибо: 2
Сказали Спасибо 21 раз(а) в 13 сообщении(ях)
Gai000login на пути к лучшему
По умолчанию Re: Помогите решить глюк с клавиатурой

Было у меня в проэкте(первый проект)такое: в протеусе нет подтягивающих резисторов но всёравно всё работало. а вот собраный образец неработал.
Так в протеусе по умолчанию если сбросить в "0" -то там и увидите синий маркер постоянно.... чего небывает в поделках на макетке.
-----------------------------------------------
Или я ошибаюсь
Gai000login вне форума  
Непрочитано 14.12.2009, 23:01  
os1n
Частый гость
 
Регистрация: 09.12.2009
Сообщений: 17
Сказал спасибо: 5
Сказали Спасибо 1 раз в 1 сообщении
os1n на пути к лучшему
Лампочка Re: Помогите решить глюк с клавиатурой

ВСЕМ СПАСИБО за оказанную помощь. Буду сидеть, сушить мозги, но думаю получится!
os1n вне форума  
 
Опции темы

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

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

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

Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Помогите найти схемы Toshiba Satellite A300-1ec и Toshiba Satellite A300d Alex-Alpha Поиск схем. Делимся схемами 1 11.03.2010 22:09
Помогите перевернуть пилу akula58 Электроника - это просто 73 11.02.2010 11:30
Помогите решить задачки Doc_Brown Автоматика и аппаратура связи 0 29.10.2009 23:18
Помогите решить, плиз: usb - не опознается Haze_ Микроконтроллеры, АЦП, память и т.д 3 09.10.2009 21:35


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


Powered by vBulletin® Version 3.8.4
Copyright ©2000 - 2026, Jelsoft Enterprises Ltd.