Микроконтроллеры, АЦП, память и т.д Темы касающиеся микроконтроллеров разных производителей, памяти, АЦП/ЦАП, периферийных модулей... |
29.07.2010, 01:16
|
|
Почётный гражданин KAZUS.RU
Регистрация: 08.09.2009
Сообщений: 1,139
Сказал спасибо: 138
Сказали Спасибо 366 раз(а) в 230 сообщении(ях)
|
Re: Как увеличивать скорость пересчёта
Godzilla82
А у вас какой компилятор, ато у меня выдаёт ошибки, я пользую CVAVR.
|
|
|
|
29.07.2010, 09:28
|
|
Почётный гражданин KAZUS.RU
Регистрация: 08.09.2009
Сообщений: 1,139
Сказал спасибо: 138
Сказали Спасибо 366 раз(а) в 230 сообщении(ях)
|
Re: Как увеличивать скорость пересчёта
После всех эксперементов сделал как советовал (MasterMushi)
PHP код:
|
if((!kn_plus)&&(kn_TX))
{delay_ms(50);
ph_state_save=ph;
delay_init=150;
while(!kn_plus)
{if (ph ‹ 32700)
{ ph += 1;
set_pch();
if ((ph›(ph_state_save+5))&&(delay_init›1))
delay_init--;
delay_button(delay_init); }}}
if((!kn_minus)&&(kn_TX))
{delay_ms(50);
ph_state_save=ph;
delay_init=150;
while(!kn_minus)
{if (ph › -32700)
{ ph -= 1;
set_pch();
if ((ph‹(ph_state_save-5))&&(delay_init›1))
delay_init--;
delay_button(delay_init); }}}
|
работает как надо.
|
|
|
|
29.07.2010, 13:38
|
|
Почётный гражданин KAZUS.RU
Регистрация: 29.10.2006
Сообщений: 1,446
Сказал спасибо: 99
Сказали Спасибо 317 раз(а) в 233 сообщении(ях)
|
Re: Как увеличивать скорость пересчёта
Сообщение от sdsrem
|
Godzilla82
А у вас какой компилятор, ато у меня выдаёт ошибки, я пользую CVAVR.
|
Ну и я вам написал код для CVAVR.
Логика работы простая. Как только вы нажимаете кнопку, происходит одиночное срабатывание. Если кнопка удерживается более 2 секунд, то происходит повтор действий каждые 100 мс. Если нужно, чтобы действия выполнялись через меньший промежуток, измените delay_ms(100) на delay_ms(20), также не забудьте при этом поменять 20 на 100.
А что за ошибки-то? Приведите полный листинг программы. Возможно, нет строчки #include ‹delay.h›.
Вместо PINA.1 и PINA.2 - надо подставлять реально используемые выводы, к которым подключается кнопка (замыкающаяся на землю при нажатии).
|
|
|
|
30.07.2010, 19:58
|
|
Почётный гражданин KAZUS.RU
Регистрация: 08.09.2009
Сообщений: 1,139
Сказал спасибо: 138
Сказали Спасибо 366 раз(а) в 230 сообщении(ях)
|
Re: Как увеличивать скорость пересчёта
Сообщение от Godzilla82
|
Ну и я вам написал код для CVAVR.
Логика работы простая. Как только вы нажимаете кнопку, происходит одиночное срабатывание. Если кнопка удерживается более 2 секунд, то происходит повтор действий каждые 100 мс. Если нужно, чтобы действия выполнялись через меньший промежуток, измените delay_ms(100) на delay_ms(20), также не забудьте при этом поменять 20 на 100.
А что за ошибки-то? Приведите полный листинг программы. Возможно, нет строчки #include ‹delay.h›.
Вместо PINA.1 и PINA.2 - надо подставлять реально используемые выводы, к которым подключается кнопка (замыкающаяся на землю при нажатии).
|
Вот как выглядит ошибка
|
|
|
|
30.07.2010, 21:06
|
|
Почётный гражданин KAZUS.RU
Регистрация: 29.10.2006
Сообщений: 1,446
Сказал спасибо: 99
Сказали Спасибо 317 раз(а) в 233 сообщении(ях)
|
Re: Как увеличивать скорость пересчёта
Сообщение от sdsrem
|
Вот как выглядит ошибка
|
Вообще-то в окошке снизу ( Messages) пишется осмысленный текст, точно указывающий на характер ошибки.
Цикл while(1) не нужен. Его заменяет begin: ... goto begin. У вас лишняя скобка.
delay_ms(100) должно быть в коде 1 раз.
ph++ - это не функция, это переменная, то есть скобки не нужны. Эта запись означает увеличение значения переменной ph на 1. Она должна быть описана.
По вашему алгоритму помимо этого нужно ещё выполнить функцию set_pch().
Последний раз редактировалось Godzilla82; 30.07.2010 в 21:28.
|
|
|
|
30.07.2010, 22:15
|
|
Почётный гражданин KAZUS.RU
Регистрация: 08.09.2009
Сообщений: 1,139
Сказал спасибо: 138
Сказали Спасибо 366 раз(а) в 230 сообщении(ях)
|
Re: Как увеличивать скорость пересчёта
Сообщение от Godzilla82
|
Вообще-то в окошке снизу (Messages) пишется осмысленный текст, точно указывающий на характер ошибки.
Цикл while(1) не нужен. Его заменяет begin: ... goto begin. У вас лишняя скобка.
delay_ms(100) должно быть в коде 1 раз.
ph++ - это не функция, это переменная, то есть скобки не нужны. Эта запись означает увеличение значения переменной ph на 1. Она должна быть описана.
По вашему алгоритму помимо этого нужно ещё выполнить функцию set_pch().
|
Работает но не ускоряется, просто переключает, но работает в цыкле, ежели прописать в майн то ругается на (cnt2) типа описан но не используется.
|
|
|
|
31.07.2010, 03:59
|
|
Почётный гражданин KAZUS.RU
Регистрация: 29.10.2006
Сообщений: 1,446
Сказал спасибо: 99
Сказали Спасибо 317 раз(а) в 233 сообщении(ях)
|
Re: Как увеличивать скорость пересчёта
Сообщение от sdsrem
|
Работает но не ускоряется, просто переключает, но работает в цыкле...
|
Код:
|
void process(void)
{
...
}
void main(void)
{
char cnt1 = 0;
char cnt2 = 0;
...
begin:
if((!kn_plus)&&(kn_TX)) {
if ( (cnt1 == 0) || (cnt1 == 20) ) {
ph++;
process();
}
if ( cnt1 ‹ 20) cnt1++;
}
else cnt1 = 0;
if((!kn_minus)&&(kn_TX)) {
if ( (cnt2 == 0) || (cnt2 == 20) ) {
ph++;
process();
}
if ( cnt2 ‹ 20) cnt2++;
}
else cnt2 = 0;
delay_ms(100);
goto begin; |
Код, выполняющий все действия нужно вынести в функцию process(). Она будет вызываться каждый раз при смене значения переменной ph.
О каком ускорении идёт речь? Одиночное нажатие - одиночное срабатывание. Долгое нажатие (более 2 сек.) - будет каждые 100 мс выполнять действия, пока нажата кнопка. То есть, за секунду значение переменной увеличится на 10.
|
|
|
|
31.07.2010, 04:32
|
|
Почётный гражданин KAZUS.RU
Регистрация: 08.09.2009
Сообщений: 1,139
Сказал спасибо: 138
Сказали Спасибо 366 раз(а) в 230 сообщении(ях)
|
Re: Как увеличивать скорость пересчёта
Сообщение от Godzilla82
|
О каком ускорении идёт речь? Одиночное нажатие - одиночное срабатывание. Долгое нажатие (более 2 сек.) - будет каждые 100 мс выполнять действия, пока нажата кнопка. То есть, за секунду значение переменной увеличится на 10.
|
Мы видимо друг друга не поняли, условие такое; ежели нажать один раз значение меняется на еденицу, ежели удерживать кнопку значение должно менятся на еденицу но при этом переключение должно ускорятся, первые десять переключений за 100 микросекунд вторые десять за 99 микросекунд третьи десять за 98 микросекунд ну и так далее пока переключение не станет 1 микросекунда.
Это для того чтоб долго не ждать когда наматает определённое значение, а медленно в начале чтоб легче было подогнать то значение которое нужно.
Но ваш код тоже интересный, только без коментов мне не совсем понятен, я ещё с програмированием на вы, может прокоментируете как он работает?
|
|
|
|
31.07.2010, 06:19
|
|
Почётный гражданин KAZUS.RU
Регистрация: 29.10.2006
Сообщений: 1,446
Сказал спасибо: 99
Сказали Спасибо 317 раз(а) в 233 сообщении(ях)
|
Re: Как увеличивать скорость пересчёта
Сообщение от sdsrem
|
Мы видимо друг друга не поняли...
...может прокоментируете как он работает?
|
Пока кнопка не нажата - мы сбрасываем счётчик cnt1. Как только нажали - делаем проверку. Если это первое нажатие cnt1 = 0, то выполняем действия и увеличиваем счётчик на 1.
Через 100 мс проверяем, если кнопка всё ещё нажата - то смотрим, равен ли счётчик 20. Если равен - то выполняем действия. Если нет - то ничего не делаем, просто увеличиваем счётчик на единицу (ждём, пока пройдут 2 сек).
Переменную cnt1 увеличиваем не всё время, а только если она меньше 20. Думаю, сам догадаетесь почему.
Этот код тоже можно сделать с ускорением.
Код:
|
void main(void)
{
char cnt1 = 0;
char cnt2 = 0;
...
begin:
if((!kn_plus)&&(kn_TX)) {
if ( (cnt1 == 0) || (cnt1 › 20) ) {
ph++;
process();
}
if ( cnt1 ‹ 90) cnt1++;
}
else cnt1 = 0;
delay_ms(100 - cnt1);
goto begin; |
Для двух кнопок правильнее описать функцию max(cnt1, cnt2) и её уже ставить в качестве аргумента для delay_ms().
Последний раз редактировалось Godzilla82; 31.07.2010 в 07:03.
|
|
|
|
31.07.2010, 08:00
|
|
Почётный гражданин KAZUS.RU
Регистрация: 08.09.2009
Сообщений: 1,139
Сказал спасибо: 138
Сказали Спасибо 366 раз(а) в 230 сообщении(ях)
|
Re: Как увеличивать скорость пересчёта
Сообщение от Godzilla82
|
Пока кнопка не нажата - мы сбрасываем счётчик cnt1. Как только нажали - делаем проверку. Если это первое нажатие cnt1 = 0, то выполняем действия и увеличиваем счётчик на 1.
Через 100 мс проверяем, если кнопка всё ещё нажата - то смотрим, равен ли счётчик 20. Если равен - то выполняем действия. Если нет - то ничего не делаем, просто увеличиваем счётчик на единицу (ждём, пока пройдут 2 сек).
Переменную cnt1 увеличиваем не всё время, а только если она меньше 20. Думаю, сам догадаетесь почему.
Этот код тоже можно сделать с ускорением.
Код:
|
void main(void)
{
char cnt1 = 0;
char cnt2 = 0;
...
begin:
if((!kn_plus)&&(kn_TX)) {
if ( (cnt1 == 0) || (cnt1 › 20) ) {
ph++;
process();
}
if ( cnt1 ‹ 90) cnt1++;
}
else cnt1 = 0;
delay_ms(100 - cnt1);
goto begin; |
Для двух кнопок правильнее описать функцию max(cnt1, cnt2) и её уже ставить в качестве аргумента для delay_ms().
|
Спасибо, буду экспериментировать.
|
|
|
|
Ваши права в разделе
|
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения
HTML код Выкл.
|
|
|
Часовой пояс GMT +4, время: 20:18.
|
|