www.open-tager.ru http://open-tager.ru/forum/ |
|
Концепция "оптимальной" прошивки. http://open-tager.ru/forum/viewtopic.php?f=5&t=1894 |
Страница 1 из 7 |
Автор: | Pingvin [ 02 фев 2013, 23:20 ] |
Заголовок сообщения: | Концепция "оптимальной" прошивки. |
Много было разговоров, что нужен некий оптимальный алгоритм работы прошивки для лазертаг-стволов, этакий "ориентир" для прошивкописателей, чтобы каждый не изобретал "свой велосипед". Предлагаю попытаться построить такую концепцию. Вношу первое предложение (вернее - это предложение LTKirov) - использовать для формирования несущей ИК сигнала аппаратные возможности контролллера, а именно - таймер1 в режиме ШИМ с коррекцией фазы и частоты. Цитата: Режим ШИМ с коррекцией фазы и частоты. Этот режим доступен для 16-битного таймера-счётчика 1 и только для вывода OC1A. В этом режиме таймер-счётчик также как и в режиме ШИМ с коррекцией фазы увеличивает значение регистра TCNTn на единицу на каждом такте до достижения верхней границы, а затем уменьшает до нуля, и т.д. Верхней границей также может быть 65535 либо значение, записанное в регистр OCR1A. Отличие от режима ШИМ с коррекцией фазы состоит в том, что в этом режиме значение регистра OCR1A обновляется из буферного регистра не при TCNT1, равном верхней границе, а при TCNT1 равном 0. Что это нам даст? Это даст нам возможность не только точно настроить частоту сигнала, но и позволит в широких пределах менять его скважность (мощность ИК излучения)! Про освобождение процессорного времени даже не говорю... Надо бы рассчитать все коэффициенты, определить в каких регистрах какие биты нужно выставить/сбросить и попробовать! Результатов эксперимента очень хотелось бы видеть в виде оформленной, легко адаптируемой библиотечки на Си. Остаётся ещё много задач - как формировать передаваемый пакет, как обрабатывать принимаемый, как воспроизводить звук и т.д. По поводу приема пакета предлагаю так же попробовать аппаратные фозможности, а именно - таймер в режиме захвата. Высказывайте критику и свои предложения! P.S. Глянул даташит - вроде и в режиме FAST PWM можно верхний предел счетчика задавать для таймера1. Короче - изучать надо и пробовать... |
Автор: | mail_robot [ 03 фев 2013, 13:38 ] |
Заголовок сообщения: | Re: Концепция "оптимальной" прошивки. |
читал даташиты на атмегу и пик, в атмеге так и не смог толком разобраться как эта штуковина работает. В пике все намного проще и понятнее оказалось. Но тут вопрос читателя наверное и опыта работы с девайсом больше наверное. Модуль ECCP у PIC18F14K50 очень хорошо умеет делать все вышеописанное. Однако есть одна проблема - модуляция. Мы же передаем не только несущую, мыж ее еще модулируем по длинне пачек. На выходах стоят управляющие защелки (TRIS) которые управляют состоянием выхода. Работает/не работает (третье состояние). Можно рулить через них, но для этого надо задействовать второй таймер, который бы отсчитывал ширину пачек импульсов (0/1) и менял состояние выхода на открыто/закрыто вовремя. Этот процесс получается все равно надо делать по прерываниям от таймера. По сути дело PWM будет только с одной установки генерировать несущую. Это я так понимаю всего лишь дело одной конфигурационной процедуры, которая настроит регистры и запустит это дело на исполнение. А вот вторая часть более ответственная и сложная. Ее неплохо было бы продумать в совокупности с процедурой арбитража, которая обеспечивала бы 100% возможность приема в ходе передачи. Ато получится как у нас сегодня на полигоне. Пока стреляем принять ничего не можем. А это неправильно. У смоленска таких проблем нет. Хотя кое какие мелкие глючки непонятной природы всетки проскакивают тоже. значит надо выбрать что приоритетнее - выстрел или пуля? если они прилетают одновременно. По идее пуля, как я мыслю Приехал мне кстати PicKit2. Но изза паяльника руки до него так и недошли еще. Проскакивала инфа, что есть какая то прога-калькулятор, которая все это дело умеет рассчитывать. Только вот поискать не удосуживался как то пока. |
Автор: | Pingvin [ 03 фев 2013, 15:10 ] |
Заголовок сообщения: | Re: Концепция "оптимальной" прошивки. |
Ну я предлагаю попробовать для приема пакета использовать режим захвата таймера. Хватит ли на все таймеров - вот вопрос. Для звука таймер нужен (даже два). Пробовать надо, может чего и получится. Кстати, Аскет при стрельбе очередями урон фиксирует, толко очередь прекращается, надо по новой курок нажать, чтобы продолжить. |
Автор: | mail_robot [ 03 фев 2013, 15:14 ] |
Заголовок сообщения: | Re: Концепция "оптимальной" прошивки. |
на захват вроде как один таймер нужен, на шим второй, на передачу третий. Вот и закончились таймеры. Но тут еще остается вопрос - не пересекуться ли там гденить ресурсы. потому как в режимах захвата и шим одновременно процессор может и не работать вовсе. |
Автор: | LTagKirov [ 03 фев 2013, 17:26 ] |
Заголовок сообщения: | Re: Концепция "оптимальной" прошивки. |
Похоже надо биты ИТОГО выложить Как они получены читайте на языке оригинала там всё более менее понятно setup_PWM(void) { TCCR1A = 0x00; // Выходы отключены от таймера TCCR1B = 0x11; // таймер работает, прескалер отключен // Выбран режим Phase & Freq Corect PWM // f = Fosc / ( 2 * N * TOP) ICR1H = 0x00; // максимальный модуль счёта ICR1L = ICR1_VAL; // примерно 222, для частоты 36КГц // TCCR1A = 0х80; // звук подключен ШИМ прямой // TCCR1A = 0х02; // ИК подключен ШИМ прямой OCR1AH = 0x00; // два разных шима на этой частоте OCR1AL = 0x00; // Звук ШИМ OCR1BH = 0x00; OCR1BL = ICR1_VAL / 2; // ИК передатчик скважность 50% |
Автор: | LTagKirov [ 03 фев 2013, 17:36 ] |
Заголовок сообщения: | Re: Концепция "оптимальной" прошивки. |
Pingvin писал(а): Ну я предлагаю попробовать для приема пакета использовать режим захвата таймера. Простейшее решение опрос входа с частотой 8кгц, отлично работает. Логика как с кнопкой - подавление дребезга. Счётчик постоянного состояния вывода неважно 1 или 0, как только выход изменил состояние смотрим сколько натикало, и принимаем решение преамбула, биты или пауза получена. Если паузу сделать другой длинны (как сделал полигон), можно даже конкренттое состояние вывода 1 или 0 не смотреть, всё однозначно определяется по длиннам счётчика, для майлс придётся наверно смотреть (незнаю не для майлс код пишу). Для длительностей 600us алгоритм работает даже на частоте опроса 2 кгц, надо всего-то определить три разных длинны импульсов. |
Автор: | Pingvin [ 04 фев 2013, 06:04 ] |
Заголовок сообщения: | Re: Концепция "оптимальной" прошивки. |
LTagKirov писал(а): Pingvin писал(а): Ну я предлагаю попробовать для приема пакета использовать режим захвата таймера. Простейшее решение опрос входа с частотой 8кгц, отлично работает. Логика как с кнопкой - подавление дребезга. Счётчик постоянного состояния вывода неважно 1 или 0, как только выход изменил состояние смотрим сколько натикало, и принимаем решение преамбула, биты или пауза получена. Если паузу сделать другой длинны (как сделал полигон), можно даже конкренттое состояние вывода 1 или 0 не смотреть, всё однозначно определяется по длиннам счётчика, для майлс придётся наверно смотреть (незнаю не для майлс код пишу). Для длительностей 600us алгоритм работает даже на частоте опроса 2 кгц, надо всего-то определить три разных длинны импульсов. Взял на заметку. |
Автор: | tommy [ 05 фев 2013, 09:14 ] |
Заголовок сообщения: | Re: Концепция "оптимальной" прошивки. |
LTagKirov писал(а): Похоже надо биты ИТОГО выложить а так взлетит? или подразумевается, что когда стреляем, то звука нет?Как они получены читайте на языке оригинала там всё более менее понятно setup_PWM(void) { update: чёт поторопился, походу. надо будет по ДШ биты развернуть, а то так не совсем понятно. предложенная ранее идея с: Код: таймер0 - общий таймер для всяческих измерений в прошивке; как-то проще и понятней (и отлично работает)
таймер1 - шим звука; таймер2 - шим стрельбы; |
Автор: | Pingvin [ 05 фев 2013, 15:27 ] |
Заголовок сообщения: | Re: Концепция "оптимальной" прошивки. |
LTagKirov писал(а): Похоже надо биты ИТОГО выложить Как они получены читайте на языке оригинала там всё более менее понятно setup_PWM(void) { TCCR1A = 0x00; // Выходы отключены от таймера TCCR1B = 0x11; // таймер работает, прескалер отключен // Выбран режим Phase & Freq Corect PWM // f = Fosc / ( 2 * N * TOP) ICR1H = 0x00; // максимальный модуль счёта ICR1L = ICR1_VAL; // примерно 222, для частоты 36КГц // TCCR1A = 0х80; // звук подключен ШИМ прямой // TCCR1A = 0х02; // ИК подключен ШИМ прямой OCR1AH = 0x00; // два разных шима на этой частоте OCR1AL = 0x00; // Звук ШИМ OCR1BH = 0x00; OCR1BL = ICR1_VAL / 2; // ИК передатчик скважность 50% Конкретика пошла - очень здорово! У меня вопрос - счетчик у тамера один? Считать он будет до 222 ( ICR1_VAL) - так? Ну ШИМ на ИК работать будет, вопросов нет, а звук то получается "урезан" да максимального значения сеймпла в 222 (вместо 255 при 8 битах)? |
Автор: | LTagKirov [ 05 фев 2013, 23:11 ] |
Заголовок сообщения: | Re: Концепция "оптимальной" прошивки. |
Pingvin писал(а): Ну ШИМ на ИК работать будет, вопросов нет, а звук то получается "урезан" да максимального значения сеймпла в 222 (вместо 255 при 8 битах)? Разрешение ЦАП конечно уменьшается, но некритично на 8кгц дискретизации hi-fi качество не получить всё равно tommy писал(а): подразумевается, что когда стреляем, то звука нет? ШИМ независимые ограничений на одновременность звука и выстрела нет. tommy писал(а): таймер2 - шим стрельбы;[/code]как-то проще и понятней (и отлично работает) Таймер 2 не может одновременно ШИМ выдавать и генерировать произвольную частоту. Делать программный ШИМ, мне лениво. Есть смысл использовать таймер 2 для звука, а Таймер 1 для ИК |
Страница 1 из 7 | Часовой пояс: UTC + 3 часа [ Летнее время ] |
Powered by phpBB® Forum Software © phpBB Group http://www.phpbb.com/ |