www.open-tager.ru

открытый лазертаг форум
Текущее время: 25 апр 2024, 19:35

Часовой пояс: UTC + 3 часа [ Летнее время ]


Реклама

Правила форума


В разделе запрещены - обсуждение оборудования не поддерживающего открытых протоколов, реклама и ссылки на готовые продукты лазертага, обсуждение политики производителей и самих производителей. Виден всем.



Начать новую тему Ответить на тему  [ Сообщений: 62 ]  На страницу Пред.  1, 2, 3, 4, 5, 6, 7  След.
Автор Сообщение
СообщениеДобавлено: 08 фев 2013, 09:25 
Не в сети
Аксакал форума
Аватар пользователя

Зарегистрирован: 15 окт 2012, 12:24
Сообщений: 1246
разговор был о Д классе в принципе насколько я понял


Вернуться наверх
 Профиль  
 
СообщениеДобавлено: 08 фев 2013, 10:34 
Не в сети
Местный

Зарегистрирован: 13 июл 2011, 17:05
Сообщений: 475
Откуда: Perm
KEROL писал(а):
Бррр...
1. Использовать ШИМ для передачи не тока можно, но и нужно. Снижается нагрузка на контроллер, проще уходить в прерывания по приему "пули". НО необходим таймер для подсчета длины передаваемой пачки (2400, 1200, 600).
Вопрос: А позволяет ли контроллер точно устанавливать частоту 56К? Или это не важно? Мелкие пики не позволяют точно размахнуться по частоте, разрядность не та...(
для подсчёта длинны подойдет и обычный таймер, который юзается для общих нужд (ведь есть такой, наверняка, т.к. скорострельность как-то ведь мерять надо). а вот надо-ли его юзать? т.к. всё одно на время выстрела звук лучше не играть (питанию легче), то на 20мс можно и паузу сделать - на приём не повлияет, а лаг звука будет незаметным.


Вернуться наверх
 Профиль  
 
СообщениеДобавлено: 08 фев 2013, 10:40 
Не в сети
Местный

Зарегистрирован: 13 июл 2011, 17:05
Сообщений: 475
Откуда: Perm
по поводу точности передаваемых/принимаемых периодов - viewtopic.php?t=1868&p=17506#p17506


Вернуться наверх
 Профиль  
 
СообщениеДобавлено: 08 фев 2013, 12:04 
Не в сети
Аксакал форума
Аватар пользователя

Зарегистрирован: 12 авг 2011, 16:55
Сообщений: 7514
Откуда: Барнаул, Алтайский край (не путать с республикой Алтай) :-)
mail_robot писал(а):
разговор был о Д классе в принципе насколько я понял

Наколько осведомлен - D класс это и есть мостовая схема (не обязательно ШИМ-ом должна управляться).
Может ошибаюсь - поправьте.

_________________
Ваше оружие становиться значительно эффективней, если его снять с предохранителя!


Вернуться наверх
 Профиль  
 
СообщениеДобавлено: 09 фев 2013, 06:49 
Не в сети
Новосел
Аватар пользователя

Зарегистрирован: 07 янв 2013, 17:48
Сообщений: 68
Так, с ШИМом для несущей определились. Алгоритм ясен.
Теперь ждемс от Пингвина описание алгоритма приема (хотя мне алгоритм уже понятен, но в тему добавь, плиз).
Только обязательно с описание прерываний(всех) и их приоритетов.

По звуку вроде тоже определились: ШИМ или SPI в зависимости от железа...


Вернуться наверх
 Профиль  
 
СообщениеДобавлено: 09 фев 2013, 13:52 
Не в сети
Аксакал форума
Аватар пользователя

Зарегистрирован: 12 авг 2011, 16:55
Сообщений: 7514
Откуда: Барнаул, Алтайский край (не путать с республикой Алтай) :-)
KEROL писал(а):
Так, с ШИМом для несущей определились. Алгоритм ясен.
Теперь ждемс от Пингвина описание алгоритма приема (хотя мне алгоритм уже понятен, но в тему добавь, плиз).
Только обязательно с описание прерываний(всех) и их приоритетов.

По звуку вроде тоже определились: ШИМ или SPI в зависимости от железа...

