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

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

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

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

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

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

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

 
Опции темы
Непрочитано 04.08.2010, 13:07  
kison
Почётный гражданин KAZUS.RU
 
Регистрация: 13.12.2004
Сообщений: 3,172
Сказал спасибо: 11
Сказали Спасибо 692 раз(а) в 504 сообщении(ях)
kison на пути к лучшему
По умолчанию Re: Увеличение скорости счета импульсов на АТ90S2313

Сообщение от E_C_C Посмотреть сообщение
А что даст прерывание по обеим линиям ? все равно надо читать соседнюю линию.
Удвоение разрешения энкодера. Если у Вас с одной линией затык, то это Вам не нужно
Ускоряйте обработчики.
Например ваш обработчик от энкодера:
Код:
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;    
 }
В общем тут и без ассемблера есть где развернуться.
Реклама:
kison вне форума  
Сказали "Спасибо" kison
E_C_C (04.08.2010)
Непрочитано 04.08.2010, 13:12  
nml
Супер-модератор
 
Аватар для nml
 
Регистрация: 13.03.2004
Адрес: Minsk
Сообщений: 2,378
Сказал спасибо: 1,955
Сказали Спасибо 1,328 раз(а) в 578 сообщении(ях)
nml на пути к лучшему
По умолчанию Re: Увеличение скорости счета импульсов на АТ90S2313

Сообщение от E_C_C Посмотреть сообщение
Я думал за такой способ, но нужно еще знать направление счета, а оно определяется фазой сигнала.
Было бы желание, а извернуться можно всегда.

Вот например - а что если завести одну фазу на T0 и на INT0, вторую - соответственно на T1 и INT1

Два таймера настроить на счет импульсов с T0 / T1
Прерывания INT настроить на спад. И в прерываниях INT разрешать-запрещать счет таймеров? В принципе, это та же логическая схема на входе (инвертор и две штуки 2И), но паять рассыпуху не надо будет.

В результате один таймер будет считать в минус, один - в плюс. А в программе вы уже будете просто вычитать первый из второго.
__________________
[ жизнь приятна и красива, если выпить литр пива ]
nml вне форума  
Непрочитано 04.08.2010, 13:36  
picavr
Почётный гражданин KAZUS.RU
 
Аватар для picavr
 
Регистрация: 07.10.2007
Адрес: Луганск
Сообщений: 1,816
Сказал спасибо: 13
Сказали Спасибо 399 раз(а) в 214 сообщении(ях)
picavr на пути к лучшему
По умолчанию 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" заказы в Китай компонентов/изготовление: плат/ЖКИ/мембраных клавиатур/имп трансформаторов
picavr вне форума  
Сказали "Спасибо" picavr
E_C_C (04.08.2010)
Непрочитано 04.08.2010, 13:45  
kison
Почётный гражданин KAZUS.RU
 
Регистрация: 13.12.2004
Сообщений: 3,172
Сказал спасибо: 11
Сказали Спасибо 692 раз(а) в 504 сообщении(ях)
kison на пути к лучшему
По умолчанию Re: Увеличение скорости счета импульсов на АТ90S2313

Сообщение от picavr Посмотреть сообщение
И ловить короткие помехи по INTам.
Если там будут помехи, то опрос по таймеру также не годится Кроме того независимо есть ли сигнал от энкодера загрузка процессора будет как при максимальной частоте этих импульсов. Опрос по таймеру - жалкий компромисс и хорош тогда, когда по прерываниям сделать не получается, например ножки уже заняты или есть для внешних прерываний более приоритетная задача.

Сообщение от picavr Посмотреть сообщение
Это PIC на 16 мгц успевал обрабатывать а у вас в 4 раза производительнее.
С чего бы тинька на 4-х мегагерцах стала в 4 раза быстрее PIC16 на 16-ти? Скорее в два раза медленней.
kison вне форума  
Непрочитано 04.08.2010, 14:17  
E_C_C
Почётный гражданин KAZUS.RU
 
Аватар для E_C_C
 
Регистрация: 08.05.2008
Адрес: регион 63
Сообщений: 1,831
Сказал спасибо: 742
Сказали Спасибо 683 раз(а) в 386 сообщении(ях)
E_C_C на пути к лучшему
По умолчанию Re: Увеличение скорости счета импульсов на АТ90S2313

