www.open-tager.ru
http://www.open-tager.ru/forum/

LTAscet - расширяем функционал прошивки
http://www.open-tager.ru/forum/viewtopic.php?f=5&t=2178
Страница 6 из 6

Автор:  LTagKirov [ 08 ноя 2013, 14:07 ]
Заголовок сообщения:  Re: LTAscet - расширяем функционал прошивки

G-man писал(а):
Допустимо. Более того умная зарядка просто до уровня зарядить побыстрому,


Величину тока решил ограничить программно значениями поменьше, иначе придётся ставить в схему терморезистор прикленный к АКБ, один контроль по "ступенке" уже недостаточен для обеспечения безопастности.

Автор:  Sabbah [ 18 фев 2014, 11:41 ]
Заголовок сообщения:  Re: LTAscet - расширяем функционал прошивки

Pingvin писал(а):
Посмотрел я тут на описание команд - состоят они из двух байт.
Первый байт как раз и указывает на команду, а второй - параметр команды.

Я предлагаю такую структуру
Цитата:

//-----------------------------------------------------

//Определим структуру для хранения полученной по ИК команды

typedef struct IR_Comand {
uint8_t name; //наименование команды
uint8_t param;//параметр команды
} tir_comand;






Откойте файл types.h и опишите её в любом месте (копи-паст ;) )

Теперь добавим к глобальным переменным новую переменную для принятой команды.

Открываем файл global_variables.c и добавляем
Цитата:
volatile tir_comand ir_comand; //принятая по ИК команда


volstile говорит компилятору - "не удаляй и не игнорируй эту переменную при оптимизации!"

Чтобы наша глобальная переменная была видна из других файлов проекта - экспортируем её.
Пропишем в файле ltag_ascetic.h следующее
Цитата:
export volatile tir_comand ir_comand; //принятая по ИК команда




Теперь не плохо бы написать фукцию, которая брала бы из буфера принятую команду и заносила её в нашу новую переменную.

Задекларируем нашу новую функцию в файле ltag_ascetic.h
Цитата:
tir_comand get_ir_comand(void);//получим из буфера ИК приемника команду


Функция вернет структуру, которую мы описали для нашей переменной ir_comsnd

Элементарно! ;)
В файле ltag_ascetic.c пишем реализацию функции
Цитата:
tir_comand get_ir_comand(void){//получим из буфера ИК приемника команду
tir_comand cmd_tmp; //создаем временную пересенную нужного типа
cmd_tmp.name = rx_buffer[0];//имя функции в первом принятом байте (индекс 0)
cmd_tmp.param= rx_buffer[1];//параметры функции во втором принятом байте (индекс 1)
return cmd_tmp;
}


Прошу помощи, при компиляции выдает ошибку на строку с
Код:
export volatile tir_comand ir_comand; //принятая по ИК команда
с чем может быть это связано? Не могу никак победить прием команд с пульта, фиксирует все как ошибку приема.

Автор:  Pingvin [ 18 фев 2014, 12:29 ]
Заголовок сообщения:  Re: LTAscet - расширяем функционал прошивки

Пардон - мой косяк.
extern
а не export! :oops:

Ошибку фиксирует потому что длинна команды больше 14 бит.
Тоже прерывание надо подправить.

Автор:  Pingvin [ 18 фев 2014, 12:31 ]
Заголовок сообщения:  Re: LTAscet - расширяем функционал прошивки

Так у меня есть где то прошивка-шаблон для работы с командами.
Только, наверно - для 3.1
А может и для 3.0
Надо поискать.

Там уже и обработчик принятых команд написан, только команды добавляй в список.

А что - пульт уже сваяли?

Вроде она

Вложения:
LTAscet_3_1_Atmega32_RC.zip [445.68 KiB]
Скачиваний: 388

Автор:  Sabbah [ 18 фев 2014, 12:51 ]
Заголовок сообщения:  Re: LTAscet - расширяем функционал прошивки

