Микроконтроллеры, АЦП, память и т.д Темы касающиеся микроконтроллеров разных производителей, памяти, АЦП/ЦАП, периферийных модулей... |
03.08.2007, 10:02
|
|
Почётный гражданин KAZUS.RU
Регистрация: 06.02.2007
Сообщений: 1,340
Сказал спасибо: 3
Сказали Спасибо 106 раз(а) в 66 сообщении(ях)
|
Сообщение от nokazus
|
561ИЕ8 - счетчик со встроенным дешифратором - 10 выходов.
|
досикус, вчера ты съел мой моск.
Как бы я сделал... Обявил бы массив структур - по 6 битов на каждую кнопку 1 - бит - кнопка нажата (железно) , 2 бит - кнопка отжата (та же) и 4 бита выделил на счетчик дребезга.
Код:
|
static volatile bit KANAL1 @ ((unsigned)&PORTA*8)+4;
typedef struct
{
unsigned naj:1;//кнопка нажата битовая переменная
unsigned otj:1;// кнопка отжата битовая переменная
unsigned st:4;// 4 бита на счетчик дребезга
}knopka_ ;
knopka_ knopka[20]; // массив структур на 20 кнопок |
В программе вызываем функцию, которой передаем номер импульса на счетчик-дешифратор
Код:
|
// после очередного импульса на счетчик
// анализируем (антидребезг)
analiz(1);// передаем номер импульса
//----------------------------------------
void analiz (unsigned char nomer)
{
if (KANAL1 == 0) // кнопка отжата
{
knopka[nomer].naj=0;// снимаем флаг нажатой кнопки
knopka[nomer].st --;// уменьшаем счетчик антидребезга
if(knopka[nomer].st ‹0)// счетчик закончился влево
{
knopka[nomer].otj=1;// ставим флаг отжатой кнопки
knopka[nomer].st =0;
}
}
else // кнопка нажата
{
knopka[nomer].otj=0;// снимаем флаг отжатой кнопки
knopka[nomer].st ++;// увеличиваем счетчик антидребезга
if(knopka[nomer].st ›=15)// счетчик закончился вправо
{
knopka[nomer].naj=1;// ставим флаг нажатой кнопки
knopka[nomer].st =15;
}
}
}
//------------------------------------------- |
Перепишем для 2 каналов
Код:
|
static volatile bit KANAL1 @ ((unsigned)&PORTA*8)+4;
static volatile bit KANAL2 @ ((unsigned)&PORTA*8)+3;
void analiz (unsigned char nomer)
{
if (KANAL1 == 0) // кнопка отжата
{
knopka[nomer].naj=0;// снимаем флаг нажатой кнопки
knopka[nomer].st --;// уменьшаем счетчик антидребезга
if(knopka[nomer].st ‹0)// счетчик закончился влево
{
knopka[nomer].otj=1;// ставим флаг отжатой кнопки
knopka[nomer].st =0;
}
}
else // кнопка нажата
{
knopka[nomer].otj=0;// снимаем флаг отжатой кнопки
knopka[nomer].st ++;// увеличиваем счетчик антидребезга
if(knopka[nomer].st ›=15)// счетчик закончился вправо
{
knopka[nomer].naj=1;// ставим флаг нажатой кнопки
knopka[nomer].st =15;
}
}
if (KANAL2 == 0) // кнопка отжата
{
knopka[nomer+10].naj=0;// снимаем флаг нажатой кнопки
knopka[nomer+10].st --;// уменьшаем счетчик антидребезга
if(knopka[nomer+10].st ‹0)// счетчик закончился влево
{
knopka[nomer+10].otj=1;// ставим флаг отжатой кнопки
knopka[nomer+10].st =0;
}
}
else // кнопка нажата
{
knopka[nomer+10].otj=0;// снимаем флаг отжатой кнопки
knopka[nomer+10].st ++;// увеличиваем счетчик антидребезга
if(knopka[nomer+10].st ›=15)// счетчик закончился вправо
{
knopka[nomer+10].naj=1;// ставим флаг нажатой кнопки
knopka[nomer+10].st =15;
}
}
} |
//вычисляем номер нажатой кнопки
unsigned char nm_kn();
Код:
|
unsigned char nm_kn(void)
{
unsigned char temp;
temp=255;
for (i=0;i‹20;i++)
{
if(knopka[i].naj==1)
{
temp=i;
break;
}
}
return temp;
}
// вернет 255, если ничего не нажато
// или номер нажатой кнопки |
|
|
|
|
03.08.2007, 17:30
|
|
Почётный гражданин KAZUS.RU
Регистрация: 06.02.2007
Сообщений: 1,340
Сказал спасибо: 3
Сказали Спасибо 106 раз(а) в 66 сообщении(ях)
|
Ну, собственно, к сказанному... Проект в протеусе.
Прикрепленный файл: 3675028.rar
|
|
|
|
03.08.2007, 18:22
|
|
Гуру портала
Регистрация: 20.11.2004
Сообщений: 10,015
Сказал спасибо: 936
Сказали Спасибо 2,269 раз(а) в 1,563 сообщении(ях)
|
Ну ты ДАЕШЬ , извини что заставил мучиться...
сПАСИБО!!
|
|
|
|
03.08.2007, 18:51
|
|
Гуру портала
Регистрация: 20.11.2004
Сообщений: 10,015
Сказал спасибо: 936
Сказали Спасибо 2,269 раз(а) в 1,563 сообщении(ях)
|
Опс , ты не совсем прав .
Надо использовать ресет на счетчике,
тогда мы будем знать начало сканирования и добавив переменную
счетчик будем знать номер строки и не надо будет массива.
В принципе это у меня уже сделано.
Но результат тот же , отловить отжатие кнопки не могу .
Вот прилагаю.
Прикрепленный файл: 302344.rar
|
|
|
|
03.08.2007, 19:00
|
|
Гуру портала
Регистрация: 20.11.2004
Сообщений: 10,015
Сказал спасибо: 936
Сказали Спасибо 2,269 раз(а) в 1,563 сообщении(ях)
|
Только в проекте много лишнего,
использовал как шаблон предыдущий проект...
|
|
|
|
03.08.2007, 23:06
|
|
Почётный гражданин KAZUS.RU
Регистрация: 06.02.2007
Сообщений: 1,340
Сказал спасибо: 3
Сказали Спасибо 106 раз(а) в 66 сообщении(ях)
|
А я могу... Не суть... Я выступаю по "взрослым" компиляторам - микроконтроллеры -мое хобби - дань преступному радиолюбительскому прошлому.
Кругом одно и то же - а в Анктартиде вдобавок холодно..
Сделаем...
Посмотрел твой код... *восхищенно* не, не зря меня в Арисент не взяли.. я бы такое и под пивом не написал... Ущербный, наверное...
Кстати, обработку клавиш в файле не увидел....
|
|
|
|
04.08.2007, 01:47
|
|
Гуру портала
Регистрация: 20.11.2004
Сообщений: 10,015
Сказал спасибо: 936
Сказали Спасибо 2,269 раз(а) в 1,563 сообщении(ях)
|
Сообщение от urry
|
Кстати, обработку клавиш в файле не увидел....
|
Да ее как таковой и нет , единственное что пока есть
ловлю нажатие и получаю код кнопки...
|
|
|
|
04.08.2007, 10:02
|
|
Почётный гражданин KAZUS.RU
Регистрация: 06.02.2007
Сообщений: 1,340
Сказал спасибо: 3
Сказали Спасибо 106 раз(а) в 66 сообщении(ях)
|
Добавил сброс на счетчик. Измененный проект прилагаю. А чем тебе так не нравятся массивы структур ?
Проверить нажата ли кнопка с номером ном -
if (knopka[nom].naj == 1) если нажата, то 1
есл отжата
if (knopka[nom].otj == 1)
Ecли там и там 0, значит, кнопка еще не определилась, работает счетчик антидребезга.
Номера кнопок идут с 0 до 9 - (как считает дешифратор) для младшего канала - и с 10 по 19 -для старшего.
Прикрепленный файл: 939152.rar
|
|
|
|
04.08.2007, 11:15
|
|
Временная регистрация
Регистрация: 04.04.2005
Сообщений: 77
Сказал спасибо: 0
Сказали Спасибо 0 раз(а) в 0 сообщении(ях)
|
Зачем усложнять жизнь? Ведь можно ввести 1-й счётчик на таймер, чтоб обработка шла, скажем, раз 16 в секунду, а второй прибавлялся при нажатой кнопке (любой) до определённого состояния и сбрасывался при изменении состояния любой кнопки. 1-й счётчик исключает дребезг (т.к. он не может так долго продолжаться), а второй будет служить для повтора нажатий. В итоге 2 байта на счётчики и 5-6 байт (2*20бит) на кнопки (текущее и предыдущее состояния).
__________________
No pain - no gain. Ha-ha
|
|
|
|
04.08.2007, 11:55
|
|
Почётный гражданин KAZUS.RU
Регистрация: 03.01.2007
Адрес: Россия,Иркутская обл.
Сообщений: 2,579
Сказал спасибо: 351
Сказали Спасибо 315 раз(а) в 193 сообщении(ях)
|
Сообщение от dosikus
|
Вот прилагаю.
|
Впечатляет
Прикрепленный файл: 302344.rar
|
|
|
|
Ваши права в разделе
|
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения
HTML код Выкл.
|
|
|
Часовой пояс GMT +4, время: 19:00.
|
|