матрица 4х4
матрица 4х4
Здравствуйте! Помогите разобраться. Подключил к тини2313 матрицу 4х4 кнопки. подтягивающие резисторы внутренние, выходы притянуты к нулю, входы к плюсу. диодов нет. При нажатии кнопки происходит прерывание PCINT0-5(в зависимости от кнопки), затем по очереди устанавливаю каждую строку в лог1 и проверяю значение столбца. Так вот когда подключен программатор все работает отлично, а когда отключен контроллер через 1-3 нажатия перезагружается. в чем может быть проблема? вот исходник:
// Pin change 0-7 interrupt service routine
interrupt [PC_INT] void pin_change_isr0(void)
{
#asm("cli");
if (PINB != 0x4F) {
fScanButtons();
PORTB=0x0F;
PORTD=0x00;
}
#asm("sei");
}
void fScanButtons()
{
unsigned char i=2;
unsigned char j=0;
unsigned char pinb = 0;
for(i=2; i<6; i++)//запускаю цикл для установки выходов в нуль
{
PORTD = ((1<<i) ^ 0xFF);
for(j=0; j<4; j++)//цикл проверки входов
{
pinb = PINB & 0x0F;
if (pinb != 0x0F)
{
printf("%02X%02X\r",PORTD,pinb);
while ((PINB & 0x0F) == pinb)
{ }
}
}
}
}
// Pin change 0-7 interrupt service routine
interrupt [PC_INT] void pin_change_isr0(void)
{
#asm("cli");
if (PINB != 0x4F) {
fScanButtons();
PORTB=0x0F;
PORTD=0x00;
}
#asm("sei");
}
void fScanButtons()
{
unsigned char i=2;
unsigned char j=0;
unsigned char pinb = 0;
for(i=2; i<6; i++)//запускаю цикл для установки выходов в нуль
{
PORTD = ((1<<i) ^ 0xFF);
for(j=0; j<4; j++)//цикл проверки входов
{
pinb = PINB & 0x0F;
if (pinb != 0x0F)
{
printf("%02X%02X\r",PORTD,pinb);
while ((PINB & 0x0F) == pinb)
{ }
}
}
}
}
- Реклама
-
BerZerK-ku
- Мучитель микросхем
- Сообщения: 492
- Зарегистрирован: Вт июл 22, 2008 08:10:54
Re: матрица 4х4
Может дело в железе? RC цепочка на сбросе есть?
Re: матрица 4х4
10ком к плюсу
Re: матрица 4х4
решил проблему. во время обработки складывалась очередь прерываний. судя по всему изза дребезга контактов. добавил в конец функции EIFR=0x20(перед глобальным разрешением прерываний) и все заработало 
- s_black
- Мучитель микросхем
- Сообщения: 411
- Зарегистрирован: Вс авг 10, 2008 19:35:49
- Откуда: Евпатория
- Контактная информация:
Re: матрица 4х4
Жаль на обработку клавы тратить прерывания. Кроме того, прерывания нужно стараться использовать как можно меньше.rush писал(а):решил проблему. во время обработки складывалась очередь прерываний. судя по всему изза дребезга контактов. добавил в конец функции EIFR=0x20(перед глобальным разрешением прерываний) и все заработало
- Реклама
Re: матрица 4х4
прерывания нужно использовать как можно больше, что бы не отвлекать силы процессора на отслеживание событий в основном цикле. Но использовать прерывания нужно правильно. Например завести таймер и по прерыванию выставлять флаг (скажем каждые 5mSec), в основном цикле по этому флагу опрашивать клавиатуру и инкрементировать счетчик по факту нажатия кнопки, если досчитал до 3-4, значит 15-20mSec уверенного контакта кнопки, можно принимать решение, что кнопка нажата.
Re: матрица 4х4
да так, но не так часто ставить флаг, через 20-30mSec достаточно и отсекать одинаковые нажатия т.е. реагировать на изменение.s64 писал(а):прерывания нужно использовать как можно больше, что бы не отвлекать силы процессора на отслеживание событий в основном цикле. Но использовать прерывания нужно правильно. Например завести таймер и по прерыванию выставлять флаг (скажем каждые 5mSec), в основном цикле по этому флагу опрашивать клавиатуру и инкрементировать счетчик по факту нажатия кнопки, если досчитал до 3-4, значит 15-20mSec уверенного контакта кнопки, можно принимать решение, что кнопка нажата.
а если прерывание то его и запрещать на теже 20-30mSec. но проблема наверно в том что надо внешние резисторы на 5-10 кОм
- s_black
- Мучитель микросхем
- Сообщения: 411
- Зарегистрирован: Вс авг 10, 2008 19:35:49
- Откуда: Евпатория
- Контактная информация:
Re: матрица 4х4
Коллега, Вам не кажется, что в этом предложении первая часть противоречит второй? Если контроллер будет постоянно висеть в обработчиках прерываний, на главный цикл не останется времени!s64 писал(а):прерывания нужно использовать как можно больше, что бы не отвлекать силы процессора на отслеживание событий в основном цикле.
А вот про флаговый автомат Вы правильно говорите. Достаточно завести один таймер, установить пару-тройку флагов - и вперёд.
- s_black
- Мучитель микросхем
- Сообщения: 411
- Зарегистрирован: Вс авг 10, 2008 19:35:49
- Откуда: Евпатория
- Контактная информация:
Re: матрица 4х4
Нет, не в резисторах. И если уж делать клаву на прерываниях (хотя повторяю - это неверно), то параллельно кнопкам нужно ставить керамику на 0,1 uF - это будет аппаратное подавление дребезга. Или в обработчике PCINT первой командой ставить запрет этого же прерывания, а после выхода разрешать - это будет программное подавление дребезга.BVS писал(а):s64 писал(а): но проблема наверно в том что надо внешние резисторы на 5-10 кОм
Re: матрица 4х4
программа в главном цикле долшна спать, просыпатся по прерываниям, отрабатывать флаги и дальше спать
про резистор, ток через кнопку долшен быть достаточный чтоб различать состояния
за 5mSec пройдет любой дребезг если кнопка нормальная, а прерывание запрещать не до конца обработчика,а на некоторое время.
А то он этот дребезг и будет обрабатывать.
про резистор, ток через кнопку долшен быть достаточный чтоб различать состояния
за 5mSec пройдет любой дребезг если кнопка нормальная, а прерывание запрещать не до конца обработчика,а на некоторое время.
А то он этот дребезг и будет обрабатывать.
- s_black
- Мучитель микросхем
- Сообщения: 411
- Зарегистрирован: Вс авг 10, 2008 19:35:49
- Откуда: Евпатория
- Контактная информация:
Re: матрица 4х4
Это кто Вам такое сказал?BVS писал(а):программа в главном цикле долшна спать, просыпатся по прерываниям, отрабатывать флаги и дальше спать
Какой ток через кнопку? Вы вообще о чём?BVS писал(а): про резистор, ток через кнопку долшен быть достаточный чтоб различать состояния
На подавление антидребезга отводят 50 - 60 мсBVS писал(а): за 5mSec пройдет любой дребезг если кнопка нормальная,
Вы ошибаетесь, коллега. Если на некоторое время - то как раз он и будет отрабатывать дребезгBVS писал(а): а прерывание запрещать не до конца обработчика,а на некоторое время.
А то он этот дребезг и будет обрабатывать.
Re: матрица 4х4
Переубеждать не буду, похоже мы с разных планет!
- s_black
- Мучитель микросхем
- Сообщения: 411
- Зарегистрирован: Вс авг 10, 2008 19:35:49
- Откуда: Евпатория
- Контактная информация:
Re: матрица 4х4
Так меня и не нужно переубеждать. Вы учебники почитайте, документацию.BVS писал(а):Переубеждать не буду, похоже мы с разных планет!
Re: матрица 4х4
Про конденсатор тоже в учебнике написано?
с емкостью линии обычно наоборот борются.
Сколько вы думаете, работает обработчик прерывания?
2-3 микро именно микросекунд, а 5 микросекунд это 40 тактов при 8МГц,
выходите вы из обработчика и тут через 10 или 100, даже через 1000 (1милисекунду) дребезг, в любом случае это лишний раз отвлекаться.
Спать или не спать это Ваше дело, кнопки на прерываниях нужны только чтобы будить контроллер, и то из состояния глубокого сна.
А если он не спит, просто опрашивать через интервал и все.
Теперь, если все флаги сброшены то у вас пустой цикл, который не чего не делает, жрет такты процессора и электроэнергию, подсуньте такую программу виндовсу - даже мышь перестанет шевелиться.
Про ток: в любой замкнутой цепи течет ток, даже если он несколько микроампер
если линия подтянута резистором к питанию, и прижать ее к земле кнопкой, то через нее потечет ток, а если сопротивление будет большое, то линия будет реагировать не только на кнопку, но и на "вспышки на солнце".
с емкостью линии обычно наоборот борются.
Сколько вы думаете, работает обработчик прерывания?
2-3 микро именно микросекунд, а 5 микросекунд это 40 тактов при 8МГц,
выходите вы из обработчика и тут через 10 или 100, даже через 1000 (1милисекунду) дребезг, в любом случае это лишний раз отвлекаться.
Спать или не спать это Ваше дело, кнопки на прерываниях нужны только чтобы будить контроллер, и то из состояния глубокого сна.
А если он не спит, просто опрашивать через интервал и все.
Теперь, если все флаги сброшены то у вас пустой цикл, который не чего не делает, жрет такты процессора и электроэнергию, подсуньте такую программу виндовсу - даже мышь перестанет шевелиться.
Про ток: в любой замкнутой цепи течет ток, даже если он несколько микроампер
если линия подтянута резистором к питанию, и прижать ее к земле кнопкой, то через нее потечет ток, а если сопротивление будет большое, то линия будет реагировать не только на кнопку, но и на "вспышки на солнце".
- s_black
- Мучитель микросхем
- Сообщения: 411
- Зарегистрирован: Вс авг 10, 2008 19:35:49
- Откуда: Евпатория
- Контактная информация:
Re: матрица 4х4
Уважаемый BVS! Мне жалко своего времени на дискуссию с Вами ни о чём. Вы не только не хотите читать учебники, но и на этом форуме не освоили элементарных основ из обучалки.
Нескромный вопрос - сколько Вам лет?
Нескромный вопрос - сколько Вам лет?


