Студопедия

КАТЕГОРИИ:

АвтоАвтоматизацияАрхитектураАстрономияАудитБиологияБухгалтерияВоенное делоГенетикаГеографияГеологияГосударствоДомЖурналистика и СМИИзобретательствоИностранные языкиИнформатикаИскусствоИсторияКомпьютерыКулинарияКультураЛексикологияЛитератураЛогикаМаркетингМатематикаМашиностроениеМедицинаМенеджментМеталлы и СваркаМеханикаМузыкаНаселениеОбразованиеОхрана безопасности жизниОхрана ТрудаПедагогикаПолитикаПравоПриборостроениеПрограммированиеПроизводствоПромышленностьПсихологияРадиоРегилияСвязьСоциологияСпортСтандартизацияСтроительствоТехнологииТорговляТуризмФизикаФизиологияФилософияФинансыХимияХозяйствоЦеннообразованиеЧерчениеЭкологияЭконометрикаЭкономикаЭлектроникаЮриспунденкция

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




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.RealTimeEngineers. Деталилицензии[Электронный ресурс] // FreeRTOSTeam. – Электрон. дан. – 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-HETHDataSheet[Электронныйресурс] // 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 ProductSpecification [Электронныйресурс] // 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. SmartRFStudio[Электронный ресурс] // TexasInstruments. – Электрон. дан., 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>

intTWI_SetValues(u8address,unsignedchardata[],intlength,boolrepeated)

{

  uint8_tstatus=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)));

      

  inti=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);//формируем состояние СТОП

  returni;

}

boolTWI_GetValues(u8address,unsignedchardata[],intlength,boolrepeated){//вовзращаетпрочитанноев data

  u8value;

  uint8_tstatus=TWI_SUCCESS;

  boolresult=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(inti=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);//формируемсостояниеСТОП

             

  returnresult;

}

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

 

#ifndefFREERTOS_CONFIG_H

#defineFREERTOS_CONFIG_H

 

#include<avr/io.h>

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

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

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

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

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

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

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

#defineconfigSUPPORT_DYNAMIC_ALLOCATION1

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

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

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

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

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

#defineconfigUSE_MUTEXES1

#defineconfigUSE_RECURSIVE_MUTEXES0

#defineconfigUSE_COUNTING_SEMAPHORES1

#defineconfigQUEUE_REGISTRY_SIZE 0

 

 

/* Co-routine definitions. */

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

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

 

/* Software timer related definitions. */

#defineconfigUSE_TIMERS1

#defineconfigTIMER_TASK_PRIORITY3

#defineconfigTIMER_QUEUE_LENGTH10

#defineconfigTIMER_TASK_STACK_DEPTHconfigMINIMAL_STACK_SIZE

 

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

to exclude the API function. */

#defineINCLUDE_vTaskPrioritySet0

#defineINCLUDE_uxTaskPriorityGet0

#defineINCLUDE_vTaskDelete1

#defineINCLUDE_vTaskSuspend1

#defineINCLUDE_xResumeFromISR1

#defineINCLUDE_vTaskDelayUntil1

#defineINCLUDE_vTaskDelay1

#defineINCLUDE_xTaskGetSchedulerState1

#defineINCLUDE_xTaskGetCurrentTaskHandle1

#defineINCLUDE_uxTaskGetStackHighWaterMark1

#defineINCLUDE_xTaskGetIdleTaskHandle0

#defineINCLUDE_eTaskGetState0

#defineINCLUDE_xEventGroupSetBitFromISR1

#defineINCLUDE_xTimerPendFunctionCall1

#defineINCLUDE_xTaskAbortDelay0

#defineINCLUDE_xTaskGetHandle0

#defineINCLUDE_xTaskResumeFromISR1

#defineINCLUDE_vTaskSuspend         1

#endif/* FREERTOS_CONFIG_H */

 

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

#include "FreeRTOS_Source/FreeRTOS.h"

#include "FreeRTOS_Source/semphr.h"

#define_FFCONF68020 /* Revision ID */

#define_FS_READONLY 0

#define_FS_MINIMIZE 0

#define  _USE_STRFUNC 1

#define_USE_FIND      1

#define  _USE_MKFS       1

#define  _USE_FASTSEEK 0

#define  _USE_EXPAND     1

#define_USE_CHMOD     1

#define_USE_LABEL     1

#define  _USE_FORWARD 0

#define_CODE_PAGE 1

#define  _USE_LFN 0