Интересный расклад! :shock:
Почему это "ждемс от Пингвина", да ещё "с описанием"? :?
Оно у меня есть?! :?
Я ничего не обещал и обещать не могу, вроде совместно обсуждаем и делимся идеями.
Будет время - займусь, результаты выложу.
А пока для меня это не приоритет, пока и так всё работает.

_________________
Ваше оружие становиться значительно эффективней, если его снять с предохранителя!


Вернуться наверх
 Профиль  
 
СообщениеДобавлено: 09 фев 2013, 18:03 
Не в сети
Новосел
Аватар пользователя

Зарегистрирован: 07 янв 2013, 17:48
Сообщений: 68
Пингвин, не скромничай, выкладывай свой алгоритм, у тебя он хоть какой-то есть... вот его и обсудим... добавим, убавим, исправим, дополним...

Как я тебя понял у тебя прием осуществляется так:
0. Ждемс прерывание... елаем все остальные вещи...
1. Уходим по спаду от ТСОП в прерывание...
2. В прерывании врубаем счетчик, включаем прерывание подъему...
3. Ждемс прерывание... делаем все остальные вещи...
4. Уходим по подъему от ТСОП в прерывание...
5. В прерывании включаем прерывание по спаду, "проверяем значение счетчика"... обнуляем его и включаем его (счетчик)...

В "проверяем значение счетчика":
0. Значение = 2400, 1200, 600 +-10%???
ДА - заполняем биты приема... 2 или 3 шт плюс Хидер (3-й бит проверка, как у ЛВ)
или, если пришла "пауза"=600, например, где-нить фиксируем, что пришла пауза...
НЕТ - обнуляем биты приема, отправляем звук "Пули летят над головой"
1. Биты заполнены?
ДА - анализ полного пакета, соответствующие действия...
НЕТ - уходим из прерывания для приема следущего бита/паузы...


Вернуться наверх
 Профиль  
 
СообщениеДобавлено: 09 фев 2013, 18:34 
Не в сети
Аксакал форума
Аватар пользователя

Зарегистрирован: 12 авг 2011, 16:55
Сообщений: 7514
Откуда: Барнаул, Алтайский край (не путать с республикой Алтай) :-)
KEROL писал(а):
Пингвин, не скромничай, выкладывай свой алгоритм, у тебя он хоть какой-то есть... вот его и обсудим... добавим, убавим, исправим, дополним...

Как я тебя понял у тебя прием осуществляется так:
0. Ждемс прерывание... елаем все остальные вещи...
1. Уходим по спаду от ТСОП в прерывание...
2. В прерывании врубаем счетчик, включаем прерывание подъему...
3. Ждемс прерывание... делаем все остальные вещи...
4. Уходим по подъему от ТСОП в прерывание...
5. В прерывании включаем прерывание по спаду, "проверяем значение счетчика"... обнуляем его и включаем его (счетчик)...

В "проверяем значение счетчика":
0. Значение = 2400, 1200, 600 +-10%???
ДА - заполняем биты приема... 2 или 3 шт плюс Хидер (3-й бит проверка, как у ЛВ)
или, если пришла "пауза"=600, например, где-нить фиксируем, что пришла пауза...
НЕТ - обнуляем биты приема, отправляем звук "Пули летят над головой"
1. Биты заполнены?
ДА - анализ полного пакета, соответствующие действия...
НЕТ - уходим из прерывания для приема следущего бита/паузы...


Так я не понял - о каком алгоритме идет речь?
Тот, который в этой ветке обсуждаем - пока не реализованный (во всяком случае я не реализовывал), или тот, который в "Аскете" работает?
Так описывал уже вроде.

Крутиться главный цикл, который проверяет поочерёдно переменные-события.
Все события генерируются прерываниями.
Главный цикл при наступлении какого-либо события выполняет соответствующую функцию - обработчик события.
А в остальном - почти все правильно описали.
Только окончание приема фиксируется по тайм-ауту и в прерываниях функций-обработчиков событий нет, только фиксируется событие - "пакет принят" или "ошибка приема".

На самом деле не так просто все описать, как оказалось! :?
Это же не линейный алгоритм, а событийный автомат получается.
Код куда проще и понятней выглядит. :)
Вот код (извиняюсь за "портянку") - тут события генерируются, давайте обсудим - что не понятно?