удалил -разобрался
__________________
Да здравствует Разум,да сгинет Маразм!

Последний раз редактировалось E_C_C; 04.08.2010 в 17:45.
E_C_C вне форума  
Непрочитано 04.08.2010, 14:24  
E97
Почётный гражданин KAZUS.RU
 
Регистрация: 08.01.2008
Сообщений: 1,143
Сказал спасибо: 379
Сказали Спасибо 430 раз(а) в 274 сообщении(ях)
E97 на пути к лучшему
По умолчанию Re: Увеличение скорости счета импульсов на АТ90S2313

Сообщение от nml Посмотреть сообщение
Вот например - а что если завести одну фазу на T0 и на INT0, вторую - соответственно на T1 и INT1
Да чото типа такого.

Или если у вас будет возможность поставить HLC2705 то задача существенно упростится достаточно подвести выход direction на INT0 а tach на T0. По внешнему прерыванию отслеживать направление а по таймеру кол. импульсов.
E97 вне форума  
Непрочитано 04.08.2010, 15:05  
nml
Супер-модератор
 
Аватар для nml
 
Регистрация: 13.03.2004
Адрес: Minsk
Сообщений: 2,378
Сказал спасибо: 1,955
Сказали Спасибо 1,328 раз(а) в 578 сообщении(ях)
nml на пути к лучшему
По умолчанию Re: Увеличение скорости счета импульсов на АТ90S2313

Сообщение от E97 Посмотреть сообщение
Или если у вас будет возможность поставить HLC2705 то задача существенно упростится
Для данного случая - упростится, но не настолько, чтобы оправдать усложнение схемы (imho). Если возможно чисто программное решение - то надо программно и делать.
__________________
[ жизнь приятна и красива, если выпить литр пива ]
nml вне форума  
Непрочитано 04.08.2010, 16:40  
picavr
Почётный гражданин KAZUS.RU
 
Аватар для picavr
 
Регистрация: 07.10.2007
Адрес: Луганск
Сообщений: 1,816
Сказал спасибо: 13
Сказали Спасибо 399 раз(а) в 214 сообщении(ях)
picavr на пути к лучшему
По умолчанию 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.
picavr вне форума  
Непрочитано 06.08.2010, 07:33  
Panda_Y2k
Временная регистрация
 
Аватар для Panda_Y2k
 
Регистрация: 30.08.2005
Адрес: Ротовска йобласть
Сообщений: 84
Сказал спасибо: 2
Сказали Спасибо 3 раз(а) в 2 сообщении(ях)
Panda_Y2k на пути к лучшему
По умолчанию 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.
Panda_Y2k вне форума  
Непрочитано 06.08.2010, 12:59  
E_C_C
Почётный гражданин KAZUS.RU
 
Аватар для E_C_C
 
Регистрация: 08.05.2008
Адрес: регион 63
Сообщений: 1,831
Сказал спасибо: 742
Сказали Спасибо 683 раз(а) в 386 сообщении(ях)
E_C_C на пути к лучшему
По умолчанию Re: Увеличение скорости счета импульсов на АТ90S2313

Сообщение от Panda_Y2k Посмотреть сообщение
Почему в прерывании от таймера не запрещаете прерывания?
Чтобы не произошел пропуск импульса, индикация в данном случае вторична.

Сообщение от Panda_Y2k Посмотреть сообщение
что это за устройство?
Датчик станка с чпу?
Датчик ВЕ 178.
С одной стороны это попытка восстановления стенда ТНВД,там надо считать обороты и показывать скорость врашения.
Попутно возникла мысль сделать эл счетчик для намоточного станка.

Вот в качестве счетчика для намотки все может работать там скорость вращения низкая, а для ТНВД пока нет.

Сообщение от Panda_Y2k Посмотреть сообщение
А как у вас там все замыкается? не вижу подтяжки на PD3
в реальном устройстве оптронная развязка по входам, я не стал городить ее в протеусе.

Пока пробую переделать проект на ассемблере, результат выложу .
__________________
Да здравствует Разум,да сгинет Маразм!
E_C_C вне форума  
 

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

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

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

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


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


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