#define  _MAX_LFN 255

#define  _LFN_UNICODE 0

#define_STRF_ENCODE 0

#define_FS_RPATH 2

#define_VOLUMES 1

#define_STR_VOLUME_ID 0

#define_VOLUME_STRS "RAM","NAND","CF","SD","SD2","USB","USB2","USB3"

#define  _MULTI_PARTITION 0

#define  _MIN_SS         512

#define  _MAX_SS         512

#define  _USE_TRIM 0

#define_FS_NOFSINFO 0

#define  _FS_TINY 1

#define_FS_EXFAT 0

#define_FS_NORTC 1

#define_NORTC_MON 5

#define_NORTC_MDAY 1

#define_NORTC_YEAR 2016

#define  _FS_LOCK 0

#define_FS_REENTRANT 1

#define_FS_TIMEOUT    1000

#define  _SYNC_t               xSemaphoreHandle

 

Файл 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"

 

 

voidCC112XInit(){

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

voidspi_write_single(uint8_tdata)

{

  SPDR=data;

}

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

voidspi_read_single(uint8_t*data)

{

  *data=SPDR;

}

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

voidCC112X_ReadRegister(uint16_taddress,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_tstatus;//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

voidCC112X_WriteRegister(uint16_taddress,uint8_tdata)

{

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

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

  elseaddress&=~(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_tstatus;

  spi_read_single(&status);

  updateStatus(status);

      

  spi_deselect_device;

}

 

voidCC112X_WriteStrobe(uint8_tstrobe)

{

  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_tstatus;

  spi_read_single(&status);

  updateStatus(status);

  spi_deselect_device;

}

 

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

voidCC112X_UnsafeStrobe(uint8_tstrobe)

{

  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_tstatus;

  spi_read_single(&status);

  updateStatus(status);

 

  spi_deselect_device;

}

 

voidCC112X_BurstRead(uint8_taddress,uint8_tdata[],uint8_tsize)

{

  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_tbw_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_tstatus;

         spi_read_single(&status);

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

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

         spi_deselect_device;

  }

}

 

voidCC112X_BurstWrite(uint8_taddress,uint8_tdata[],uint8_tsize)

{

  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_tbw_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;

  }

}

 

voidCC112X_ReadStatus()

{

  uint8_tstatus_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);

}

 

voidCC112X_RxMode(void)

{

  CC112X_UnsafeStrobe(CC112X_SIDLE);

  CC112X_UnsafeStrobe(CC112X_SFRX);// flush Rx buff

  CC112X_UnsafeStrobe(CC112X_SRX);// activate Rx!

}

voidCC112X_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"

#defineFLAG_BUT_PRESSED(1<<0)

#defineFLAG_BUT_HOLD(1<<1)

#defineFLAG_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)

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

 

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

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

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

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

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

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

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

#if(BUT_POLL_ROTATION>0)

#defineCheckOneBut_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;

 

#defineSwitch_m(x)switch(x){

#defineEnd_m()}

#else

 

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

reg=1;\

}\

else{\

reg=0;\

}\

BUT_Check(reg,id,settings);

 

#defineSwitch_m(x)

#defineEnd_m()

#endif

 

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

#defineBUT_COUNT_MAX(BUT_COUNT_HELD+1)

#defineBUT_COUNT_THR_2_MAX(BUT_COUNT_THR_2+1)

 

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

#if(BUT_COUNT_HELD<=250)

staticuint8_tcountDeb[BUT_AMOUNT];

staticuint8_tcountDebTmp;

#else

staticuint16_tcountDeb[BUT_AMOUNT];

staticuint16_tcountDebTmp;

#endif

 

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

#if(BUT_DOUBLE_CLICK_EN==1)

#if(BUT_COUNT_THR_2<=253)

staticuint8_tcountHold[BUT_AMOUNT];

staticuint8_tcountHoldTmp;

#else

staticuint16_tcountHold[BUT_AMOUNT];

staticuint16_tcountHoldTmp;

#endif

#endif

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

staticuint8_tstateBut[BUT_AMOUNT];

 

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

 

staticuint8_tbuf[BUT_SIZE_BUF];

staticuint8_thead,tail,count;

 

staticvoidPutBut(uint8_tbut)

{

if(count<BUT_SIZE_BUF){

buf[head]=but;

count++;

head++;

head&=(BUT_SIZE_BUF-1);

}

}

uint8_tBUT_GetBut(void)

