Управление ракетной техникой

Разработка комплекса программных средств управления летательными аппаратами. Контроль измерения параметров полёта. Сохранение информации во флеш-памяти на борту ракеты. Структура данных модуля навигации. Специфика операционных систем в микроконтроллерах.

Рубрика Программирование, компьютеры и кибернетика
Вид дипломная работа
Язык русский
Дата добавления 04.07.2018
Размер файла 2,9 M

Отправить свою хорошую работу в базу знаний просто. Используйте форму, расположенную ниже

Студенты, аспиранты, молодые ученые, использующие базу знаний в своей учебе и работе, будут вам очень благодарны.

Кольцевой буфер удобен для случаев, когда имеется один отправитель и несколько получателей, но нужно иметь для каждого получателя отдельный индекс idxOUT.

Кольцевой буфер не очень удобен для случаев, когда имеется несколько отправителей и один получатель, тогда при выборке информации из буфера необходимо правильно её сортировать. Если задан только один получатель и только один отправитель, то кольцевой буфер обеспечивает быстродействие и простоту реализации.

В бортовой системе для формирования пакета передачи (см. таблицу 1) опрашивается несколько кольцевых буферов. Это не очень удобно, в дальнейшем планируется использование флажкового буфера или очередей ОС [20].

5.2 Драйвер CC1125

Программная модель трансивера представлена 301 регистром; значительно упрощает процесс конфигурирование SmartRF Studio - утилита от производителя трансивера, которая делает настройку более понятной и не позволяет задать недопустимую комбинацию параметров [21].

На рисунке ниже представлен внешний вид SmartRF Studio.

Рисунок 17 - Внешний вид ПО SmartRF Studio

Таким образом, желательно выбрать необходимый режим работы в ПО SmartRF Studio, которое сгенерирует первоначальные значения для регистров. Необходимо скопировать их в программу МК, в раздел инициализации трансивера. Это и было сделано в процедуре CC112XInit. Были написаны и процедуры, облегчающие коммуникацию с трансивером CC1125.

Процедура CC112X_ReadRegister позволяет прочитать регистр по адресу address, прочитанное значение сохраняется по адресу data. CC112X_ReadRegister справляется как с обращением к (основному) пространству регистров, так и к расширенному пространству регистров. Дополнительно возвращается статус-байт приёмопередатчика. Процедура updateStatus по содержимому статус-байта анализирует текущее состояние CC1125.

Процедура CC112X_WriteRegister позволяет записать в регистр по адресу address значение data. CC112X_WriteRegister справляется как с обращением к (основному) пространству регистров, так и к расширенному пространству регистров. Дополнительно возвращается статус-байт приёмопередатчика.

Процедуры CC112X_BurstRead и CC112X_BurstWrite позволяют прочитать из регистров и записать в регистры соответственно. Используется режим Burst (Бёст), передаётся адрес первого регистра, массив байт для записи (чтения) и количество регистров для записи (чтения). Процедуры используют возможности CC1125 по автоинкременту адреса, так что такой подход позволяет снизить нагрузку на управляющий канал и на микроконтроллер при последовательной записи (чтении) множества регистров. Процедуры подходят для обращения к (основному) пространству регистров и к расширенному пространству регистров.

Процедуры CC112X_WriteStrobe и CC112X_UnsafeStrobe позволяют записать в приёмопередатчик строб-команду. Строб-команда - это короткая (один байт) команда без адреса, предписывающее совершить конкретное действие, например, перезагрузиться, отчистить приёмный буфер и другие. CC112X_WriteStrobe проверяет команду на соответствие синтаксису (два старших бита должны быть занулены), CC112X_UnsafeStrobe этого не делает, обеспечивая повышенное быстродействие.

Где vTaskDelay и portTICK_PERIOD_MS есть части операционной системы FreeRTOS. vTaskDelay(1/portTICK_PERIOD_MS) создаёт задержку на 1 мс, что аналогично использованию _delay_ms стандартного модуля delay.h в Atmel Studio.

Нить vCCWrite отвечает за передача по радиоканалу, в её бесконечном цикле ожидается наполнение кольцевых буферов GPS и вертикальной скорости, извлекаются данные из них и записываются непосредственно в FIFO трансивера, который при достижении заданной длины пакета (устанавливается регистром PKT_LEN) отправляет его по радиоканалу.

5.3 Сервис FatFs

Для резервирования принятых данных используется SD карта памяти. Для работы с ней используется SPI модуль, на его базе функционирует высокоуровневый сервис карты памяти FatFS, что обеспечивает переносимость кода для других платформ (ARM, AVR, 8051, PIC, Z80, 68k, Windows и другие), поддержку файловых систем, совместимых с ОС Windows. Таким образом, данные пишутся на карту, и для их считывания не требуется дополнительное ПО. В качестве файловой системы выбрана FAT16.

Лицензия сервиса FatFS - однопунктовая лицензия BSD: при повторном распространении исходного кода должно оставаться уведомление об авторском праве и последующий отказ от гарантий [22]. Алгоритм работы с сервисом FatFS:

Инициализизация SPI

SPI_Init();

Монтаж тома

f_mount (&fs,"0",1);

Открытие файла

open_append(&fil, "1.txt");

В нити приёмника vFatFsWrite запись данные из кольцевого буфера

f_printf(&fil, "%c", value);

f_sync(&fil);//flush буфера

f_close(&fil);//После приземления закрытие файла

6. Отладка контроллера

Отладка проводилась в системе моделирования Proteus 8. Далее перечислены достоинства этого продукта:

*Единая среда для разработки электронных схем, программного обеспечения и печатной платы (включая и 3D моделирование);

*Удобство разработки схем на основе МК;

*Единая база данных компонентов обеспечивает обмен данными между модулями Proteus в текущем проекте;

*Расширенные средства для работы с документацией к проекту;

*Большое количество различных моделей: аналоговые и цифровые электронные компоненты, периферийные устройства, интерактивные элементы ввода-вывода: кнопки, переключатели, двигатели, реле, виртуальные терминалы (UART, SPI, I2C, USB), виртуальные измерительные приборы и генераторы.

*возможность работы в многопроцессорном режиме;

*большое количество примеров проектирования устройств на основе МК различных типов.

Целью отладки является проверка алгоритмов, ПО, проверка взаимодействия МК, использующего ОСРВ FreeRTOS, с переферийными устройствами. Схема, собранная в Proteus, приведена на рисунке 18.

Далее приведено описание компонентов схемы для отладки в Proteus.

МК является основным компонентов схемы отладки. Виртуальная карта памяти подключена МК. Данная карта имитирующая реальную карту MMC в режиме SPI; сохранение полученной информации производится в файл на компьютере. Дополнительно для контроля SPI используется осциллограф, это позволяет видеть не только результат передачи, но и структуру сигналов.

Рисунок 18

Сервомашинки моделируются с помощью компонента PWMServo, специально предназначенного для моделирования сервомашинок, управляемых ШИМ. Для контроля управляющих сигналов сервомашинки были подключены к осциллографу (рисунок 19).

Рисунок 19 - Отладка ШИМ

Клавиатура для ручного управления сервомашинками представлена четыремя кнопками, подключена к GPIO.

Бинарный датчик начала движения ракеты - чека - представлена кнопкой с соответствующим названием, подключён к GPIO.

Аналоговый датчик дифференциального давления также представлен на схеме. Он моделируется делителем напряжения, это позволяющим изменять напряжение на выводе АЦП в процессе отладки.

Модуль местоположения подключён к аппаратному USART МК и представляет из себя виртуальный терминал USART. Это позволяет видеть данные для настройки модуля, посылаемые МК при старте, вводить строку данных местоположения; также этот терминал использовался для целей отладки - вывода сообщений МК на компьютер (рисунок 20).

Рисунок 20 - Монитор модуля местоположения, карта памяти

Трансивер представлен SPI терминалом, это позволяет контролировать передаваемую информацию.

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

Это позволило на ПК видеть состояние программы, значение интересующих переменных, факт того, что сообщение (не) приходит в нужный момент времени и др. Особенно удобна для целей отладки оказалась функция printf - мощное средство форматированного вывода. На рисунке ниже представлена схема для отладки в Proteus.

