Микроконтроллеры, АЦП, память и т.д Темы касающиеся микроконтроллеров разных производителей, памяти, АЦП/ЦАП, периферийных модулей... |
04.10.2007, 22:25
|
|
Вид на жительство
Регистрация: 18.06.2006
Сообщений: 434
Сказал спасибо: 0
Сказали Спасибо 12 раз(а) в 12 сообщении(ях)
|
обработка клавиатуры?
Подскажите плиз, как правильно организовать обработку клавиатуры. Я делаю так:
поочередно таймером меняю уровни на 3-х портах, на схеме (SX 34,35,36)
И по четырем портам ловлю прерывания.
В симуляторе PROTEUS се работает нормально (правда иногда зависает), а вот в девайсе с реальной клавиатурой, работает не стабильно, виснит, кнопки поклацаю снова работает.
Что я делаю не так програмно или аппаратно?
Код обработки клавиатуры
Код:
|
if (TMR2IF==1)
{
if (f_keypres==0 & RBIF!=1)
{
key_seconds++;
if (key_seconds›=500)
{
if (RB1==0) RB1=1, RB2=0;
else if (RB2==0) RB2=1, RB3=0;
else if (RB3==0) RB3=1, RB1=0;
key_seconds=0;
}
}
...
if (RBIF==1)
{
if (f_keypres==0) f_keypres=1;
else f_keypres=0;
if (RB1==0)
{
if (RB4==0) key=0x31;
else if (RB5==0) key=0x34;
else if (RB6==0) key=0x37;
else if (RB7==0) key=0x2a;
}
else if (RB2==0)
{
if (RB4==0) key=0x32;
else if (RB5==0) key=0x35;
else if (RB6==0) key=0x38;
else if (RB7==0) key=0x30;
}
else if (RB3==0)
{
if (RB4==0) key=0x33;
else if (RB5==0) key=0x36;
else if (RB6==0) key=0x39;
else if (RB7==0) key=0x23;
}
if (f_keypres==1) f_buzzer=1, Keypres();
else f_buzzer=0;
RBIF=0;
} |
-- Прилагается рисунок: --
|
|
|
|
05.10.2007, 00:10
|
|
Гражданин KAZUS.RU
Регистрация: 30.04.2006
Сообщений: 984
Сказал спасибо: 5
Сказали Спасибо 18 раз(а) в 14 сообщении(ях)
|
А дребезг подавляете? В протеусе кнопки без дребезга, в отличие от реальных кнопок. И выложите польностью проект если хотите чтоб помогли...
|
|
|
|
05.10.2007, 00:37
|
|
Вид на жительство
Регистрация: 18.06.2006
Сообщений: 434
Сказал спасибо: 0
Сказали Спасибо 12 раз(а) в 12 сообщении(ях)
|
Подскажи чем можно подавлять дребезг в моем случае?
Не пойму почему когда что то спрашиваю все говорят выложи проект, интересно кому охото разбераться в более чем 1000 строк кода?
Я вроде привожу примеры с законченым смыслом.
Вообще я переделал обработку клавы, так как когда порты на прирывание стоят, уж больно они чувчтвительные, срабатывают даже если счупом от осцилографа касаюсь.
Сделал все через таймер.
Хотя про дребезг очень нужно, подскажи как защитить в моем случае?
|
|
|
|
05.10.2007, 00:53
|
|
Гражданин KAZUS.RU
Регистрация: 30.04.2006
Сообщений: 984
Сказал спасибо: 5
Сказали Спасибо 18 раз(а) в 14 сообщении(ях)
|
|
|
|
|
05.10.2007, 08:15
|
|
Временная регистрация
Регистрация: 31.07.2004
Сообщений: 78
Сказал спасибо: 0
Сказали Спасибо 27 раз(а) в 6 сообщении(ях)
|
Доброго времени... Если необходимо могу выслать файл и схему реально действующей клавиатуры... Разрабатывал сам. Успешно эксплуатируется уже более года на производстве. Не использует прерываний. С количеством кнопок - 16.
|
|
|
|
05.10.2007, 08:19
|
|
Временная регистрация
Регистрация: 31.07.2004
Сообщений: 78
Сказал спасибо: 0
Сказали Спасибо 27 раз(а) в 6 сообщении(ях)
|
Да. Забыл сказать. Схема и программа под ATMega 8535. Написана в Algorithm Builder. Но думаю это проблемой не будет.
|
|
|
|
05.10.2007, 10:01
|
|
Вид на жительство
Регистрация: 18.06.2006
Сообщений: 434
Сказал спасибо: 0
Сказали Спасибо 12 раз(а) в 12 сообщении(ях)
|
Если клавиатура обрабатывается без прерываний, как же ее постоянно контролировать в процессе выполнения основной программы?
|
|
|
|
05.10.2007, 10:57
|
|
Почётный гражданин KAZUS.RU
Регистрация: 06.02.2007
Сообщений: 1,340
Сказал спасибо: 3
Сказали Спасибо 106 раз(а) в 66 сообщении(ях)
|
А что, основной цикл микроконтроллера - 10 секунд занимает ? Выделяете время в основном цикле на опрос, затем - когда удобно - анализируете состояние и обрабатываете. Время в основном цикле, выведенное под другие задачи, можно использовать как константу задержки для подавления дребезга.
Еще вариант
http://www.remexpert.com/forum/viewt...er=asc&start=0
|
|
|
|
05.10.2007, 15:33
|
|
Временная регистрация
Регистрация: 31.07.2004
Сообщений: 78
Сказал спасибо: 0
Сказали Спасибо 27 раз(а) в 6 сообщении(ях)
|
Сообщение от urry
|
А что, основной цикл микроконтроллера - 10 секунд занимает ? Выделяете время в основном цикле на опрос, затем - когда удобно - анализируете состояние и обрабатываете. Время в основном цикле, выведенное под другие задачи, можно использовать как константу задержки для подавления дребезга.
Еще вариант
http://www.remexpert.com/forum/viewt...er=asc&start=0
|
Совершенно согласен с данным утверждением. Таймер же дергает задачу сколько-то раз в секунду (смена скан-кода). Вот в это время и производить опрос. По крайней мере у меня так. Дребезг давится проверкой на отпускание нажатой клавиши. Так же без труда можно добавить таймер времени нажатия если нужно. Мне было без надобности - по-этому я в своей разработке его не учитывал.
|
|
|
|
05.10.2007, 15:43
|
|
Временная регистрация
Регистрация: 31.07.2004
Сообщений: 78
Сказал спасибо: 0
Сказали Спасибо 27 раз(а) в 6 сообщении(ях)
|
Сообщение от maxNTF
|
Если клавиатура обрабатывается без прерываний, как же ее постоянно контролировать в процессе выполнения основной программы?
|
Нет ну если нужно - могу и прерывание вставить Вопрос только - Зачем? Если делать с прерыванием, то лучше вообще без таймера. В этом случае на 16 клавиш получиться 8 линий + один вывод прерывания. Если жаль такое количество портов отдавать - есть еще вариант. Вытащить контроллер клавы от компа. Распаять хоть все 101(1ХХ - кто больше?) клавишу. Два входа - из них один прерывание. Такое тоже делал, давно но до сих пор работает. Кстати у Atmel'a по этому поводу даже даташит имеется. Так что тут только от фантазии и рук зависит.
|
|
|
|
Ваши права в разделе
|
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения
HTML код Выкл.
|
|
|
Часовой пояс GMT +4, время: 18:47.
|
|