Разработка автономного аппаратно-программного комплекса средств для подсистемы управления "Роботом-дозиметристом"
Контроллер управления двигателями. Назначение, краткая характеристика, перспективы внедрения робота-дозиметриста. Обзор основных способов беспроводной передачи данных на большие расстояния. Проектирование принципиальной схемы бортового контроллера.
Рубрика | Программирование, компьютеры и кибернетика |
Вид | дипломная работа |
Язык | русский |
Дата добавления | 05.01.2013 |
Размер файла | 2,4 M |
Отправить свою хорошую работу в базу знаний просто. Используйте форму, расположенную ниже
Студенты, аспиранты, молодые ученые, использующие базу знаний в своей учебе и работе, будут вам очень благодарны.
Этап 2.Получатель (2) принимает пакет. После чего он его проверяет, и удостоверившись что с пакетом всё хорошо он увеличивает свою числовую последовательность на 1 и отправляет пользователю 1, пакет подтверждения, а сам начинает обрабатывать данные которые только что получил. Пакет подтверждения отличается от обычного только тем, что в нём есть флаг подтверждения АСК и числовая последовательность увеличена на 1.
Этап 3.Пользователь 1 получает пакет подтверждения и проверяет его. Удостоверившись, что с пакетом всё хорошо он увеличивает свою числовую последовательность на 1
При установлении соединения, работа протокола ГДС отличается от обычной, увеличенным количеством этапов (рис.4.4):
Этап 1.Инициатор передачи (1) отправляет пакет в котором заполняет только адрес отправителя А1, числовую последовательность ЧП, контрольную сумму CRC и флаг установки соединения INIT.
Этап 2. Получатель (2) принимает пакет и благодаря флагу INIT не проверяет адреса, а проверяет только целостность пакета. Удостоверившись, что с пакетом всё хорошо он запоминает адрес отправителя и отправляет ему обычный пакет, а сам остаётся дожидается подтверждения.
Этап 3. Пользователь (1) принимает пакет и проверяет только адрес получателя и целостность пакета. Удостоверившись, что с пакетом всё хорошо он запоминает адрес отправителя, увеличивает свою числовую последовательность на 1 и отправляет пользователю 1, пакет подтверждения.
Этап 4. Пользователь 1 получает пакет подтверждения и проверяет его. Удостоверившись, что с пакетом всё хорошо он увеличивает свою числовую последовательность на 1.
При ближайшем рассмотрении становится, очевидно, что начиная со второго этапа, установка соединения выглядит как обычная передача сообщения. Она отличается только этапом 3, где не проверяется адрес отправителя. Так что можно сказать, что установка соединения по протоколу ГДС является частным случаем обычного обмена сообщениями.
4.1.3 Возможные ситуации при передаче данных по протоколу
Рис. 4.5. Потеря пакета сразу после отправки
Рис. 4.6.Нарушение целостности пакета, сразу после отправки.
Для того что бы реализовать функции проверки и формирования пакета, представленные на рис. 4.2, необходимо рассмотреть все возможные ситуации которые могут возникнуть при обычной передаче пакета по протоколу гарантированной доставке сообщений (ГДС).
Для начала рассмотрим ситуацию, когда наш пакет теряется сразу после отправки (Рис. 4.5).
Если такая ситуация произошла, то пользователю нужно всего лишь повторить отправку пакета. Это можно реализовать по прохождению, какого то промежутка времени, по Timeout'у. Программа уходит в ожидание и, прождав некоторое время, не дождавшись подтверждения, повторяет попытку. Количество попыток необходимо ограничить, что бы не возникла ситуации, когда у получателя произошла какая-нибудь поломка и он не может продолжать дальнейшую работу, а отправитель пытается ему что то отправить. После окончания попыток пользователь должен сообщить о не удачи.
Теперь рассмотрим ситуацию, когда сразу после отправки у нас нарушается целостность пакета (Рис. 4.6).
Если такое произойдёт, то получатель должен будет сообщить об этом отправителю. Для этого необходимо выставить флаг нарушения целостности ERR. Числовая последовательность у получателя не увеличится, так как формально он не получил нормальный пакет.
Когда отправитель получит пакет и проверит его, то на основе флага ERR и числовой последовательности, он примет решение отправить предыдущее сообщение заново. Дальнейшая работа протокола ни чем не отличается от обычной отправки сообщений.
Так же нам необходимо рассмотреть случаи, в которых происходит сбой при отправке подтверждения. Одним из этих случаев является потеря пакета подтверждения доставки сообщения (рис. 4.7).
Если такая ситуация произошла, то перед тем как отправить пакет подтверждения получатель увеличил свою числовую последовательность, а отправитель, как и в первом случае, недожавшись подтверждения, по Timeout'у, повторит отправку предыдущего пакета.
Получатель примет пакет и при проверке увидит, что его числовая последовательность выше, чем у отправителя. На основе этого он сделает вывод, что пакет подтверждения был потерян и отправит его снова. После чего получатель примет этот пакет, проверит его, и остановится, увеличив свою числовую последовательность.
Рис. 4.7. Потеря пакета подтверждения
Рис. 4.8. .Нарушение целостности пакета подтверждения
Теперь рассмотрим ситуацию, у нас нарушается целостность пакета подтверждения доставки сообщения (Рис. 4.6).
В этом случае, перед тем как отправитель получит повреждённый пакет подтверждения, получатель увеличит свою числовую последовательность. Отправитель же обнаружит при проверке, что пакет повреждён и уведомит об этом получателя, выставив флаг ERR, не увеличив при этом свою числовую последовательность.
Получатель примет пакет, как и в предыдущем случае, увидит, что его числовая последовательность выше, чем у отправителя. На основе этого он сделает вывод, что пакет подтверждения был потерян и отправит его снова. После чего получатель примет этот пакет, проверит его, и остановится, увеличив свою числовую последовательность.
Единственное отличие этого случая от предыдущего, что получатель так же с предыдущим сообщением получает флаг ERR.
Как было рассмотрено выше, процесс установки соединения по протоколу ГДС является частным случаем обычного обмена сообщениями. Поэтому для него так же будут выполняться все случаи рассмотренные выше. Если же возникнет случай, когда сразу после инициализации у нас потеряется пакет с флагом INIT, то пользователь 1 просто не получит не какого сообщения и соединение не будет установлено. Тоже самое произойдет, если целостность этого пакета будет нарушена. Пользователь 2 просто откинет этот пакет и сделает вид, что ничего не произошло.
4.1.4 Блок-схемы основных функций протокола
После рассмотрения всех возможных ситуаций при работе протокола, были разработаны блок-схемы всех необходимых алгоритмов для дальнейшей реализации протокола гарантированной доставки (ГДС) сообщений по радиоканалу. В список необходимых алгоритмов вошли:
- алгоритм проверки пакетов;
- алгоритм передачи пакетов;
- алгоритм приёма пакетов;
- алгоритм установления соединения со стороны клиента;
- алгоритм установления соединения со стороны сервера;
Алгоритм проверки пакетов был реализован при использовании результатов полученных в пункте 4.1.3. «Возможные ситуации при передаче данных по протоколу».
Такая структура проверки пакета не случайна. Сначала проверяются адреса, поскольку среда передачи общедоступна, и кто угодно может отправить пакет на той же частоте что и мы, то если адреса не совпадают, программа сразу же перестаёт проверять пакет, не устанавливая флаг результата, деля вит, что ничего не произошло.
Далее идёт проверка целостности. По тому что, даже если пакет и адресован нам, но он повреждён, то нет никакого смысла проверять его дальше.
Рис.4.9. Алгоритм проверки пакетов
После проверки целостности, идёт распознавание того какой именно пакет к нам пришёл. На основе всех этих проверок возможны три различных результата. Если по завершению алгоритма флаг result равен:
0 пакет был адресован не нам, и мы возвращаемся в режим ожидания нужного нам пакета;
1 успешный результат;
2 нам необходимо отправить предыдущий пакет.
Этот алгоритм полностью отрабатывает все возможные ситуации, рассмотренные в предыдущем пункте. Так же он частично формирует следующее сообщение, устанавливая необходимые флаги и числовую последовательность.
Флаг NoCh устанавливается на первом этапе (рис 4.4) со стороны клиента при попытке установления связи с сервером.
PFlags. - набор флагов пришедших в пакете.
Flags. - флаги, которые необходимо отправить в будущем пакете.
ЧПН - наша числовая последовательность.
ЧПп - числовая последовательность, записанная в пришедшем пакете.
Рис.4.10. Алгоритм приёма пакетов
Рис.4.11. Алгоритм передачи пакетов
Рис.4.12. Алгоритм установления соединения со стороны сервера
Рис.4.13. Алгоритм установления соединения со стороны клиента
Про алгоритмы, представленные на рис. 4.12. 4.13. отдельно стоит добавить то, что установление соединения с обеих сторон должно происходить как можно быстрее. Это связанно с тем, что в режиме установлении соединения со стороны сервера система переходит в режим ожидания, в котором не проверяются адреса полученных пакетов. По этому, какой-нибудь шум может быть расценен как пакет с флагом инициализации.
4.2 Общий алгоритм управляющей программы
Рис.4.14. Общий алгоритм программы.
Общий алгоритм программы, представленный на рис. 4.14. был разработан для контроллера оператора и бортового контроллера. Единственное чем отличаются эти контроллеры при использовании этого алгоритма так это блоком выполнения функций.
Для контроллера оператора блок выполнения функций представляет собой набор функций вывода на LCD дисплей определённых сообщений и отправки данных запроса по протоколу гарантированной доставки сообщений по радиоканалу. Выбор выполняемых функций осуществляется с помощью обработчика прерываний кнопок.
Для бортового контроллера блок выполнения функций отсутствует. В его задачи входит обработка и выполнение запросов поступающих со стороны контроллера оператора и посылка ответов.
Блок инициализации включает в себя, настройку радио модуля, частоты работы ЦПУ, АЦП , LCD модуля, последовательных портов и основных портов ввода вывода микроконтроллера.
Блок обработки прерываний включает в себя обработку прерывания от четырёх видов источников.
Обработка прерываний от таймера. Реализована в виде ожидания в алгоритмах протокола гарантированной доставке сообщений. А так же в алгоритмах работы LCD дисплея и сканера клавиатуры.
Обработка прерываний от порта общего назначения. Используется при обработки нажатия кнопок.
Обработка прерываний от радио модуля. Используется только в контроллере оператора для обработки пакетов поступающих по протоколу.
Обработка прерываний от последовательного интерфейса. Используется только в бортовом контроллере для обработки пакетов поступающих по протоколу и обработки данных поступающих с USB или СOM-порта
Блок «Сон» представляет собой особое состояние микроконтроллера в котором ЦПУ микроконтроллера перестаёт выполнять исполнительный код программы, записанный в него, контроллер прерываний остаётся включен. Можно сказать, что в данном случае ЦПУ микроконтроллера просто перестаёт работать, до момента, когда на него поступит какое-нибудь прерывание из вне.
Блок обработки пакетов и блок установления соединения реализованы на алгоритмах, которые были разработаны в пункте 4.1.4. «Блок-схемы основных функций протокола».
Рис.4.15. Алгоритм обработки нажатия кнопок
Данный алгоритм позволяет распознавать нажатие кнопки или зажатие кнопки, на определённый период времени, устанавливая при этом соответствующие флаги. Он так же подходит для распознавания нажатия или зажима группы кнопок.
5. ТЕСТИРОВАНИЕ И ОТЛАДКА СПРОЕКТИРОВАННЫХ УСТРОЙСТВ
Тестирование данных устройств проводилось по двум направлениям:
- Тестирование аппаратной части контроллеров;
- Тестирование программной части контролеров.
Среди средств отладки применялись:
- Мультиметр Mastech MAS838;
- Цифровой осциллограф АСК-22060;
- Программатор MSP-GANG430.
5.1 Тестирование печатных плат
Тестирование состояло из следующих этапов:
- тестирование правильности работы преобразователей напряжения;
- тестирование приёма и передачи сообщений по интерфейсу RS-232;
- тестирование приёма и передачи сообщений по интерфейсу USB;
- тестирование работы радио модуля.
Тестирование преобразователей напряжения проводилось следующим образом. К платам подключали необходимый источник питания , и с помощью мультиметра измеряли выходное напряжение преобразователей.
Выходное напряжение преобразователей попадало в 5% диапазон от того которое указал производитель.
Преобразователь TPS61006 установленный на плате те контроллера оператора, превышал этот диапазон. Его выходное напряжение было +3.52В при заявленных +3.3В.
В документации на микроконтроллер CC430F6137 сказано, что критическое напряжение работы микроконтроллера +3.6В.
По сколько источником питания для контролера оператора служит батарейка, то со временем она будет разряжаться в связи с чем выходное напряжение так же будет понижаться. Так что было принято решение не заменять этот источник питания.
Для проверки работы последовательного интерфейса RS-232 в режиме приёма и передачи был проведён специальный тест.
Ход выполнения тестирования:
- подключаем плату к USB порту, тем самым подавая напряжение на плату +5В;
- предварительно, МК запрограммирован тестовой программой, которая должна принимать код приходящий по асинхронному последовательному порту, и отправлять обратно;
- плата подключается по интерфейсу RS-232 к компьютеру;
- на компьютере запускается программа “Terminal”;
- после включения питания, плата устанавливает свою схему коммутации в положение COM - UART и передаёт по интерфейсу RS-232 сообщение о готовности ;
- из программы “Terminal” отсылаются пакеты по интерфейсу RS-232;
- плата ретранслирует принятые пакеты на компьютер по интерфейсу RS-232.
После проведения этого теста на экране Terminal`а появились отправленные нами пакеты, и их количество совпадало с количеством отправленных, было принято считать тест успешно пройденным.
Для проверки работы интерфейса USB в режиме приёма и передачи был проведён специальный тест. Тест аналогичен соответствующему тесту для интерфейса RS-232 за счёт того, что программа “Terminal” распознают USB - соединение как COM.
Ход выполнения тестирования:
- подключаем плату к USB порту, тем самым подавая напряжение на плату +5В;
- предварительно, МК запрограммирован тестовой программой, которая должна принимать код приходящий по асинхронному последовательному порту, и отправлять обратно;
- на компьютере запускается программа “Terminal”;
- после включения питания, плата устанавливает свою схему коммутации в положение COM - UART и передаёт по интерфейсу USB сообщение о готовности;
- из программы “Terminal” отсылаются пакеты для робота по интерфейсу USB;
- плата ретранслирует принятые пакеты на компьютер по интерфейсу USB.
После проведения этого теста на экране Terminal`а появились отправленные нами пакеты, и их количество совпадало с количеством отправленных, было принято считать тест успешно пройденным.
Для проверки работы радио модуля в режиме приёма и передачи на частоте 868МГц был проведён специальный тест.
Ход выполнения тестирования:
- Берём 2 одинаковых контроллера оператора;
- Подключаем к ним источник напряжения;
- предварительно, МК запрограммирован тестовой программой, которая должна принимать код приходящий по радиоканалу и выводить его на LCD дисплей, а при нажатии на кнопку отправлять этот код;
- нажимаем на кнопку контроллера №1;
- контроллер №1 передаёт на контроллер №2, а тот выводит его на дисплей.
В результате этого теса сообщение было передано на максимальном расстоянии 7см. что позволяет утверждать, что радио модуль, работает. Но при повторном проведении этого теста с последующим увеличением расстояния, Сообщение не передаётся.
Этот тест так же проводился при использовании частот 916МГц и 413МГц. Но даже на расстоянии менее 7см данные не передавались. Из этого можно сделать вывод, что антенна спроектирована правильно и с частотой работы 868МГц.
При дальнейшем рассмотрении всех особенностей проектировки печатных антенн, в плате контроллера оператора была найдена ошибка, допущенная при проектировании рис.5.1.
Рис.5.1. Фотография контролера оператора (вид сверху)
Как можно увидеть на фотографии, линии, соединяющие микроконтроллер MSP430F6137 и колебательный контур, имеют разную длину. Это разница в длине и повлекла за собой понижение мощности радио модуля.
В связи с этой ошибкой пришлось заново произвести разработку принципиальной схемой котроллера оператора с заменой микроконтроллера CC430F6137 на MSP430FE423 (рис. 5.3) и добавлением в схему отдельного радио модуля CC1100, того же что используется в бортовом контроллере.
Основные характеристики микроконтроллера MSP430FE423:
* 16-разрядный микроконтроллер пониженной мощности;
*8КБ Flash-памяти;
* 256Б RAM;
* USARTs (универсальный асинхронный приёмопередатчик);
* LCD модуль.
Замена микроконтроллеров произошла по той причине, что невозможно развести плату так, чтобы линии, соединяющие микроконтроллер MSP430F6137 и колебательный контур были одинаковой длинны.
Новые принципиальные схемы представлены на рис.5.2, 5.3, 5.4.
Так же повторно была произведена трассировка печатной платы контроллера оператора (рис 5.5 и 5.6)
Рис.5.2. Принципиальная схема повышающего источника напряжения для повторно спроектированного контроллера оператора
Рис.5.3. Принципиальная схема микроконтроллера для повторно спроектированного контроллера оператора
Рис.5.4. Принципиальная схема радио модуля для повторно спроектированного контроллера оператора
Рис.5.5. Повторно спроектированная печатная плата контроллера оператора (вид сверху).
Рис.5.6. Повторно спроектированная печатная плата контроллера оператора (вид снизу).
5.2 Отладка программной части контроллеров
Поскольку на этапе тестирования печатных платы была выявлена ошибка, из-за которой радио модуль не может передавать данные на большие расстояния, провести полную отладку программной части контроллеров, не получилось.
Но всё же радио модуль оказался способен передавать данные на короткое расстояние. Благодаря этому удалось произвести тестирование протокола гарантированной доставки сообщений по радиоканалу.
Для тестирования протокола были искусственно созданы ситуации, описанные в пункте 4.1.2. «Возможные ситуации при передаче данных по протоколу», с целью проверки того что данные всё ровно будут доставлены.
При прохождении тестов были выявлены 2 тупиковые ситуации.
Рис.5.7. Первая тупиковая ситуация
Рис.5.8. Вторя тупиковая ситуация
Предположим, что пакет подтверждения не был доставлен, в то время как пользователь 2 увеличил свою числовую последовательность. Тогда пользователь 1 будет повторять запрос, пока у него не кончится количество попыток. Предположим что у пользователя 1 кончались попытки отправки сообщения и он так и не получил ответа и не увеличил свою числовую последовательность. После чего пользователь 2 отправляет уже новый пакет с числовой последовательностью большей чем у него.
Исходя из алгоритма проверки пакетов представленного на рис.4.9. мы должны будем увеличить нашу числовую последовательность и отослать пустое сообщение без флагов. Но это не так. Мы оказываемся в совершенно новой ситуации. Таким образом, что бы выбраться из первой тупиковой ситуации, необходимо после проверки числовой последовательности, проверять пакет на наличие флага подтверждения ACK и в соответствии с ним принимать дальнейшее решение.
Так же данная ситуация абсолютно точно показывает пользователю 1 сколько пакетов он потерял. Если для нас приходит пакет, числовая последовательность которого больше, и этот пакет не содержит флага подтверждения, то количество потерянных пакетов есть разница между нашей и пришедшей числовой последовательностью.
Теперь рассмотрим вторую тупиковую ситуацию. Предположим, что пакет подтверждения был доставлен поврежденным, в то время как пользователь 2 увеличил свою числовую последовательность. Тогда пользователь 1 повторит запрос установив флаг повреждения целостности ERR. Предположим, что это сообщение дойдёт до пользователя 2 тоже повреждённым. Тогда он сам отправит сообщение с флагом ERR пользователю 1. Исходя из доработанного алгоритма проверки пакетов, мы должны будем расценить это сообщение, как потерю пакета. Нам вроде как необходимо повторить отправку пакета со стороны пользователя 1 и получив пакет подтверждения увеличить свою ЧП. Но это не так. На самом деле нам просто необходимо на этапе 5 сразу увеличить свою числовую последовательно и успешно выйти из алгоритма передачи пакетов представленном на рис.4.11. Доработанный алгоритм проверки пакетов представлен на рис.5.9.
Рис.5.9. Доработанный алгоритм проверки пакетов.
робот дозиметрист передача контроллер
Основные параметры протокола, такие как, время ожидания подтверждения и количество попыток отправки пакета, необходимо устанавливать экспериментально, но поскольку, сообщения не могут быть переданы на большое расстояние, то этого сделать не удастся.
Вовремя проведения тестирования протокола, время ожидания равнялось 300мс а, количество попыток отправки пакета равно 3.
ЗАКЛЮЧЕНИЕ
Цели, поставленные в техническом задании на дипломный проект, были последовательно выполнены, их результаты представлены в данной пояснительной записке.
Обзорная часть дипломного проекта состоит из следующих частей:
- обзор аппаратных решений, применяющихся в «Роботе-дозиметристе» и анализ общей структурной схемы робота;
- обзор способов дистанционной передачи данных.
На основании обзорной части, было последовательно выполнено следующее:
- разработана структурная схема взаимодействия контроллера оператора и бортового контроллера;
- произведён выбор аппаратной базы для реализации контроллера оператора и бортового контроллера.
Далее, основываясь на результатах предыдущих пунктов:
- спроектированы принципиальные электрические схемы контроллера оператора и бортового контроллера;
- спроектированы печатные платы контроллера оператора и бортового контроллера;
- разработан протокол гарантированной доставки сообщений для радиоканала;
- разработана общая программа для взаимодействия бортового контроллера и контроллера оператора;
- составлено руководство пользователя для плат бортового контроллера и контроллера оператора.
Отладка протокола не была выполнена до конца из-за возникших проблем с платой контроллера оператора.
Спроектированные контроллеры имеют большое значение в разработке «Робота-дозиметриста». Они позволяют сократить ряд основных проблем при дальнейшей разработке и эксплуатации робота, обеспечивая дополнительный контроль над ним и предоставляя ряд новых возможностей, таких как увеличенная дистанция беспроводного управления роботом.
Кроме того в Бортовом контроллере предусмотрены интерфейсы для подключения множества самых разных устройств, которые смогут расширить его функциональные возможности.
Разработанный протокол позволяет двум устройствам обмениваться данными с гарантией доставки этих данных. Так же он имеет широкие возможности для доработки, с целью создания более серьёзных систем. На его основе можно создать многопользовательский протокол для организации сети, использующей в качестве среды передачи данных радиоканал определённой частоты. Так же в дальнейшем можно использовать шифрование данных для этого протокола.
Помимо всего прочего, разработанные контроллеры могу выполнять задачу отладочного устройства, имея возможность, подключатся к необходимому узлу, или между узлами и, позволяя дистанционно отслеживать различные характеристик системы, над которой производится отладка.
СПИСОК ЛИТЕРАТУРЫ
1. Лопаткин А. В.. P-CAD. - СПб.: БВХ - Петербург, 2006. - 560 с.
2. А. В. Белов. Самоучитель разработчика устройств на микроконтроллерах AVR. - М.: Наука и техника, 2010. - 544 с.
3. Шахнович И. Современные технологии беспроводной связи.- М.: Мир, 1987. - 608 с.
4. Семейство микроконтроллеров MSP430. Рекомендации по применению. - ЗАО «Компэл», 2005. - 544 с.
5. Семейство микроконтроллеров MSP430x1xx. - ЗАО «Компэл», 2005. - 368 с.
6. Лобкова Л. М. Проектирование антенн и устройств СВЧ. - СевНТУ, 2002. - 147 с.
7. CC430 Family User's Guide (Rev. B). SLAU259B - Texas Instruments, 2010 - 640с.
8. CC430x1xx Family User's Guide (Rev. F). SLAU049B - Texas Instruments, 2006 - 625с.
8. Раймонд Мэк. Импульсные источники питания. Теоретические основы проектирования и руководство по практическому применению. - М: Додэка XXI, 2008. - 274 с.
9. Горвард Джонсон, Мартин Грэхем. Высокоскоростная передача цифровых данных: высший курс черной магии. - Вильямс, 2005. - 997 с.
10. Джон Мортон. Микроконтроллеры AVR. Вводный курс. - М: Додэка-ХХI, 2006. - 272 с.
11. Феер К. Беспроводная цифровая связь: методы модуляции. -- Пер. с англ. // Под. ред. В. И. Журавлёва. -- М.: Радио и связь, 2000. -- 520 с.
12. Kent Smith. Antennas for low power application. - 2001 http://www.mplab.ru/rfmod/ant.pdf
13. Wikipedia (http://ru.wikipedia.org/wiki/ Последовательный_порт) - интернет ресурс
14. Агуров П.В. - Интерфейс USB. Практика использования и программирования. - СПб.: БВХ - Петербург, 2004. - 576 с.
ПРИЛОЖЕНИЕ 1. РУКОВОДСТВО ПОЛЬЗОВАТЕЛЯ.
Инструкция по программированию МК
Программирование осуществляется при помощи программатора MSP-GANG430. MSP-GANG430 может запрограммировать до восьми идентичных MSP430 устройств одновременно. MSP-GANG430 подключается к ПК с использованием стандартного RS232 последовательного порта. MSP-GANG430 предоставляет гибкие возможности программирования устройств.
MSP-GANG430 оснащен платой расширения, реализующего взаимосвязь между MSP-GANG430 и несколькими восьми устройствами.
Программирование микроконтроллера выполняется при помощи следующей последовательности действий:
1. Подключите MSP-GANG430 к последовательному порту ПК (COM1 или COM15).
2. Подключите внешний источник питания для MSP-GANG430. Напряжение питания должно находиться в диапазоне от 9В до 15В постоянного тока и должны быть способно, обеспечить минимальный ток 300 мА.
3. Установите плату расширения. D-Sub разъем на MSP-GANG430. Плата расширения обеспечивает подключение до восьми устройств.
4. Установите последнюю версию программного обеспечения, которое можно загрузить с веб-сайта MSP430 в www.msp430.com.
5. Нажмите на иконку GANG430 находящуюся в папке, указанной при установке программного обеспечения (по умолчанию папка ADT430). Графический интерфейс программы изображён на рис.6.2.
6. Выберите нужные устройства в закладках «группы» и «тип».
7. Подключите к плате расширения устройства, которые необходимо запрограммировать.
8. После подключения нажмите на кнопку Start находящуюся на программаторе.
9. Выберите файл, объектный код которого должен быть запрограммирован в устройство. Поддерживаемые форматы для файла кода .TXT и .HEX
10. Используйте кнопку Load Image, чтобы загрузить файл объектного кода и его контрольную сумму для MSP-GANG430.
11. Выберите напряжение, используя закладку напряжения питания.
12. Выберите необходимые параметры, находящиеся в основном окне программы.
13. Нажмите на кнопку Execute в главном разделе. В разделе Статус отображаются операций прогресса и завершения.
Перечень элементов
Плата контроллера оператора. Таблица 1. |
||||||
Обозначение |
Тип компонента |
Значение |
PatternName |
|||
Конденсаторы |
||||||
C15 |
C0805 |
1 pF, *0.25pF NPO |
805 |
|||
C14 |
C0805 |
1.5 pF, *0.25pF NPO |
805 |
|||
C18 |
C0805 |
1.5 pF, *0.25pF NPO |
805 |
|||
C17 |
C0805 |
1.8 pF, *0.25pF NPO |
805 |
|||
C3 |
C0805 |
22pF |
805 |
|||
C4 |
C0805 |
22pF |
805 |
|||
C19 |
C0805 |
27pF 5% NPO |
805 |
|||
C20 |
C0805 |
27pF 5% NPO |
805 |
|||
C13 |
C0805 |
33 pF 5% NPO |
805 |
|||
C22 |
C0805 |
33 pF 5% NPO |
805 |
|||
C12 |
C0805 |
100 pF 5% NPO |
805 |
|||
C16 |
C0805 |
100 pF 5% NPO |
805 |
|||
C23 |
C0805 |
4.7nF X7R |
805 |
|||
C2 |
C0805 |
10nF |
805 |
|||
C5 |
C0805 |
10nF |
805 |
|||
C6 |
C0805 |
10nF |
805 |
|||
C7 |
C0805 |
10nF |
805 |
|||
C21 |
C0805 |
100nF X7R |
805 |
|||
C1 |
C0805 |
0.1uF |
805 |
|||
C9 |
C0805 |
1uF |
805 |
|||
C10 |
C0805 |
1uF |
805 |
|||
C25 |
C0805 |
1uF |
805 |
|||
C11 |
CASE_B |
10uFx6.3V |
CASEB3528 |
|||
C24 |
CASE_B |
47uFx6.3V |
CASEB3528 |
|||
Микросхемы |
||||||
DA1 |
CC1100 |
CC1100 |
QLP20 |
|||
DD1 |
MSP430EF42 |
MSP430F423 |
PQFP64_10X10P05 |
|||
U2 |
TPS76333 |
TPS76333 |
SOT23-5 |
|||
Индикаторы |
||||||
HG1 |
DTC20297A |
DTC20297A |
||||
Индуктивности |
||||||
L3 |
CM201212 |
6.2 nH 5% |
805 |
|||
L2 |
CM201212 |
12 nH 5% |
805 |
|||
L4 |
CM201212 |
12 nH 5% |
805 |
|||
L1 |
CM201212 |
18 nH 5% |
805 |
|||
L5 |
CM201212 |
18 nH 5% |
805 |
|||
Резисторы |
||||||
R10 |
R0805 |
270 |
805 |
|||
R9 |
R0805 |
56k 1% |
805 |
|||
R9 |
R0805 |
56k 1% |
805 |
|||
R4 |
R0805 |
100k |
805 |
|||
R5 |
R0805 |
100k |
805 |
|||
R6 |
R0805 |
100k |
805 |
|||
R7 |
R0805 |
100k |
805 |
|||
R8 |
R0805 |
100k |
805 |
|||
Кнопки |
||||||
SB1 |
TS-A_PS-130 |
TS-AXPS-130 |
||||
SB2 |
TS-A_PS-130 |
TS-AXPS-130 |
||||
Светодиоды KPC-3216 |
||||||
VD2 |
KPC-3216 |
|||||
Разъемы |
PLD-12 |
|||||
XP1 |
PLD-12 |
|||||
Кварцевые резонаторы |
||||||
ZQ1 |
PK206 |
32.768 kHz |
PK206 |
|||
ZQ2 |
HCX-6SB |
26 MHz, 10ppm, Fund, SMD0603 |
HCX-6SB |
|||
Плата бортового контроллера Перечень элементов Таблица 2 |
||||||
Обозначение |
Тип компонента |
Значение |
PatternName |
|||
Конденсаторы |
||||||
C1 |
C0805 |
100 pF 5% NPO |
805 |
|||
C2 |
C0805 |
1.5 pF, *0.25pF NPO |
805 |
|||
C3 |
C0805 |
33 pF 5% NPO |
805 |
|||
C4 |
C0805 |
1 pF, *0.25pF NPO |
805 |
|||
C5 |
C0805 |
100 pF 5% NPO |
805 |
|||
C6 |
C0805 |
1.8 pF, *0.25pF NPO |
805 |
|||
C7 |
C0805 |
1.5 pF, *0.25pF NPO |
805 |
|||
C8 |
C0805 |
27pF 5% NPO |
805 |
|||
C9 |
C0805 |
4.7nF X7R |
805 |
|||
C10 |
C0805 |
33 pF 5% NPO |
805 |
|||
C11 |
C0805 |
27pF 5% NPO |
805 |
|||
C12 |
C0805 |
100nF X7R |
805 |
|||
C13 |
CASE_B |
47uFx6.3V |
CASEB3528 |
|||
C14 |
C0805 |
0.1uF |
805 |
|||
C15 |
C0805 |
0.1uF |
805 |
|||
C16 |
C0805 |
0.1uF |
805 |
|||
C17 |
C0805 |
10uF |
805 |
|||
C18 |
C0805 |
0.1uF |
805 |
|||
C19 |
C0805 |
10nF |
805 |
|||
C20 |
C0805 |
27pF 5% NPO |
805 |
|||
C21 |
C0805 |
0.1uF |
805 |
|||
C22 |
C0805 |
27pF 5% NPO |
805 |
|||
C23 |
C0805 |
0.1uF |
805 |
|||
C24 |
C0805 |
0.1uF |
805 |
|||
C25 |
C0805 |
0.1uF |
805 |
|||
C26 |
C0805 |
0.1uF |
805 |
|||
C27 |
C0805 |
0.1uF |
805 |
|||
C28 |
C0805 |
10nF |
805 |
|||
C29 |
C0805 |
30pF |
805 |
|||
C30 |
C0805 |
30pF |
805 |
|||
C31 |
C0805 |
12pF |
805 |
|||
C32 |
C0805 |
12pF |
805 |
|||
C33 |
C1206 |
22uF |
1206 |
|||
C34 |
C0805 |
100pF |
805 |
|||
C35 |
C0805 |
33nF |
805 |
|||
C36 |
C1206 |
10uF |
1206 |
|||
C37 |
C0805 |
10uF |
805 |
|||
C38 |
C0805 |
100nF |
805 |
|||
C39 |
C0805 |
10uF |
805 |
|||
C40 |
C0805 |
100nF |
805 |
|||
C41 |
C0805 |
10nF |
805 |
|||
C42 |
C0805 |
0.33uF |
805 |
|||
C43 |
C0805 |
0.1uF |
805 |
|||
C44 |
C1206 |
10uF |
1206 |
|||
C45 |
C0805 |
0.1uF |
805 |
|||
C46 |
C1206 |
10uF |
1206 |
|||
Резисторы |
||||||
R1 |
R0805 |
56k 1% |
805 |
|||
R2 |
R0805 |
430 |
805 |
|||
R3 |
R0805 |
470 |
805 |
|||
R4 |
R1206 |
10 |
1206 |
|||
R5 |
R0805 |
430 |
805 |
|||
R6 |
R0805 |
270 |
805 |
|||
R7 |
R0805 |
430 |
805 |
|||
R8 |
R0805 |
10k |
805 |
|||
R9 |
R0805 |
1k |
805 |
|||
R10 |
R0805 |
10 |
805 |
|||
R11 |
R0805 |
10k |
805 |
|||
R12 |
R0805 |
5k |
805 |
|||
R13 |
R0805 |
5k |
805 |
|||
R14 |
R0805 |
10 |
805 |
|||
R15 |
R0805 |
5k |
805 |
|||
R16 |
R0805 |
1.5k |
805 |
|||
R17 |
R0805 |
5k |
805 |
|||
R18 |
R0805 |
5k |
805 |
|||
R19 |
R0805 |
3k |
805 |
|||
R20 |
R0805 |
3k |
805 |
|||
R21 |
R0805 |
100k |
805 |
|||
R22 |
R0805 |
5k |
805 |
|||
R23 |
R0805 |
3k |
805 |
|||
R24 |
R0805 |
100k |
805 |
|||
R25 |
R0805 |
430 |
805 |
|||
R26 |
R0805 |
430 |
805 |
|||
R27 |
R0805 |
2.2k |
805 |
|||
R28 |
R0805 |
10k |
805 |
|||
R29 |
R0805 |
100k |
805 |
|||
R30 |
R0805 |
56k |
805 |
|||
R31 |
R0805 |
100k |
805 |
|||
R32 |
R0805 |
430 |
805 |
|||
R33 |
R0805 |
430 |
805 |
|||
R34 |
R1206 |
10 |
1206 |
|||
R35 |
R0805 |
270 |
805 |
|||
R36 |
R0805 |
100k |
805 |
|||
R37 |
R0805 |
470k |
805 |
|||
R38 |
R0805 |
470k |
805 |
|||
R39 |
R0805 |
10k |
805 |
|||
R40 |
R0805 |
270 |
805 |
|||
R41 |
R1206 |
10 |
1206 |
|||
R42 |
R0805 |
430 |
805 |
|||
R43 |
R1206 |
10 |
1206 |
|||
Индуктивности |
||||||
L1 |
CM201212 |
18 nH 5% |
805 |
|||
L2 |
CM201212 |
12 nH 5% |
805 |
|||
L3 |
CM201212 |
6.2 nH 5% |
805 |
|||
L4 |
CM201212 |
18 nH 5% |
805 |
|||
L5 |
CM201212 |
12 nH 5% |
805 |
|||
L6 |
DO1608C |
DO1608C-333ML 33uH |
L_6_6X4_5 |
|||
L7 |
SDR1005 |
2.2uH |
SDR1005 |
|||
Микросхемы |
||||||
DA1 |
CC1100 |
QLP20 |
||||
DA2 |
TS3A5017 |
TS3A5017DR |
||||
DA3 |
TS3A5017 |
TS3A5017DR |
||||
DD1 |
ADM202 |
SO16 |
||||
DD2 |
MSP430F147IPMR |
PQFP-G64_10X10P05 |
||||
U6 |
FT8U232AM |
FT8U245AM |
||||
U12 |
M93C46 |
{Value} |
M93C46 |
|||
U20 |
TPS6100X |
TPS61006DGS |
MSOP-10_W120P05 |
|||
U24 |
TPS6120X |
{Value} |
DRC(S-PVSON-N10) |
|||
U25 |
78L33 |
78L33 |
||||
Кнопки |
||||||
SB1 |
TS-A_PS-130 |
TS-AXPS-130 |
||||
SB2 |
TS-A_PS-130 |
TS-AXPS-130 |
||||
Светодиоды |
||||||
VD1 |
KPC-3216 |
KPC-3216 |
||||
VD3 |
KPC-3216 |
KPC-3216 |
||||
VD4 |
KPC-3216 |
KPC-3216 |
||||
VD6 |
KPC-3216 |
KPC-3216 |
||||
VD7 |
KPC-3216 |
KPC-3216 |
||||
VD8 |
KPC-3216 |
KPC-3216 |
||||
VD9 |
KPC-3216 |
KPC-3216 |
||||
VD11 |
KPC-3216 |
KPC-3216 |
||||
Диоды |
||||||
D1 |
MBRM120LT3 |
DO-216AA |
||||
VD2 |
MBRM120LT3 |
DO-216AA |
||||
VD5 |
MBRM120LT3 |
DO-216AA |
||||
VD10 |
MBRM120LT3 |
DO-216AA |
||||
Транзисторы |
||||||
VT1 |
BC847 |
SOT-23 |
||||
VT2 |
BC847 |
SOT-23 |
||||
VT3 |
BC847 |
SOT-23 |
||||
VT4 |
BC847 |
SOT-23 |
||||
VT5 |
BC847 |
SOT-23 |
||||
Разъемы |
||||||
XS1 |
DRB-9MA |
DRB-9MA |
||||
XS2 |
UBAR-04-S |
UBAR-04-S |
||||
XS3 |
DRB-9MA |
DRB-9MA |
||||
Кварцевые резонаторы и генераторы |
||||||
ZQ1 |
FTX26-M20SM7 |
26MHz |
FTX26-M20SM7 |
|||
ZQ2 |
HC-49U |
8MHz |
HC-49U |
|||
ZQ3 |
PK206 |
32k |
PK206 |
Листинг 1
#include "main.h"
#include "LCD.h"
#include "ADC.h"
#include "CoupleProto.h"
#include "RF_coreMod.h"
unsigned int buttonCnt = 0;
unsigned int buttonPressed = 0;
unsigned int ButtonSet = 0;
unsigned int lastDisp = 0;
unsigned char flagfinInt = 0;
unsigned char slip = 0;
unsigned char idself[10] = {0};
unsigned char msg[8] = {' ',' ',' ',' ',' ',' ',' ',' '};
unsigned char* data = 0;
int main( void )
{
WDTCTL = WDTPW + WDTHOLD;
SetVCore(3);
InitButtonLeds();
InitTimer();
ResetRadioCore();
InitAdc();
InitRadio();
ReceiveOff();
int h =6;
while (h--)
data[h] = 0;
get(idself);
while(1)
{
slip = 1;
__bis_SR_register( LPM3_bits + GIE );
__no_operation();
if (!initSys)
{
switch (ButtonSet)
{
case 1:
ClientInit();
break;
case 7:
ServerInit();
break;
default:
ButtonSet =0;
break;
}
}
if(initSys)
{
if(chReceiving())
{
RecDataProto(data, 6);
ReceiveOn();
}
else
{
switch (ButtonSet)
{
case 1:
ClientInit();
break;
case 2:
ClientInit();
ClientInit();
break;
case 7:
ServerInit();
break;
default:
ButtonSet =0;
break;
}
}
}
}
void InitButtonLeds(void)
{
P5SEL |= 0xc0;
// Set up the button as interruptible
P2DIR &= ~(0x07);
P2REN |= 0x07;
P2IES |= 0x07;
P2IFG = 0;
P2OUT |= 0x07;
P2IE |= 0x07;
// Initialize Port J
PJOUT = 0x00;
PJDIR = 0xFF;
// Set up LEDs
P2DIR |= BIT6 + BIT7;
P2OUT |= BIT6 + BIT7;
}
void InitTimer(void)
{
P5SEL |= 0x03; // Set xtal pins
LFXT_Start(XT1DRIVE_0);
TA0CTL = TASSEL__ACLK + TACLR; // ACLK source
}
void InitRadio(void)
{
PMMCTL0_H = 0xA5;
PMMCTL0_L |= PMMHPMRE_L;
PMMCTL0_H = 0x00;
WriteRfSettings(&rfSettings);
WriteSinglePATable(PATABLE_VAL);
}
void Wait(void)
{
TA0CTL &= ~(MC_3);
TA0CCR2 = 3277;
TA0CCTL2 |= CCIE;
TA0CTL |= MC_2 + TACLR;
}
void WaitDisp(unsigned int Time, unsigned char* action)
{
Init_LCD();
lastDisp = Time * 10;
Load_LCD_Memory(action);
Wait();
}
void ChButton (void)
{
TA0CCTL2 &= ~(CCIE);
unsigned char n = (P2IFG & 0x07);
if (!(flagfinInt & n))
{
if (!(P2IN & n))
buttonCnt++;
else
{
buttonPressed = 0;
ButtonSet = n;
}
if ((buttonCnt == 30)&&(buttonPressed))
{
buttonPressed = 0;
ButtonSet = 8 + n;
flagfinInt |= n;
}
}
else
{
P2IES &= 1;
flagfinInt &= ~n;
buttonPressed = 0;
}
}
#pragma vector=TIMER0_A1_VECTOR
__interrupt void TIMER0_A1_ISR(void)
{
switch(__even_in_range(TA0IV,14))
{
case 0: break;
case 2:
if(chReceiving())
{
TA0CCR1 += RX_TIMER_PERIOD; // 16 cycles * 1/32768 = ~500 us
for(int i=0; i<8; i++)
msg[i]=' ';
msg[0]='P';
msg[1]='t';
msg[2]='r';
WaitDisp(5, msg);
pktRxHandler();
if(chPacketReceived())
__bic_SR_register_on_exit(LPM3_bits);
}
else if(chTransmitting())
{
TA0CCR1 += TX_TIMER_PERIOD; // 16 cycles * 1/32768 = ~500 us
for(int i=0; i<8; i++)
msg[i]=' ';
msg[0]='P';
msg[1]='t';
msg[2]='t';
WaitDisp(5, msg);
pktTxHandler();
if(chPacketTransmit())
__bic_SR_register_on_exit(LPM3_bits);
}
else if (chCProtoFlagWait() == 1)
{
setCProtoTimeOut(1);
__bic_SR_register_on_exit(LPM3_bits);
}
break;
case 4:
TA0CTL &= ~(MC_3);
if(buttonPressed)
{
ChButton();
if (!buttonPressed)
{
P2IFG = 0;
P2IE |= 0x07;
if(slip)
{
__bic_SR_register_on_exit(LPM3_bits);
slip = 0;
}
}
else
Wait();
}
if (lastDisp)
{
lastDisp--;
Wait();
if (!lastDisp)
{
ClearDisplayDriverMemory();
LCDBCTL0 &= ~LCDON;
P2OUT |= BIT6 + BIT7;
}
}
break;
case 6: break; // Reserved not used
case 8: break; // Reserved not used
case 10: break; // Reserved not used
case 12: break; // Reserved not used
case 14: break; // Overflow not used
}
}
#pragma vector=PORT2_VECTOR
__interrupt void PORT2_ISR(void)
{
switch(__even_in_range(P2IV, 16))
{
case 0: break;
case 2: // P2.0 IFG
__delay_cycles(100);
buttonPressed = 1;
P2IE &= ~BIT0;
P2IFG |= 0x01;
buttonCnt = 0;
Wait();
break;
case 4: // P2.1 IFG
__delay_cycles(100);
buttonPressed =1;
P2IE &= ~BIT1;
P2IFG |= 0x02;
buttonCnt = 0;
Wait();
break;
case 6: // P2.2 IFG
__delay_cycles(100);
buttonPressed =1;
P2IE &= ~BIT2;
P2IFG |= 0x04;
buttonCnt = 0;
ADC12CTL0 |= ADC12SC;
Wait();
break;
case 8: break; // P2.3 IFG
case 10: break; // P2.4 IFG
case 12: break; // P2.5 IFG
case 14: break; // P2.6 IFG
case 16: break; // P2.7 IFG
}
}
//------------------------------------------------------------------------------
#pragma vector=ADC12_VECTOR
__interrupt void ADC12ISR (void)
{
switch(__even_in_range(ADC12IV,34))
{
case 0: break; // Vector 0: No interrupt
case 2: break; // Vector 2: ADC overflow
case 4: break; // Vector 4: ADC timing overflow
case 6: // Vector 6: ADC12IFG0
TakeVolt(msg);
WaitDisp(5, msg);
break;
case 8: break; // Vector 8: ADC12IFG1
case 10: break; // Vector 10: ADC12IFG2
case 12: break; // Vector 12: ADC12IFG3
case 14: break; // Vector 14: ADC12IFG4
case 16: break; // Vector 16: ADC12IFG5
case 18: break; // Vector 18: ADC12IFG6
case 20: break; // Vector 20: ADC12IFG7
case 22: break; // Vector 22: ADC12IFG8
case 24: break; // Vector 24: ADC12IFG9
case 26: break; // Vector 26: ADC12IFG10
case 28: break; // Vector 28: ADC12IFG11
case 30: break; // Vector 30: ADC12IFG12
case 32: break; // Vector 32: ADC12IFG13
case 34: break; // Vector 34: ADC12IFG14
default: break;
}}
#pragma vector=CC1101_VECTOR
__interrupt void CC1101_ISR(void)
{
switch(__even_in_range(RF1AIV,32)) // Prioritizing Radio Core Interrupt
{
case 0: break; // No RF core interrupt pending
case 2: break; // RFIFG0
case 4: break; // RFIFG1
case 6: break; // RFIFG2
case 8: break; // RFIFG3
case 10: break; // RFIFG4
case 12: break; // RFIFG5
case 14: break; // RFIFG6
case 16: break; // RFIFG7
case 18: break; // RFIFG8
case 20: // RFIFG9
if(!(RF1AIES & BIT9)) // RX sync word received
{
for(int i=0; i<8; i++)
msg[i]=' ';
msg[0]='I';
msg[1]='n';
msg[2]='t';
WaitDisp(5, msg);
setReceiving(1);
__bic_SR_register_on_exit(LPM3_bits); // Exit active
}
break;
case 22: break; // RFIFG10
case 24: break; // RFIFG11
case 26: break; // RFIFG12
case 28: break; // RFIFG13
case 30: break; // RFIFG14
case 32: break; // RFIFG15
}
#ifndef MAIN_H_
#define MAIN_H_
#include "cc430F6137.h"
#include "RF_1_fun.h"
void InitButtonLeds(void);
void InitRadio(void);
void InitTimer(void);
void WaitDisp(unsigned int Time, unsigned char* action);
void ChButton(void);
void Wait(void);
void get(unsigned char* id);
#define PATABLE_VAL (0x51)
RF_SETTINGS rfSettings = {
0x08, // FSCTRL1 Frequency synthesizer control.
0x00, // FSCTRL0 Frequency synthesizer control.
0x23, // FREQ2 Frequency control word, high byte.
0x31, // FREQ1 Frequency control word, middle byte.
0x3B, // FREQ0 Frequency control word, low byte.
0xCA, // MDMCFG4 Modem configuration.
0x83, // MDMCFG3 Modem configuration.
0x93, // MDMCFG2 Modem configuration.
0x22, // MDMCFG1 Modem configuration.
0xF8, // MDMCFG0 Modem configuration.
0x00, // CHANNR Channel number.
0x34, // DEVIATN Modem deviation setting (when FSK modulation is enabled).
0x56, // FREND1 Front end RX configuration.
0x10, // FREND0 Front end TX configuration.
0x18, // MCSM0 Main Radio Control State Machine configuration.
0x16, // FOCCFG Frequency Offset Compensation Configuration.
0x6C, // BSCFG Bit synchronization Configuration.
0x43, // AGCCTRL2 AGC control.
0x40, // AGCCTRL1 AGC control.
0x91, // AGCCTRL0 AGC control.
0xE9, // FSCAL3 Frequency synthesizer calibration.
0x2A, // FSCAL2 Frequency synthesizer calibration.
0x00, // FSCAL1 Frequency synthesizer calibration.
0x1F, // FSCAL0 Frequency synthesizer calibration.
0x59, // FSTEST Frequency synthesizer calibration.
0x81, // TEST2 Various test settings.
0x35, // TEST1 Various test settings.
0x09, // TEST0 Various test settings.
0x47, // FIFOTHR RXFIFO and TXFIFO thresholds.
0x29, // IOCFG2 GDO2 output pin configuration.
0x06, // IOCFG0 GDO0 output pin configuration. Refer to SmartRF® Studio User Manual for detailed pseudo register explanation.
0x04, // PKTCTRL1 Packet automation control.
0x04, // PKTCTRL0 Packet automation control.
0x00, // ADDR Device address.
0x64 // PKTLEN Packet length.
};
#endif
#include "CoupleProto.h"
#include "RF_1_fun.h"
#include "cc430F6137.h"
#include "crc16.h"
unsigned char CProtoFlagOK = 0;
unsigned char CProtoIdSelf[10] = {0};
unsigned char CProtoIdPar[10] = {0};
unsigned char CProtoPos = 0;
unsigned char CProtoFlags = 0;
unsigned char CProtoFlagFail = 0;
unsigned char* CProtoGlobData;
unsigned int CProtoGlobDataLength = 0;
unsigned char RxBuffer[PACKET_LEN+2] = {0};
unsigned char TxBuffer[PACKET_LEN]= {0};
unsigned char CProtoTransmitting = 0;
unsigned char CProtoReceiving = 0;
unsigned char txBytesLeft = PACKET_LEN; // +1 for length byte
unsigned char txPosition = 0;
unsigned char rxBytesLeft = PACKET_LEN+2; // +2 for status bytes
unsigned char rxPosition = 0;
unsigned char lengthByteRead = 0;
unsigned short CProtoLastTime = 0;
unsigned int CProtoTimeLoop = 0;
unsigned char CProtoTimeOut = 0;
unsigned char CProtoFlagWait = 0;
unsigned char packetReceived = 0;
unsigned char packetTransmit = 0;
unsigned char transmitting = 0;
unsigned char receiving = 0;
char ClientInit(void)
{
char initSys = 0;
CProtoFlagOK = 0;
GetSelfId();
CProtoFlags = INIT_FLAG;
ReceiveOff();
FormMsg();
TransmitPacket();
ReceiveOn();
while((!initSys))&&(!ButtonSet))
{
__bis_SR_register( LPM3_bits + GIE );
__no_operation();
if(receiving)
{
ReceivePacket();
ChRecDataInit();
if(CProtoFlagOK)
{
GetParId();
initSys = 1;
FormMsg();
TransmitPacket();
}
else
ReceiveOn();
}
}
ReceiveOff();
return (initSys);
}
char ServerInit(void)
{
char initSys = 0;
int msgCnt = 0;
CProtoFlagOK = 0;
ReceiveOn();
while((!initSys))&&(!ButtonSet))
{
WaitSec(3);
if(receiving)
{
ReceivePacket();
ChRecDataInit();
if (CProtoFlagOK)
{
CProtoFlagOK = 0;
StopWaitTimer();
GetParId();
GetSelfId();
FormMsg();
while((!initSys)&&(msgCnt<3))
{
ReceiveOff();
TransmitPacket();
ReceiveOn();
CProtoTimeOut = 0;
while((!initSys)&&(!CProtoTimeOut))
{
WaitSec(1);
if(receiving)
{
ReceivePacket();
ChRecData( );
if(CProtoFlagOK)
initSys = 1;
else
ReceiveOn();
}
if(CProtoTimeOut)
msgCnt++;
}
}
StopWaitTimer();
}
receiving = 0;
}
}
StopWaitTimer();
ReceiveOff();
return (initSys);
}
char TransDataProto(unsigned char* Data_Buffer, int Data_Length)
{
CProtoGlobData = Data_Buffer;
CProtoGlobDataLength = Data_Length;
char msgCnt = 0;
CProtoFlagOK = 0;
CProtoFlags = 0;
CProtoPos++;
FormMsg();
while((!CProtoFlagOK)&&(msgCnt<3))
{
ReceiveOff();
TransmitPacket();
ReceiveOn();
CProtoTimeOut = 0;
while((!CProtoFlagOK)&&(!CProtoTimeOut))
{
WaitSec(3);
if(receiving)
{
ReceivePacket();
ChRecData();
ReceiveOn();
}
if(CProtoTimeOut)
msgCnt++;
}
}
StopWaitTimer();
return (CProtoFlagOK);
}
char RecDataProto(unsigned char* Data_Buffer, int Data_Length)
{
CProtoGlobDataLength = Data_Length;
CProtoFlagOK = 0;
ReceivePacket();
ChRecData();
if(!CProtoFlagOK)
{
CProtoGlobData = Data_Buffer;
GetData();
FormMsg();
TransmitPacket();
}
return (CProtoFlagOK);
}
void ReceiveOn(void)
{
RF1AIES &= ~BIT9;
RF1AIFG = 0;
RF1AIE |= BIT9;
Strobe( RF_SRX );
__no_operation();
}
void ReceiveOff(void)
{
RF1AIE &= ~BIT9;
RF1AIFG &= ~BIT9;
RF1AIES &= ~BIT9;
Strobe(RF_SIDLE);
Strobe(RF_SFRX);
}
void GetSelfId(void) //Вытаскивает_id_микроконтроллера-------------------
{
unsigned char *idadr;
idadr = 0x0000;
idadr = idadr + 0x0ff0;
for (int h=0; h<10; h++)
CProtoIdSelf[h] = *(idadr + h);
}
void GetParId(void)
{
for (int h=0; h<10; h++)
CProtoIdPar[h] = RxBuffer[h+10];
}
void GetData(void)
{
int h = 0;
while (h < CProtoGlobDataLength)
{
CProtoGlobData[CProtoGlobDataLength] = RxBuffer[22+h];
h++;
}
}
void FormMsg(void)
{
short crc;
for (int h=0; h<10; h++)
{
TxBuffer[h] = CProtoIdPar[h];
TxBuffer[h + 10] = CProtoIdSelf[h];
}
TxBuffer[20] = CProtoFlags;
TxBuffer[21] = CProtoPos;
int h=0;
while (h < CProtoGlobDataLength)
{
TxBuffer[22+h] = CProtoGlobData[CProtoGlobDataLength];
h++;
}
crc = CRC16(TxBuffer, 22 + CProtoGlobDataLength);
TxBuffer[23 + CProtoGlobDataLength] = crc;
TxBuffer[22 + CProtoGlobDataLength] = crc>>8;
}
void ChRecData(void)
{
short crc, crcIn = 0;
CProtoFlagFail = 0;
CProtoFlags = 0;
for (int h=0; h<10; h++)
{
if((CProtoIdSelf[h] != RxBuffer[h])||(CProtoIdPar[h] != RxBuffer[h + 10]))
{
CProtoFlagFail = 1;
break;
}
}
if(!CProtoFlagFail)
{
crc = CRC16(RxBuffer, PACKET_LEN + CProtoGlobDataLength - 2);
crcIn = RxBuffer[22 + CProtoGlobDataLength];
crcIn = crcIn<<8;
crcIn |= RxBuffer[23 + CProtoGlobDataLength];
if(crc != crcIn)
{
TxBuffer[21] = ERR_FLAG;
ReceiveOff();
TransmitPacket();
ReceiveOn();
CProtoFlagFail = 1;
}
else
{
switch (RxBuffer[20] & 0x30)
{
case 0x00:
if ((RxBuffer[20] == (CProtoPos + 1)) || (RxBuffer[20] == CProtoPos))
{
CProtoFlags |= ACK_FLAG;
if(RxBuffer[20] == (CProtoPos + 1))
CProtoPos++;
CProtoFlagOK = 1;
}
else
{
CProtoFlagFail = 1;
}
break;
case 0x20:
if (RxBuffer[20] == (CProtoPos - 1))
{
ReceiveOff();
TransmitPacket();
ReceiveOn();
CProtoFlagFail = 1;
}
else if (RxBuffer[20] == CProtoPos)
{
CProtoFlags = ACK_FLAG;
CProtoFlagOK = 1;
}
else
{CProtoFlagFail = 1;}
break;
case 0x10:
CProtoFlagOK = 1;
break;
default:
CProtoFlagFail = 1;
break;
}
}
}
}
void ChRecDataInit(void)
{
short crc, crcIn = 0;
CProtoFlagFail = 0;
CProtoFlags = 0;
if (RxBuffer[20] & 0x80)
{
crc = CRC16(RxBuffer, PACKET_LEN + CProtoGlobDataLength - 2);
crcIn = RxBuffer[22 + CProtoGlobDataLength];
crcIn = crcIn<<8;
crcIn |= RxBuffer[23 + CProtoGlobDataLength];
if(crc != crcIn)
{CProtoFlagFail = 1;}
else
{
CProtoPos++;
CProtoFlagOK = 1;
}
}
else if ((RxBuffer[21] == (CProtoPos + 1)) || (RxBuffer[21] == CProtoPos))
{
for (int h=0; h<10; h++)
{
if(CProtoIdSelf[h] != RxBuffer[h])
{
CProtoFlagFail = 1;
break;
}
}
if(!CProtoFlagFail)
{
crc = CRC16(RxBuffer, PACKET_LEN + CProtoGlobDataLength - 2);
crcIn = RxBuffer[22 + CProtoGlobDataLength];
crcIn = crcIn<<8;
crcIn |= RxBuffer[23 + CProtoGlobDataLength];
if(crc != crcIn)
{
TxBuffer[21] = ERR_FLAG;
ReceiveOff();
TransmitPacket();
ReceiveOn();
CProtoFlagFail = 1;
}
else
{
if (RxBuffer[21] == (CProtoPos + 1))
CProtoPos++;
CProtoFlags = ACK_FLAG;
}
}
}
}
void WaitSec(unsigned int Time)
{
if(CProtoFlagWait == 2)
{
TA0CTL &= ~(MC_3);
CProtoFlagWait = 1;
TA0CCR1 = CProtoLastTime;
if (TA0CCR1 < 50)
TA0CCR1 = 50;
TA0CCTL1 |= CCIE;
TA0CTL |= MC_2 + TACLR;
__bis_SR_register(LPM3_bits + GIE);
__no_operation();
TA0CCTL2 &= ~(CCIE);
}
if(!CProtoFlagWait)
{
CProtoTimeLoop = Time;
CProtoTimeOut = 1;
CProtoFlagWait = 1;
}
while((CProtoTimeLoop) && (CProtoTimeOut))
{
CProtoTimeOut = 0;
CProtoTimeLoop--;
TA0CTL &= ~(MC_3);
TA0CCR1 = 32768;
TA0CCTL1 |= CCIE;
TA0CTL |= MC_2 + TACLR;
__bis_SR_register(LPM3_bits + GIE);
__no_operation();
TA0CCTL2 &= ~(CCIE);
}
if(CProtoTimeOut)
{
CProtoFlagWait = 0;
}
else
{
CProtoFlagWait = 2;
CProtoLastTime = TA0CCR2;
}
}
void StopWaitTimer(void)
{
TA0CCR2 = 32768;
TA0CCTL2 &= ~(CCIE);
CProtoTimeLoop = 0;
CProtoTimeOut = 0;
CProtoFlagWait = 0;
}
void ReceivePacket(void)
{
rxBytesLeft = PACKET_LEN + CProtoGlobDataLength + 2;// Set maximum packet leng + 2 for appended bytes
rxPosition = 0;
packetReceived = 0;
__delay_cycles(2800); // Wait for bytes to fill in RX FIFO
TA0CTL &= ~(MC_3);
TA0CCR1 = RX_TIMER_PERIOD; // x cycles * 1/32768 = y us
TA0CCTL1 |= CCIE;
TA0CTL |= MC_2 + TACLR; // Start the timer- continuous mode
__bis_SR_register(LPM3_bits + GIE);
__no_operation();
TA0CCR1 = RX_TIMER_PERIOD;
TA0CCTL1 &= ~(CCIE);
//TA0CTL &= ~(MC_3); // Turn off timer
__no_operation();
}
void TransmitPacket(void)
{
P2OUT |= BIT6; // Pulse LED during Transmit
txBytesLeft = PACKET_LEN + CProtoGlobDataLength;
txPosition = 0;
packetTransmit = 0;
transmitting = 1;
Strobe( RF_STX ); // Strobe STX
TA0CTL &= ~(MC_3);
TA0CCR1 = TX_TIMER_PERIOD; // x cycles * 1/32768 = y us
TA0CCTL1 |= CCIE;
TA0CTL |= MC_2 + TACLR; // Start the timer- continuous mode
__bis_SR_register(LPM3_bits + GIE);
__no_operation();
TA0CCR1 = TX_TIMER_PERIOD; // x cycles * 1/32768 = y us
TA0CCTL1 &= ~(CCIE);
// TA0CTL &= ~(MC_3); // Turn off timer
P2OUT &= ~BIT6; // Turn off LED after Transmit
}
void pktRxHandler(void) {
unsigned char RxStatus;
unsigned char bytesInFifo;
RxStatus = Strobe(RF_SNOP);
switch(RxStatus & CC430_STATE_MASK)
{
case CC430_STATE_RX:
if (bytesInFifo = MIN(rxBytesLeft, RxStatus & CC430_FIFO_BYTES_AVAILABLE_MASK))
{
rxBytesLeft -= bytesInFifo;
while (bytesInFifo--) {
RxBuffer[rxPosition] = ReadSingleReg(RXFIFO);
rxPosition++;
}
if (!rxBytesLeft){
packetReceived = 1;
receiving = 0;
lengthByteRead = 0;
ReceiveOff();
P2OUT ^= BIT7;
}
}
break;
default:
if(!packetReceived)
{
packetReceived = 1;
}
rxBytesLeft = 0;
receiving = 0;
ReceiveOff();
break;
}
}
void pktTxHandler(void) {
unsigned char freeSpaceInFifo;
unsigned char TxStatus;
TxStatus = Strobe(RF_SNOP);
switch (TxStatus & CC430_STATE_MASK) {
case CC430_STATE_TX:
if (freeSpaceInFifo = MIN(txBytesLeft, TxStatus & CC430_FIFO_BYTES_AVAILABLE_MASK))
{
txBytesLeft -= freeSpaceInFifo;
while(freeSpaceInFifo--)
{
WriteSingleReg(TXFIFO, TxBuffer[txPosition]);
txPosition++;
}
if(!txBytesLeft)
{
RF1AIES |= BIT9; // End-of-packet TX interrupt
RF1AIFG &= ~BIT9; // clear RFIFG9
while(!(RF1AIFG & BIT9)); // poll RFIFG9 for TX end-of-packet
RF1AIES &= ~BIT9; // End-of-packet TX interrupt
RF1AIFG &= ~BIT9; // clear RFIFG9
transmitting = 0;
packetTransmit = 1;
}
}
break;
case CC430_STATE_TX_UNDERFLOW:
Strobe(RF_SFTX); // Flush the TX FIFO
__no_operation();
default:
if(!packetTransmit)
packetTransmit = 1;
if (transmitting) {
if ((TxStatus & CC430_STATE_MASK) == CC430_STATE_IDLE) {
transmitting = 0;
}
}
break;
}
}
unsigned char chCProtoFlagWait(void)
{
return (CProtoFlagWait);
}
void setCProtoTimeOut(unsigned char flag)
{
CProtoTimeOut = flag;
}
unsigned char chPacketReceived(void)
{
return (packetReceived);
}
unsigned char chPacketTransmit(void)
{
return (packetTransmit);
}
unsigned char chReceiving(void)
{
return (receiving);
}
unsigned char chTransmitting(void)
{
return (transmitting);
}
void setReceiving(unsigned char flag)
{
receiving = flag;
}
void setTransmitting(unsigned char flag)
{
transmitting = flag;
}
#include "cc430f6137.h"
#include "ADC.h"
void InitAdc(void)
{
P2SEL |= BIT3;
ADC12CTL0 = ADC12ON+ADC12SHT02; // Turn on ADC12, set sampling time
ADC12CTL1 = ADC12SHP; // Use sampling timer
ADC12MCTL0 = ADC12SREF_1; // Vr+=Vref+ and Vr-=AVss
}
int TakeVot(int maxVolt)
{
ADC12CTL0 |= ADC12SC;
while (!(ADC12IFG & BIT0));
int Voltage = (int)(((long)ADC12MEM0*maxVolt*100)/4095);
return (Voltage);
}
#include "crc16.h"
const unsigned short CRC16_Table[256] = {
0x0000, 0x1021, 0x2042, 0x3063, 0x4084, 0x50A5, 0x60C6, 0x70E7,
0x8108, 0x9129, 0xA14A, 0xB16B, 0xC18C, 0xD1AD, 0xE1CE, 0xF1EF,
0x1231, 0x0210, 0x3273, 0x2252, 0x52B5, 0x4294, 0x72F7, 0x62D6,
0x9339, 0x8318, 0xB37B, 0xA35A, 0xD3BD, 0xC39C, 0xF3FF, 0xE3DE,
0x2462, 0x3443, 0x0420, 0x1401, 0x64E6, 0x74C7, 0x44A4, 0x5485,
0xA56A, 0xB54B, 0x8528, 0x9509, 0xE5EE, 0xF5CF, 0xC5AC, 0xD58D,
0x3653, 0x2672, 0x1611, 0x0630, 0x76D7, 0x66F6, 0x5695, 0x46B4,
0xB75B, 0xA77A, 0x9719, 0x8738, 0xF7DF, 0xE7FE, 0xD79D, 0xC7BC,
0x48C4, 0x58E5, 0x6886, 0x78A7, 0x0840, 0x1861, 0x2802, 0x3823,
0xC9CC, 0xD9ED, 0xE98E, 0xF9AF, 0x8948, 0x9969, 0xA90A, 0xB92B,
0x5AF5, 0x4AD4, 0x7AB7, 0x6A96, 0x1A71, 0x0A50, 0x3A33, 0x2A12,
0xDBFD, 0xCBDC, 0xFBBF, 0xEB9E, 0x9B79, 0x8B58, 0xBB3B, 0xAB1A,
0x6CA6, 0x7C87, 0x4CE4, 0x5CC5, 0x2C22, 0x3C03, 0x0C60, 0x1C41,
0xEDAE, 0xFD8F, 0xCDEC, 0xDDCD, 0xAD2A, 0xBD0B, 0x8D68, 0x9D49,
0x7E97, 0x6EB6, 0x5ED5, 0x4EF4, 0x3E13, 0x2E32, 0x1E51, 0x0E70,
0xFF9F, 0xEFBE, 0xDFDD, 0xCFFC, 0xBF1B, 0xAF3A, 0x9F59, 0x8F78,
0x9188, 0x81A9, 0xB1CA, 0xA1EB, 0xD10C, 0xC12D, 0xF14E, 0xE16F,
0x1080, 0x00A1, 0x30C2, 0x20E3, 0x5004, 0x4025, 0x7046, 0x6067,
0x83B9, 0x9398, 0xA3FB, 0xB3DA, 0xC33D, 0xD31C, 0xE37F, 0xF35E,
0x02B1, 0x1290, 0x22F3, 0x32D2, 0x4235, 0x5214, 0x6277, 0x7256,
0xB5EA, 0xA5CB, 0x95A8, 0x8589, 0xF56E, 0xE54F, 0xD52C, 0xC50D,
0x34E2, 0x24C3, 0x14A0, 0x0481, 0x7466, 0x6447, 0x5424, 0x4405,
0xA7DB, 0xB7FA, 0x8799, 0x97B8, 0xE75F, 0xF77E, 0xC71D, 0xD73C,
0x26D3, 0x36F2, 0x0691, 0x16B0, 0x6657, 0x7676, 0x4615, 0x5634,
0xD94C, 0xC96D, 0xF90E, 0xE92F, 0x99C8, 0x89E9, 0xB98A, 0xA9AB,
0x5844, 0x4865, 0x7806, 0x6827, 0x18C0, 0x08E1, 0x3882, 0x28A3,
0xCB7D, 0xDB5C, 0xEB3F, 0xFB1E, 0x8BF9, 0x9BD8, 0xABBB, 0xBB9A,
0x4A75, 0x5A54, 0x6A37, 0x7A16, 0x0AF1, 0x1AD0, 0x2AB3, 0x3A92,
0xFD2E, 0xED0F, 0xDD6C, 0xCD4D, 0xBDAA, 0xAD8B, 0x9DE8, 0x8DC9,
0x7C26, 0x6C07, 0x5C64, 0x4C45, 0x3CA2, 0x2C83, 0x1CE0, 0x0CC1,
0xEF1F, 0xFF3E, 0xCF5D, 0xDF7C, 0xAF9B, 0xBFBA, 0x8FD9, 0x9FF8,
0x6E17, 0x7E36, 0x4E55, 0x5E74, 0x2E93, 0x3EB2, 0x0ED1, 0x1EF0
};
unsigned short CRC16(unsigned char *BufI, unsigned short LenB)
{
unsigned short crc, i0;
crc = 0xFFFF; i0 = LenB;
while(i0--)
crc = (crc << 8) ^ CRC16_Table[(crc >> 8) ^ *BufI++];
return(crc);
}
#include "LCD.h"
const unsigned int ascii_to_lcd_digit_e [] =
{
0,/*DW 0 ; displays "SP" */
0,/*DW 0 ; displays "!" */
0,/*DW 0 ; displays " " "*/
0,/*DW 0 ; displays "#" */
0,/*DW 0 ; displays "$" */
0,/*DW 0 ; displays "%" */
0,/*DW 0 ; displays "&" */
0,/*DW 0 ; displays " ' "*/
0,/*DW 0 ; displays "(" */
0,/*DW 0 ; displays ")" */
0,/*DW 0 ; displays "*" */
Подобные документы
Устройство и назначение однокристальных микроконтроллеров, сферы их применения. Разработка контроллера для управления домашней метеостанцией: расчет принципиальной схемы и характеристика ее элементов, выбор датчиков. Описание программы управления.
курсовая работа [280,3 K], добавлен 28.12.2012Устройство и назначение однокристальных микроконтроллеров, сферы их применения. Разработка контроллера для управления роботизированной платформой, ориентированной на движение по напольной линии. Расчет функциональной и принципиальной схемы управления.
курсовая работа [540,6 K], добавлен 28.12.2012Разработка структурной схемы устройства управления учебным роботом. Выбор двигателя, микроконтроллера, микросхемы, интерфейса связи и стабилизатора. Расчет схемы электрической принципиальной. Разработка сборочного чертежа устройства и алгоритма программы.
курсовая работа [577,8 K], добавлен 24.06.2013Выбор манипулятора-указателя, микропроцессора, интерфейса подключения к ПК. Обзор используемых команд. Проектирование функциональной и электрической принципиальной схемы контроллера трекбола. Разработка алгоритма и программы функционирования системы.
курсовая работа [453,3 K], добавлен 22.10.2012Выбор беспроводной технологии передачи данных. Механизмы управления качеством передачи потоков. Программное обеспечение приемной и передающей станции. Эксперименты, направленные на изучение неравномерности передаваемого потока данных при доступе к среде.
дипломная работа [1,1 M], добавлен 18.05.2012Механизмы управления транзакциями в СУБД. Обзор средств удаленного взаимодействия с объектами. Разработка подсистемы управления транзакциями. Практический анализ производительности подсистемы. Способы защиты пользователей от опасных и вредных факторов.
дипломная работа [449,9 K], добавлен 14.03.2013Разработка системы контроля, управления и диспетчеризации куста скважин. Выбор кустового контроллера, аппаратных средств нижнего и верхнего уровня, средств передачи данных, SCADA-приложения. Расчет надежности и экономической эффективности проекта.
дипломная работа [2,0 M], добавлен 29.09.2013Разработка аппаратно-программного комплекса для осуществления идентификации объектов управления на основе вещественного интерполяционного метода. Анализ работоспособности аппаратно-программного комплекса, пример идентификации объекта управления.
магистерская работа [2,2 M], добавлен 11.11.2013Мобильные роботы и комплексы на их основе. Аналитический обзор программных средств по созданию базы данных и интерфейсов пользователей. Open Interface и классификация команд. Разработка аппаратного комплекса для формирования управляющих программ робота.
дипломная работа [2,3 M], добавлен 22.06.2014Преимущества и недостатки роботизированной сварки. Характеристика видов систем управления базами данных. Информационная модель сварочного робота, системы управления роботом сварочных клещей. Критерии выбора робота и структура запроса на выборку.
курсовая работа [3,3 M], добавлен 22.12.2014