Рисунок 21 - Работа в эмуляторе

Для реализации основного функционала было затрачено 28556 байт памяти программ (21,8 %) и 3921 байт памяти данных (95,7 %), что делает дальнейшее расширение на базе Atmega128 затруднительным.

На таблице ниже представлено распределение ресурсов МК.

Таблица 3 - Распределение ресурсов МК

Наименование вывода

Назначение

PE7

Чека

PА4-PА7

Клавиатура управления сервомашинками

PF0

АЦП для датчика давления

PE0-PE1

UART

PC0-PC7

Выходы ШИМ (сервомашинки)

PB1-PB3

SPI

PB0

Выбор ведомого (карта памяти)

PD5

Выбор ведомого (трансивер)

PD0-PD1

I2C

PG2

Линия подключения светодиода

Для начала работы необходимо запустить среду Proteus 8 Professional и открыть приложенный файл проекта. Для начала симуляции в меню Debug выбрать Start VSM Debugging или нажать комбинацию клавиш Ctrl+F12, а затем Run Simulation или клавишу F12.

После запуска симуляции убедиться, что сервомашинки вышли на положение «закрыто» (+23,3), мигает светодиод-индикатор таймера D1. Одинарным нажатием одной из четырёх кнопок управления можно перевести соответствующую сервомашинку в положение «открыто» (-124). Двойное нажатие переводит соответствующую сервомашинку в положение «закрыто». При отрыве чеки аппаратура переходит в режим полёта, запускается индикатор режима полёта - раз в секунду начинает меняться уровень на PG0. На 16 секунде полёта открывается сервомашинка PH (блокировка крышки парашюта), на 17 секунде - сервомашинка PARACHUTE, на 18 секунде - CANSAT1, на 20 секунде - CANSAT2. В течении времени полёта (заданного заранее) происходит измерение ADC0 с делителя напряжения, получение данных с GPS имитируется посылкой любого символа в терминал.

Заключение

Целью выпускной квалификационной работы является разработка бортовой системы сбора данных и управления моделью ракеты типа TSR, разработанной студентами Самарского университета для участия в C'Space.

В процессе был проведен системный анализ объекта, разработана структурная схема системы. При её разработке предложено использовать последовательные интерфейсы и интеллектуальные средства ввода, вывода информации.

Анализ алгоритмов обработки показал, что с увеличением количества периферийных устройств и исполнительных устройств необходимо применение резидентной ОСРВ FreeRTOS.

Выбраны технические средства для реализации системы.

Разработано ПО, написанное на языке высокого уровня Си, с использованием компилятора GCC.

Модель системы, состоящая из основных, базовых элементов отлажена в среде моделирования Proteus. В процессе моделирования доказана работоспособность основных компонентов и ПО в целом.

Анализ результата моделирования показал, что ресурсы использованного МК по объёму памяти программ и данных выбраны почти полностью. Таким образом при дальнейшем развитии системы предполагается использовать 32-х разрядный МК с большим объёмом памяти. Результаты могут быть использованы в проектах одноступенчатых ракет и во вторых ступенях ракет типа TSR.

Список использованных источников

1. Cosmic Vision [Электронный ресурс] // ESA Science. - Электрон. дан. - URL: http:/www.esa.int/Our_Activities/Space_Science/?Cosmic_Vision_2015-2025_and_the_candidate_missions_are (дата обращения: 12.03.2017).

2. Черняев А.Г. Электроника студенческой ракеты [Текст] // Приборостроение в XXI веке - 2016. Интеграция науки, образования и производства: сб. материалов XII Междунар. научн. -техн. конф. (Ижевск, 23-25 нояб. 2016 г.). - Ижевск: Изд-во ИжГТУ имени М.Т. Калашникова, 2017. - С. 121-130.

3. Ракетный двигатель высокой мощности [Электронный ресурс] // Cesaroni technology. - Электрон. дан. - URL: http:/www.pro38.com/products/pro75/motor/MotorData.php?prodid=2486K510-P (дата обращения: 14.11.2016).

4. Иоффе В.Г. Проектирование микропроцессорных устройств на базе однокристальных микроконтроллеров. [Текст] // Самара: Самарский государственный аэрокосмический университет, 2014. 24 с.

5. Применение модулей приемников ML8088sE Управление приемником Рекомендации по применению [Электронный ресурс] // НАВИА - Электрон. дан., 2016. - URL: http://naviaglonass.ru/wp-content/uploads/ML8088sE_AppNote1_0.pdf (дата обращения: 01.06.2017).

6. Петунин А.Н. Методы и техника измерений параметров газового потока [Текст] // М.: Машиностроение, 1972. 332 с.

7. An Introduction to Air Density and Density Altitude Calculations [Электронный ресурс] // Richard Shelquist. - Электрон. дан. - URL: http://wahiduddin.net/calc/density_altitude.htm (дата обращения: 01.06.2017).

8. Косенко С. Новая серия датчиков дифференциального давления от omron [Текст] // «Вестник Электроники», №2, 2014 - С. 44-50.

9. Real Time Engineers. Детали лицензии [Электронный ресурс] // FreeRTOS Team. - Электрон. дан. - URL: http:/www.freertos.org/?a00114.html (дата обращения: 11.03.2017).

10. HighIntegritySystems. SAFERTOS [Электронный ресурс] // HighIntegritySystems. - Электрон. дан. - URL: http:/www.highintegritysystems.com/down-loads/manuals-datasheets/safertos-datasheet-downloads (дата обращения: 1.03.2017).

11. Червяков М.В. Операционная система для встраиваемых систем на базе 8-разрядных однокристальных микроконтроллеров [Текст]: диплом. проект. Самарский государственный аэрокосмический университет, Самара, 2012.

12. Чуфырев А. Е. Технический обзор особенностей операционной системы реального времени TI-RTOS [Текст] // Juvenis scientia. - 2016 г. - 1. - стр. 3-7.

13. Linx. ANT-433-HETH Data Sheet [Электронный ресурс] // linxtechnologies. - Электрон. дан. - URL: http:/www.linxtechnologies.com/resources/data-guides/ant-433-heth.pdf (дата обращения: 1.03.2017).

14. Рутледж Д. Энциклопедия практической электроники [Текст] // ДМК Пресс-е изд. М.: ДМК Пресс. 522 с.

15. Уоллес Р. Максимальная дальность связи по радиоканалу в системе: как этого добиться [Текст] // Новости Электроники, № 12, Dec 2015. С. 3-13.

16. Датчики давления. Типы, характеристики, особенности, подбор. [Электронный ресурс] // Контеч Систем. - Электрон. дан., 2016. - URL: http://kontech-system.com.ua/articles/datchiki-davlenija-tipy-harakteristiki-osobennosti-podbor (дата обращения: 01.06.2017).

17. AVR182: Zero Cross Detector [Электронный ресурс] // Atmel. - Электрон. дан. - URL: http://www.atmel.com/Images/Atmel-2508-Zero-Cross-Detector_ApplicationNote_AVR182.pdf (дата обращения: 01.06.2017).

18. MPU-9250 Product Specification [Электронный ресурс] // InvenSense. - Электрон. дан., 2016. - URL: https://www.invensense.com/wp-content/uploads/2015/02/PS-MPU-9250A-01-v1.1.pdf (дата обращения: 01.06.2017).

19. Кумарин А.А. Применение суперконденсаторов в качестве промежуточного хранилища энерии в системе энергоснабжения наноспутника [Текст] // Материалы секции «Промышленная электроника» 53-й международной научной студенсечкой конференции. - Новосибирск, Россия, 2015. - С. 15.

20. Курниц А. FreeRTOS. Взгляд изнутри. Алгоритм работы планировщика [Текст] // Компоненты и технологии, Т. 6, № 143, 2013. С. 89-94.

21. SmartRF Studio [Электронный ресурс] // Texas Instruments. - Электрон. дан., 2016. - URL: http://www.ti.com/tool/smartrftm-studio (дата обращения: 01.06.2017).

22. Chan. License [Электронный ресурс] // Elm-chan. - Электрон. дан., 2017. - URL: http:/ elm-chan.org/fsw/ff/en/appnote.html#license (дата обращения: 03.03.2017).

