roboforum.ru

Технический форум по робототехнике.
Текущее время: 02 дек 2024, 20:13

Часовой пояс: UTC + 4 часа




Начать новую тему Ответить на тему  [ Сообщений: 5 ] 
Автор Сообщение
 Заголовок сообщения: как измерить длину импульсов?
СообщениеДобавлено: 09 янв 2011, 18:10 
Не в сети

Зарегистрирован: 13 июл 2009, 14:18
Сообщения: 28
Откуда: Барнаул
прог. языки: C/C++
Есть 2х канальная радиоаппаратура, на выходе приемника импульсы для управления сервами или регуляторами скорости.
Задача стоит в том чтобы измерить длину управляющих импульсов и интерпретировать сигналы "газ" "поворот" в сигналы для танкового привода.

Вот кусок кода для ATmega8 (кварц 16МГц)
Прерывания настроены на любое изменение состояния порта
подтягивающие резисторы на порт D включены
Код:
interrupt [EXT_INT0] void ext_int0_isr(void)
{
// Place your code here
if (flag1==0) {TCNT0=0x00;
               flag1=1;
              }
else  {flag1=0;
       move1=TCNT0;   
      };

 
}

// External Interrupt 1 service routine
interrupt [EXT_INT1] void ext_int1_isr(void)
{
// Place your code here
if (flag2==0) {TCNT0=0x00;
               flag2=1;
              }
else  {flag2=0;
       move2=TCNT0;   
      };

переменный move1 и move2 хранят длину импульсов с 2х каналов.
НО!
Программа работает но считается только длина импульса на ноге "INT0".
Считает и импульс на ноге "INT1", если отключить прерывание на INT0 и оставить только INT1.
То-есть можно сделать вывод, что импульсы начинаются одновременно.

Если пытаться "поймать" импульс в основном цыкле программы, отключив внешние прерывания
Код:
while(flag1==0){ if(PORTD.2==1){TCNT0=0;
                                        flag1=1;
                                       };
                       }; 
                     
         while(flag1==1){ if(PORTD.2==0){move1=TCNT0;
                                        flag1=0;
                                       };
                       };               


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


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: как измерить длину импульсов?
СообщениеДобавлено: 09 янв 2011, 19:04 
Не в сети
отсылающий читать курс
Аватара пользователя

Зарегистрирован: 06 ноя 2005, 04:18
Сообщения: 14195
Откуда: Москва
Если у вас 2 сигнала то используйте 2 ноги внешних прерываний но настраивайте прерывание каждый раз на то событие которое ожидаете.

_________________
Читайте !


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: как измерить длину импульсов?
СообщениеДобавлено: 09 янв 2011, 20:13 
Не в сети
Аватара пользователя

Зарегистрирован: 01 июл 2009, 08:59
Сообщения: 2254
Откуда: Екатеринбург
прог. языки: асемблер AVR
Я на Сях не пишу, поэтому мой ответ будет скорее общим, чем частным. Внешние прерывания работают оба - это точно. Если они произойдут одновременно, то нулевое прерывание будет обработано первым. Но флаг срабатывания первого прерывания сбрасывает только возврат из подпрограммы прерываний. Так что даже в этом случае прерывания должны обработаться оба. В симуляторе пробовали имитировать?


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: как измерить длину импульсов?
СообщениеДобавлено: 09 янв 2011, 22:30 
Не в сети
Аватара пользователя

Зарегистрирован: 15 сен 2007, 13:03
Сообщения: 6338
Откуда: Красноярск
прог. языки: ASM(МК), C(PC)
ФИО: Гагарский Андрей Александрович
фронт смотреть одним прерыванием, спады - двумя.. по фронту пускать таймер, и переключать режимы прерываний, по спаду - смотреть таймер и возвращать режимы

_________________
«Как сердцу выразить себя? … Мысль изреченная есть ложь!»
В этом мире меня подводит доброта и порядочность...
"двое смотрят в лужу, один видит лужу, другой отраженные в ней звезды"


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: как измерить длину импульсов?
СообщениеДобавлено: 10 янв 2011, 14:26 
Не в сети

Зарегистрирован: 13 июл 2009, 14:18
Сообщения: 28
Откуда: Барнаул
прог. языки: C/C++
Все разобрался, заработало.
В протеусе пробовал но он вообще на прерывания не реагирует(может версия карявая...)
На счет того что должны работать влюбом случае оба - да, но импульс тогда измерится не правильно.
сделал вот так
Код:
interrupt [EXT_INT0] void ext_int0_isr(void)
{
// Place your code here
if (flag1==0) {TCNT0=0x00;
               flag1=1;
              }
else  {flag1=0;
       move1=TCNT0;
       GICR=0x80;
      };

 
}

// External Interrupt 1 service routine
interrupt [EXT_INT1] void ext_int1_isr(void)
{
// Place your code here
if (flag2==0) {TCNT0=0x00;
               flag2=1;
              }
else  {flag2=0;
       move2=TCNT0;
       GICR=0x40;
      };

}

то-есть внутри первого прерывания отключаем разрешение на его срабатывание, а во втором после выполнения разрешаем, в итоге они поочереди выполняются несмотря на одновременное начало импульсов


Вернуться к началу
 Профиль  
 
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 5 ] 

Часовой пояс: UTC + 4 часа


Кто сейчас на конференции

Сейчас этот форум просматривают: Bing [Bot] и гости: 7


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

Найти:
Перейти:  
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group
Русская поддержка phpBB
phpBB SEO