Разработка автономного аппаратно-программного комплекса средств для подсистемы управления "Роботом-дозиметристом"

Контроллер управления двигателями. Назначение, краткая характеристика, перспективы внедрения робота-дозиметриста. Обзор основных способов беспроводной передачи данных на большие расстояния. Проектирование принципиальной схемы бортового контроллера.

Рубрика Программирование, компьютеры и кибернетика
Вид дипломная работа
Язык русский
Дата добавления 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 "*" */


Подобные документы

Работы в архивах красиво оформлены согласно требованиям ВУЗов и содержат рисунки, диаграммы, формулы и т.д.
PPT, PPTX и PDF-файлы представлены только в архивах.
Рекомендуем скачать работу.