Реклама на сайте English version  DatasheetsDatasheets

KAZUS.RU - Электронный портал. Принципиальные схемы, Datasheets, Форум по электронике

Новости электроники Новости Литература, электронные книги Литература Документация, даташиты Документация Поиск даташитов (datasheets)Поиск PDF
  От производителей
Новости поставщиков
В мире электроники

  Сборник статей
Электронные книги
FAQ по электронике

  Datasheets
Поиск SMD
Он-лайн справочник

Принципиальные схемы Схемы Каталоги программ, сайтов Каталоги Общение, форум Общение Ваш аккаунтАккаунт
  Каталог схем
Избранные схемы
FAQ по электронике
  Программы
Каталог сайтов
Производители электроники
  Форумы по электронике
Помощь проекту

Микроконтроллеры, АЦП, память и т.д Темы касающиеся микроконтроллеров разных производителей, памяти, АЦП/ЦАП, периферийных модулей...

 
Опции темы
Непрочитано 29.07.2010, 01:16  
sdsrem
Почётный гражданин KAZUS.RU
 
Аватар для sdsrem
 
Регистрация: 08.09.2009
Сообщений: 1,139
Сказал спасибо: 138
Сказали Спасибо 366 раз(а) в 230 сообщении(ях)
sdsrem на пути к лучшему
По умолчанию Re: Как увеличивать скорость пересчёта

Godzilla82


А у вас какой компилятор, ато у меня выдаёт ошибки, я пользую CVAVR.
Реклама:
sdsrem вне форума  
Непрочитано 29.07.2010, 09:28  
sdsrem
Почётный гражданин KAZUS.RU
 
Аватар для sdsrem
 
Регистрация: 08.09.2009
Сообщений: 1,139
Сказал спасибо: 138
Сказали Спасибо 366 раз(а) в 230 сообщении(ях)
sdsrem на пути к лучшему
По умолчанию 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_init1))
                           
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_init1))
                           
delay_init--; 
                               
delay_button(delay_init); }}} 

работает как надо.
sdsrem вне форума  
Непрочитано 29.07.2010, 13:38  
Godzilla82
Почётный гражданин KAZUS.RU
 
Регистрация: 29.10.2006
Сообщений: 1,446
Сказал спасибо: 99
Сказали Спасибо 317 раз(а) в 233 сообщении(ях)
Godzilla82 на пути к лучшему
Сообщение Re: Как увеличивать скорость пересчёта

Сообщение от sdsrem Посмотреть сообщение
Godzilla82
А у вас какой компилятор, ато у меня выдаёт ошибки, я пользую CVAVR.
Ну и я вам написал код для CVAVR.

Логика работы простая. Как только вы нажимаете кнопку, происходит одиночное срабатывание. Если кнопка удерживается более 2 секунд, то происходит повтор действий каждые 100 мс. Если нужно, чтобы действия выполнялись через меньший промежуток, измените delay_ms(100) на delay_ms(20), также не забудьте при этом поменять 20 на 100.

А что за ошибки-то? Приведите полный листинг программы. Возможно, нет строчки #include ‹delay.h›.

Вместо PINA.1 и PINA.2 - надо подставлять реально используемые выводы, к которым подключается кнопка (замыкающаяся на землю при нажатии).
Godzilla82 вне форума  
Непрочитано 30.07.2010, 19:58  
sdsrem
Почётный гражданин KAZUS.RU
 
Аватар для sdsrem
 
Регистрация: 08.09.2009
Сообщений: 1,139
Сказал спасибо: 138
Сказали Спасибо 366 раз(а) в 230 сообщении(ях)
sdsrem на пути к лучшему
По умолчанию Re: Как увеличивать скорость пересчёта

Сообщение от Godzilla82 Посмотреть сообщение
Ну и я вам написал код для CVAVR.

Логика работы простая. Как только вы нажимаете кнопку, происходит одиночное срабатывание. Если кнопка удерживается более 2 секунд, то происходит повтор действий каждые 100 мс. Если нужно, чтобы действия выполнялись через меньший промежуток, измените delay_ms(100) на delay_ms(20), также не забудьте при этом поменять 20 на 100.

А что за ошибки-то? Приведите полный листинг программы. Возможно, нет строчки #include ‹delay.h›.

Вместо PINA.1 и PINA.2 - надо подставлять реально используемые выводы, к которым подключается кнопка (замыкающаяся на землю при нажатии).
Вот как выглядит ошибка
Миниатюры:
Нажмите на изображение для увеличения
Название: 123.jpg
Просмотров: 96
Размер:	46.8 Кб
ID:	10348  
sdsrem вне форума  
Непрочитано 30.07.2010, 21:06  
Godzilla82
Почётный гражданин KAZUS.RU
 
Регистрация: 29.10.2006
Сообщений: 1,446
Сказал спасибо: 99
Сказали Спасибо 317 раз(а) в 233 сообщении(ях)
Godzilla82 на пути к лучшему
Сообщение Re: Как увеличивать скорость пересчёта