Код:
#include "ltag_ascetic.h"
#include "milshot_snd.h"
//#include "joystick_driver.h"
//#include "hitraw.h"
/**************************************************************************************
* Обработчик прерываний таймера 2 (72 КГц)
***************************************************************************************/

ISR(TIMER2_COMP_vect){
timer1++;
volatile uint8_t prt;


prt = TSOP_IN&TSOP_PIN;
if (prt==0) //На ножке ИК-приемника низкий уровень сигнала (пойман сигнал несущей)
   {
      low_level_counter++;//Увеличиваем счетчик длительности низкоуровнего сигнала на ножке ИК-приемника
      if (chit_detected_counter < (IR_ZERO*1000)) chit_detected_counter++;
      if (chit_detected_counter >= (IR_ZERO*1000)) chit_detected=true;

   }
else  //На ножке ИК-приемника высокий уровень сигнала (нет сигнала несущей)
   {
      chit_detected_counter = 0;
      if (chit_detected) chit_detected=false;
      high_level_counter++;///Увеличиваем счетчик длительности высокоуровнего сигнала на ножке ИК-приемника
      if((start_bit_received)&&(high_level_counter > IR_ZERO*8))
      {//Фиксируем окончание приема по таймауту
         start_bit_received   = false;    //отменяем прием
         rx_event = RX_COMPLETE;         //Генерим событие "принят пакет"      
      }


   }
if (ir_transmitter_on==true)
   {//Если передача разрешена

      if (ir_pulse_counter > 0)      //необходимая длительность пачки импульсов
      {                        //ещё не достигнута, "мигаем" дальше
         IR_LED_INVERT;           //необходимая длительность пачки
         ir_pulse_counter--;
      }
      else                     //пачка импульсов была отправлена,
      {
         IR_LED_OFF;         //тушим ИК-диод
         if ( ir_space_counter > 0)   //проверим, выдержан ли промежуток между импульсами
         {                     //нет, промежуток не выдержан

               IR_LED_OFF;   //тушим ИК-диод
               ir_space_counter--;   //уменьшаем обратный счетчик паузы на один "тик"      
         }
         else //Пакет импульсов и промежуток между битами переданы
         {    //нужно формировать следующую пачку (передаваемый бит)


            if (data_packet.data[cursor_position]!=0) //если указатель указывает не на пустую ячейку
            {
               ir_pulse_counter =data_packet.data[cursor_position++] ; //передадим импульс указанной длительностью
               ir_space_counter = IR_SPACE;      //и про паузу не забудем
            }
            else //Все данные переданы (элемент, на который ссылается указатель, равен 0)
            {
               ir_transmitter_on=false; //выключаем передатчик
               FIRE_LED_OFF;
               display_bullets_update_now++;
            }   





         }            
      }




   }
else    {//Если передача запрещена

      }


}



/**************************************************************************************
* Обработчик внещних прерываний вывода INT0 (выход TSOPа)
***************************************************************************************/