{

uint8_tbut=0;

 

if(count){

but=buf[tail];

count--;

tail++;

tail&=(BUT_SIZE_BUF-1);

}

returnbut;

}

 

staticvoidBUT_Check(uint8_tstate,uint8_ti,uint8_tsettings)

{

uint8_tstateTmp;

uint8_tevent;

 

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;

}

 

voidBUT_Init(void)

{

uint8_ti;

 

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;

 

#ifdefBUT_1_ID

ButtonInit_m(BUT_1_DDRX,BUT_1_PORTX,BUT_1_PIN,BUT_1_PULL);

#endif

 

#ifdefBUT_2_ID

ButtonInit_m(BUT_2_DDRX,BUT_2_PORTX,BUT_2_PIN,BUT_2_PULL);

#endif

 

#ifdefBUT_3_ID

ButtonInit_m(BUT_3_DDRX,BUT_3_PORTX,BUT_3_PIN,BUT_3_PULL);

#endif

 

#ifdefBUT_4_ID

ButtonInit_m(BUT_4_DDRX,BUT_4_PORTX,BUT_4_PIN,BUT_4_PULL);

#endif

}

voidBUT_Poll(void)

{

#if(BUT_POLL_ROTATION>0)

staticuint8_ti=0;

#endif

uint8_tstate=0;

 

Switch_m(i);

 

#ifdefBUT_1_ID

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

#endif

 

#ifdefBUT_2_ID

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

#endif

 

#ifdefBUT_3_ID

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

#endif

 

#ifdefBUT_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, расположенного тут

volatileintangleCS1=2300;

volatileintangleCS2=2300;

volatileintangleP=2300;

volatileintanglePH=2300;

volatileinttakt=0;

voidServoDriverInit(){//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"

 

 

TButtonStateCS1_PC0_PF4,CS2_PC1_PF6,Parach_PC2_PF5,PH_PC3_PF7;

 

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

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

#defineGPS_BAUD_PRESCALE(((F_CPU/(GPS_BAUDRATE*16UL)))-1)

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

 

SemaphoreHandle_tGPS_Ready,Orient_Ready,RTC_Time_Ready;

 

#defineRXQ3_BAUDRATE19200//rxq3 speed

#defineRXQ3_BAUD_PRESCALE(((F_CPU/(RXQ3_BAUDRATE*16UL)))-1)

 

//Sd>>>

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

FILfil;

 

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

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

//Sd<<<

 

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

 

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

 

enumTCC1125_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ке!

structTFBuf{

  u8ADC_idxIN,ADC_idxOUT;

  unsignedshortADC_Buf[4];

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

 

  u8GPS_idxIN,GPS_idxOUT_SD,GPS_idxOUT_CC;

  u8GPS_Buf[128];

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

      

  u8Orient_idxIN,Orient_idxOUT;

  u8Orient_Buf[64];

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

}FBuf;

 

 

#defineSendIfLimit(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);\

}

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

staticintmy_putchar(charc,FILE*stream)

{

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

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

  UDR0=c;//oneByte;

  return0;

}

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

staticFILEmystdout=FDEV_SETUP_STREAM(

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

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

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

);

voidvFligthServo(void*pvParameters)

{

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

  UBaseType_tuxHighWaterMark;

  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);

         vTaskDelay(1000/portTICK_PERIOD_MS);

         vTaskDelay(120000/portTICK_PERIOD_MS);

         vTaskResume(ADC_Handle);//убираем ADC vADCStart

         vTaskResume(FatFsWrite_Handle);//убираембэкапна SD vFatFsWrite

         f_close(&fil);//закрылифайл

         while(1){

         BottLED();}

  }

}

 

voidvFatFsWrite(void*pvParameters)