Приложение А

Справочные таблицы

Таблица А1 - Способы доступа к адресному пространству CC1125

Способ доступа

Command/Address byte

Описание

Одиночный доступ

(register space)

Адрес: R/WЇ 0 A5 A4 A3 A2 A1 A0

(A5 - 0 < 0x2F)

Бит R/WЇ определяет настройку операции на чтение (1) или на запись (0).

Регистровый доступ определяется адресом в

A5 - 0.

Точно один байт данных ожидается после байта адреса. Байт статуса возвращается на линию SO как при отправке адреса по линии SI, так и при записи данных.

Множественный доступ

(register space)

Адрес: R/WЇ 1 A5 A4 A3 A2 A1 A0

(A5 - 0 < 0x2F)

Бит R/WЇ определяет настройку операции на чтение (1) или на запись (0).

Адрес в А5 - 0 определяет первый регистр доступа к ним, после чего внутренний счетчик адреса увеличивается на единицу для каждого нового байта данных следующего за байтом адреса

Последовательность байты ожидается после байта адреса и пакет доступа завершается путем установки CSn высоким.

Байт состояния чипа возвращается на SO линию и когда адрес посылается на линии SI, а также, когда данные записываются.

Если внутренний счетчик адреса достигает адреса 0x2E (последний байт в регистре пространства) счетчик не будет увеличивать больше и тот же адрес будет читаться / записываться окончания пакетного доступа.

Одиночный доступ

(extended register space)

Команда: R/WЇ 0 1 0 1 1 1 1

Адрес: A7 A6 A5 A4 A3 A2 A1 A0

(A7 - 0: See Table 5)

Этот режим доступа инициализируется специальной командой (0x2F). Первый переданный байт интерпритируется как расширенный адрес.

Ровно один байт данных ожидается после расширенного байта адреса.

Когда расширенный адрес посылается на линию SI, SO вернет все нули. Байт состояния чип возвращается на линии SO, когда команда передается и когда данные записываются на расширенный адрес.

Множественный доступ

(extended register space)

Команда: R/WЇ 1 1 0 1 1 1 1

Адрес: A7 A6 A5 A4 A3 A2 A1 A0

(A7 - 0: See Table 5)

Этот режим доступа инициализируется специальной командой (0x2F).

Первый байт после этой команды интерпретируется как расширенный адрес.

Байты ожидаются последовательно после расширенного байта адреса, обмен завершается

установкой CSn в “1”.

Когда расширенный адрес посылается на линию SI, SO вернет все нули. Байт состояния чипа возвращается на линию SO, когда команды передается и когда данные записываются на расширенный адрес.

Если внутренний счетчик адреса достигает адреса 0xFF (последний байт в расширенном пространстве регистра), счетчик будет сброшен в 0х00.

Регистры, не перечисленные в таблице 5 [2], могут быть частью пакетного доступа.

Доступ для команд (строб)

Адрес: R/WЇ 0 A5 A4 A3 A2 A1 A0

(0x30 5?-0 ?A 0x3D)

Доступ к одному из регистров строба инициирует событие, определяемое адресом в A5 - 0, например, сброс устройства, запуск кварцевого генератора и т.д. Нет ожидаемых байтов данных.

Байт состояния чип возвращается на линии SO, когда команда строба отправляется на линии SI

Прямой доступ к FIFO

Команда: R/WЇ B 1 1 1 1 1 0

Адрес: A7 A6 A5 A4 A3 A2 A1 A0

A7 - 0 < 0x80: TX FIFO

0x80 ?7- 0 A? 0xFF: RX FIF

Этот режим доступа начинается с определенной команды (0x3e), которая позволяет получить доступ к FIFOs непосредственно через операции с памятью, не затрагивая FIFO указатели.

Первый байт после этой команды интерпретируется как адрес. Следующий байт - приёмник или источник. Если бёрст включен, последовательность байтов будет

читаться/записываться приращением к адресу 1.

FIFO указатели доступны в расширенном пространстве регистров для целей отладки.

Стандартный доступ к FIFO

Адрес: R/WЇ B 1 1 1 1 1 1

Бит R/WЇ определяет настройку операции на чтение (1) из RX FIFO или запись (0) в TX FIFO. Если бит бёрст установлен, все байты следуют за адресом до установления CSn в “1”.

Если бит бёрст сброшен, доступ к буферам FIFO реализуется побайтно как к обычному регистру.

Использование стандартного FIFO push/pop интерфейса 128 байтного TX FIFO и 128 байтного RX FIFO достигается использованием адреса 0x3F. Когда бит R/WЇ сброшен, TX FIFO доступен и RX

FIFO доступен когда бит R/WЇ установлен. При использование этого типа доступа, TX FIFO является write-only, RX FIFO является read-only.

Таблица А2 - Набор передаваемых сообщений

Бит

Маска бита

Сообщение

0

0x1

$GPGNS Message

1

0x2

$GPGGA Message

2

0x4

$GPGSA Message

3

0x8

$GPGST Message

4

0x10

$GPVTG Message

5

0x20

$PSTMNOISE Message

6

0x40

$GPRMC Message

7

0x80

$PSTMRF Message

8

0x100

$PSTMTG Message

9

0x200

$PSTMTS Message

10

0x400

$PSTMPA Message

11

0x800

$PSTMSAT Message

12

0x1000

$PSTMRES Message

13

0x2000

$PSTMTIM Message

14

0x4000

$PSTMWAAS Message

15

0x8000

$PSTMDIFF Message

16

0x10000

$PSTMCORR Message

17

0x20000

$PSTMSBAS Message

18

0x40000

$PSTMTESTRF Message

19

0x80000

$GPGSV Message

20

0x100000

$GPGLL Message

21

0x200000

$PSTMPPSDATA Message

22

0x400000

Reserved

23

0x800000

$PSTMCPU Message

24

0x1000000

$GPZDA Message

25

0x2000000

$PSTMTRAIMSTATUS Message

26

0x4000000

$PSTMPOSHOLD Message

27

0x8000000

$PSTMKFCOV Message

28

0x10000000

$PSTMAGPS Message

29

0x20000000

$PSTMLOWPOWERDATA Message

30

0x40000000

$PSTMNOTCHSTATUS

31

0x80000000

Reserved

Таблица А3 - Набор передаваемых сообщений

Имя

Страница

Параметр

Описание

Набор сообщений 0

NMEA Message List 0

CDB-ID 201

стандартная страница

Набор сообщений 1

NMEA Message List 1

CDB-ID 210

вспомогательная страница

Набор сообщений 2

NMEA Message List 2

CDB-ID 211

вспомогательная страница

NMEA Message List - набор сообщений, выводимый приемником в соответствующей странице, задаётся согласно таблице А2.

Таблица А4 - Особенности лицензий FreeRTOS и OpenRTOS

FreeRTOS Лицензия открытого ПО

OpenRTOS Коммерческая Лицензия

Является бесплатным?

Да

Нет

Могу ли использовать в коммерческой разработке?

Да

Да

Не требующая лицензионных отчислений?

Да

Да

Предоставляются гарантии?

Нет

Да

Могу ли я обращаться за поддержкой от производителя на коммерческой основе?

Нет, FreeRTOS поддерживается интернет-сообществом

Да

Предоставляются ли юридическая защита?

Нет

Да, защита интеллектуальной собственности предоставляется

Должен ли я открывать код своего проекта, использующего ОСРВ?

Нет

Нет

Должен ли я открывать мои изменения ядра ОСРВ?

Да

Нет

Должен ли я заявлять об использовании этой ОСРВ?

Да, если распространяете исходный код

Нет

Должен ли я давать доступ к коду этой ОСРВ пользователям моего ПО?

Да, если распространяете исходный код

Нет

Приложение Б

Листинг программы

Файл TWI_driver.c - драйвер модуля TWI (I2C)

#include "main.h"

#include "TWI_driver/twi.h"

#include "TWI_driver/TWI_driver.h"

#include <avr/io.h>

int TWI_SetValues(u8 address, unsigned char data[], int length, bool repeated)