Сообщение от sdsrem Посмотреть сообщение
Вот как выглядит ошибка
Вообще-то в окошке снизу (Messages) пишется осмысленный текст, точно указывающий на характер ошибки.

Цикл while(1) не нужен. Его заменяет begin: ... goto begin. У вас лишняя скобка.

delay_ms(100) должно быть в коде 1 раз.

ph++ - это не функция, это переменная, то есть скобки не нужны. Эта запись означает увеличение значения переменной ph на 1. Она должна быть описана.

По вашему алгоритму помимо этого нужно ещё выполнить функцию set_pch().

Последний раз редактировалось Godzilla82; 30.07.2010 в 21:28.
Godzilla82 вне форума  
Непрочитано 30.07.2010, 22:15  
sdsrem
Почётный гражданин KAZUS.RU
 
Аватар для sdsrem
 
Регистрация: 08.09.2009
Сообщений: 1,139
Сказал спасибо: 138
Сказали Спасибо 366 раз(а) в 230 сообщении(ях)
sdsrem на пути к лучшему
По умолчанию Re: Как увеличивать скорость пересчёта

Сообщение от Godzilla82 Посмотреть сообщение
Вообще-то в окошке снизу (Messages) пишется осмысленный текст, точно указывающий на характер ошибки.

Цикл while(1) не нужен. Его заменяет begin: ... goto begin. У вас лишняя скобка.

delay_ms(100) должно быть в коде 1 раз.

ph++ - это не функция, это переменная, то есть скобки не нужны. Эта запись означает увеличение значения переменной ph на 1. Она должна быть описана.

По вашему алгоритму помимо этого нужно ещё выполнить функцию set_pch().
Работает но не ускоряется, просто переключает, но работает в цыкле, ежели прописать в майн то ругается на (cnt2) типа описан но не используется.
sdsrem вне форума  
Непрочитано 31.07.2010, 03:59  
Godzilla82
Почётный гражданин KAZUS.RU
 
Регистрация: 29.10.2006
Сообщений: 1,446
Сказал спасибо: 99
Сказали Спасибо 317 раз(а) в 233 сообщении(ях)
Godzilla82 на пути к лучшему
Сообщение 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.
Godzilla82 вне форума  
Непрочитано 31.07.2010, 04:32  
sdsrem
Почётный гражданин KAZUS.RU
 
Аватар для sdsrem
 
Регистрация: 08.09.2009
Сообщений: 1,139
Сказал спасибо: 138
Сказали Спасибо 366 раз(а) в 230 сообщении(ях)
sdsrem на пути к лучшему
По умолчанию Re: Как увеличивать скорость пересчёта

Сообщение от Godzilla82 Посмотреть сообщение
О каком ускорении идёт речь? Одиночное нажатие - одиночное срабатывание. Долгое нажатие (более 2 сек.) - будет каждые 100 мс выполнять действия, пока нажата кнопка. То есть, за секунду значение переменной увеличится на 10.

Мы видимо друг друга не поняли, условие такое; ежели нажать один раз значение меняется на еденицу, ежели удерживать кнопку значение должно менятся на еденицу но при этом переключение должно ускорятся, первые десять переключений за 100 микросекунд вторые десять за 99 микросекунд третьи десять за 98 микросекунд ну и так далее пока переключение не станет 1 микросекунда.
Это для того чтоб долго не ждать когда наматает определённое значение, а медленно в начале чтоб легче было подогнать то значение которое нужно.
Но ваш код тоже интересный, только без коментов мне не совсем понятен, я ещё с програмированием на вы, может прокоментируете как он работает?
sdsrem вне форума  
Непрочитано 31.07.2010, 06:19  
Godzilla82
Почётный гражданин KAZUS.RU
 
Регистрация: 29.10.2006
Сообщений: 1,446
Сказал спасибо: 99
Сказали Спасибо 317 раз(а) в 233 сообщении(ях)
Godzilla82 на пути к лучшему
Сообщение 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.
Godzilla82 вне форума  
Непрочитано 31.07.2010, 08:00  
sdsrem
Почётный гражданин KAZUS.RU
 
Аватар для sdsrem
 
Регистрация: 08.09.2009
Сообщений: 1,139
Сказал спасибо: 138
Сказали Спасибо 366 раз(а) в 230 сообщении(ях)
sdsrem на пути к лучшему
По умолчанию 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().
Спасибо, буду экспериментировать.
sdsrem вне форума  
 

Закладки
Опции темы

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.

Быстрый переход

Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Как понизить ТВ частоты???? retro-person Автоматика и аппаратура связи 5 02.08.2010 16:42
MICRF505 и как его едят aramiha Микроконтроллеры, АЦП, память и т.д 4 18.05.2010 16:34
Генератор частоты на Mega - как? code-by Микроконтроллеры, АЦП, память и т.д 9 10.11.2009 15:02
Генератор розового шума как средство от бессоницы Dizartius Производственное оборудование 3 03.10.2009 13:20


Часовой пояс GMT +4, время: 20:18.


Powered by vBulletin® Version 3.8.4
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd. Перевод: zCarot