diff --git a/.gitmodules b/.gitmodules index af041ee..280e6e5 100644 --- a/.gitmodules +++ b/.gitmodules @@ -16,3 +16,7 @@ [submodule "storno_cqp6xx_digital_xtal/avr_eeprom_driver"] path = storno_cqp6xx_digital_xtal/avr_eeprom_driver url = https://OZ1CM@bitbucket.org/oz1cm/avr_eeprom_driver.git +[submodule "storno_cqp6xx_digital_xtal/cm_task_manager"] + path = storno_cqp6xx_digital_xtal/cm_task_manager + url = https://OZ1CM@bitbucket.org/oz1cm/cm_task_manager.git + branch = master diff --git a/.vs/storno_cqp6xx_digital_xtal/v14/.atsuo b/.vs/storno_cqp6xx_digital_xtal/v14/.atsuo index d2540d2..cf9665d 100644 Binary files a/.vs/storno_cqp6xx_digital_xtal/v14/.atsuo and b/.vs/storno_cqp6xx_digital_xtal/v14/.atsuo differ diff --git a/storno_cqp6xx_digital_xtal/Debug/Makefile b/storno_cqp6xx_digital_xtal/Debug/Makefile index a211d0f..61fb183 100644 --- a/storno_cqp6xx_digital_xtal/Debug/Makefile +++ b/storno_cqp6xx_digital_xtal/Debug/Makefile @@ -38,6 +38,7 @@ SUBDIRS := \ ../avr_i2c_driver/ \ ../avr_uart_driver/ \ ../cm_msg/ \ +../cm_task_manager/ \ ../si5351_driver/ @@ -48,6 +49,7 @@ C_SRCS += \ ../avr_i2c_driver/avr_i2c.c \ ../avr_uart_driver/avr_uart.c \ ../cm_msg/cm_msg.c \ +../cm_task_manager/cm_task_manager.c \ ../cqm6xx_app.c \ ../main.c \ ../si5351_driver/si5351_driver.c @@ -65,6 +67,7 @@ avr_gpio_driver/avr_gpio.o \ avr_i2c_driver/avr_i2c.o \ avr_uart_driver/avr_uart.o \ cm_msg/cm_msg.o \ +cm_task_manager/cm_task_manager.o \ cqm6xx_app.o \ main.o \ si5351_driver/si5351_driver.o @@ -75,6 +78,7 @@ avr_gpio_driver/avr_gpio.o \ avr_i2c_driver/avr_i2c.o \ avr_uart_driver/avr_uart.o \ cm_msg/cm_msg.o \ +cm_task_manager/cm_task_manager.o \ cqm6xx_app.o \ main.o \ si5351_driver/si5351_driver.o @@ -85,6 +89,7 @@ avr_gpio_driver/avr_gpio.d \ avr_i2c_driver/avr_i2c.d \ avr_uart_driver/avr_uart.d \ cm_msg/cm_msg.d \ +cm_task_manager/cm_task_manager.d \ cqm6xx_app.d \ main.d \ si5351_driver/si5351_driver.d @@ -95,6 +100,7 @@ avr_gpio_driver/avr_gpio.d \ avr_i2c_driver/avr_i2c.d \ avr_uart_driver/avr_uart.d \ cm_msg/cm_msg.d \ +cm_task_manager/cm_task_manager.d \ cqm6xx_app.d \ main.d \ si5351_driver/si5351_driver.d @@ -148,6 +154,13 @@ cm_msg/cm_msg.o: ../cm_msg/cm_msg.c @echo Finished building: $< +cm_task_manager/cm_task_manager.o: ../cm_task_manager/cm_task_manager.c + @echo Building file: $< + @echo Invoking: AVR/GNU C Compiler : 5.4.0 + $(QUOTE)E:\cm_programs\microchip_studio\7.0\toolchain\avr8\avr8-gnu-toolchain\bin\avr-gcc.exe$(QUOTE) -x c -funsigned-char -funsigned-bitfields -DDEBUG -I"E:\cm_programs\microchip_studio\7.0\Packs\atmel\ATtiny_DFP\1.10.348\include" -O1 -ffunction-sections -fdata-sections -fpack-struct -fshort-enums -g2 -Wall -mmcu=attiny402 -B "E:\cm_programs\microchip_studio\7.0\Packs\atmel\ATtiny_DFP\1.10.348\gcc\dev\attiny402" -c -std=gnu99 -MD -MP -MF "$(@:%.o=%.d)" -MT"$(@:%.o=%.d)" -MT"$(@:%.o=%.o)" -o "$@" "$<" + @echo Finished building: $< + + ./cqm6xx_app.o: .././cqm6xx_app.c @echo Building file: $< @echo Invoking: AVR/GNU C Compiler : 5.4.0 diff --git a/storno_cqp6xx_digital_xtal/Debug/cm_task_manager/cm_task_manager.d b/storno_cqp6xx_digital_xtal/Debug/cm_task_manager/cm_task_manager.d new file mode 100644 index 0000000..2e8172e --- /dev/null +++ b/storno_cqp6xx_digital_xtal/Debug/cm_task_manager/cm_task_manager.d @@ -0,0 +1,14 @@ +cm_task_manager/cm_task_manager.d cm_task_manager/cm_task_manager.o: \ + ../cm_task_manager/cm_task_manager.c \ + ../cm_task_manager/cm_task_manager.h \ + e:\cm_programs\microchip_studio\7.0\toolchain\avr8\avr8-gnu-toolchain\lib\gcc\avr\5.4.0\include\stdint.h \ + e:\cm_programs\microchip_studio\7.0\toolchain\avr8\avr8-gnu-toolchain\avr\include\stdint.h \ + e:\cm_programs\microchip_studio\7.0\toolchain\avr8\avr8-gnu-toolchain\lib\gcc\avr\5.4.0\include\stddef.h + +../cm_task_manager/cm_task_manager.h: + +e:\cm_programs\microchip_studio\7.0\toolchain\avr8\avr8-gnu-toolchain\lib\gcc\avr\5.4.0\include\stdint.h: + +e:\cm_programs\microchip_studio\7.0\toolchain\avr8\avr8-gnu-toolchain\avr\include\stdint.h: + +e:\cm_programs\microchip_studio\7.0\toolchain\avr8\avr8-gnu-toolchain\lib\gcc\avr\5.4.0\include\stddef.h: diff --git a/storno_cqp6xx_digital_xtal/Debug/cm_task_manager/cm_task_manager.o b/storno_cqp6xx_digital_xtal/Debug/cm_task_manager/cm_task_manager.o new file mode 100644 index 0000000..dd6a0c2 Binary files /dev/null and b/storno_cqp6xx_digital_xtal/Debug/cm_task_manager/cm_task_manager.o differ diff --git a/storno_cqp6xx_digital_xtal/Debug/makedep.mk b/storno_cqp6xx_digital_xtal/Debug/makedep.mk index dc6fb01..14d6a29 100644 --- a/storno_cqp6xx_digital_xtal/Debug/makedep.mk +++ b/storno_cqp6xx_digital_xtal/Debug/makedep.mk @@ -12,6 +12,8 @@ avr_uart_driver\avr_uart.c cm_msg\cm_msg.c +cm_task_manager\cm_task_manager.c + cqm6xx_app.c main.c diff --git a/storno_cqp6xx_digital_xtal/cm_task_manager b/storno_cqp6xx_digital_xtal/cm_task_manager new file mode 160000 index 0000000..c6b3c93 --- /dev/null +++ b/storno_cqp6xx_digital_xtal/cm_task_manager @@ -0,0 +1 @@ +Subproject commit c6b3c93074fa24dace48e16a935f260dc3989c4c diff --git a/storno_cqp6xx_digital_xtal/cqm6xx_app.c b/storno_cqp6xx_digital_xtal/cqm6xx_app.c index 55f82ce..8979379 100644 --- a/storno_cqp6xx_digital_xtal/cqm6xx_app.c +++ b/storno_cqp6xx_digital_xtal/cqm6xx_app.c @@ -12,7 +12,8 @@ #include "avr_global_config.h" #include "avr_eeprom_driver/avr_eeprom_driver.h" #include "cm_msg/cm_msg.h" -//#include +#include "cm_task_manager/cm_task_manager.h" + #define PLLA_SETTINGS_EEPROM_ADDR 0x00 // addr 0 #define PLLB_SETTINGS_EEPROM_ADDR 0x20 // addr 32 (64 bytes total memory) @@ -24,136 +25,45 @@ static uint8_t isStructValid(storno_xtal_app_t *inst){ return 0; } -static void cqm6xx_app_updateOsc(storno_xtal_app_t *inst){ +void setRTXOscMode(storno_xtal_app_t *inst){ + + if(inst->rtx_mode != STORNO_APP_TX_MODE){ + + cm_setOutputEnable(inst->si5351_dev,SI5351_OUTPUT_0,SI5351_OUTPUT_ENABLE); // RX + cm_setOutputEnable(inst->si5351_dev,SI5351_OUTPUT_1,SI5351_OUTPUT_DISABLE); // TX + + }else{ + cm_setOutputEnable(inst->si5351_dev,SI5351_OUTPUT_0,SI5351_OUTPUT_DISABLE); // RX + cm_setOutputEnable(inst->si5351_dev,SI5351_OUTPUT_1,SI5351_OUTPUT_ENABLE); // TX + } + +} + +void cqm6xx_app_taskHandler(storno_xtal_app_t *inst){ // Check Struct if(isStructValid(inst) != 0)return; - // We will only do this once, aka when transisioning from RX to TX and TX to RX.. - if(inst->state_next == inst->state_now)return; + // Run next task: + cm_taskManager_run_tasks(&inst->storno_xtal_task); - switch(inst->state_next){ + // Find out if we are in RX or TX + + // If TX pin is not set, then turn on RX output on PLL and disable TX clock. Run setRTXOscMode once, so pll isnt constantly written to!! + if((gpio_get_level(GPIO_PORTA,GPIO_PIN_PTT) != GPIO_LEVEL_SET) && (inst->rtx_mode != STORNO_APP_RX_MODE )){ - case STORNO_APP_RX_MODE: - //_delay_ms(1); - cm_setOutputEnable(inst->si5351_dev,SI5351_OUTPUT_0,SI5351_OUTPUT_ENABLE); // RX - //_delay_ms(1); - cm_setOutputEnable(inst->si5351_dev,SI5351_OUTPUT_1,SI5351_OUTPUT_DISABLE); // TX - - break; - - case STORNO_APP_TX_MODE: - //_delay_ms(1); - cm_setOutputEnable(inst->si5351_dev,SI5351_OUTPUT_0,SI5351_OUTPUT_DISABLE); // RX - //_delay_ms(1); - cm_setOutputEnable(inst->si5351_dev,SI5351_OUTPUT_1,SI5351_OUTPUT_ENABLE); // TX - - break; + inst->rtx_mode = STORNO_APP_RX_MODE; + cm_taskManager_addTaskToList(&inst->storno_xtal_task,setRTXOscMode,inst); + + }else if (inst->rtx_mode != STORNO_APP_TX_MODE){ + inst->rtx_mode = STORNO_APP_TX_MODE; + cm_taskManager_addTaskToList(&inst->storno_xtal_task,setRTXOscMode,inst); - default: - break; - } - } -static void cqm_setPLLParam(storno_xtal_app_t *inst, si5351_PLLs pll_num, si5351_Outputs output){ - - cm_setPllParamRaw(inst->si5351_dev,pll_num, inst->plla_param_data.MSNx_P1, inst->plla_param_data.MSNx_P2, inst->plla_param_data.MSNx_P3); - //_delay_ms(1); - cm_setOutputMultiSynthRaw(inst->si5351_dev,output, inst->plla_param_data.MSx_P1, inst->plla_param_data.MSx_P2, inst->plla_param_data.MSx_P3); - //_delay_ms(1); - cm_setCLKControl(inst->si5351_dev,output,SI5351_CLK_POWER_UP); - - -} -static void cqm6xx_app_loadPLLParam(storno_xtal_app_t *inst){ - - // Read settings for PLLA first - cm_EEPROM_read((uint8_t*)PLLA_SETTINGS_EEPROM_ADDR,(uint8_t *)&inst->plla_param_data,sizeof(storno_pll_param_msg)); - //_delay_ms(1); - cm_setInputSource(inst->si5351_dev, SI5351_CLK_SOURCE_XTAL); - //_delay_ms(1); - - - cqm_setPLLParam(inst, SI5351_PLL_A, SI5351_OUTPUT_0); - //_delay_ms(1); - - - cm_EEPROM_read((uint8_t*)PLLB_SETTINGS_EEPROM_ADDR,(uint8_t *)&inst->plla_param_data,sizeof(storno_pll_param_msg)); - //_delay_ms(1); - cqm_setPLLParam(inst, SI5351_PLL_B, SI5351_OUTPUT_1); - - - // Set third output to crystal freq for calibration! - cqm_setPLLParam(inst, SI5351_PLL_B, SI5351_OUTPUT_2); - cm_setCLKControl(inst->si5351_dev, SI5351_OUTPUT_2,SI5351_CLK_POWER_UP); - //_delay_ms(1); - cm_setOutputEnable(inst->si5351_dev,SI5351_OUTPUT_2,SI5351_OUTPUT_ENABLE); - - - -} - -void cqm6xx_app_statemachine(storno_xtal_app_t *inst){ - - // Check Struct - if(isStructValid(inst) != 0)return; - - switch (inst->state_next) - { - case STORNO_APP_PROGRAM_OSC: - // Read PLL parameters from EEPROM and Program PLL values here: - inst->state_now = inst->state_next; - - cqm6xx_app_loadPLLParam(inst); - - - // if ok, then go to RX mode: - inst->state_next = STORNO_APP_RX_MODE; - break; - - - case STORNO_APP_RX_MODE: - // If we just came from another state, then Enable RX osc here.. - cqm6xx_app_updateOsc(inst); - - // Update state now.. - inst->state_now = inst->state_next; - - - // If PTT is hold, then disable RX osc, and go to STORNO_APP_TX_MODE, to enable tx osc. - if(gpio_get_level(GPIO_PORTA,GPIO_PIN_PTT) == GPIO_LEVEL_SET) inst->state_next = STORNO_APP_TX_MODE; - - break; - - case STORNO_APP_TX_MODE: - // If we just came from another state, then Enable TX osc here.. - cqm6xx_app_updateOsc(inst); - - // Update state now.. - inst->state_now = inst->state_next; - - // If PTT is released, then disable TX osc, and go to STORNO_APP_RX_MODE, to enable rx osc. - if(gpio_get_level(GPIO_PORTA,GPIO_PIN_PTT) == GPIO_LEVEL_RESET) inst->state_next = STORNO_APP_RX_MODE; - break; - - - case STORNO_APP_RST_TO_BOOTLOADER: - - break; - - default: - break; - } - - -} - -void programPLL_Parameters(storno_xtal_app_t *inst){ - - //uint8_t *data_ptr = (void *)&inst->plla_param_data; +void EepromWritePLLParameters(storno_xtal_app_t *inst){ //Burn settings into eeprom here: switch(inst->plla_param_data.header.PLL_Ident){ @@ -180,25 +90,6 @@ void programPLL_Parameters(storno_xtal_app_t *inst){ } - /*if((inst->plla_param_data.PLL_Ident == MSG_GET_PLLA_PARAM) && (inst->plla_param_data.PLL_Ident == MSG_GET_PLLB_PARAM)){ - - cm_uart_send('O'); - cm_uart_send('Z'); - cm_uart_send('1'); - cm_uart_send('C'); - cm_uart_send('M'); - - - for(uint8_t idx = 0; idx < sizeof(storno_pll_param_msg);idx++){ - cm_uart_send(data_ptr[idx]); - } - }*/ - - // Send status back maybe.. - - //Force state machine to load new settings from eeprom: - inst->state_next = STORNO_APP_PROGRAM_OSC; - } static int writeDefaultSettingsEEprom(storno_xtal_app_t *inst){ @@ -239,6 +130,44 @@ static int isEEPROMValid(storno_xtal_app_t *inst){ return 0; +} + +static void cqm_setPLLParam(storno_xtal_app_t *inst, si5351_PLLs pll_num, si5351_Outputs output){ + + cm_setPllParamRaw(inst->si5351_dev,pll_num, inst->plla_param_data.MSNx_P1, inst->plla_param_data.MSNx_P2, inst->plla_param_data.MSNx_P3); + //_delay_ms(1); + cm_setOutputMultiSynthRaw(inst->si5351_dev,output, inst->plla_param_data.MSx_P1, inst->plla_param_data.MSx_P2, inst->plla_param_data.MSx_P3); + //_delay_ms(1); + cm_setCLKControl(inst->si5351_dev,output,SI5351_CLK_POWER_UP); + + +} +static void cqm6xx_app_loadPLLParam(storno_xtal_app_t *inst){ + + // Read settings for PLLA first + cm_EEPROM_read((uint8_t*)PLLA_SETTINGS_EEPROM_ADDR,(uint8_t *)&inst->plla_param_data,sizeof(storno_pll_param_msg)); + //_delay_ms(1); + cm_setInputSource(inst->si5351_dev, SI5351_CLK_SOURCE_XTAL); + //_delay_ms(1); + + + cqm_setPLLParam(inst, SI5351_PLL_A, SI5351_OUTPUT_0); + //_delay_ms(1); + + + cm_EEPROM_read((uint8_t*)PLLB_SETTINGS_EEPROM_ADDR,(uint8_t *)&inst->plla_param_data,sizeof(storno_pll_param_msg)); + //_delay_ms(1); + cqm_setPLLParam(inst, SI5351_PLL_B, SI5351_OUTPUT_1); + + + // Set third output to crystal freq for calibration! + cqm_setPLLParam(inst, SI5351_PLL_B, SI5351_OUTPUT_2); + cm_setCLKControl(inst->si5351_dev, SI5351_OUTPUT_2,SI5351_CLK_POWER_UP); + //_delay_ms(1); + cm_setOutputEnable(inst->si5351_dev,SI5351_OUTPUT_2,SI5351_OUTPUT_ENABLE); + + + } int uart_rx_event(storno_xtal_app_t *inst, void *rxData){ @@ -257,6 +186,11 @@ int uart_rx_event(storno_xtal_app_t *inst, void *rxData){ } + // Add EepromWritePLLParameters to trigger to write setting to eeprom as soon as we can after ISR! + cm_taskManager_addTaskToList(&inst->storno_xtal_task,(void*)EepromWritePLLParameters,inst); + + // Add write pll to list.. so the settings are updated immitialy + return 0; } @@ -265,14 +199,11 @@ void cqm6xx_app_init(storno_xtal_app_t *inst, void *si5351_dev){ if(si5351_dev == NULL) return; if(inst == NULL)return; - - inst->state_next = STORNO_APP_PROGRAM_OSC; - inst->state_now = STORNO_APP_PROGRAM_OSC; - inst->si5351_dev = si5351_dev; cm_MsgCompleteEvt_Register(inst,(Get_msgComplete_Event_fpt)uart_rx_event); cm_uart_init(inst,(get_UART_Event_fpt)cm_msg_DecodeMsg_Byte); + cm_taskManager_init(&inst->storno_xtal_task); // Check if data is vaild (if this is a new mcu) if(!isEEPROMValid(inst)){ @@ -280,4 +211,6 @@ void cqm6xx_app_init(storno_xtal_app_t *inst, void *si5351_dev){ writeDefaultSettingsEEprom(inst); } + cqm6xx_app_loadPLLParam(inst); + } \ No newline at end of file diff --git a/storno_cqp6xx_digital_xtal/cqm6xx_app.h b/storno_cqp6xx_digital_xtal/cqm6xx_app.h index eee3a76..839fa65 100644 --- a/storno_cqp6xx_digital_xtal/cqm6xx_app.h +++ b/storno_cqp6xx_digital_xtal/cqm6xx_app.h @@ -46,28 +46,24 @@ typedef struct { typedef enum { - - STORNO_APP_PROGRAM_OSC = 0, - STORNO_APP_RX_MODE = 1, - STORNO_APP_TX_MODE = 2, - STORNO_APP_RST_TO_BOOTLOADER = 5, + STORNO_APP_RX_MODE = 0, + STORNO_APP_TX_MODE = 1, -}storno_app_states; +}storno_app_modes; typedef struct { - storno_app_states state_now; - storno_app_states state_next; - + storno_app_modes rtx_mode; void *si5351_dev; storno_pll_param_msg plla_param_data; storno_pll_param_msg pllb_param_data; + cm_task_manager_t storno_xtal_task; }__attribute__((packed))storno_xtal_app_t; -void cqm6xx_app_statemachine(storno_xtal_app_t *inst); +void cqm6xx_app_taskHandler(storno_xtal_app_t *inst); void cqm6xx_app_init(storno_xtal_app_t *inst, void *si5351_dev); diff --git a/storno_cqp6xx_digital_xtal/main.c b/storno_cqp6xx_digital_xtal/main.c index 9ed8c82..7a6f426 100644 --- a/storno_cqp6xx_digital_xtal/main.c +++ b/storno_cqp6xx_digital_xtal/main.c @@ -13,6 +13,7 @@ #include "cqm6xx_app.h" #include "avr_eeprom_driver/avr_eeprom_driver.h" + storno_xtal_app_t storno_xtal_app; int main(void) @@ -30,11 +31,13 @@ int main(void) si5351_driver si5351_dev; cm_si5351_init(&si5351_dev,&si5351_i2c,(setGet_I2C_Event_fpt)cm_i2c_transfer); cqm6xx_app_init(&storno_xtal_app, &si5351_dev); + + while (1) { - cqm6xx_app_statemachine(&storno_xtal_app); - //_delay_ms(100); + cqm6xx_app_taskHandler(&storno_xtal_app); + } } diff --git a/storno_cqp6xx_digital_xtal/storno_cqp6xx_digital_xtal.cproj b/storno_cqp6xx_digital_xtal/storno_cqp6xx_digital_xtal.cproj index 276f558..ea518f3 100644 --- a/storno_cqp6xx_digital_xtal/storno_cqp6xx_digital_xtal.cproj +++ b/storno_cqp6xx_digital_xtal/storno_cqp6xx_digital_xtal.cproj @@ -103,47 +103,47 @@ - -mmcu=attiny402 -B "%24(PackRepoDir)\atmel\ATtiny_DFP\1.10.348\gcc\dev\attiny402" - True - True - True - True - False - True - True - - - DEBUG - - - - - %24(PackRepoDir)\atmel\ATtiny_DFP\1.10.348\include\ - - - Optimize (-O1) - True - True - Default (-g2) - True - - - libm - - - - - D:\cm_projects\microchip_studio_projects\storno_cqp6xx_digital_xtal\storno_cqp6xx_digital_xtal\si5351_driver\include - ../avr_uart_driver - - - - - %24(PackRepoDir)\atmel\ATtiny_DFP\1.10.348\include\ - - - Default (-Wa,-g) - + -mmcu=attiny402 -B "%24(PackRepoDir)\atmel\ATtiny_DFP\1.10.348\gcc\dev\attiny402" + True + True + True + True + False + True + True + + + DEBUG + + + + + %24(PackRepoDir)\atmel\ATtiny_DFP\1.10.348\include\ + + + Optimize (-O1) + True + True + Default (-g2) + True + + + libm + + + + + D:\cm_projects\microchip_studio_projects\storno_cqp6xx_digital_xtal\storno_cqp6xx_digital_xtal\si5351_driver\include + ../avr_uart_driver + + + + + %24(PackRepoDir)\atmel\ATtiny_DFP\1.10.348\include\ + + + Default (-Wa,-g) + @@ -180,6 +180,12 @@ compile + + compile + + + compile + compile @@ -205,6 +211,7 @@ + @@ -244,6 +251,12 @@ compile + + compile + + + compile + compile