{

  TickType_txLastWakeTime;

  constTickType_txFrequency=1830;

  xLastWakeTime=xTaskGetTickCount();

  UINTByteWrite=0;

  u16value;

  EventBits_tuxBits;

  for(;;)

  {

         printf(" hi SDW ");

         if(xSemaphoreTake(RTC_Time_Ready,(TickType_t)0)==pdTRUE)//еслитаймерпосчитал 500ms

         {

                f_printf(&fil, " TimeM %x",RTC_TimeMult);// запишемтекущеевремя

         }

             

         /*while*/if(FBuf.ADC_idxIN!=FBuf.ADC_idxOUT)//данные есть, обрабатываем их

         {

                printf("ADC 2 SD");

                //запись в SD даных ADC

                value=FBuf.ADC_Buf[FBuf.ADC_idxOUT++];

                FBuf.ADC_idxOUT&=sizeof(FBuf.ADC_Buf)/sizeof(FBuf.ADC_Buf[0])-1;

                //value -> SD карта

                intres=f_printf(&fil, " ADC %x",value);

                //printf("f_printf return (byte wrote): %u ",res);

                f_sync(&fil);//flush буфера (+0x36 байт к стеку)

         }

             

         //if( xSemaphoreTake(GPS_Ready, 1 ) == pdTRUE )

             

         uxBits=xEventGroupWaitBits(FBuf.GPSEventGroupSdOrCC,0b11,pdFALSE,pdFALSE,0);//2е pdFALSE говорит, чтодостаточноуст-яхоть 1гобита //Sd - 1йбит, CC - 0й

         printf(" SDBits %u ",uxBits);

         if(uxBits&(1<<1)){

                if(FBuf.GPS_idxIN!=FBuf.GPS_idxOUT_SD)//данныеесть, обрабатываемих

                {

                      value=FBuf.GPS_Buf[FBuf.GPS_idxOUT_SD++];

                      FBuf.GPS_idxOUT_SD&=sizeof(FBuf.GPS_Buf)/sizeof(FBuf.GPS_Buf[0])-1;

                      //printf(" GPS[0] is %c ",value);

                      

                      printf(" use GPS_idxOUT_SD: ");

                      intres=f_printf(&fil, " GPS ");

                      while((value!='a')&&(FBuf.GPS_idxIN!=FBuf.GPS_idxOUT_SD)){//while(value!=cr){

                             //value -> SD карта

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

                             printf("%c",value);

                             f_sync(&fil);//flush буфера (+0x36 байткстеку)

                                 

                             value=FBuf.GPS_Buf[FBuf.GPS_idxOUT_SD++];

                             FBuf.GPS_idxOUT_SD&=sizeof(FBuf.GPS_Buf)/sizeof(FBuf.GPS_Buf[0])-1;

                      };

                }

                //сбросить свой GPS SD бит //Sd - 1й бит, CC - 0й

                xEventGroupClearBits(FBuf.GPSEventGroupSdOrCC,(1<<1));

                printf(" GPS SD bit clean ");

         }

         PORTG^=(1<<PG4);

         vTaskDelayUntil(&xLastWakeTime,xFrequency);

  }

}

voidvCCWrite(void*pvParameters)

{

  TickType_txLastWakeTime;

  constTickType_txFrequency=1700;

  xLastWakeTime=xTaskGetTickCount();

  UINTByteWrite=0;

  u16value;

  EventBits_tuxBits;

  u8Data2CCAmount=0;//кол-во отправленных в пакете (до 63х байт)

      

  CC112XInit();

  CC112X_TxMode();//Перейти в режим передачи

      

  UBaseType_tuxHighWaterMark;

  uxHighWaterMark=uxTaskGetStackHighWaterMark(NULL);

  //printf(" init vCCWrite uxHighWaterMark %u ", uxHighWaterMark);

  for(;;)

  {

         uxBits=xEventGroupWaitBits(FBuf.GPSEventGroupSdOrCC,0b11,pdFALSE,pdFALSE,0);//2е pdFALSE говорит, чтодостаточноуст-яхоть 1гобита //Sd - 1йбит, CC - 0й

         printf(" CCBits %u ",uxBits);

         if(uxBits&(1<<0)){

                if(FBuf.GPS_idxIN!=FBuf.GPS_idxOUT_CC)//данныеесть, обрабатываемих

                {

                      value=FBuf.GPS_Buf[FBuf.GPS_idxOUT_CC++];

                      FBuf.GPS_idxOUT_CC&=sizeof(FBuf.GPS_Buf)/sizeof(FBuf.GPS_Buf[0])-1;

                          

                      while((value!='a')&&(FBuf.GPS_idxIN!=FBuf.GPS_idxOUT_CC)){//while(value!=cr){

                        CC112X_WriteRegister(CC112X_TXFIFO,value);//CC112X_BurstWrite(CC112X_TXFIFO,dat,1);быстреебылобызаполнитьмассивилипосчитатьоффсетот value (до<cr>)

                             Data2CCAmount++;

                             SendIfLimit(63);

                             value=FBuf.GPS_Buf[FBuf.GPS_idxOUT_CC++];  FBuf.GPS_idxOUT_CC&=sizeof(FBuf.GPS_Buf)/sizeof(FBuf.GPS_Buf[0])-1;

                      };

                }

                    

                //сбросить свой GPS CC бит //Sd - 1й бит, CC - 0й

                xEventGroupClearBits(FBuf.GPSEventGroupSdOrCC,(1<<0));

         }

             

         CC112X_WriteStrobe(CC112X_STX);//start send

         _delay_ms(50);

         //while (PINE & (1<<PE0)); // Wait for GDO0 to be cleared -> end of packet

         CC112X_ReadStatus();

         CC112X_State=TX;//Proteus

         if(CC112X_State==TX)

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

             

         PORTG^=(1<<PG4);

             

         vTaskDelayUntil(&xLastWakeTime,xFrequency);

  }

}

