Микроконтроллеры, АЦП, память и т.д Темы касающиеся микроконтроллеров разных производителей, памяти, АЦП/ЦАП, периферийных модулей... |
04.08.2007, 23:49
|
|
Гуру портала
Регистрация: 20.11.2004
Сообщений: 10,015
Сказал спасибо: 936
Сказали Спасибо 2,269 раз(а) в 1,563 сообщении(ях)
|
Так,с переварил все выше описаное , теперь начинает проясняться . Завтра думаю выложу нечто рабочее.
Пинайте , буду благодарен любому замечанию и помощи.
Спасибо...
|
|
|
|
06.08.2007, 20:14
|
|
Гуру портала
Регистрация: 20.11.2004
Сообщений: 10,015
Сказал спасибо: 936
Сказали Спасибо 2,269 раз(а) в 1,563 сообщении(ях)
|
Вот вроде получилось
отлавливать отпускание кнопки.
Осовной цикл.
Код:
|
static int8 work;
static struct key{
int8 count_key;
int8 state;
int8 temp_key;
int8 push_count;
int8 number;
int8 debounce;
int f_real:1;
int f_push:1;
int temp:1;
}key;
// пока для отладки ячейки целиком
////////////////////////////////////////////////////////////////////////////////
// main loop
////////////////////////////////////////////////////////////////////////////////
void main(){
Initialize ();
bit_set(RES); // иницилизация счетчика клавы
bit_clear(RES);
while(1){
indik();
if(key.state›0x80&&key.state‹0xff){
work=1;// нажата и отпущена кнопка, при обнаружении такого состояния
// будем сбрасывать key.state после проверки.
}
if(key.state==0xff){
work=2;// остается нажатой
}
indik_eeprom(work);
}
} |
Прерывание.
Код:
|
#int_RTCC
void RTCC_isr()
{
//--------------------------------------------------------------
// key_service (обработка кнопки)
//--------------------------------------------------------------
int8 temp=0;
if(key.count_key==10){
key.count_key=0;
bit_set(K_RES);//Cброс клавы если счетчик переполнен
bit_clear(K_RES);
}
key.f_real=on;
if(PORT_D&0x30){ //
key.f_real=off;
if(PORT_D&0x20){ // выделяем столбец нажатой кнопки
temp=10;
}
if(key.count_key==key.temp_key){ //если нажата таже, увелич. счетчик
key.push_count++;
}
key.number=key.count_key+temp; //сохраняем номер нажатой кнопки
key.temp_key=key.count_key; //и ее строку.
if(key.push_count==10){ //счетчик debounce
key.push_count=0;
key.f_push=on;
}
}
if((key.count_key==key.temp_key)&&key.f_real){ //если номер строки
key.f_push=off; // сохранненый совпадает,
key.push_count=0; //но кнопка не нажата
key.number=0xff; // сбрасываем все
}
key.state‹‹=1; // получаем "осцилограмму"
key.state+=key.f_push; //кнопки ,если 0x80 ‹key.state‹0xff
//кнопка нажата и отпущена,если 0xff
//нажата если 0 то не нажата.
bit_set(K_CLK);//Cледующая строка клавы
bit_clear(K_CLK);
key.count_key++;
......
...
.. |
Прикрепленный файл: 4700491.rar
|
|
|
|
07.08.2007, 16:13
|
|
Почётный гражданин KAZUS.RU
Регистрация: 06.02.2007
Сообщений: 1,340
Сказал спасибо: 3
Сказали Спасибо 106 раз(а) в 66 сообщении(ях)
|
Не нравится слабая защита - антидребезг. Сыграл на анализе state, игнорируя мелкие значения, согласен. Но здесь надо смотреть в железе и на плохих кнопках. Правда, китайцы нам их поставляют много, так что с ними проблем не будет. ![Улыбка](images/smilies/icon_smile.gif)
Далее - использование прерывания приводит к тому, что при нажатии кнопки будет дергаться изображение на индикаторах. ИМХО, использовать прерывание нужно тогда, когда без него не обойтись. Возможно, здесь применение прерывания для кнопок оправдано -сильная загрузка контроллера - но алгоритма я не знаю. Но я бы где-то в основном цикле смотрел, не так уж много ресурсов потребляет.
|
|
|
|
07.08.2007, 19:09
|
|
Гуру портала
Регистрация: 20.11.2004
Сообщений: 10,015
Сказал спасибо: 936
Сказали Спасибо 2,269 раз(а) в 1,563 сообщении(ях)
|
Сообщение от urry
|
Не нравится слабая защита - антидребезг. Сыграл на анализе state, игнорируя мелкие значения, согласен. Но здесь надо смотреть в железе и на плохих кнопках. Правда, китайцы нам их поставляют много, так что с ними проблем не будет. ![Улыбка](images/smilies/icon_smile.gif)
Далее - использование прерывания приводит к тому, что при нажатии кнопки будет дергаться изображение на индикаторах. ИМХО, использовать прерывание нужно тогда, когда без него не обойтись. Возможно, здесь применение прерывания для кнопок оправдано -сильная загрузка контроллера - но алгоритма я не знаю. Но я бы где-то в основном цикле смотрел, не так уж много ресурсов потребляет.
|
Клава пленочная , вроде работает но пересмотрю одназначно, это тестовый вариант.
В железе уже пашет вовсю ![Валяюсь от смеха](images/smilies/icon_biggrin.gif) .
Я одновреммено в протеусе и ICD отлаживаю.
Основная прога впереди .
В основном цикле кнопки не знаю как сделать .
Придеться постоянно вызывать функцию опроса ?
Еще больший гемморой.Хотя может ты и прав.
Счас еще в прерывание АЦП запихаю на все каналы.
И вопрос , если с 1wire работать , прерывания будут мешать?
Отключать не хотелось бы , часы нужны .
|
|
|
|
07.08.2007, 19:12
|
|
Гуру портала
Регистрация: 20.11.2004
Сообщений: 10,015
Сказал спасибо: 936
Сказали Спасибо 2,269 раз(а) в 1,563 сообщении(ях)
|
Сообщение от urry
|
Далее - использование прерывания приводит к тому, что при нажатии кнопки будет дергаться изображение на индикаторах.
|
Хоть частота обновления и на низшем пределе , подергиваний не наблюдал .
|
|
|
|
07.08.2007, 19:38
|
|
Почётный гражданин KAZUS.RU
Регистрация: 06.02.2007
Сообщений: 1,340
Сказал спасибо: 3
Сказали Спасибо 106 раз(а) в 66 сообщении(ях)
|
Cтранно, что в железе нет мерцаний - я в протеусе вижу... ![Улыбка](images/smilies/icon_smile.gif) А с 1-wire все проще - вызывай по отработке секунд - если будет индикатор нервничать - переписать функцию вручную, не использовать библиотечную.
Я как-то переписывал пзу АОНа - использовал платку в своих целях, кстати -многоканальный термометр - то чтобы оно не мерцало, пришлось всталять функцию регенерации очередного символа дисплея везде буквально.
Сегодня в отпуск - ночью в Одессу !!!
|
|
|
|
07.08.2007, 19:46
|
|
Гуру портала
Регистрация: 20.11.2004
Сообщений: 10,015
Сказал спасибо: 936
Сказали Спасибо 2,269 раз(а) в 1,563 сообщении(ях)
|
Сообщение от urry
|
Сегодня в отпуск - ночью в Одессу !!!
|
Счастливый
|
|
|
|
07.08.2007, 21:55
|
|
Вид на жительство
Регистрация: 06.10.2006
Сообщений: 329
Сказал спасибо: 4
Сказали Спасибо 17 раз(а) в 13 сообщении(ях)
|
Сообщение от dosikus
|
Сообщение от urry
|
Не нравится слабая защита - антидребезг. Сыграл на анализе state, игнорируя мелкие значения, согласен. Н
|
Клава пленочная , вроде работает но пересмотрю одназначно, это тестовый вариант.
В железе уже пашет вовсю .
Я одновреммено в протеусе и ICD отлаживаю.
Основная прога впереди .
В основном цикле кнопки не знаю как сделать.
Придеться постоянно вызывать функцию опроса ?
Еще больший гемморой.Хотя может ты и прав.
|
Почему не использовать rtOS?
Даже на PIC16F628A у меня три задачи великолепно крутятся. Начать надо с jacOS и все проблемы с тем как это сделать в основном цикле опадут как желтые листья. Тем более, что будут еще задачи.
|
|
|
|
07.08.2007, 23:31
|
|
Гуру портала
Регистрация: 20.11.2004
Сообщений: 10,015
Сказал спасибо: 936
Сказали Спасибо 2,269 раз(а) в 1,563 сообщении(ях)
|
Сообщение от DL36
|
Почему не использовать rtOS?
Даже на PIC16F628A у меня три задачи великолепно крутятся. Начать надо с jacOS и все проблемы с тем как это сделать в основном цикле опадут как желтые листья. Тем более, что будут еще задачи.
|
Ссылочку можно? Что то это мимо меня пролетело , а счас
заинтересовался...
|
|
|
|
08.08.2007, 08:25
|
|
Гуру портала
Регистрация: 20.11.2004
Сообщений: 10,015
Сказал спасибо: 936
Сказали Спасибо 2,269 раз(а) в 1,563 сообщении(ях)
|
А если останавливать сканирование строк , при
обнаружении нажатой кнопки и начинать обрабатывать дребезг... ????????!!!!!!!!
|
|
|
|
Ваши права в разделе
|
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения
HTML код Выкл.
|
|
|
Часовой пояс GMT +4, время: 20:15.
|
|