Микроконтроллеры, АЦП, память и т.д Темы касающиеся микроконтроллеров разных производителей, памяти, АЦП/ЦАП, периферийных модулей... |
04.08.2010, 13:07
|
|
Почётный гражданин KAZUS.RU
Регистрация: 13.12.2004
Сообщений: 3,172
Сказал спасибо: 11
Сказали Спасибо 692 раз(а) в 504 сообщении(ях)
|
Re: Увеличение скорости счета импульсов на АТ90S2313
Сообщение от E_C_C
|
А что даст прерывание по обеим линиям ? все равно надо читать соседнюю линию.
|
Удвоение разрешения энкодера. Если у Вас с одной линией затык, то это Вам не нужно ![Улыбка](images/smilies/icon_smile.gif)
Ускоряйте обработчики.
Например ваш обработчик от энкодера:
Код:
|
interrupt [EXT_INT0] void ext_int0_isr(void)
//прерывание по фронту, анализируется состояние второго входа
{
#asm("cli")
PORTB.7=1;
if(PIND.3==0)
{
i--;
}
if(PIND.3==1)
{
i++;
}
#asm("sei")
} |
Прерывания запрещать не надо, они и так запрещены.
Вот то же:
Код:
|
interrupt [EXT_INT0] void ext_int0_isr(void)
//прерывание по фронту, анализируется состояние второго входа
{
PORTB.7=1;
if(PIND.3==0)
{
i--;
}
else
{
i++;
}
} |
На несколько тактов будет короче.
В RevriteDig непонятна строка temp=Dc; Видимо должно быть temp=i;
Тогда прерывания нужно запретить только на время считывания этой переменной:
Код:
|
void RevriteDig(long int Dc)
//функция перезаписи индицируемого значения
{
long int temp;
#asm("cli")
temp=i;
#asm("sei")
D[0]=D[1]=D[2]=D[3]=D[4]=0;
while(temp ›= 10000)
{
temp = temp - 10000;
D[0]++;
}
while(temp ›= 1000)
{
temp = temp - 1000;
D[1]++;
}
while(temp ›= 100)
{
temp = temp - 100;
D[2]++;
}
while(temp ›= 10)
{
temp = temp - 10;
D[3]++;
}
while(temp ›= 1)
{
temp = temp - 1;
D[4]++;
}
} |
Вообще неплохо работать не напрямую с образом индикатора, а с локальным массивом и переписывать в D[] уже готовые результаты при запрещенных прерываниях. Так индикатор перестанет "моргать".
Прерывание от таймера стоит сократить. Ну и разблокировать прерывания в нем - небольшое подмаргивание индикатора все же лучше чем пропуски импульсов от энкодера.
Да - вместо задержки в основном цикле лучше считать кол-во прерываний на индикацию. При большой загрузке delay_ms(100); // каждые 100мс обновить индикацию превратятся в куда большую задержку.
Код:
|
interrupt [TIM1_COMP] void timer1_comp_isr(void)
// динамическая индикация
{
static unsigned char PosDig;
#asm("sei")
PORTB =0x00; //гашение всех сегментов
PORTD &= ~((1‹‹0)|(1‹‹1)|(1‹‹4)|(1‹‹5)|(1‹‹6)); // отключение катодов
switch (PosDig) //выбор подключаемого катода
{ case 0: PORTD.6 =1; break;
case 1: PORTD.5 =1; break;
case 2: PORTD.4 =1; break;
case 3: PORTD.1 =1; break;
case 4: PORTD.0 =1; break;
}
PORTB = DigSim[D[PosDig]];
PosDig ++;
if (PosDig ==5) PosDig = 0;
} |
В общем тут и без ассемблера есть где развернуться.
|
|
|
|
04.08.2010, 13:12
|
|
Супер-модератор
Регистрация: 13.03.2004
Адрес: Minsk
Сообщений: 2,378
Сказал спасибо: 1,955
Сказали Спасибо 1,328 раз(а) в 578 сообщении(ях)
|
Re: Увеличение скорости счета импульсов на АТ90S2313
Сообщение от E_C_C
|
Я думал за такой способ, но нужно еще знать направление счета, а оно определяется фазой сигнала.
|
Было бы желание, а извернуться можно всегда.
Вот например - а что если завести одну фазу на T0 и на INT0, вторую - соответственно на T1 и INT1
Два таймера настроить на счет импульсов с T0 / T1
Прерывания INT настроить на спад. И в прерываниях INT разрешать-запрещать счет таймеров? В принципе, это та же логическая схема на входе (инвертор и две штуки 2И), но паять рассыпуху не надо будет.
В результате один таймер будет считать в минус, один - в плюс. А в программе вы уже будете просто вычитать первый из второго.
__________________
[ жизнь приятна и красива, если выпить литр пива ]
|
|
|
|
04.08.2010, 13:36
|
|
Почётный гражданин KAZUS.RU
Регистрация: 07.10.2007
Адрес: Луганск
Сообщений: 1,816
Сказал спасибо: 13
Сказали Спасибо 399 раз(а) в 214 сообщении(ях)
|
Re: Увеличение скорости счета импульсов на АТ90S2313
Сообщение от nml
|
Вот например - а что если завести одну фазу на T0 и на INT0, вторую - соответственно на T1 и INT1
|
И ловить короткие помехи по INTам.
Нет. лучше всё в таймере. скорости AVR хватит на обработку энкодера со скоростью скажем 100 000 импульсов в сек. Если вынести прерывание обработки энкодера по таймеру одному а преоывание индикаци на другой таймер.
Если скорость существенно ниже то и одно прерыание от таймера с успехом справится.
Делал лет 8 назад управление бензоколонками от компутера...
Подсчёт импульсов от 4-х бензоколонок паралельно, по 100 импульсов на литр, сколько там льёт литров в секунду примерно представляете...
Вот по прерыванию 100 микросек это всё и обрабатывалось + успевал обработку УСАРТ - общение с компьютером. Это PIC на 16 мгц успевал обрабатывать а у вас в 4 раза производительнее.
__________________
"picavr(ГАВ)мыло.ру" USB_Analyzer, Digital_Storage_Oscilloscope "picavr.kr1.ru" заказы в Китай компонентов/изготовление: плат/ЖКИ/мембраных клавиатур/имп трансформаторов
|
|
|
|
04.08.2010, 13:45
|
|
Почётный гражданин KAZUS.RU
Регистрация: 13.12.2004
Сообщений: 3,172
Сказал спасибо: 11
Сказали Спасибо 692 раз(а) в 504 сообщении(ях)
|
Re: Увеличение скорости счета импульсов на АТ90S2313
Сообщение от picavr
|
И ловить короткие помехи по INTам.
|
Если там будут помехи, то опрос по таймеру также не годится ![Улыбка](images/smilies/icon_smile.gif) Кроме того независимо есть ли сигнал от энкодера загрузка процессора будет как при максимальной частоте этих импульсов. Опрос по таймеру - жалкий компромисс ![Улыбка](images/smilies/icon_smile.gif) и хорош тогда, когда по прерываниям сделать не получается, например ножки уже заняты или есть для внешних прерываний более приоритетная задача.
Сообщение от picavr
|
Это PIC на 16 мгц успевал обрабатывать а у вас в 4 раза производительнее.
|
С чего бы тинька на 4-х мегагерцах стала в 4 раза быстрее PIC16 на 16-ти? Скорее в два раза медленней.
|
|
|
|
04.08.2010, 14:17
|
|
Почётный гражданин KAZUS.RU
Регистрация: 08.05.2008
Адрес: регион 63
Сообщений: 1,831
Сказал спасибо: 742
Сказали Спасибо 683 раз(а) в 386 сообщении(ях)
|
Re: Увеличение скорости счета импульсов на АТ90S2313
удалил -разобрался
__________________
Да здравствует Разум,да сгинет Маразм!
Последний раз редактировалось E_C_C; 04.08.2010 в 17:45.
|
|
|
|
04.08.2010, 14:24
|
|
Почётный гражданин KAZUS.RU
Регистрация: 08.01.2008
Сообщений: 1,143
Сказал спасибо: 379
Сказали Спасибо 430 раз(а) в 274 сообщении(ях)
|
Re: Увеличение скорости счета импульсов на АТ90S2313
Сообщение от nml
|
Вот например - а что если завести одну фазу на T0 и на INT0, вторую - соответственно на T1 и INT1
|
Да чото типа такого.
Или если у вас будет возможность поставить HLC2705 то задача существенно упростится достаточно подвести выход direction на INT0 а tach на T0. По внешнему прерыванию отслеживать направление а по таймеру кол. импульсов.
|
|
|
|
04.08.2010, 15:05
|
|
Супер-модератор
Регистрация: 13.03.2004
Адрес: Minsk
Сообщений: 2,378
Сказал спасибо: 1,955
Сказали Спасибо 1,328 раз(а) в 578 сообщении(ях)
|
Re: Увеличение скорости счета импульсов на АТ90S2313
Сообщение от E97
|
Или если у вас будет возможность поставить HLC2705 то задача существенно упростится
|
Для данного случая - упростится, но не настолько, чтобы оправдать усложнение схемы (imho). Если возможно чисто программное решение - то надо программно и делать.
__________________
[ жизнь приятна и красива, если выпить литр пива ]
|
|
|
|
04.08.2010, 16:40
|
|
Почётный гражданин KAZUS.RU
Регистрация: 07.10.2007
Адрес: Луганск
Сообщений: 1,816
Сказал спасибо: 13
Сказали Спасибо 399 раз(а) в 214 сообщении(ях)
|
Re: Увеличение скорости счета импульсов на АТ90S2313
Сообщение от E97
|
Или если у вас будет возможность поставить HLC2705 то задача существенно упростится .
|
Да принципиально можно вообще всё сделать на логике.. ТОЛЬКО ЗАЧЕМ усложнять железо, если всё сможет обработать один МК? Для этого МК и применяют что бы железо максимально упростить.... Только нужно мозги приложить... те кто не может мозги, ... прикладывают железо...
Сообщение от kison
|
Если там будут помехи, то опрос по таймеру также не годится
|
обработка по таймеру позволит применить антидребезговые алгоритмы... и всё работает уже лет по 8...
Сообщение от kison
|
Кроме того независимо есть ли сигнал от энкодера загрузка процессора будет как при максимальной частоте этих импульсов.
|
Если грамотно написать прогу, то загрузка на каждый проход по обработке 1 энкодера будет примерно 3-10микросекунд из 100 .. а это 3-10%. Так что не слишком это много, но ничего не пропустит...
Сообщение от kison
|
С чего бы тинька на 4-х мегагерцах стала в 4 раза быстрее PIC16 на 16-ти? Скорее в два раза медленней.
|
тактовая частота ядра получится одинаковая 4 МГЦ в обоих случаях... а дальше как софт напишете.. если обработка только в регистрах.. тогда одинаково.. если в RAM тогда да.. AVR медленнее..
А Тинька2313 до 20мгц бегает с кварцем.
__________________
"picavr(ГАВ)мыло.ру" USB_Analyzer, Digital_Storage_Oscilloscope "picavr.kr1.ru" заказы в Китай компонентов/изготовление: плат/ЖКИ/мембраных клавиатур/имп трансформаторов
Последний раз редактировалось picavr; 04.08.2010 в 16:48.
|
|
|
|
06.08.2010, 07:33
|
|
Временная регистрация
Регистрация: 30.08.2005
Адрес: Ротовска йобласть
Сообщений: 84
Сказал спасибо: 2
Сказали Спасибо 3 раз(а) в 2 сообщении(ях)
|
Re: Увеличение скорости счета импульсов на АТ90S2313
У вас не 500гц, а 5кгц. При даже 4мгц тактовой скорости все равно должно хватать.
Зачем в прерывании выставляете ногу PB7?
Сделайте в прерывании со входа так:
interrupt [EXT_INT0] void ext_int0_isr(void)
//прерывание по фронту, анализируется состояние второго входа
{
#asm("cli")
PORTB.7=1;
if(PIND.3==0) i--
else i++;
#asm("sei")
}
Это немного сократит обработчик.
Почему в прерывании от таймера не запрещаете прерывания? что это за устройство?
Датчик станка с чпу?
А как у вас там все замыкается? не вижу подтяжки на PD3
ЗЫ Похоже недоглядел, уже такую рекомендацию дали
__________________
Не впихуйте невпихуемое!!
Последний раз редактировалось Panda_Y2k; 06.08.2010 в 07:40.
|
|
|
|
06.08.2010, 12:59
|
|
Почётный гражданин KAZUS.RU
Регистрация: 08.05.2008
Адрес: регион 63
Сообщений: 1,831
Сказал спасибо: 742
Сказали Спасибо 683 раз(а) в 386 сообщении(ях)
|
Re: Увеличение скорости счета импульсов на АТ90S2313
Сообщение от Panda_Y2k
|
Почему в прерывании от таймера не запрещаете прерывания?
|
Чтобы не произошел пропуск импульса, индикация в данном случае вторична.
Сообщение от Panda_Y2k
|
что это за устройство?
Датчик станка с чпу?
|
Датчик ВЕ 178.
С одной стороны это попытка восстановления стенда ТНВД,там надо считать обороты и показывать скорость врашения.
Попутно возникла мысль сделать эл счетчик для намоточного станка.
Вот в качестве счетчика для намотки все может работать там скорость вращения низкая, а для ТНВД пока нет.
Сообщение от Panda_Y2k
|
А как у вас там все замыкается? не вижу подтяжки на PD3
|
в реальном устройстве оптронная развязка по входам, я не стал городить ее в протеусе.
Пока пробую переделать проект на ассемблере, результат выложу .
__________________
Да здравствует Разум,да сгинет Маразм!
|
|
|
|
Ваши права в разделе
|
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения
HTML код Выкл.
|
|
|
Часовой пояс GMT +4, время: 00:03.
|
|