voidvBottLED(void*pvParameters)//стек-жируха (0x98 байт)

{

  for(;;)

  {

         PORTG|=(1<<PG0);

         vTaskDelay(1500);

         PORTG&=~(1<<PG0);

         vTaskDelay(1500);//моргнулии

         vTaskSuspend(NULL);//засыпаем

  }

}

 

//работассервамиотклавы

voidvPollingFromButt_lib(void*pvParameters)

{

  UBaseType_tuxHighWaterMark;

  uint8_tbut,code;

  for(;;)

  {

         but=BUT_GetBut();//проверкабуфера - кодкнопки

             

         switch(but){

                case1://PF4 CS1

                code=BUT_GetBut();//беремкодсобытия

                if(code==3)//одинарное отпускание

                {

                      angleCS1=700;

                      BottLED();

                }else

                if(code==5)//двойное

                {

                      angleCS1=2300;

                      BottLED();

                }

                break;

                case2://PF5 P

                code=BUT_GetBut();//берем код события

                if(code==3)//одинарное отпускание

                {

                      angleP=700;

                      BottLED();

                }else

                if(code==5)//двойное

                {

                      angleP=2300;

                      BottLED();

                }

                break;

                    

                case3://PF6 CS2

                code=BUT_GetBut();//берем код события

                if(code==3)//одинарное отпускание

                {

                      angleCS2=700;

                      BottLED();

                }else

                if(code==5)//двойное

                {

                      angleCS2=2300;

                      BottLED();

                }

                break;

                    

                case4://PF7 PH

                code=BUT_GetBut();//берем код события

                if(code==3)//одинарное отпускание

                {

                      anglePH=700;

                      BottLED();

                }else

                if(code==5)//двойное

                {

                      anglePH=2300;

                      BottLED();

                }

                break;

         }

         uxHighWaterMark=uxTaskGetStackHighWaterMark(NULL);

         //printf(" Polling WaterMark %u ", uxHighWaterMark);

  }

}

 

//Подпрограмма-обработчик прерывания по приходу байта с GPS

ISR(USART0_RX_vect)

{

  u8val=UDR0;

  /*if ( val!='A'){//if ( UDR0!=lf){ //<CR> - Возврат каретки (0x0D) - добавим,<LF> - Подача строки - не будем уже передавать в очередь,

  FBuf.GPS_Buf[FBuf.GPS_idxIN++] =val;

  FBuf.GPS_idxIN &= sizeof(FBuf.GPS_Buf)/sizeof(FBuf.GPS_Buf[0])-1;//BUF_MASK;

  }

  else //а выставим семафор - из очереди можно изъять байты

  {

  printf(" ISR bits ");

  xEventGroupSetBits(FBuf.GPSEventGroupSdOrCC, (1<<1)|(1<<0));

  //xSemaphoreGiveFromISR(GPS_Ready, NULL);

  }*/

  //if (rand(10)==1)

  {//Этотестовыйкод, рабочий – сверху

         for(inti=48;i<59;i++){

                FBuf.GPS_Buf[FBuf.GPS_idxIN++]=i;

         FBuf.GPS_idxIN&=sizeof(FBuf.GPS_Buf)/sizeof(FBuf.GPS_Buf[0])-1;}

         FBuf.GPS_Buf[FBuf.GPS_idxIN++]='a';

         FBuf.GPS_idxIN&=sizeof(FBuf.GPS_Buf)/sizeof(FBuf.GPS_Buf[0])-1;FBuf.GPS_Buf[FBuf.GPS_idxIN++]='A';

         FBuf.GPS_idxIN&=sizeof(FBuf.GPS_Buf)/sizeof(FBuf.GPS_Buf[0])-1;

         printf(" ISR bits ");

  xEventGroupSetBits(FBuf.GPSEventGroupSdOrCC,(1<<1)|(1<<0));}

}

 