{

uint8_t status = TWI_SUCCESS;

/*формируем состояние СТАРТ*/

TWCR = (1<<TWINT)|(1<<TWSTA)|(1<<TWEN);

while(!(TWCR & (1<<TWINT)));

/*выдаемна шину пакет SLA-W*/

TWDR = (address<<1)|0;

TWCR = (1<<TWINT)|(1<<TWEN);

while(!(TWCR & (1<<TWINT)));

int i=0;

for (i=0;i<length;i++){

TWDR = data[i];

TWCR = (1<<TWINT)|(1<<TWEN);//Говорим регистру управления, что мы хотим передать данные, содержащиеся в регистре данных TWDR

while(!(TWCR & (1<<TWINT)));

status = TWSR & TWSR_MASK;

if ((status != TWI_START) && (status != TWI_REP_START)) break;

}

if (!repeated) //если не репит(нонстоп) мод

TWCR = (1<<TWINT)|(1<<TWSTO)|(1<<TWEN);//формируем состояние СТОП

return i;

}

bool TWI_GetValues(u8 address, unsigned char data[], int length, bool repeated) {//вовзращает прочитанное в data

u8 value;

uint8_t status = TWI_SUCCESS;

bool result=true;

//формируем состояние СТАРТ

TWCR = (1<<TWINT)|(1<<TWSTA)|(1<<TWEN);

while(!(TWCR & (1<<TWINT)));

//выдаем на шину пакет SLA-R

TWDR = (address<<1)|1;

TWCR = (1<<TWINT)|(1<<TWEN);

while(!(TWCR & (1<<TWINT)));

//считываем данные

for (int i=0;i<length;i++){

TWCR = (1<<TWINT)|(1<<TWEN);

while(!(TWCR & (1<<TWINT)));

status = TWSR & TWSR_MASK;

if ((status != TWI_START) && (status != TWI_REP_START)) {result=false; break;}

data[i] = TWDR;

}

if (!repeated) //если не репит(нонстоп) мод

TWCR = (1<<TWINT)|(1<<TWSTO)|(1<<TWEN);//формируем состояние СТОП

return result;

}

Файл FreeRTOSConfig.h - конфигурация ОС FreeRTOS

#ifndef FREERTOS_CONFIG_H

#define FREERTOS_CONFIG_H

#include <avr/io.h>

#define configUSE_PREEMPTION1// 1-вытесняюшее ядро, 0- кооперативное

#define configUSE_IDLE_HOOK0// Задача "Бездействие"(idle hook) (1-используется, 0-не используется) если другие задачи не работают

#define configUSE_TICK_HOOK0// Функция перехвата ТИКА (1-используется, 0-не используется)

#define configCPU_CLOCK_HZ( ( unsigned long ) 8000000 )//частота в Гц, с которой работает внутреннее ядро процессора.

#define configTICK_RATE_HZ( ( portTickType ) 1000 ) //частота переключений RTOS по прерываниям 1000 ticks= ~1ms

#define configMAX_PRIORITIES( ( unsigned portBASE_TYPE ) 4 ) // Указывается максимальное число приоритетов для задач

#define configMINIMAL_STACK_SIZE( ( unsigned short ) 300 ) //110 Минимальный размер стека (задачи idle hook) . В общем, без необходимости, не стоит уменьшать это значение.

#define configSUPPORT_DYNAMIC_ALLOCATION 1

#define configTOTAL_HEAP_SIZE( (size_t ) ( 2400 ) )//Общий объем памяти (кучи) в байтах, только для heap_1, heap_2, heap_4

#define configMAX_TASK_NAME_LEN( 8 )//Максимальная длинна имени задачи

#define configUSE_TRACE_FACILITY0// Трассировка с записью в буфер (1-включена, 0-отключена)

#define configUSE_16_BIT_TICKS1 //задает тип 16-битного счетчика тиков, если равен 1 - portTickType определен как 16-битный unsigned. Если 0 - используется 32-битный unsigned

#define configIDLE_SHOULD_YIELD1//Определяет поведение задач с приоритетом idle hook

#define configUSE_MUTEXES 1

#define configUSE_RECURSIVE_MUTEXES 0

#define configUSE_COUNTING_SEMAPHORES 1

#define configQUEUE_REGISTRY_SIZE0

/* Co-routine definitions. */

#define configUSE_CO_ROUTINES 0//Использование сопрограмм (1-используется, 0-не используется)

#define configMAX_CO_ROUTINE_PRIORITIES ( 2 )//Указывается максимальное число приоритетов для сопрограмм

/* Software timer related definitions. */

#define configUSE_TIMERS 1

#define configTIMER_TASK_PRIORITY 3

#define configTIMER_QUEUE_LENGTH 10

#define configTIMER_TASK_STACK_DEPTH configMINIMAL_STACK_SIZE

/* Set the following definitions to 1 to include the API function, or zero

to exclude the API function. */

#define INCLUDE_vTaskPrioritySet 0

#define INCLUDE_uxTaskPriorityGet 0

#define INCLUDE_vTaskDelete 1

#define INCLUDE_vTaskSuspend 1

#define INCLUDE_xResumeFromISR 1

#define INCLUDE_vTaskDelayUntil 1

#define INCLUDE_vTaskDelay 1

#define INCLUDE_xTaskGetSchedulerState 1

#define INCLUDE_xTaskGetCurrentTaskHandle 1

#define INCLUDE_uxTaskGetStackHighWaterMark 1

#define INCLUDE_xTaskGetIdleTaskHandle 0

#define INCLUDE_eTaskGetState 0

#define INCLUDE_xEventGroupSetBitFromISR 1

#define INCLUDE_xTimerPendFunctionCall 1

#define INCLUDE_xTaskAbortDelay 0

#define INCLUDE_xTaskGetHandle 0

#define INCLUDE_xTaskResumeFromISR 1

#define INCLUDE_vTaskSuspend1

#endif /* FREERTOS_CONFIG_H */

Файл ffconf.h - конфигурация FatFs

#include "FreeRTOS_Source/FreeRTOS.h"

#include "FreeRTOS_Source/semphr.h"

#define _FFCONF 68020/* Revision ID */

#define _FS_READONLY0

#define _FS_MINIMIZE0

#define_USE_STRFUNC1

#define _USE_FIND1

#define_USE_MKFS1

#define_USE_FASTSEEK0

#define_USE_EXPAND1

#define _USE_CHMOD1

#define _USE_LABEL1

#define_USE_FORWARD0

#define _CODE_PAGE1

#define_USE_LFN0

#define_MAX_LFN255

#define_LFN_UNICODE0

#define _STRF_ENCODE0

#define _FS_RPATH2

#define _VOLUMES1

#define _STR_VOLUME_ID0

#define _VOLUME_STRS"RAM","NAND","CF","SD","SD2","USB","USB2","USB3"

#define_MULTI_PARTITION0

#define_MIN_SS512

#define_MAX_SS512

#define_USE_TRIM0

#define _FS_NOFSINFO0

#define_FS_TINY1

#define _FS_EXFAT0

#define _FS_NORTC1

#define _NORTC_MON5

#define _NORTC_MDAY1

#define _NORTC_YEAR2016

#define_FS_LOCK0

#define _FS_REENTRANT1

#define _FS_TIMEOUT1000

#define_SYNC_txSemaphoreHandle

Файл CC112X_SPI.c - драйвер CC1125

#include "CC112X_SPI_driver/CC112X.h"

#include "CC112X_SPI_driver/CC112X_SPI.h"

#include "FreeRTOSConfig.h"

#include "main.h"

#include "FreeRTOS_Source/FreeRTOS.h"

