Есть новая версия, но схема сильно изменилась, практически это новая версия оборудования несовместимая по железу с первым вариантом. Соответственно и прошивка не подойдёт. К сожалению пока не могу выложить код полностью. Есть ли желание у кого-нибудь паять схему для закрытых исходников  ?  
Архитектура программы довольно простая - приведённый кусок кода полностью описывает поведение прошивки для выстрела.
Код:
#include "fire.h"
void setup_fire(void) {
   
   StateFire = 0;
   ots_cnt = 0; 
   make_bullet();   // подготовить пулю по cfg параметрам
}
// Логическое поведения оборудования для выстрелов  100Гц
void LogicFire(void) 
{
   switch (StateFire)
   {
      case WantPula: 
      // флаг BtFire кнопка Огонь отфильтованная от дребезга
         if (( btFire > 0) || (btMIC > 0 ))  { 
            StateFire = NeedPula;   // запрос на выстрел обработан
         
         }
      break;
      case NeedPula: 
      // Проверить наличие патронов в обойме и состояние жизни игрока
       if ((0 == ammo_clip_in_game)||(1 == flOutGame))   {
           // Вне игры или нет патронов 
         StateFire = OneFire;       // отпусти курок :)
         need_sound(SND_OSECHKA);    
      } else { 
         // есть патроны и в игре
         StateFire = OutPula; 
         // между этими состояниями можно вставить 
         // паузу накачки лазера, определить тип выстрела 
         // (дольше держим сильнее выстрел и тд)
         // или ещё какое нибудь расширение  игры
      };
      break;
       case OutPula: 
         // вычесть патрон из магазина
         ammo_clip_in_game--;
      
         // запуск пули только здесь
         // и сюда можем попасть только с  0 == flFire
         // биты пули выгружаются 
         // из remote_tx_data с мл разрядов
         remote_tx_data = bullet_data;
         // инициировать ИК выстрел 
         // передача в прерывании
         remote_tx_state = TX_NEED;
         flFire = 1;          
//         need_sound(SND_FIRE);   // запускаем звук 
// Звук и пуля могут мешать друг другу flFire = 1; 
// на время выстрела работу со звуком останавливать
// неменять состояние подключения вЫходов таймеров
         StateFire = EndPula;    
      break;
       case EndPula: 
      
      // Пуля должна улететь полностью, 
      // чтобы начать следующую ИК посылку
      if (1 == flFire) { 
         
         StateFire = EndPula;   
      } else  {    
         // Пуля улетела, проверяем нет ли поражений
            need_sound(SND_FIRE);      // запускаем звук пули
         if (1 == flEnemyFire) {      // Да Получена Чужая пуля 
         
         //  отработать паузу невозможности стрельбы
            shok_time_cnt = 0;
            StateFire = EnemyFireShok;
         } else {
         //    Пуля улетела, и нет поражений  
         //    отрабатываем темп стрельбы
            temp_fire_cnt = 0;
            StateFire = TempFire;
         }
      }
      break;
   case TempFire: 
            
      temp_fire_cnt++;
      if (temp_fire_cnt > temp_fire)
      {   // пауза кончилась, определяем режим стрельбы
         // автомат, полуавтомат, кнопка внешняя
         if ( rifle == RIFLE_AVTO){
            StateFire = SequFire;
         } else {
            
         }
      }
      break;
   case EnemyFireShok: 
         shok_time_cnt++;
      if (shok_time_cnt > shok_time) {
                           // пауза кончилась
            flEnemyFire = 0;    // сбросить флаг
         //  Нужно обязательно отпустить курок, после шока
            StateFire = OneFire;       
      }
      break;
   case OneFire: 
      if ( btFire > 0 ) { 
          StateFire = OneFire;    // Нужно обязательно отпустить курок
      } else { 
          StateFire = WantPula;    // Ожидание
          btMIC = 0;    // сбрасываем флаг микрофона 
      };
          ots_cnt = 0;          // сбросить счётчик отсечки
      break;
   case SequFire:
      if ( btFire > 0 ) { 
         if (ots_cnt > otsechka) {    // отсечка кончилась 
                 
               StateFire = OneFire; 
         } else  {   
               StateFire = NeedPula;
               ots_cnt ++;
#if DEBUG_TX == 1    
            putchar_(' '); // в начало строки
            putchar_('o');putchar_(ots_cnt);putchar_(' ');
#endif 
         };
      } else { 
         StateFire = WantPula;       // отпустили курок
         ots_cnt = 0;              // сбросить счётчик отсечки
         btMIC = 0;                // сбрасываем флаг микрофона 
      };
      break;
   }; // case end
} // конец автомата выстрела