voiduart_Init(void)

{

  UBRR0H=GPS_BAUD_PRESCALE>>8;// Load upper 8-bits of the baud rate value into the high byte of the UBRR register

  UBRR0L=GPS_BAUD_PRESCALE;// Load lower 8-bits of the baud rate value into the low byte of the UBRR register

  //8 бит данных, 1 стоп бит, без контроля четности

  UCSR0C=(1<<UCSZ1)|(1<<UCSZ0);//( 1 << URSEL ) |

  //разрешить прием, передачу данных и прерывание по приёму байта

  UCSR0B=(1<<RXCIE)|(1<<TXEN)|(1<<RXEN);

}

 

/*инициализация SPI модуля в режиме master*/

voidSPI_Init(void)

{

  /*настройка портов ввода-вывода

  все выводы, кроме MISO выходы*/

  DDRB|=(1<<SPIC_MOSI)|(1<<SPIC_SCLK)|(1<<SPIC_CS)|(0<<SPIC_MISO);

  PORTB|=(1<<SPIC_MOSI)|(1<<SPIC_SCLK)|(1<<SPIC_CS)|(1<<SPIC_MISO);

  DDRD|=1<<SPIC_extraCS;

  PORTD|=1<<SPIC_extraCS;

  /*разрешение spi,старший бит вперед,мастер, режим 0, частота 16M/4=4MHz*/

  SPCR=(1<<SPE)|(0<<DORD)|(1<<MSTR)|(0<<CPOL)|(0<<CPHA)|(0<<SPR1)|(0<<SPR0);

  SPSR=(0<<SPI2X);

}

 

u16RTC_500msDetection;

ISR(TIMER2_COMP_vect){//T=10ms

  RTC_500msDetection++;//32.768 кГц dt26

  if(RTC_500msDetection==49){

         RTC_TimeMult++;//увеличиваем множитель времени по основанию 500ms

         xSemaphoreGive(RTC_Time_Ready);//Семафорим, что пора выписать время

         RTC_500msDetection=0;

  }

  PORTG^=(1<<PG2);

  mmc_disk_timerproc();//FatFs дела

  BUT_Poll();//опроситькнопки

}

 

FRESULTopen_append(

FIL*fp,// [OUT] File object to create

constchar*path// [IN] File name to be opened

)

{

  FRESULTfr;

  /* Opens an existing file. If not exist, creates a new file. */

  fr=f_open(fp,path,FA_WRITE|FA_OPEN_ALWAYS);

  if(fr==FR_OK){

         /* Seek to end of the file to append data */

         fr=f_lseek(fp,f_size(fp));

         if(fr!=FR_OK)

         f_close(fp);

  }

  returnfr;

}

 

 

voidvADCStart(void*pvParameters)//Инициализацияизапуск ADC

{

  ADMUX=0b00000000;     //// InternalVrefturnedoff, выравнивание по правой границе 7й канал, 10бит

  ADCSRA|=(1<<ADEN)|(0<<ADSC)|(0<<ADFR)|(0<<ADIE)|(1<<ADPS2)|(1<<ADPS1)|(1<<ADPS0);//вкл adc, не запустить первое преобраз, непрер режим прерыван выкл (ADFR), ADCпрерывание выкл, делитель 128 (62.5kHz)

  TickType_txLastWakeTime;

  constTickType_txFrequency=2000;//ms

  xLastWakeTime=xTaskGetTickCount();

  unsignedshortADCdata;

  floatvoltage;

  for(;;)

  {

         ADCSRA|=1<<ADSC;//начать новое преобразование (раз в ~50 ms)

         vTaskDelay(1);//Пусть другие повыполняются 1 такт диспетчера

         while(!(ADCSR&1<<ADIF));//ждать флага прерывания по готовности ацп

             

         ADCdata=ADCW;// В ADCW хранится напряжение в двоичном коде

         voltage=ADCdata*0.0048876;// 5 вольт / 1023 = 4.8875

             

         //прерывание ADC, ring buffer

         FBuf.ADC_Buf[FBuf.ADC_idxIN++]=ADCdata;










Последнее изменение этой страницы: 2018-04-12; просмотров: 262.

stydopedya.ru не претендует на авторское право материалов, которые вылажены, но предоставляет бесплатный доступ к ним. В случае нарушения авторского права или персональных данных напишите сюда...