void CC112XInit(){

CC112X_WriteStrobe(CC112X_SRES);//CC112X reset

vTaskDelay(1 / portTICK_PERIOD_MS);//_delay_ms(100);

CC112X_WriteRegister(CC112X_IOCFG3,0xB0); //GPIO3 IO Pin Configuration

CC112X_WriteRegister(CC112X_IOCFG2,0x06); //GPIO2 IO Pin Configuration

CC112X_WriteRegister(CC112X_IOCFG1,0xB0); //GPIO1 IO Pin Configuration

CC112X_WriteRegister(CC112X_IOCFG0,0x40); //GPIO0 IO Pin Configuration

CC112X_WriteRegister(CC112X_SYNC_CFG1,0x0B); //Sync Word Detection Configuration Reg.

CC112X_WriteRegister(CC112X_DEVIATION_M,0xA3); //Frequency Deviation Configuration

CC112X_WriteRegister(CC112X_MODCFG_DEV_E,0x02); //Modulation Format and Frequency

CC112X_WriteRegister(CC112X_DCFILT_CFG,0x1C); //Digital DC Removal Configuration

CC112X_WriteRegister(CC112X_FREQ_IF_CFG,0x33); //RX Mixer Frequency Configuration

CC112X_WriteRegister(CC112X_IQIC,0xC6); //Digital Image Channel Compensation

CC112X_WriteRegister(CC112X_CHAN_BW,0x19); //Channel Filter Configuration

CC112X_WriteRegister(CC112X_MDMCFG0,0x05); //General Modem Parameter Configuration

CC112X_WriteRegister(CC112X_SYMBOL_RATE2,0x3F); //Symbol Rate Configuration Exponent and

CC112X_WriteRegister(CC112X_SYMBOL_RATE1,0x75); //Symbol Rate Configuration Mantissa

CC112X_WriteRegister(CC112X_SYMBOL_RATE0,0x10); //Symbol Rate Configuration

CC112X_WriteRegister(CC112X_AGC_REF,0x20); //AGC Reference Level

CC112X_WriteRegister(CC112X_AGC_CS_THR,0x19); //Carrier Sense Threshold

CC112X_WriteRegister(CC112X_AGC_CFG1,0xA9); //Automatic Gain Control

CC112X_WriteRegister(CC112X_AGC_CFG0,0xCF); //Automatic Gain Control

CC112X_WriteRegister(CC112X_FIFO_CFG,0x00); //FIFO Configuration

CC112X_WriteRegister(CC112X_FS_CFG,0x14); //Frequency Synthesizer

CC112X_WriteRegister(CC112X_PKT_CFG0,0x20); //Packet Configuration Reg. 0

CC112X_WriteRegister(CC112X_PKT_LEN,0xFF); //Packet Length Configuration

CC112X_WriteRegister(CC112X_IF_MIX_CFG,0x00); //IF Mix Configuration

CC112X_WriteRegister(CC112X_FREQOFF_CFG,0x22); //Frequency Offset Correction

CC112X_WriteRegister(CC112X_FREQ2,0x56); //Frequency Configuration [23:16]

CC112X_WriteRegister(CC112X_FREQ1,0xCC); //Frequency Configuration [15:8]

CC112X_WriteRegister(CC112X_FREQ0,0xCC); //Frequency Configuration [7:0]

CC112X_WriteRegister(CC112X_IF_ADC0,0x05); //Analog to Digital Converter

CC112X_WriteRegister(CC112X_FS_DIG1,0x00); //Frequency Synthesizer Digital

CC112X_WriteRegister(CC112X_FS_DIG0,0x5F); //Frequency Synthesizer Digital

CC112X_WriteRegister(CC112X_FS_CAL0,0x0E); //Frequency Synthesizer

CC112X_WriteRegister(CC112X_FS_DIVTWO,0x03); //Frequency Synthesizer Divide by

CC112X_WriteRegister(CC112X_FS_DSM0,0x33); //FS Digital Synthesizer Module

CC112X_WriteRegister(CC112X_FS_DVC0,0x17); //Frequency Synthesizer Divider

CC112X_WriteRegister(CC112X_FS_PFD,0x50); //Frequency Synthesizer Phase Frequency

CC112X_WriteRegister(CC112X_FS_PRE,0x6E); //Frequency Synthesizer Prescaler

CC112X_WriteRegister(CC112X_FS_REG_DIV_CML,0x14);//Frequency Synthesizer Divider

CC112X_WriteRegister(CC112X_FS_SPARE,0xAC); //Frequency Synthesizer Spare

CC112X_WriteRegister(CC112X_XOSC5,0x0E); //Crystal Oscillator Configuration Reg.

CC112X_WriteRegister(CC112X_XOSC3,0xC7); //Crystal Oscillator Configuration Reg.

CC112X_WriteRegister(CC112X_XOSC1,0x07); //Crystal Oscillator Configuration Reg.

}

//Передача одного байта, SPI

void spi_write_single(uint8_t data)

{

SPDR = data;

}

//Передача data и прием одного байта в имя функции

void spi_read_single(uint8_t* data)

{

*data=SPDR;

}

//См. Figure 15, стр 30 даташита CC112X

void CC112X_ReadRegister(uint16_t address, uint8_t * data)

{

//clear R/~W to Write and no Burst

if (address>0xFF) {address &= ~(1<<14); address |= 1<<15;}//2байтное число

else {address &= ~(1<<6); address |= 1<<7;}

spi_select_device;

while (ioport_get_pin_level);//Требование CC112X

if (address>0xFF) {

spi_write_single((uint8_t)(address>>8));//шлём старшую часть адреса

while(!spi_is_tx_ok);//wait SPI for ready

}

spi_write_single((uint8_t)address); //шлём младшую часть адреса

while(!spi_is_tx_ok);//wait SPI for ready delay_ms(5);

uint8_t status;//State-byte of CC112X

spi_read_single(&status);

updateStatus(status);

spi_write_single(0xFF);//шлём ерунду, чтобы читалось (сдвиговый р-р работает)

while(!spi_is_tx_ok);//wait SPI for ready delay_ms(5); //Tns = 200 ns delay

spi_read_single(&data);

spi_deselect_device;

}

//Single Register Access

void CC112X_WriteRegister(uint16_t address, uint8_t data)

{

//clear R/~W to Write and no Burst

if (address>0xFF) address &= ~(1<<15 | 1<<14);//2байтное число

else address &= ~(1<<7 | 1<<6);

spi_select_device;

while (ioport_get_pin_level); //Требование CC112X //10ns пауза

if (address>0xFF) {

spi_write_single((uint8_t)(address>>8));//шлём старшую часть адреса

while(!spi_is_tx_ok);//wait SPI for ready

}

spi_write_single((uint8_t)address); //шлём младшую часть адреса

while(!spi_is_tx_ok);//wait SPI for ready

//delay_ms(5);

spi_write_single(data);//шлём значение

while(!spi_is_tx_ok);//wait SPI for ready

uint8_t status;

spi_read_single( &status);

updateStatus(status);

spi_deselect_device;

}

void CC112X_WriteStrobe(uint8_t strobe)

{

strobe &= 0x3f; //clear R/~W and Burst

spi_select_device;

//while (ioport_get_pin_level(SPIC_MISO)); //НЕ использовать при стробе

spi_write_single(strobe);

while(!spi_is_tx_ok);//wait SPI for ready delay_ms(5);

//Получаем статус

uint8_t status;

spi_read_single(&status);

updateStatus(status);

spi_deselect_device;

}

//UnsafeStrobe don't use R/~W and Burst bit checks

void CC112X_UnsafeStrobe(uint8_t strobe)

{

spi_select_device;

//while (ioport_get_pin_level(SPIC_MISO)); //НЕ использовать при стробе

spi_write_single(strobe);

while(!spi_is_tx_ok);//wait SPI for ready delay_ms(5);

//Получаем статус

uint8_t status;

spi_read_single(&status);

updateStatus(status);

spi_deselect_device;

}

void CC112X_BurstRead(uint8_t address, uint8_t data[], uint8_t size)

{

if (size >0)

{

address |= (1<<7) | (1<<6);

spi_select_device;

//while (ioport_get_pin_level(SPIC_MISO)); // wait for slave to be ready

spi_write_single(address);

while(!spi_is_tx_ok);//wait SPI for ready

vTaskDelay(1 / portTICK_PERIOD_MS);//delay_ms(1);

for (uint8_t bw_i=0; bw_i < size; bw_i++) {

//delay_ms(5);

spi_write_single(0xFF);//ерунду

vTaskDelay(1 / portTICK_PERIOD_MS);//delay_ms(1);//tns=20 ns,

while(!spi_is_tx_ok);//wait SPI for ready

spi_read_single(&data[bw_i]);

}

//по идее тут можно забрать статус

uint8_t status;

spi_read_single(&status);

//updateStatus(status);//надо проверить

vTaskDelay(1 / portTICK_PERIOD_MS);//delay_ms(1);//tns=20 ns, см. Table 22

spi_deselect_device;

}

}

