Страница 1 из 1

матрица 4х4

Добавлено: Ср ноя 23, 2011 12:13:39
rush
Здравствуйте! Помогите разобраться. Подключил к тини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)
{ }
}
}
}
}

Re: матрица 4х4

Добавлено: Ср ноя 23, 2011 13:38:35
BerZerK-ku
Может дело в железе? RC цепочка на сбросе есть?

Re: матрица 4х4

Добавлено: Ср ноя 23, 2011 13:40:04
rush
10ком к плюсу

Re: матрица 4х4

Добавлено: Ср ноя 23, 2011 14:05:47
rush
решил проблему. во время обработки складывалась очередь прерываний. судя по всему изза дребезга контактов. добавил в конец функции EIFR=0x20(перед глобальным разрешением прерываний) и все заработало :)

Re: матрица 4х4

Добавлено: Сб дек 03, 2011 10:11:12
s_black
rush писал(а):решил проблему. во время обработки складывалась очередь прерываний. судя по всему изза дребезга контактов. добавил в конец функции EIFR=0x20(перед глобальным разрешением прерываний) и все заработало :)
Жаль на обработку клавы тратить прерывания. Кроме того, прерывания нужно стараться использовать как можно меньше.

Re: матрица 4х4

Добавлено: Сб дек 03, 2011 11:41:27
s64
прерывания нужно использовать как можно больше, что бы не отвлекать силы процессора на отслеживание событий в основном цикле. Но использовать прерывания нужно правильно. Например завести таймер и по прерыванию выставлять флаг (скажем каждые 5mSec), в основном цикле по этому флагу опрашивать клавиатуру и инкрементировать счетчик по факту нажатия кнопки, если досчитал до 3-4, значит 15-20mSec уверенного контакта кнопки, можно принимать решение, что кнопка нажата.

Re: матрица 4х4

Добавлено: Сб дек 03, 2011 13:02:38
BVS
s64 писал(а):прерывания нужно использовать как можно больше, что бы не отвлекать силы процессора на отслеживание событий в основном цикле. Но использовать прерывания нужно правильно. Например завести таймер и по прерыванию выставлять флаг (скажем каждые 5mSec), в основном цикле по этому флагу опрашивать клавиатуру и инкрементировать счетчик по факту нажатия кнопки, если досчитал до 3-4, значит 15-20mSec уверенного контакта кнопки, можно принимать решение, что кнопка нажата.
да так, но не так часто ставить флаг, через 20-30mSec достаточно и отсекать одинаковые нажатия т.е. реагировать на изменение.
а если прерывание то его и запрещать на теже 20-30mSec. но проблема наверно в том что надо внешние резисторы на 5-10 кОм

Re: матрица 4х4

Добавлено: Сб дек 03, 2011 13:14:30
s_black
s64 писал(а):прерывания нужно использовать как можно больше, что бы не отвлекать силы процессора на отслеживание событий в основном цикле.
Коллега, Вам не кажется, что в этом предложении первая часть противоречит второй? Если контроллер будет постоянно висеть в обработчиках прерываний, на главный цикл не останется времени!
А вот про флаговый автомат Вы правильно говорите. Достаточно завести один таймер, установить пару-тройку флагов - и вперёд.

Re: матрица 4х4

Добавлено: Сб дек 03, 2011 13:19:20
s_black
BVS писал(а):
s64 писал(а): но проблема наверно в том что надо внешние резисторы на 5-10 кОм
Нет, не в резисторах. И если уж делать клаву на прерываниях (хотя повторяю - это неверно), то параллельно кнопкам нужно ставить керамику на 0,1 uF - это будет аппаратное подавление дребезга. Или в обработчике PCINT первой командой ставить запрет этого же прерывания, а после выхода разрешать - это будет программное подавление дребезга.

Re: матрица 4х4

Добавлено: Сб дек 03, 2011 13:40:38
BVS
программа в главном цикле долшна спать, просыпатся по прерываниям, отрабатывать флаги и дальше спать
про резистор, ток через кнопку долшен быть достаточный чтоб различать состояния
за 5mSec пройдет любой дребезг если кнопка нормальная, а прерывание запрещать не до конца обработчика,а на некоторое время.
А то он этот дребезг и будет обрабатывать.

Re: матрица 4х4

Добавлено: Сб дек 03, 2011 16:31:50
s_black
BVS писал(а):программа в главном цикле долшна спать, просыпатся по прерываниям, отрабатывать флаги и дальше спать
Это кто Вам такое сказал?
BVS писал(а): про резистор, ток через кнопку долшен быть достаточный чтоб различать состояния
Какой ток через кнопку? Вы вообще о чём?
BVS писал(а): за 5mSec пройдет любой дребезг если кнопка нормальная,
На подавление антидребезга отводят 50 - 60 мс
BVS писал(а): а прерывание запрещать не до конца обработчика,а на некоторое время.
А то он этот дребезг и будет обрабатывать.
Вы ошибаетесь, коллега. Если на некоторое время - то как раз он и будет отрабатывать дребезг

Re: матрица 4х4

Добавлено: Сб дек 03, 2011 18:38:28
BVS
Переубеждать не буду, похоже мы с разных планет!

Re: матрица 4х4

Добавлено: Сб дек 03, 2011 18:48:03
s_black
BVS писал(а):Переубеждать не буду, похоже мы с разных планет!
Так меня и не нужно переубеждать. Вы учебники почитайте, документацию.

Re: матрица 4х4

Добавлено: Сб дек 03, 2011 21:31:46
BVS
Про конденсатор тоже в учебнике написано?
с емкостью линии обычно наоборот борются.

Сколько вы думаете, работает обработчик прерывания?
2-3 микро именно микросекунд, а 5 микросекунд это 40 тактов при 8МГц,
выходите вы из обработчика и тут через 10 или 100, даже через 1000 (1милисекунду) дребезг, в любом случае это лишний раз отвлекаться.

Спать или не спать это Ваше дело, кнопки на прерываниях нужны только чтобы будить контроллер, и то из состояния глубокого сна.
А если он не спит, просто опрашивать через интервал и все.
Теперь, если все флаги сброшены то у вас пустой цикл, который не чего не делает, жрет такты процессора и электроэнергию, подсуньте такую программу виндовсу - даже мышь перестанет шевелиться.

Про ток: в любой замкнутой цепи течет ток, даже если он несколько микроампер
если линия подтянута резистором к питанию, и прижать ее к земле кнопкой, то через нее потечет ток, а если сопротивление будет большое, то линия будет реагировать не только на кнопку, но и на "вспышки на солнце".

Re: матрица 4х4

Добавлено: Сб дек 03, 2011 21:52:41
s_black
Уважаемый BVS! Мне жалко своего времени на дискуссию с Вами ни о чём. Вы не только не хотите читать учебники, но и на этом форуме не освоили элементарных основ из обучалки.
Нескромный вопрос - сколько Вам лет?