ISR(INT0_vect){

if(!(MCUCR&_BV(ISC00)))       //если прерывание вызвано спадом
   {
      MCUCR |=_BV(ISC00); //следующее прерывание будет сгенерировано фронтом
      if (start_bit_received)//Если старт-бит принят, то идет прием пакета
         {
            if((high_level_counter < (IR_SPACE + ERROR_TOLERANCE))&&(high_level_counter > (IR_SPACE - ERROR_TOLERANCE)))//Проверим длительность паузы между битами
            {
               //длительность паузы между импульсами корректна
            }
            else //Длительность паузы между приемом битов не корректна
            {//Фиксируем ошибку приёма
                  start_bit_received   = false;    //отменяем прием
                  bit_in_rx_buff = 0;            //очищаем буфер
                  rx_event = RX_ERROR;         //генерируем событие - "ошибка приёма"
            }


         }      
      low_level_counter = 0;//Обнуляем счетчик длительности низкоуровнего сигнала на ножке ИК-приёмника
      high_level_counter = 0;//Обнуляем счетчик длительности высокоуровнего сигнала на ножке ИК-приёмника
   }
else                   //прерывание вызвано фронтом
   {
      MCUCR &=~_BV(ISC00); //следующее прерывание будет сгенерировано спадом

      if (start_bit_received)//Если старт-бит принят, то идет прием пакета
         {
            if((low_level_counter < (IR_ZERO + ERROR_TOLERANCE))&&(low_level_counter > (IR_ZERO - ERROR_TOLERANCE)))//Проверим, соответствует ли длительность пакета нулевому биту
            {
               set_buffer_bit(bit_in_rx_buff++, false);//Длительность пачки соответствует биту со значением 0, заносим ноль в буфер приема

            }
            else //Нет, это не бит со значением 0
            {
               if((low_level_counter < (IR_ONE + ERROR_TOLERANCE))&&(low_level_counter > (IR_ONE - ERROR_TOLERANCE)))//, может это бит со значением 1?
               {
                     set_buffer_bit(bit_in_rx_buff++, true);//Длительность пачки соответствует биту со значением 1, заносим еденицу в буфер приема      
               }
               else //Это ни единица, ни ноль - это помеха
               {
                  start_bit_received   = false;    //отменяем прием
                  bit_in_rx_buff = 0;            //очищаем буфер
                  rx_event = RX_ERROR;         //генерируем событие - "ошибка приёма"
               }
            }
         }
      else //Старт-бит ещё не принят
      {
         if ((low_level_counter < (IR_START + ERROR_TOLERANCE))&&(low_level_counter > (IR_START - ERROR_TOLERANCE))) //Может это старт-бит?   
         {//Это старт-бит
            bit_in_rx_buff = 0;            //очищаем буфер
            start_bit_received   = true;    //разрешаем прием пакетов (бит)

         }
         else //это не старт-бит, это помеха
         {
            //Игнорируем
         }
      }


      low_level_counter = 0;//Обнуляем счетчик длительности низкоуровнего сигнала на ножке ИК-приёмника
      high_level_counter = 0;//Обнуляем счетчик длительности высокоуровнего сигнала на ножке ИК-приёмника




   }

}








Вот, собственно - и вся реализация приема и передачи пакетов...

_________________
Ваше оружие становиться значительно эффективней, если его снять с предохранителя!


Вернуться наверх
 Профиль  
 
СообщениеДобавлено: 09 фев 2013, 21:09 
Не в сети
Аксакал форума

Зарегистрирован: 29 авг 2011, 11:08
Сообщений: 1849
tommy писал(а):
т.к. всё одно на время выстрела звук лучше не играть (питанию легче), то на 20мс можно и паузу сделать - на приём не повлияет, а лаг звука будет незаметным.


Попробовал отключить усилитель, действительно, ИК дальше ловит, на слабых батареях. Тоже буду включать звук уже после выстрела 8-)

_________________
"За 2 месяца максимум можно чертёж сделать, еще за 3 фундамент." (c) Номернабис


Вернуться наверх
 Профиль  
 
СообщениеДобавлено: 09 фев 2013, 21:15 
Не в сети
Аксакал форума
Аватар пользователя

Зарегистрирован: 12 авг 2011, 16:55
Сообщений: 7514
Откуда: Барнаул, Алтайский край (не путать с республикой Алтай) :-)
LTagKirov писал(а):
tommy писал(а):
т.к. всё одно на время выстрела звук лучше не играть (питанию легче), то на 20мс можно и паузу сделать - на приём не повлияет, а лаг звука будет незаметным.


Попробовал отключить усилитель, действительно, ИК дальше ловит, на слабых батареях. Тоже буду включать звук уже после выстрела 8-)

Либо конденсатор тысячи на три мкФ по питанию.

_________________
Ваше оружие становиться значительно эффективней, если его снять с предохранителя!


Вернуться наверх
 Профиль  
 
Показать сообщения за:  Сортировать по:  
Начать новую тему Ответить на тему  [ Сообщений: 62 ]  На страницу Пред.  1, 2, 3, 4, 5, 6, 7  След.

Часовой пояс: UTC + 3 часа [ Летнее время ]


Кто сейчас на форуме

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 9


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

Найти:
Перейти:  
cron
Powered by phpBB® Forum Software © phpBB Group
Русская поддержка phpBB