void CC112X_BurstWrite(uint8_t address, uint8_t data[], uint8_t size)

{

if (size >0)

{

address &= ~(1<<7);//Делаем, что в при любом address будет запись

address |= (1<<6);//В режиме Burst

spi_select_device;

while (ioport_get_pin_level); // wait for slave to be ready

spi_write_single(address);

while(!spi_is_tx_ok);

for (uint8_t bw_i=0; bw_i < size; bw_i++)

{

vTaskDelay(40 / portTICK_PERIOD_MS);

while(!spi_is_tx_ok);//wait SPI for ready

spi_write_single(data[bw_i]);

}

while(!spi_is_tx_ok);//tns=20 ns, см. Table 22

vTaskDelay(1 / portTICK_PERIOD_MS);//delay_ms(1);

//delay_ms(100);

spi_deselect_device;

}

}

void CC112X_ReadStatus()

{

uint8_t status_data;

spi_select_device;

while (ioport_get_pin_level); // wait for slave to be ready

spi_write_single(0b10000000);

while(!spi_is_tx_ok);//wait SPI for ready

spi_read_single(&status_data);

spi_deselect_device;

updateStatus(status_data);

}

void CC112X_RxMode(void)

{

CC112X_UnsafeStrobe(CC112X_SIDLE);

CC112X_UnsafeStrobe(CC112X_SFRX); // flush Rx buff

CC112X_UnsafeStrobe(CC112X_SRX); // activate Rx!

}

void CC112X_TxMode(void)

{

CC112X_UnsafeStrobe(CC112X_SIDLE);//Отправим строб

CC112X_UnsafeStrobe(CC112X_SFTX); // flush Tx buff на случай, если мы находимся в TX_FIFO_ERROR или RX_FIFO_ERROR

CC112X_UnsafeStrobe(CC112X_STX);

}

Файл buttons.c - драйвер клавиатуры

#include "buttons.h"

#define FLAG_BUT_PRESSED (1<<0)

#define FLAG_BUT_HOLD (1<<1)

#define FLAG_BUT_RELEASED (1<<2)

/*макрос проверки состояния пина. зависит от

активного уровня в настройках*/

#define _TestBit1(var, bit) ((var) & (1<<(bit)))

#define _TestBit0(var, bit) (!((var) & (1<<(bit))))

#define _TestBit(var, bit, lev) _TestBit##lev(var, bit)

#define TestBitLev(var, bit, lev) _TestBit(var, bit, lev)

/*настройка портов на вход, вкл/выкл подтяжки*/

#define ButtonInit_m(dir, port, pin, pull) do{dir &= ~(1<<pin); \

if (pull) {port |= (1<<pin);} \

else{port &= ~(1<<pin);}}while(0)

/*сохранение события во временной переменной, если оно разрешено*/

#define SaveEvent_m(settings, mask, curEvent, reg) do{if ((settings) & (mask)){reg = curEvent;}}while(0)

/*макрос для опроса. в одном случае реализует часть switch оператора, в другом просто опрос*/

#if (BUT_POLL_ROTATION > 0)

#define CheckOneBut_m(id, port, pin, lev, settings, reg) case ((id) - 1): \

if (TestBitLev(port, pin, lev)){\

reg = 1; \

} \

else{ \

reg = 0; \

} \

BUT_Check(reg, id, settings); \

break;

#define Switch_m(x) switch(x){

#define End_m() }

#else

#define CheckOneBut_m(id, port, pin, lev, settings, reg) if (TestBitLev(port, pin, lev)){\

reg = 1; \

} \

else{ \

reg = 0; \

} \

BUT_Check(reg, id, settings);

#define Switch_m(x)

#define End_m()

#endif

/*границы для счетчика антидребезга и двойного клика*/

#define BUT_COUNT_MAX (BUT_COUNT_HELD + 1)

#define BUT_COUNT_THR_2_MAX (BUT_COUNT_THR_2 + 1)

/*антидребезговый счетчик*/

#if (BUT_COUNT_HELD <= 250)

static uint8_t countDeb[BUT_AMOUNT];

static uint8_t countDebTmp;

#else

static uint16_t countDeb[BUT_AMOUNT];

static uint16_t countDebTmp;

#endif

/*счетчики для реализации двойного клика*/

#if (BUT_DOUBLE_CLICK_EN == 1)

#if (BUT_COUNT_THR_2 <= 253)

static uint8_t countHold[BUT_AMOUNT];

static uint8_t countHoldTmp;

#else

static uint16_t countHold[BUT_AMOUNT];

static uint16_t countHoldTmp;

#endif

#endif

/*буфер, в котором хрянятся флаги кнопок*/

static uint8_t stateBut[BUT_AMOUNT];

/*************** кольцевой буфер ******************/

static uint8_t buf[BUT_SIZE_BUF];

static uint8_t head, tail, count;

static void PutBut(uint8_t but)

{

if (count < BUT_SIZE_BUF){

buf[head] = but;

count++;

head++;

head &= (BUT_SIZE_BUF - 1);

}

}

uint8_t BUT_GetBut(void)

{

uint8_t but = 0;

if (count){

but = buf[tail];

count--;

tail++;

tail &= (BUT_SIZE_BUF - 1);

}

return but;

}

static void BUT_Check(uint8_t state, uint8_t i, uint8_t settings)

{

uint8_t stateTmp;

uint8_t event;

i--;

stateTmp = stateBut[i];

event = 0;

#if (BUT_DOUBLE_CLICK_EN == 1)

countHoldTmp = countHold[i];

#endif

countDebTmp = countDeb[i];

if (state){

if (countDebTmp < BUT_COUNT_MAX){

countDebTmp++;

if (countDebTmp > BUT_COUNT_THR){

if (!(stateTmp & FLAG_BUT_PRESSED)){

stateTmp |= FLAG_BUT_PRESSED;

#if (BUT_PRESSED_EN == 1)

SaveEvent_m(settings, BUT_EV_PRESSED, BUT_PRESSED_CODE, event);

#endif

}

}

if (countDebTmp > BUT_COUNT_HELD){

if (!(stateTmp & FLAG_BUT_HOLD)){

stateTmp &= ~(FLAG_BUT_RELEASED);

stateTmp |= FLAG_BUT_HOLD;

#if (BUT_HELD_EN == 1)

SaveEvent_m(settings, BUT_EV_HELD, BUT_HELD_CODE, event);

#endif

}

}

}

}

else{

#if (BUT_DOUBLE_CLICK_EN == 1)

if ((stateTmp & FLAG_BUT_PRESSED)&&(!(stateTmp & FLAG_BUT_HOLD))){

if (stateTmp & FLAG_BUT_RELEASED){

stateTmp &= ~FLAG_BUT_RELEASED;

SaveEvent_m(settings, BUT_EV_DOUBLE_CLICK, BUT_DOUBLE_CLICK_CODE, event);

}

else{

countHoldTmp = 0;

stateTmp |= FLAG_BUT_RELEASED;

}

}

if (stateTmp & FLAG_BUT_RELEASED){

if (countHoldTmp > BUT_COUNT_THR_2){

countHoldTmp = 0;

stateTmp &= ~FLAG_BUT_RELEASED;

#if (BUT_RELEASED_EN == 1)

SaveEvent_m(settings, BUT_EV_RELEASED, BUT_RELEASED_CODE, event);

#endif

}

}

#else

if ((stateTmp & FLAG_BUT_PRESSED)&&(!(stateTmp & FLAG_BUT_HOLD))){

SaveEvent_m(settings, BUT_EV_RELEASED, BUT_RELEASED_CODE, event);

}

#endif

#if (BUT_RELEASE_LONG_EN == 1)

if ((stateTmp & FLAG_BUT_PRESSED)&&(stateTmp & FLAG_BUT_HOLD)){

SaveEvent_m(settings, BUT_EV_RELEASED_LONG, BUT_RELEASED_LONG_CODE, event);

}

#endif

countDebTmp = 0;

stateTmp &= ~(FLAG_BUT_PRESSED|FLAG_BUT_HOLD);

}

#if (BUT_DOUBLE_CLICK_EN == 1)

if (stateTmp & FLAG_BUT_RELEASED){

if (countHoldTmp < BUT_COUNT_THR_2_MAX){

countHoldTmp++;

}

}

countHold[i] = countHoldTmp;

#endif

if (event){

PutBut(i+1);

PutBut(event);

}

countDeb[i] = countDebTmp;

stateBut[i] = stateTmp;

}

