![]() Студопедия КАТЕГОРИИ: АвтоАвтоматизацияАрхитектураАстрономияАудитБиологияБухгалтерияВоенное делоГенетикаГеографияГеологияГосударствоДомЖурналистика и СМИИзобретательствоИностранные языкиИнформатикаИскусствоИсторияКомпьютерыКулинарияКультураЛексикологияЛитератураЛогикаМаркетингМатематикаМашиностроениеМедицинаМенеджментМеталлы и СваркаМеханикаМузыкаНаселениеОбразованиеОхрана безопасности жизниОхрана ТрудаПедагогикаПолитикаПравоПриборостроениеПрограммированиеПроизводствоПромышленностьПсихологияРадиоРегилияСвязьСоциологияСпортСтандартизацияСтроительствоТехнологииТорговляТуризмФизикаФизиологияФилософияФинансыХимияХозяйствоЦеннообразованиеЧерчениеЭкологияЭконометрикаЭкономикаЭлектроникаЮриспунденкция |
Список использованных источников ⇐ ПредыдущаяСтр 4 из 4
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
Таблица А2 – Набор передаваемых сообщений
Таблица А3– Набор передаваемых сообщений
NMEA Message List – набор сообщений, выводимый приемником в соответствующей странице, задаётся согласно таблице А2. Таблица А4– Особенности лицензий FreeRTOS и OpenRTOS
Приложение БЛистинг программы Файл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; просмотров: 314. stydopedya.ru не претендует на авторское право материалов, которые вылажены, но предоставляет бесплатный доступ к ним. В случае нарушения авторского права или персональных данных напишите сюда... |