Да пульт давно собран, но пока не в корпусе, да мне и под 3.1 пойдет для примера, я пробовал и extern ставить но не обрабатывало команду. На счет прерываний где и как нужно подправить?

Автор:  Pingvin [ 18 фев 2014, 12:53 ]
Заголовок сообщения:  Re: LTAscet - расширяем функционал прошивки

Sabbah писал(а):
Да пульт давно собран, но пока не в корпусе, да мне и под 3.1 пойдет для примера, я пробовал и extern ставить но не обрабатывало команду. На счет прерываний где и как нужно подправить?

в файле isr.c там где то после фиксации таймаута идет проверка количества принятых бит.

Автор:  Pingvin [ 18 фев 2014, 12:57 ]
Заголовок сообщения:  Re: LTAscet - расширяем функционал прошивки

Вот обработчик приема сообщения
Код:
   
                  case RX_MESSAGE_COMPLITE://принято сообщение
                  {
                     
                     if(get_buffer_bit(0)) //если этот бит равен 1, то это пакет с командой
                           {
                                 ir_message = get_ir_message_from_buffer();//выдергиваем значения команды из буфера ИК приемника
                       
                               if (ir_message.control_byte ==Valid_value )//сообщение принято корректно (контрольный байт принят без ошибок)
                      {
                        switch(ir_message.ID)//если имя команды
                                 {
                                    case Add_Health: //добавить "жизни"
                                    {
                              //код для добавления жизни
                                       break;
                                    }
                                    case Add_Rounds://добавить "патронов"
                                    {
                                 
                               //код для добавления патронов
                                       break;
                                    }

                                    case Command://какая то дополнительноя команда
                                    {
                                       
                              switch(ir_message.param)//выясним, какая это командв
                              {
                                 case 0x05://начать новую игру немедленно
                                 {
                                       init_var(); //инициализируем переменные
                                       joystick_event=no_pressing; //очищаем события джойстика
                                       keyboard_event=no_key_pressing;//очищаем события триггера
                                       reload_key_event=no_key_pressing;//очищаем события перезарядки
                                       rx_event = NOT_EVENT;   //очищаем события ИК приемника
                                       display_status();//обновляем информацию на дисплее
                                       
                                       WOUND_LED_ON;
                                       play_sound_6();
                                       //код обработки дополнительной команды
                                                WOUND_LED_OFF;
                                    
                                    break;
                                 }
                                 case 0x00://"выключить" игрока
                                 {
                                    
                                    
                                    break;
                                    
                                 }
                                 default: break;
                              
                              }
                              
                           
                              break;
                                    }
                                 }
                            }

                           }
                     else//контрольный байт сообщения не корректный - ошибка приема
                     {
                     }
                     
                     
                     
                     
                     rx_event = NOT_EVENT;
                     break;

                  }



А вот как прерывание подправлено

Код:
{//Фиксируем окончание приема по таймауту
         start_bit_received   = false;    //отменяем прием

         switch(bit_in_rx_buff)//проверим, сколько бит принято
         {
            case 14:
            {
               rx_event = RX_COMPLETE;         //Генерим событие "принят пакет"
               break;   
            }
            case 24:
            {
               rx_event =    RX_MESSAGE_COMPLITE;//принято сообщение;
               break;   
            }
            default:
            {
               rx_event = RX_ERROR;         //генерируем событие - "ошибка приёма"
            }
         }



         receiver_on = false;//выключаем приемник
         if (ir_transmitter_on==false) TIMSK &=~_BV(OCIE2); //если передача не ведётся - выключаем прерывания
      }

Автор:  Sabbah [ 18 фев 2014, 13:11 ]
Заголовок сообщения:  Re: LTAscet - расширяем функционал прошивки

ага спс бум пробовать

Страница 6 из 6 Часовой пояс: UTC + 3 часа [ Летнее время ]
Powered by phpBB® Forum Software © phpBB Group
http://www.phpbb.com/