void BUT_Init(void)

{

uint8_t i;

for(i = 0; i < BUT_AMOUNT; i++){

countDeb[i] = 0;

stateBut[i] = 0;

#if (BUT_DOUBLE_CLICK_EN == 1)

countHold[i] = 0;

#endif

}

for(i = 0; i < BUT_SIZE_BUF; i++){

buf[i] = 0;

}

head = 0;

tail = 0;

count = 0;

#ifdef BUT_1_ID

ButtonInit_m(BUT_1_DDRX, BUT_1_PORTX, BUT_1_PIN, BUT_1_PULL);

#endif

#ifdef BUT_2_ID

ButtonInit_m(BUT_2_DDRX, BUT_2_PORTX, BUT_2_PIN, BUT_2_PULL);

#endif

#ifdef BUT_3_ID

ButtonInit_m(BUT_3_DDRX, BUT_3_PORTX, BUT_3_PIN, BUT_3_PULL);

#endif

#ifdef BUT_4_ID

ButtonInit_m(BUT_4_DDRX, BUT_4_PORTX, BUT_4_PIN, BUT_4_PULL);

#endif

}

void BUT_Poll(void)

{

#if (BUT_POLL_ROTATION > 0)

static uint8_t i = 0;

#endif

uint8_t state = 0;

Switch_m(i);

#ifdef BUT_1_ID

CheckOneBut_m(BUT_1_ID, BUT_1_PINX, BUT_1_PIN, BUT_1_LEV, BUT_1_EVENT, state);

#endif

#ifdef BUT_2_ID

CheckOneBut_m(BUT_2_ID, BUT_2_PINX, BUT_2_PIN, BUT_2_LEV, BUT_2_EVENT, state);

#endif

#ifdef BUT_3_ID

CheckOneBut_m(BUT_3_ID, BUT_3_PINX, BUT_3_PIN, BUT_3_LEV, BUT_3_EVENT, state);

#endif

#ifdef BUT_4_ID

CheckOneBut_m(BUT_4_ID, BUT_4_PINX, BUT_4_PIN, BUT_4_LEV, BUT_4_EVENT, state);

#endif

End_m();

#if (BUT_POLL_ROTATION > 0)

i++;

if (i >= BUT_AMOUNT){

i = 0;

}

#endif

}

Файл servo.c - драйвер сервомашинок

#include "Servo/servo.h"

#include <avr/io.h>

#include <avr/interrupt.h> //для ISR, расположенного тут

volatile int angleCS1 = 2300;

volatile int angleCS2 = 2300;

volatile int angleP = 2300;

volatile int anglePH = 2300;

volatile int takt = 0;

void ServoDriverInit () {//timer3_init

OCR3A = 20000;

TCCR3A = 0;

TCCR3B |= (1 << WGM32);//CTC

TCNT3 = 0;

TCCR3B |= (1<<CS31);//...010 - предделитель 8

ETIMSK |= (1 << OCIE3A);//TIMSK не к-т

}

ISR(TIMER3_COMPA_vect) {

if (takt == 0) {

SERVO_PORT |= (1<<SERVO_PIN_CS1);

OCR3A = angleCS1;}

if (takt == 1) {

SERVO_PORT &= ~(1<<SERVO_PIN_CS1);

OCR3A = CYCLE - angleCS1;}

if (takt == 2) {

SERVO_PORT |= (1<<SERVO_PIN_CS2);

OCR3A = angleCS2;}

if (takt == 3) {

SERVO_PORT &= ~(1<<SERVO_PIN_CS2);

OCR3A = CYCLE - angleCS2;}

if (takt == 4) {

SERVO_PORT |= (1<<SERVO_PIN_P);

OCR3A = angleP;}

if (takt == 5) {

SERVO_PORT &= ~(1<<SERVO_PIN_P);

OCR3A = CYCLE - angleP;}

if (takt == 6) {

SERVO_PORT |= (1<<SERVO_PIN_PH);

OCR3A = anglePH;}

if (takt == 7) {

SERVO_PORT &= ~(1<<SERVO_PIN_PH);

OCR3A = CYCLE - anglePH;}

takt = takt + 1;

if (takt == 9) takt = 0;

};

Файл main.c - точка входа в программу

#include <avr/io.h>

#include "CC112X_SPI_driver/CC112X.h"

#include "FreeRTOS_Source/FreeRTOS.h"

#include "FreeRTOS_Source/semphr.h"

//#include "task.h"

#include "main.h"

#include <stdbool.h>

#include <avr/interrupt.h>

#include "FreeRTOS_Source/event_groups.h" //для битов

#include "stdio.h"

#include <util/delay.h>

#include "ffconf.h"

//#include "lib_fatf/diskio.h"

#include "fatf-new/ff.h"

#include "fatf-new/cfc_avr.h"

#include "Servo/servo.h"

#include "mpu925X/MPU9250.h"

#include "TWI_driver/TWI_driver.h"

#include "CC112X_SPI_driver/CC112X_SPI.h"

#include "Butt_lib/buttons.h"

TButtonState CS1_PC0_PF4,CS2_PC1_PF6,Parach_PC2_PF5,PH_PC3_PF7;

//USE GPS UART 1 (UART0 предназначен для программирования внутренней флеш-памяти)

#define GPS_BAUDRATE 9600 //GPS speed нужно 115200 для ML8088 http://naviaglonass.ru/wp-content/uploads/ML8088sE_AppNote1_0.pdf

#define GPS_BAUD_PRESCALE (((F_CPU / (GPS_BAUDRATE * 16UL))) - 1)

unsigned short GPSBytesAmount;//Количество принятых от GPS байт

SemaphoreHandle_t GPS_Ready,Orient_Ready,RTC_Time_Ready;

#define RXQ3_BAUDRATE 19200 //rxq3 speed

#define RXQ3_BAUD_PRESCALE (((F_CPU / (RXQ3_BAUDRATE * 16UL))) - 1)

//Sd>>>

FATFS fs; /*Рабочая область (file system object) для логических дисков (из библиотеки) */

FIL fil;

FRESULT res; /*переменная перечиления, по умолчанию int, возвращает код результатат функции (библиотека pff.h)*/

WORD bw; /*Указатель на переменную для количества записанных байт*/

//Sd<<<

TaskHandle_t BottLED_Handle,ADC_Handle,FatFsWrite_Handle,CCWrite_Handle,PollingFromButt_lib_Handle, FligthServo_Handle,Orient_Handle;//дескрипторы задач (для обращения к задачам из-под др. задач)

unsigned short RTC_TimeMult=0;//Текущего времени множитель (0=0ms, 1=500ms,2=1s,3=1.5s, X ms=500*RTC_TimeMult)

enum TCC1125_Status {IDLE=0, RX, TX, FSTXON,CALIBRATE,SETTLING,RX_FIFO_ERR,TX_FIFO_ERR}CC112X_State;

//#define BUF_SIZE 16 //размер буфера обязательно равен степени двойки

//#define BUF_MASK (BUF_SIZE-1)

//Размер массивов ADC_Buf GPS_Buf Orient_Buf кратен 2ке!

struct TFBuf{

u8 ADC_idxIN, ADC_idxOUT;

unsigned short ADC_Buf[4];

EventGroupHandle_t ADCEventGroupSdOrCC;//Sd - 1й бит, CC - 0й

u8 GPS_idxIN, GPS_idxOUT_SD, GPS_idxOUT_CC;

u8 GPS_Buf[128];

EventGroupHandle_t GPSEventGroupSdOrCC;//Sd - 1й бит, CC - 0й

u8 Orient_idxIN, Orient_idxOUT;

u8 Orient_Buf[64];

EventGroupHandle_t Orient_EventGroupSdOrCC;//Sd - 1й бит, CC - 0й

}FBuf;

#define SendIfLimit(limit) \

if (Data2CCAmount>=limit){\

Data2CCAmount=0;\

CC112X_WriteStrobe(CC112X_STX);\

_delay_ms(50); \

CC112X_ReadStatus();\

CC112X_State=TX;\

if (CC112X_State==TX) vTaskResume(BottLED_Handle);\

}

// функция вывода символа

static int my_putchar(char c, FILE *stream)

{

//xQueueSend( xQueueToGPS, &c, portMAX_DELAY );//Отправить jj на GPS

while ( ( UCSR0A & ( 1 << UDRE ) ) == 0 );//ждём, когда можно

UDR0 = c;//oneByte;

return 0;

}

// определяем дескриптор для стандартного вывода

static FILE mystdout = FDEV_SETUP_STREAM(

my_putchar, //vGatekeeperUARTTask2 // функция вывода символа

NULL, // функция ввода символа, нам сейчас не нужна

_FDEV_SETUP_WRITE // флаги потока - только вывод

);

void vFligthServo( void *pvParameters )

{

vTaskSuspend(PollingFromButt_lib_Handle);//убираем кнопки серв - уже не нужны

UBaseType_t uxHighWaterMark;

uxHighWaterMark = uxTaskGetStackHighWaterMark( NULL );

anglePH=2300;

angleP=2300;

angleCS1=2300;

angleCS2=2300;

for( ;; )

{

vTaskDelay( 16000 / portTICK_PERIOD_MS ); //После 16 сек ракета в высшей точке

anglePH=700;//тут был разблок крышки парашюта

xTaskResumeFromISR(BottLED_Handle);//моргнуть vBottLED -> PORTG |= (1<<PG0);

vTaskDelay( 1000 / portTICK_PERIOD_MS ); //Чтобы парашют выбросился на 18

angleP=700;//Парашют 2ой ступени вылетел

xTaskResumeFromISR(BottLED_Handle);//моргнуть vBottLED -> PORTG |= (1<<PG0)

vTaskDelay( 1000 / portTICK_PERIOD_MS );

angleCS1=700;//Вывалил 1ый кансат PA0-CN7

xTaskResumeFromISR(BottLED_Handle);//моргнуть vBottLED -> PORTG |= (1<<PG0);

//vTaskDelay( 1000 / portTICK_PERIOD_MS );

vTaskDelay( 2000 / portTICK_PERIOD_MS );

angleCS2=700;

xTaskResumeFromISR(BottLED_Handle);//моргнуть vBottLED -> PORTG |= (1<<PG0);

vTaskDe...


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

  • Задача накопления, обработки и распространения информации. Характеристика систем управления. Схема комплекса средств автоматизации. Функционирование АСУ комплекса средств автоматизации. Требования, предъявляемые к АРМ РД. Структура базы данных.

    реферат [29,1 K], добавлен 12.06.2009

  • Разработка алгоритма фильтрации данных, полученных с систем спутниковой навигации с помощью GNSS-модуля. Анализ работы фильтра Калмана, его программная реализация под конкретную задачу. Выбор навигационных модулей для получения данных позиционирования.

    дипломная работа [3,6 M], добавлен 12.01.2016

  • Порядок работы менеджера турфирмы. Анализ рынка программных приложений для ведения туристического бизнеса. Выбор средств проектирования и разработки системы управления баз данных. Разработка, реализация и анализ работы программного модуля, его запуск.

    дипломная работа [3,4 M], добавлен 19.07.2015

  • Особенности архитектуры Java. Технология Java Database Connectivity. Кроссплатформенность Java-приложений. Преимущества языка программирования. Логическая структура базы данных. Структура программного комплекса. Верификация программных средств.

    курсовая работа [962,8 K], добавлен 13.01.2016

  • Структура данных в динамической памяти, однонаправленные списки. Разработка программного комплекса, предназначенной для хранения и предоставления пользователям данных об улицах города. Реализация данной программы при помощи метода расширения ядра.

    курсовая работа [438,3 K], добавлен 11.01.2016

  • Изучение области применения комплекса для проведения имитационных испытаний микропроцессорных систем железнодорожной автоматики на функциональную безопасность. Разработка программного обеспечения модуля управления и отладки. Тестирование системы команд.

    курсовая работа [1,1 M], добавлен 22.11.2014

  • Система управления базами данных как совокупность программных и языковых средств, предназначенных для создания и обработки данных. Анализ деятельности обувной мастерской. Особенности разработки функциональной диаграммы и тестирования программного модуля.

    дипломная работа [2,9 M], добавлен 04.11.2012

  • Проблемы и тенденции проектирования операционных систем, структура ОС. Руководящие принципы при разработке интерфейса. Парадигмы пользователя, исполнения и данных. Примеры применения ортогональности и связывания. Методы практической реализации систем.

    реферат [60,9 K], добавлен 26.01.2011

  • Основные функции системы управления базами данных. Комплекс программных и лингвистических средств общего или специального назначения. Условия принятой технологии обработки данных. Управление буферами оперативной памяти. Журнализация и её значение.

    курсовая работа [1,2 M], добавлен 19.01.2012

  • Выполнение отладки программных модулей с использованием специализированных программных средств. Тестирование, оптимизация кода модуля. Реализация базы данных в конкретной системе управления. Анализ проектной и технической документации на уровне компонент.

    дипломная работа [5,0 M], добавлен 08.06.2017

  • Характеристика сущности, назначения, функций операционных систем. Отличительные черты их эволюции. Особенности алгоритмов управления ресурсами. Современные концепции и технологии проектирования операционных систем, требования, предъявляемые к ОС XXI века.

    курсовая работа [36,4 K], добавлен 08.01.2011

  • Понятие операционной системы как базового комплекса компьютерных программ, обеспечивающего управление аппаратными средствами компьютера, работу с файлами, ввод и вывод данных, выполнение утилит. История развития операционных систем семейства Windows.

    курсовая работа [54,3 K], добавлен 10.01.2012

  • Характеристика флэш-памяти, особого вида энергонезависимой перезаписываемой полупроводниковой памяти. Исследование особенностей организации флэш-памяти. Общий принцип работы ячейки. Обзор основных типов карт памяти. Защита информации на флеш-накопителях.

    презентация [9,3 M], добавлен 12.12.2013

  • Анализ программных средств несанкционированного доступа к информации в сетях ЭВМ и способов защиты. Возможности операционных систем по защите и разграничению доступа к информации и выбор самой защищенной. Планирование сети штаба объединения ВВС и ПВО.

    дипломная работа [1,0 M], добавлен 14.09.2010

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

    курсовая работа [2,6 M], добавлен 18.06.2013

  • Реализация программного средства "Действия над матрицами". Разработка кода программного продукта на основе готовой спецификации на уровне модуля. Использование инструментальных средств на этапе отладки программного модуля. Выбор стратегии тестирования.

    отчет по практике [296,1 K], добавлен 19.04.2015

  • Современные SCADA-системы и их безопасность. Диспетчерское управление и сбор данных. Основные компоненты SCADA-систем. Система логического управления. База данных реального времени. Автоматическая конвертация проектов для разных операционных систем.

    реферат [253,7 K], добавлен 25.11.2014

  • Основные принципы работы и назначение флеш-памяти, история ее создания, технология изготовления и применение в цифровых устройствах. Обзор и характеристика существующих стандартов: удобство и польза. Флеш-память: особенности туннелирования и стирания.

    реферат [90,3 K], добавлен 27.11.2011

  • Автоматизированная система управления как комплекс аппаратных и программных средств, его структура и содержание, назначение и функциональные особенности. Разновидности данных систем и их отличия. Понятие и внутреннее устройство, элементы жесткого диска.

    реферат [233,4 K], добавлен 29.12.2010

  • Особенности решения задачи контроля и управления посещением охраняемого объекта. Создание системы как совокупности программных и технических средств. Классификация систем контроля и управления доступом. Основные устройства системы и их характеристика.

    презентация [677,7 K], добавлен 03.12.2014

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