This thread has been locked.
If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.
Hi @jagadish gundavarapu ,
I created a project using TMS570LC4357 development board. I used Halcogen to get it done. In halcogen I selected FreeRTOS but developed my application without creating a task.
I configured external interrupts with below mentioned I/O pins :
Inputs: PA0 (with external interrupt on high side)
PA6 (with external interrupt on high side)
PA7 (with external interrupt on high side)
PB2 (with external interrupt on high side)
Outputs:
PB6 = User LED 2
PB7 = User LED 3
Execution:
Application work well when I execute the code. Attached is the main.c file for reference.
/** @file HL_sys_main.c * @brief Application main file * @date 11-Dec-2018 * @version 04.07.01 * * This file contains an empty main function, * which can be used for the application. */ /* * Copyright (C) 2009-2018 Texas Instruments Incorporated - www.ti.com * * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * * Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * * Neither the name of Texas Instruments Incorporated nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * */ /* USER CODE BEGIN (0) */ #include "HL_sys_core.h" #include "HL_gio.h" #include <stdio.h> /* USER CODE END */ /* Include Files */ #include "HL_sys_common.h" /* USER CODE BEGIN (1) */ #define false 0 #define true 1 // Define constants #define TEETH_PER_ROTATION 50 #define CABLE_LENGTH_PER_TOOTH 1 // Length in teeths of a meter per tooth 1= 0.1 meter. 10 = 1 meter. 100 = 10 meter and so on... #define SENSOR1 0x01 #define SENSOR2 0x02 //.... Declarations ...... boolean PB2_Flag = false; boolean PA0_Flag = false; boolean PA6_Flag = false; boolean PA7_Flag = false; boolean PROX1_A_Flag = false; boolean PROX1_B_Flag = false; boolean PROX2_A_Flag = false; boolean PROX2_B_Flag = false; uint16_t PROX1_A_Counter = 0; uint16_t PROX1_B_Counter = 0; uint16_t PROX2_A_Counter = 0; uint16_t PROX2_B_Counter = 0; uint16_t cableLengthSensor1 = 0; uint16_t cableLengthSensor2 = 0; char Prox1_direction = 0; char Prox2_direction = 0; /* USER CODE END */ /** @fn void main(void) * @brief Application main function * @note This function is empty by default. * * This function is called after startup. * The user can use this function to implement the application. */ /* USER CODE BEGIN (2) */ // Function to determine direction for a specific sensor char determineDirection(uint8_t sensor){ uint16_t Prox1A_Count = 0; uint16_t Prox1B_Count = 0; uint16_t Prox2A_Count = 0; uint16_t Prox2B_Count = 0; if(sensor == SENSOR1){ Prox1A_Count = PROX1_A_Counter; Prox1B_Count = PROX1_B_Counter; return (Prox1A_Count > Prox1B_Count) ? (gioSetBit(gioPORTB, 6, 1), gioSetBit(gioPORTB, 7, 0), 'A') : (Prox1B_Count > Prox1A_Count) ? (gioSetBit(gioPORTB, 6, 0), gioSetBit(gioPORTB, 7, 1), 'B') : (gioSetBit(gioPORTB, 6, 0), gioSetBit(gioPORTB, 7, 0), 'C'); // if(Prox1A_Count > Prox1B_Count){ // gioSetBit(gioPORTB, 6, 1); //LED 2 ON // gioSetBit(gioPORTB, 7, 0); //LED 1 OFF // return 'A'; // Direction A // }else if (Prox1A_Count < Prox1B_Count){ // gioSetBit(gioPORTB, 6, 0); //LED 2 OFF // gioSetBit(gioPORTB, 7, 1); //LED 1 ON // return 'B'; // Direction B // }else{ // gioSetBit(gioPORTB, 6, 0); //LED 2 OFF // gioSetBit(gioPORTB, 7, 0); //LED 1 OFF // return 'N'; // No clear direction detected // } }else if(sensor == SENSOR2){ Prox2A_Count = PROX2_A_Counter; Prox2B_Count = PROX2_B_Counter; return (Prox2A_Count > Prox2B_Count) ? (gioSetBit(gioPORTB, 6, 1), gioSetBit(gioPORTB, 7, 0), 'A') : (Prox2B_Count > Prox2A_Count) ? (gioSetBit(gioPORTB, 6, 0), gioSetBit(gioPORTB, 7, 1), 'B') : (gioSetBit(gioPORTB, 6, 0), gioSetBit(gioPORTB, 7, 0), 'C'); // if(Prox2A_Count > Prox2B_Count){ // gioSetBit(gioPORTB, 6, 1); //LED 2 ON // gioSetBit(gioPORTB, 7, 0); //LED 1 OFF // return 'A'; // Direction A // }else if(Prox2A_Count < Prox2B_Count){ // gioSetBit(gioPORTB, 6, 0); //LED 2 OFF // gioSetBit(gioPORTB, 7, 1); //LED 1 ON // return 'B'; // Direction B // }else{ // gioSetBit(gioPORTB, 6, 0); //LED 2 OFF // gioSetBit(gioPORTB, 7, 0); //LED 1 OFF // return 'N'; // No clear direction detected // } }else{ gioSetBit(gioPORTB, 6, 0); //LED 2 OFF gioSetBit(gioPORTB, 7, 0); //LED 1 OFF return 'N'; // Invalid sensor number } } // Function to calculate cable length for a given sensor uint16_t calculateCableLength(uint8_t sensor, char Prox_direction, uint16_t PROX_A_Counter, uint16_t PROX_B_Counter) { if (sensor != SENSOR1 && sensor != SENSOR2) { printf("Invalid sensor number\n"); return 0; // Return 0 to indicate an error } if (Prox_direction != 'A' && Prox_direction != 'B' && Prox_direction != 'C') { printf("Invalid direction\n"); return 0; // Return 0 to indicate an error } uint16_t pulses = (Prox_direction == 'A') ? PROX_A_Counter : (Prox_direction == 'B') ? PROX_B_Counter : 0; return (uint16_t)((pulses * CABLE_LENGTH_PER_TOOTH) / TEETH_PER_ROTATION); } // Function for proximity sensor 1 void Prox1(){ // Determine the direction for Sensor 1 Prox1_direction = determineDirection(SENSOR1); cableLengthSensor1 = calculateCableLength(SENSOR1, Prox1_direction, PROX1_A_Counter, PROX1_B_Counter); } // Function for proximity sensor 2 void Prox2(){ // Determine the direction for Sensor 2 Prox2_direction = determineDirection(SENSOR2); cableLengthSensor2 = calculateCableLength(SENSOR2, Prox2_direction, PROX2_A_Counter, PROX2_B_Counter); } /* USER CODE END */ int main(void) { /* USER CODE BEGIN (3) */ gioInit(); _enable_IRQ_interrupt_(); while(1) { Prox1(); // Proximity sensor 1 Prox2(); // Proximity sensor 2 PB2_Flag = PA0_Flag = PA6_Flag = PA7_Flag = 0; // Resetting Input flags } /* USER CODE END */ return 0; } /* USER CODE BEGIN (4) */ void gioNotification(gioPORT_t *port, uint32 bit) { if(port == gioPORTB && bit == 2) { PB2_Flag = true; PROX1_A_Flag = true; PROX1_A_Counter++; // Increment counters for Sensor 1 based on received signal A } else if(port == gioPORTA && bit == 0) { PA0_Flag = true; PROX1_B_Flag = true; PROX1_B_Counter++; // Increment counters for Sensor 1 based on received signal B } else if(port == gioPORTA && bit == 6) { PA6_Flag = true; PROX2_B_Flag = true; PROX2_B_Counter++; // Increment counters for Sensor 2 based on received signal B } else if(port == gioPORTA && bit == 7) { PA7_Flag = true; PROX2_A_Flag = true; PROX2_A_Counter++; // Increment counters for Sensor 2 based on received signal A } else { PROX1_A_Flag = PROX1_B_Flag = PROX2_A_Flag = PROX2_B_Flag = false ; } } /* USER CODE END */
--------------------
Now the Problem Statement:
I have another project which uses FreeRTOS and 2 Task are running in it.
I modified this code to configure above specified I/O pins with external interrupts.
When I executed my code, it get stuck In os_port.c --> vPortStartFirstTask(); function.
Below is my freeRTOS config:
Attached is the main.c file with freeRTOS task running in it.
/** @file HL_sys_main.c * @brief Application main file * @date 11-Dec-2018 * @version 04.07.01 * * This file contains an empty main function, * which can be used for the application. */ /* * Copyright (C) 2009-2018 Texas Instruments Incorporated - www.ti.com * * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * * Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * * Neither the name of Texas Instruments Incorporated nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * */ /* USER CODE BEGIN (0) */ /* USER CODE END */ /* Include Files */ #include "HL_sys_common.h" /* USER CODE BEGIN (1) */ /* FreeRTOS scheduler files */ #include "FreeRTOS.h" #include "FreeRTOS_UDP_IP.h" #include "os_task.h" #include "FreeRTOS_sockets.h" #include "os_timer.h" #include "HL_emac.h" #include "HL_hw_reg_access.h" #include "HL_spi.h" #include "HL_gio.h" #include "HL_sys_pmu.h" #include "HL_adc.h" /* Console IO Support */ #include "HL_sci.h" #include <stdint.h> #include <string.h> #include <stdio.h> /* Simulink header */ #include "Hercules.h" /*Maths Operations */ #include "math.h" /** DEFINE **/ #define sciREGx sciREG1 #define clearScreen() printf("\033[H\033[J") #define gotoxy(x,y) printf("\033[%d;%dH", (x), (y)) #define DEBUG_STRING_BUFFER_SIZE 1024 uint8_t txtCRLF[] = {'\r', '\n'}; char printBuffer [512]; #define DebugOn 0 #define false 0 #define true 1 //AD7175_8_Setup #define NumEnabledChannelsBitMask 15 // binary bit mask value for number of channels enabled #define cNDT1SensorCH 0 #define cNDT1NoiseCH 1 #define cNDT2SensorCH 2 #define cNDT2NoiseCH 3 // Proximity sensor definitions ..... #define TEETH_PER_ROTATION 50 #define CABLE_LENGTH_PER_TOOTH 1 // Length in teeths of a meter per tooth 1= 0.1 meter. 10 = 1 meter. 100 = 10 meter and so on... #define SENSOR1 0x01 #define SENSOR2 0x02 /* Define the network addressing. These parameters will be used if either * ipconfigUDE_DHCP is 0 or if ipconfigUSE_DHCP is 1 but DHCP auto configuration * failed. */ //Set to static IP for se on current scaler setup //[TODO] Update IP address to Scaler assigned //static const uint8_t ucIPAddress[ 4 ] = { 10, 0, 0, 98 }; //static const uint8_t ucNetMask[ 4 ] = { 255, 255, 255, 0 }; //static const uint8_t ucGatewayAddress[ 4 ] = { 10, 0, 0, 138 }; //static const uint8_t ucDNSServerAddress[ 4 ] = { 10, 0, 0, 100 }; static const uint8_t ucIPAddress[ 4 ] = { 192, 168, 169, 8 }; static const uint8_t ucNetMask[ 4 ] = { 255, 255, 255, 0 }; static const uint8_t ucGatewayAddress[ 4 ] = { 192, 168, 169, 204 }; static const uint8_t ucDNSServerAddress[ 4 ] = { 192, 168, 169, 204 }; /* SPI variables */ uint16_t txSPIbuffer[]= {0x0,0x0,0x0,0x0,0x0}; uint16 txDataLowByte = 0; uint16 txDataHighByte = 0; uint16_t rxBuffer[10]; uint16_t BufId = 0; spiDAT1_t AD7175_8_Setup_dataconfig; // 8 bits for command spiDAT1_t AD7175_8_data_recv_dataconfig; // 8 bits segments for data uint32_t spiCommand = 0; uint32_t spiData = 0; uint16_t rxSPIbuffer[5]; // Buffer structure with WL not set. FIrst 24Bits is Signal Reading, nest 8bits is the status register when Data_STAT is set, the last 8bits are the CRC, when CRC is enabled uint16_t rxSPIstatusBuffer[2]; // Buffer structure with WL not set. FIrst 24Bits is Signal Reading, nest 8bits is the status register when Data_STAT is set, the last 8bits are the CRC, when CRC is enabled char strNDTSensor1_Signal[11],strNDTSensor1_Noise[11],strNDTSensor2_Signal[11],strNDTSensor2_Noise[11]; char Bit16_Sensor1_Signal[7],Bit16_Sensor1_Noise[7],Bit16_Sensor2_Signal[7],Bit16_Sensor2_Noise[7]; // Variables declaration for 16 bit ADC resolution uint16_t Sensor1_Signal=0,Sensor1_Noise=0,Sensor2_Signal=0,Sensor2_Noise=0; // Variables declaration for 16 bit ADC resolution /* ADC Variables */ uint32 ch_count=0; /* Power System Bits */ bool Latch_On = 0; bool Power_12V_On = 0; bool Disable_System = 0; //.... Proximity Sensor Declarations ...... boolean PB2_Flag = false; boolean PA0_Flag = false; boolean PA6_Flag = false; boolean PA7_Flag = false; boolean PROX1_A_Flag = false; boolean PROX1_B_Flag = false; boolean PROX2_A_Flag = false; boolean PROX2_B_Flag = false; uint16_t PROX1_A_Counter = 0; uint16_t PROX1_B_Counter = 0; uint16_t PROX2_A_Counter = 0; uint16_t PROX2_B_Counter = 0; uint16_t cableLengthSensor1 = 0; uint16_t cableLengthSensor2 = 0; char Prox1_direction = 0; char Prox2_direction = 0; /*Task Initalisation Complete Statuses */ bool Task_1_Initialised = false; bool Task_2_Initialised = false; /* Debug */ uint8_t cString[ 150]; //55 100 ]; struct AD7175_8_Measurements{ uint32_t ADCvalue; uint8_t StatusReg; uint8_t CRC; } ; struct NDTsensors{ struct AD7175_8_Measurements Signal; struct AD7175_8_Measurements Noise; } ; struct NDTRecords{ struct NDTsensors NDT1; struct NDTsensors NDT2; uint32_t Heartbeat; } ; struct NDTRecords NDTLog; /* Task Handles */ xTaskHandle xDebugTaskHandle; // Task used to send data to a serial terminal xTaskHandle xNetworkCommsTaskHandle; // Task to handle Ethernet network data communications xTaskHandle xADCpollingTaskHandle; // Task to Poll analog data xTaskHandle xSimulinkTaskHandle; // Task used to Run Simulink code. Typically Power Management xTaskHandle xInitialisationTaskHandle; // Task Used to coordinate the intialisation of all task xTaskHandle xAggregateTaskHandle; // Task Used to combine all tasks other than simulink void sciDisplayText(sciBASE_t *sci, uint8_t *text) { size_t length = strlen ((const char *)text); while(length--) { while ((sci->FLR & 0x4) == 4); //wait until busy sciSendByte(sci,*text++); // send out text }; } void sciDisplayTextLen(sciBASE_t *sci, uint8_t *text,uint32_t length) { while(length--) { while ((sci->FLR & 0x4) == 4); //wait until busy sciSendByte(sci,*text++); // send out text }; } void vApplicationIPNetworkEventHook( eIPCallbackEvent_t eNetworkEvent ) { static BaseType_t xTasksAlreadyCreated = pdFALSE; char printBuffer[256]; uint32_t ulIPAddress, ulNetMask, ulGatewayAddress, ulDNSServerAddress; int8_t cBuffer[16]; sciDisplayText(sciREGx,"Network Status ..."); /* Check this was a network up event, as opposed to a network down event. */ if( eNetworkEvent == eNetworkUp ) { /* The network is up and configured. Print out the configuration obtained from the DHCP server. */ FreeRTOS_GetAddressConfiguration( &ulIPAddress, &ulNetMask, &ulGatewayAddress, &ulDNSServerAddress ); /* Convert the IP address to a string then print it out. */ FreeRTOS_inet_ntoa( ulIPAddress, cBuffer ); sprintf(printBuffer,"IP Address: %s\r\n", cBuffer ); sciDisplayText(sciREGx,(uint8_t *)printBuffer); /* Convert the net mask to a string then print it out. */ FreeRTOS_inet_ntoa( ulNetMask, cBuffer ); sprintf(printBuffer,"Subnet Mask: %s\r\n", cBuffer ); sciDisplayText(sciREGx,(uint8_t *)printBuffer); /* Convert the IP address of the gateway to a string then print it out. */ FreeRTOS_inet_ntoa( ulGatewayAddress, cBuffer ); sprintf(printBuffer,"Gateway IP Address: %s\r\n", cBuffer ); sciDisplayText(sciREGx,(uint8_t *)printBuffer); /* Convert the IP address of the DNS server to a string then print it out. */ FreeRTOS_inet_ntoa( ulDNSServerAddress, cBuffer ); sprintf(printBuffer,"DNS server IP Address: %s\r\n", cBuffer ); sciDisplayText(sciREGx,(uint8_t *)printBuffer); /* Create the tasks that use the IP stack if they have not already been created. */ if( xTasksAlreadyCreated == pdFALSE ) { /* * For convenience, tasks that use FreeRTOS+UDP can be created here * to ensure they are not created before the network is usable. */ xTasksAlreadyCreated = pdTRUE; } } else { sciDisplayText(sciREGx,"Network not up :("); } } /** @fn void uint16buf2HexString(uint8_t * uint8buf,uint BufferLength,char * HexCharArray) * @brief convert data to a Hex char string * @param[in] uint8buf - Pointer to buffer of uint8_t members * @param[in] BufferLength - unsigned integer that is the length of uint8Buf * @param[in] HexCharArray - Pointer to char array of char members * * @return null. * * This function converts an array of 8-bit numbers to a string of Hex characters. * */ static char hex[] = "0123456789ABCDEF"; void uint16buf2HexString(uint16_t * uint16buf,size_t BufferLength,char * HexCharArray){ size_t i = 0; /* //Forward order? for (i = 0; i < BufferLength/2; i++) { HexCharArray[(((BufferLength/2-1)-i) * 2) + 0] = hex[((uint16buf[i] & 0x00F0) >> 4)]; HexCharArray[(((BufferLength/2-1)-i) * 2) + 1] = hex[((uint16buf[i] & 0x000F) >> 0)]; } */ //Reverese order? for (i = 0; i < BufferLength/2; i++) { HexCharArray[(i * 2) + 0] = hex[((uint16buf[i] & 0x00F0) >> 4)]; HexCharArray[(i * 2) + 1] = hex[((uint16buf[i] & 0x000F) >> 0)]; } //// Add Null char at the end of the string // HexCharArray[(i * 2) + 2] = 0x00; } /*static char hex[] = "0123456789ABCDEF"; void convert_to_hex_str(char* str, uint8_t* val, size_t val_count) { for (size_t i = 0; i < val_count; i++) { str[(i * 2) + 0] = hex[((val[i] & 0xF0) >> 4)]; str[(i * 2) + 1] = hex[((val[i] & 0x0F) >> 0)]; } } */ /** @fn void SPIdataSetup(uint32_t * Command, uint32_t * Data, uint16 * txBuffer,int WordLength,int NumCmdWords, int NumTxWords ) * @brief convert address and data into word length chunks to be sent * @param[in] Command - Pointer to command to be sent * @param[in] Data - Pointer to data to be sent * @param[in] txBuffer - Pointer to Transmit buffer array of uint16_t members * @param[in] WordLength - Number of characters specified in the SPI data format Data Format being transmitted * @param[in] NumCmdWords - Number of words to break the command value into. * @param[in] NumTxWords - Number of Words to be transmitted. * * @return null. * * This function populates a transfer buffer array of length equivalent to NumTxWords with data of the form address of the register or and then data. */ void SPIdataSetup(uint32_t * Command, uint32_t * Data, uint16 * txBuffer,int WordLength,int NumCmdWords, int NumTxWords ){ static int idataCnt = 0; for(idataCnt = 0;idataCnt <= NumTxWords;idataCnt = idataCnt + 1) { txBuffer[idataCnt] = 0x0; //Reset value if(idataCnt <= (NumCmdWords - 1)) { txBuffer[idataCnt] = (uint16_t)(*Command >> (WordLength*(idataCnt))); } else { txBuffer[idataCnt] = (uint16_t)(*Data >> (WordLength*(idataCnt - NumCmdWords))); } } } /* * PMU Support */ void initialisePMU() { /* PMU calibration */ _pmuInit_(); _pmuEnableCountersGlobal_(); _pmuResetCounters_(); _pmuStartCounters_(pmuCYCLE_COUNTER); } uint32 getPMUCycleCounter() { return _pmuGetCycleCount_(); } static uint32 totalCount; static uint32 lastCycleCount; void initExecutionTimer() { initialisePMU(); totalCount = 0; lastCycleCount = 0; } uint32 getExecutionTimer() { uint32 cycleCount = getPMUCycleCounter(); if (cycleCount < lastCycleCount) { /* * We have an overflow... */ totalCount += cycleCount + (0xFFFFFFFF - lastCycleCount); } else { totalCount += (cycleCount-lastCycleCount)/1000; } lastCycleCount = cycleCount; return totalCount; } // Function to determine direction of Winch Rope using Proximity Sensors char determineDirection(uint8_t sensor){ uint16_t Prox1A_Count = 0; uint16_t Prox1B_Count = 0; uint16_t Prox2A_Count = 0; uint16_t Prox2B_Count = 0; if(sensor == SENSOR1){ Prox1A_Count = PROX1_A_Counter; Prox1B_Count = PROX1_B_Counter; return (Prox1A_Count > Prox1B_Count) ? (gioSetBit(gioPORTB, 6, 1), gioSetBit(gioPORTB, 7, 0), 'A') : (Prox1B_Count > Prox1A_Count) ? (gioSetBit(gioPORTB, 6, 0), gioSetBit(gioPORTB, 7, 1), 'B') : (gioSetBit(gioPORTB, 6, 0), gioSetBit(gioPORTB, 7, 0), 'C'); // if(Prox1A_Count > Prox1B_Count){ // gioSetBit(gioPORTB, 6, 1); //LED 2 ON // gioSetBit(gioPORTB, 7, 0); //LED 1 OFF // return 'A'; // Direction A // }else if (Prox1A_Count < Prox1B_Count){ // gioSetBit(gioPORTB, 6, 0); //LED 2 OFF // gioSetBit(gioPORTB, 7, 1); //LED 1 ON // return 'B'; // Direction B // }else{ // gioSetBit(gioPORTB, 6, 0); //LED 2 OFF // gioSetBit(gioPORTB, 7, 0); //LED 1 OFF // return 'N'; // No clear direction detected // } }else if(sensor == SENSOR2){ Prox2A_Count = PROX2_A_Counter; Prox2B_Count = PROX2_B_Counter; return (Prox2A_Count > Prox2B_Count) ? (gioSetBit(gioPORTB, 6, 1), gioSetBit(gioPORTB, 7, 0), 'A') : (Prox2B_Count > Prox2A_Count) ? (gioSetBit(gioPORTB, 6, 0), gioSetBit(gioPORTB, 7, 1), 'B') : (gioSetBit(gioPORTB, 6, 0), gioSetBit(gioPORTB, 7, 0), 'C'); // if(Prox2A_Count > Prox2B_Count){ // gioSetBit(gioPORTB, 6, 1); //LED 2 ON // gioSetBit(gioPORTB, 7, 0); //LED 1 OFF // return 'A'; // Direction A // }else if(Prox2A_Count < Prox2B_Count){ // gioSetBit(gioPORTB, 6, 0); //LED 2 OFF // gioSetBit(gioPORTB, 7, 1); //LED 1 ON // return 'B'; // Direction B // }else{ // gioSetBit(gioPORTB, 6, 0); //LED 2 OFF // gioSetBit(gioPORTB, 7, 0); //LED 1 OFF // return 'N'; // No clear direction detected // } }else{ gioSetBit(gioPORTB, 6, 0); //LED 2 OFF gioSetBit(gioPORTB, 7, 0); //LED 1 OFF return 'N'; // Invalid sensor number } } // Function to calculate Winch Rope length using Proximity sensors uint16_t calculateCableLength(uint8_t sensor, char Prox_direction, uint16_t PROX_A_Counter, uint16_t PROX_B_Counter) { if (sensor != SENSOR1 && sensor != SENSOR2) { printf("Invalid sensor number\n"); return 0; // Return 0 to indicate an error } if (Prox_direction != 'A' && Prox_direction != 'B' && Prox_direction != 'C') { printf("Invalid direction\n"); return 0; // Return 0 to indicate an error } uint16_t pulses = (Prox_direction == 'A') ? PROX_A_Counter : (Prox_direction == 'B') ? PROX_B_Counter : 0; return (uint16_t)((pulses * CABLE_LENGTH_PER_TOOTH) / TEETH_PER_ROTATION); } // Function for proximity sensor 1 void Prox1(){ // Determine the direction for Sensor 1 Prox1_direction = determineDirection(SENSOR1); cableLengthSensor1 = calculateCableLength(SENSOR1, Prox1_direction, PROX1_A_Counter, PROX1_B_Counter); } // Function for proximity sensor 2 void Prox2(){ // Determine the direction for Sensor 2 Prox2_direction = determineDirection(SENSOR2); cableLengthSensor2 = calculateCableLength(SENSOR2, Prox2_direction, PROX2_A_Counter, PROX2_B_Counter); } void vSimulinkTask(void *pvParameters) { // ulTaskNotifyTake( pdTRUE,portMAX_DELAY); // (T1)Wait for Simulink code to be initialised Task_1_Initialised = false; // const TickType_t xDelay250ms = pdMS_TO_TICKS( 250 ); // /* Send gain settings via SPI */ // SPIdataSetup(&txDpotCmdBuffer[Gain_index], &txDpotDataBuffer[Gain_index], txSPIbuffer,8,1,2 ); // spiTransmitData(spiREG3,&AD7175_8_data_recv_dataconfig,2, txSPIbuffer); // gioSetBit(gioPORTA, 1, 1); // Set opAmp high Task_1_Initialised = true; // xTaskNotifyGive( xInitialisationTaskHandle); // vTaskPrioritySet( xSimulinkTaskHandle, 4 ); // vTaskPrioritySet( xInitialisationTaskHandle, 4| portPRIVILEGE_BIT ); // ulTaskNotifyTake( pdTRUE,portMAX_DELAY); // Wait for response from initailisation Task for(;;) { /* Simulink generated code variables Read inputs */ //rtPwrOn = gioGetBit(gioPORTB, 1); // //extern boolean_T rtPwrOn; /* '<Root>/powerOn' */ rtjetsonOn = gioGetBit(gioPORTA, 0); // //extern boolean_T rtjetsonOn; /* '<Root>/jetsonOn' */ rtlatch = gioGetBit(gioPORTB, 0); //extern boolean_T rtlatch; /* '<Root>/powerLatch' */ /* Run Simulink generated code */ Hercules_step(); /* Simulink generated code variables Write to outputs */ //gioSetBit(gioPORTA, 2, rtshutdown); //extern boolean_T rtshutdown; /* '<Root>/shutdown' */ gioSetBit(gioPORTB, 4, rtjetsonFCTR); //extern boolean_T rtjetsonFCTR; /* '<Root>/jetsonFCTR' */ gioSetBit(gioPORTA, 5, rtjetsonRestet); //extern boolean_T rtjetsonRestet; /* '<Root>/jetsonRestet' */ gioSetBit(gioPORTA, 7, rtjetsonPwrBtn); //extern boolean_T rtjetsonPwrBtn; /* '<Root>/jetsonPwrBtn' */ // //extern enPowerStates_t rtPowerState; /* '<Root>/PowerState' */ //extern enPowerStates_t rtpowerStateReq;/* '<Root>/powerStateReq' */ // xTaskNotifyGive( xAggregateTaskHandle ); //Start AggregateTaskHandleg // xTaskNotifyGive( xADCpollingTaskHandle ); //Start ADC polling // vTaskPrioritySet( xADCpollingTaskHandle, 5 ); // vTaskPrioritySet( xSimulinkTaskHandle, 4 ); // ulTaskNotifyTake( pdTRUE,xDelay250ms); vTaskPrioritySet( xAggregateTaskHandle, 4 ); //[TODO] remove if not the right approach // vTaskPrioritySet( xSimulinkTaskHandle, 3 ); sciDisplayText(sciREGx, "Task Simulink... \r\n"); } #pragma diag_suppress 112 //Remove warning from compiler as it is intentional that the return statement can not be reached. vTaskDelete( NULL ); } // ************************************************************************************************ //Aggregate void vAggregate(void *pvParameters) { // Debug Task: used to send extra debug data to a terminal uint32_t rxDataAddressTest = 15UL; uint8_t ChannelCount = 0; uint8_t ChannelBitMask = 0; const TickType_t x20ms = 20UL / portTICK_PERIOD_MS; Task_2_Initialised = false; /* Setup AD7175-8 to specific channel */ // for(BufId = 0;BufId < 4; BufId++) // { // SPIdataSetup(&txRX5880AddrWriteBuffer[BufId], &txRX5880DataBuffer[BufId], txSPIbuffer,5,1,5 ); // spiTransmitData(spiREG3,&AD7175_8_Setup_dataconfig,5,txSPIbuffer); // } /* [TODO] removed to test read operation */ // [TODO] Removed for testing default settings with the reads operation // Setup Channel 0 for NDT Sensor Signal // txSPIbuffer[0] = 0x10; txSPIbuffer[1] = 0x80; txSPIbuffer[2] = 0x16; //0x10;; txSPIbuffer[3] = 0x00; txSPIbuffer[4] = 0x00; spiTransmitData(spiREG3,&AD7175_8_Setup_dataconfig,3,txSPIbuffer); // Setup Channel 1 for NDT Sensor Signal txSPIbuffer[0] = 0x11; txSPIbuffer[1] = 0x80; txSPIbuffer[2] = 0x36;//0x30; txSPIbuffer[3] = 0x00; txSPIbuffer[4] = 0x00; spiTransmitData(spiREG3,&AD7175_8_Setup_dataconfig,3,txSPIbuffer); // Setup Channel 2 for NDT Sensor Signal txSPIbuffer[0] = 0x12; txSPIbuffer[1] = 0x80; txSPIbuffer[2] = 0x56;//0x50; txSPIbuffer[3] = 0x00; txSPIbuffer[4] = 0x00; spiTransmitData(spiREG3,&AD7175_8_Setup_dataconfig,3,txSPIbuffer); // Setup Channel 3 for NDT Sensor Signal txSPIbuffer[0] = 0x13; txSPIbuffer[1] = 0x80; txSPIbuffer[2] = 0x76;// 0x70; txSPIbuffer[3] = 0x00; txSPIbuffer[4] = 0x00; spiTransmitData(spiREG3,&AD7175_8_Setup_dataconfig,3,txSPIbuffer); // Setup Setup Config Reg. 0 txSPIbuffer[0] = 0x20; txSPIbuffer[1] = 0x1F; txSPIbuffer[2] = 0x00; txSPIbuffer[3] = 0x00; txSPIbuffer[4] = 0x00; spiTransmitData(spiREG3,&AD7175_8_Setup_dataconfig,3,txSPIbuffer); // Setup ADC Mode Register txSPIbuffer[0] = 0x01; txSPIbuffer[1] = 0x07; //0x00; txSPIbuffer[2] = 0x00; //Continuous conversion // txSPIbuffer[3] = 0x00; txSPIbuffer[4] = 0x00; spiTransmitData(spiREG3,&AD7175_8_Setup_dataconfig,3,txSPIbuffer); // Setup Interface mode Register txSPIbuffer[0] = 0x02; txSPIbuffer[1] = 0x09; //0x01; txSPIbuffer[2] = 0x40; txSPIbuffer[3] = 0x00; txSPIbuffer[4] = 0x00; spiTransmitData(spiREG3,&AD7175_8_Setup_dataconfig,3,txSPIbuffer); sciDisplayText(sciREGx, "AD7175-8 Setup Complete... \r\n"); Task_2_Initialised = true; // *** vADCpolling init //vDebugTask init sciDisplayText(sciREGx, "Debug Task Setup Complete... \r\n"); // **** Comms // Network Communications Task //Initialisation Section Network Comms xSocket_t xSocket; struct freertos_sockaddr xDestinationAddress; // uint8_t cString[ 100 ]; uint32_t ulCount = 0UL; /* Send strings to port 9997 on IP address "192.168.169.7" on the scaler. */ xDestinationAddress.sin_addr = FreeRTOS_inet_addr( "192.168.169.7" ); xDestinationAddress.sin_port = FreeRTOS_htons( 9997 ); /* Create the socket. */ sciDisplayText(sciREGx, "Create the socket... \r\n"); xSocket = FreeRTOS_socket( FREERTOS_AF_INET, FREERTOS_SOCK_DGRAM,/*FREERTOS_SOCK_DGRAM for UDP.*/ FREERTOS_IPPROTO_UDP ); /* Check the socket was created. */ configASSERT( xSocket != FREERTOS_INVALID_SOCKET ); if (xSocket == FREERTOS_INVALID_SOCKET) { sciDisplayText(sciREGx, "SOCKET INVALID \r\n"); } else { sciDisplayText(sciREGx, "Socket created. \r\n"); } sciDisplayText(sciREGx, "Ethernet Network Comms. Setup Complete... \r\n"); // strcpy(cString,"Hello"); // FreeRTOS_sendto( xSocket, // cString, // sizeof(cString), // 0, // &xDestinationAddress, // sizeof( xDestinationAddress ) ); //strlen(cString ), for(;;){ // *** vADCpolling Task //Read AD7175-8 channels: 4 channels ChannelCount = 0; //[TODO] Heartbeat should be tick time count //Set Heart Beat NDTLog.Heartbeat = ulCount; while(ChannelCount < NumEnabledChannelsBitMask){ //Read the status register to see if a data convention has completed // sciDisplayText(sciREGx, "ADCpolling Task(1039)..... \r\n"); txSPIbuffer[0] = 0x40; txSPIbuffer[1] = 0x00; txSPIbuffer[2] = 0x00; txSPIbuffer[3] = 0x00; txSPIbuffer[4] = 0x00; rxSPIstatusBuffer[0] = 0x00; rxSPIstatusBuffer[1] = 0x00; // vTaskDelay(x20ms); spiTransmitAndReceiveData(spiREG3,&AD7175_8_data_recv_dataconfig,2,txSPIbuffer,rxSPIstatusBuffer); // If Ready Bit set in status register then read new data in data register if((rxSPIstatusBuffer[1] >> 7) == 0){ // if(spiREG3->PC){ // spiCommand = (uint32 *)0x44; // spiData = (uint32 *)0x00; // SPIdataSetup(spiCommand,spiData, txSPIbuffer,8,1,4 ); txSPIbuffer[0] = 0x44; //read data command txSPIbuffer[1] = 0x00; txSPIbuffer[2] = 0x00; txSPIbuffer[3] = 0x00; txSPIbuffer[4] = 0x00; rxSPIbuffer[0] = 0x00; rxSPIbuffer[1] = 0x00; rxSPIbuffer[2] = 0x00; rxSPIbuffer[3] = 0x00; rxSPIbuffer[4] = 0x00; spiTransmitAndReceiveData(spiREG3,&AD7175_8_data_recv_dataconfig,5,txSPIbuffer,rxSPIbuffer); // check which channel the data belongs too // Setup for no CRC, so that index 0 is status register // [TODO] update to 1 when CRC is in use rxDataAddressTest = rxSPIstatusBuffer[1] & 0x0F; ChannelBitMask = (uint8)pow(2,rxDataAddressTest); switch(rxDataAddressTest ){ case(cNDT1SensorCH): if(!(ChannelCount & ChannelBitMask)){ // sciDisplayText(sciREGx, "cNDT1SensorCH..... \r\n"); uint16buf2HexString(rxSPIbuffer,sizeof(rxSPIbuffer)-1,strNDTSensor1_Signal); // ChannelCount |= ChannelBitMask; NDTLog.NDT1.Signal.ADCvalue = (((uint32_t)rxSPIbuffer[4])<<16)+(((uint32_t)rxSPIbuffer[3])<<8)+(((uint32_t)rxSPIbuffer[2])<<0); NDTLog.NDT1.Signal.StatusReg = rxSPIstatusBuffer[1]; NDTLog.NDT1.Signal.CRC = 0; // Converting ADC to 16 bit resolution Sensor1_Signal = (uint16_t)((rxSPIbuffer[1] << 8) | rxSPIbuffer[2] ); snprintf(Bit16_Sensor1_Signal, sizeof(Bit16_Sensor1_Signal), "%04X", Sensor1_Signal); } ChannelCount|= ChannelBitMask; break; case(cNDT1NoiseCH): if(!(ChannelCount & ChannelBitMask)){ // sciDisplayText(sciREGx, "cNDT1NoiseCH..... \r\n"); uint16buf2HexString(rxSPIbuffer,sizeof(rxSPIbuffer)-1,strNDTSensor1_Noise); // ChannelCount |= ChannelBitMask; NDTLog.NDT1.Noise.ADCvalue = (((uint32_t)rxSPIbuffer[4])<<16)+(((uint32_t)rxSPIbuffer[3])<<8)+(((uint32_t)rxSPIbuffer[2])<<0); NDTLog.NDT1.Noise.StatusReg = rxSPIstatusBuffer[1]; NDTLog.NDT1.Noise.CRC = 0; // Converting ADC to 16 bit resolution Sensor1_Noise = (uint16_t)((rxSPIbuffer[1] << 8) | rxSPIbuffer[2] ); snprintf(Bit16_Sensor1_Noise, sizeof(Bit16_Sensor1_Noise), "%04X", Sensor1_Noise); } ChannelCount |= ChannelBitMask; break; case(cNDT2SensorCH): if(!(ChannelCount & ChannelBitMask)){ // sciDisplayText(sciREGx, "cNDT2SensorCH..... \r\n"); uint16buf2HexString(rxSPIbuffer,sizeof(rxSPIbuffer)-1,strNDTSensor2_Signal); // ChannelCount |= ChannelBitMask; NDTLog.NDT2.Signal.ADCvalue = (((uint32_t)rxSPIbuffer[4])<<16)+(((uint32_t)rxSPIbuffer[3])<<8)+(((uint32_t)rxSPIbuffer[2])<<0); NDTLog.NDT2.Signal.StatusReg = rxSPIstatusBuffer[1]; NDTLog.NDT2.Signal.CRC = 0; // Converting ADC to 16 bit resolution Sensor2_Signal = (uint16_t)((rxSPIbuffer[1] << 8) | rxSPIbuffer[2] ); snprintf(Bit16_Sensor2_Signal, sizeof(Bit16_Sensor2_Signal), "%04X", Sensor2_Signal); } ChannelCount |= ChannelBitMask; break; case(cNDT2NoiseCH): if(!(ChannelCount & ChannelBitMask)){ // sciDisplayText(sciREGx, "cNDT2NoiseCH..... \r\n"); uint16buf2HexString(rxSPIbuffer,sizeof(rxSPIbuffer)-1,strNDTSensor2_Noise); // ChannelCount |= ChannelBitMask; NDTLog.NDT2.Noise.ADCvalue = (((uint32_t)rxSPIbuffer[4])<<16)+(((uint32_t)rxSPIbuffer[3])<<8)+(((uint32_t)rxSPIbuffer[2])<<0); NDTLog.NDT2.Noise.StatusReg = rxSPIstatusBuffer[1]; NDTLog.NDT2.Noise.CRC = 0; // Converting ADC to 16 bit resolution Sensor2_Noise = (uint16_t)((rxSPIbuffer[1] << 8) | rxSPIbuffer[2] ); snprintf(Bit16_Sensor2_Noise, sizeof(Bit16_Sensor2_Noise), "%04X", Sensor2_Noise); } ChannelCount |= ChannelBitMask; break; default: // sciDisplayText(sciREGx, "SPI Received Data source is not from any setup channels. \r\n"); break; } } } /* ............. Test 24bit and 16 bit adc data on terminal ................................ */ // sprintf( (char*)cString, // "S1%s 16bit%s N1%s 16bit%s S2%s 16bit%s N2%s 16bit%s HB%lu \r\n", // strNDTSensor1_Signal, Bit16_Sensor1_Signal, strNDTSensor1_Noise, Bit16_Sensor1_Noise, strNDTSensor2_Signal, Bit16_Sensor2_Signal, strNDTSensor2_Noise, Bit16_Sensor2_Noise, ulCount ); sprintf( (char*)cString, "%s %s %s %s %lu \r\n", Bit16_Sensor1_Signal, Bit16_Sensor1_Noise, Bit16_Sensor2_Signal, Bit16_Sensor2_Noise, ulCount ); // display the message sent sciDisplayText(sciREGx,(uint8_t *)cString); FreeRTOS_sendto( xSocket, cString, strlen( cString ), 0, &xDestinationAddress, sizeof( xDestinationAddress ) ); /* Increment the msg count */ ulCount++; } #pragma diag_suppress 112 //Remove warning from compiler as it is intentional that the return statement can not be reached. vTaskDelete( NULL ); } // ************************************************************************************************ /* USER CODE END */ /** @fn void main(void) * @brief Application main function * @note This function is empty by default. * * This function is called after startup. * The user can use this function to implement the application. */ /* USER CODE BEGIN (2) */ /* USER CODE END */ //[TODO] Set MAC to Production allocated uint8 emacAddress[6U] = {0x0U, 0x08U, 0x00U, 0x00U, 0x00U, 0x02U}; //{0x0U, 0x08U, 0xEEU, 0x03U, 0xA6U, 0x6CU}; uint32 emacPhyAddress = 1U; int main(void) { /* USER CODE BEGIN (3) */ BaseType_t returnVal = pdFALSE; sciInit(); sciDisplayText(sciREGx, txtCRLF); sciDisplayText(sciREGx, "Initialising GIO...\r\n"); gioInit(); sciDisplayText(sciREGx, "Initialising ADC...\r\n"); adcInit(); sciDisplayText(sciREGx, "Enable Interrupt for Proximity Sensors_...\r\n"); _enable_IRQ_interrupt_(); sciDisplayText(sciREGx, "Initialising SPI...\r\n"); // AD7175-8 SPI setup Address and Data Frame AD7175_8_Setup_dataconfig.CS_HOLD = true; AD7175_8_Setup_dataconfig.WDEL = true; // was org false AD7175_8_Setup_dataconfig.DFSEL = SPI_FMT_1; AD7175_8_Setup_dataconfig.CSNR = SPI_CS_2; // AD7175-8 SPI Data Receive Format AD7175_8_data_recv_dataconfig.CS_HOLD = true; // was org false AD7175_8_data_recv_dataconfig.WDEL = true; // was org false AD7175_8_data_recv_dataconfig.DFSEL = SPI_FMT_1; AD7175_8_data_recv_dataconfig.CSNR = SPI_CS_2; spiInit(); /* * Initialise the embedded Ethernet interface. The tasks that use the * network are created in the vApplicationIPNetworkEventHook() hook function * below. The hook function is called when the network connects. */ sciDisplayText(sciREGx, "Initialising IP Layer...\r\n"); returnVal = FreeRTOS_IPInit( ucIPAddress, ucNetMask, ucGatewayAddress, ucDNSServerAddress, emacAddress); if (pdFAIL == returnVal) { sciDisplayText(sciREGx, "...FAILED\r\n"); } else { sciDisplayText(sciREGx, "IP Initialisation Success.\r\n"); } /* Initialize Simulink */ // sciDisplayText(sciREGx, "Initialising Simulink...\r\n"); Hercules_initialize(); sciDisplayText(sciREGx, "\r\nCreating Tasks...\r\n"); /* // Create Task 1 if (xTaskCreate(vTask1,"LowPri-LED2", configMINIMAL_STACK_SIZE, NULL, 1, &xTask1Handle) != pdTRUE) { // Task could not be created while(1); } // Create Task 2 if (xTaskCreate(vTask2,"HighPri-LED3", configMINIMAL_STACK_SIZE, NULL, 3, &xTask2Handle) != pdTRUE) { // Task could not be created while(1); } */ /* if (xTaskCreate(vInitialisationTask,"InitialisationTask", configMINIMAL_STACK_SIZE*1, NULL, 6, &xInitialisationTaskHandle) != pdTRUE)//| portPRIVILEGE_BIT { sciDisplayText(sciREGx, "Error Creating Initialisation Task...\r\n"); } else { sciDisplayText(sciREGx, "Created Initialisation Task.\r\n"); } */ if (xTaskCreate(vSimulinkTask,"Simulink", configMINIMAL_STACK_SIZE*4, NULL, 2 , &xSimulinkTaskHandle) != pdTRUE) { sciDisplayText(sciREGx, "Error Creating Simulink Task...\r\n"); } else { sciDisplayText(sciREGx, "Created Simulink Task.\r\n"); } if (xTaskCreate(vAggregate,"Aggregate", configMINIMAL_STACK_SIZE*4, NULL, 3 , &xAggregateTaskHandle) != pdTRUE) { sciDisplayText(sciREGx, "Error Creating Aggregate...\r\n"); } else { sciDisplayText(sciREGx, "Created Aggregate.\r\n"); } /* if (xTaskCreate(vADCpolling,"ADCpolling", configMINIMAL_STACK_SIZE*2, NULL, 6 , &xADCpollingTaskHandle) != pdTRUE) { sciDisplayText(sciREGx, "Error Creating ADC polling...\r\n"); } else { sciDisplayText(sciREGx, "Created ADC polling.\r\n"); } if (xTaskCreate(vEthernetCommsTask,"NetworkComms", configMINIMAL_STACK_SIZE*2, NULL, 3 , &xNetworkCommsTaskHandle) != pdTRUE) { sciDisplayText(sciREGx, "Error Creating Network Communications...\r\n"); } else { sciDisplayText(sciREGx, "Created Network Communications.\r\n"); } if (xTaskCreate(vDebugTask,"DebugTask", configMINIMAL_STACK_SIZE*2, NULL, 5 , &xDebugTaskHandle) != pdTRUE) { sciDisplayText(sciREGx, "Error Creating Debug Task...\r\n"); } else { sciDisplayText(sciREGx, "Created Debug Task.\r\n"); } */ sciDisplayText(sciREGx, "\r\nStarting Scheduler...\r\n"); /* Start Scheduler */ vTaskStartScheduler(); // vTaskStartScheduler run only once and never execute again untill system reboot. /* Run forever */ while(1); #pragma diag_suppress 112 //Remove warning from compiler as it is intentional that the return statement can not be reached. /* USER CODE END */ return 0; } /* USER CODE BEGIN (4) */ void gioNotification(gioPORT_t *port, uint32 bit) { if(port == gioPORTB && bit == 2) { PB2_Flag = true; PROX1_A_Flag = true; PROX1_A_Counter++; // Increment counters for Sensor 1 based on received signal A } else if(port == gioPORTA && bit == 0) { PA0_Flag = true; PROX1_B_Flag = true; PROX1_B_Counter++; // Increment counters for Sensor 1 based on received signal B } else if(port == gioPORTA && bit == 6) { PA6_Flag = true; PROX2_B_Flag = true; PROX2_B_Counter++; // Increment counters for Sensor 2 based on received signal B } else if(port == gioPORTA && bit == 7) { PA7_Flag = true; PROX2_A_Flag = true; PROX2_A_Counter++; // Increment counters for Sensor 2 based on received signal A } else { PROX1_A_Flag = PROX1_B_Flag = PROX2_A_Flag = PROX2_B_Flag = false ; } } /* USER CODE END */
Did I placed the "void gioNotification(gioPORT_t *port, uint32 bit)" function at the right place in my main.c file?
Below is the gioNotification(gioPORT_t *port, uint32 bit) function in my main.c file:
/* USER CODE BEGIN (4) */
void gioNotification(gioPORT_t *port, uint32 bit)
{
if(port == gioPORTB && bit == 2)
{
PB2_Flag = true;
PROX1_A_Flag = true;
PROX1_A_Counter++; // Increment counters for Sensor 1 based on received signal A
}
else if(port == gioPORTA && bit == 0)
{
PA0_Flag = true;
PROX1_B_Flag = true;
PROX1_B_Counter++; // Increment counters for Sensor 1 based on received signal B
}
else if(port == gioPORTA && bit == 6)
{
PA6_Flag = true;
PROX2_B_Flag = true;
PROX2_B_Counter++; // Increment counters for Sensor 2 based on received signal B
}
else if(port == gioPORTA && bit == 7)
{
PA7_Flag = true;
PROX2_A_Flag = true;
PROX2_A_Counter++; // Increment counters for Sensor 2 based on received signal A
}
else
{
PROX1_A_Flag = PROX1_B_Flag = PROX2_A_Flag = PROX2_B_Flag = false ;
}
}
/* USER CODE END */
Can you help me to fix the code?
Hi Vivek,
I verified your both the applications with RTOS and without RTOS and i didn't find out any issues there.
Did I placed the "void gioNotification(gioPORT_t *port, uint32 bit)" function at the right place in my main.c file?
Yes, it is fine to be placed there.
Is it possible for you to share your complete projects of both, so that i can debug them directly on my Lauchpad. You can send them through private chat as well.
--
Thanks & regards,
Jagadish.
Hey Jagadish,
I managed to fix this issue.
I did some silly mistake in gio.c file and messed up my RMII pins configurations. I fixed it and its working well.
My interrupt config is also working well now....
But just in case anyone wants a reference project for interrupt configuration, I am happy to leave this project here attached.
Have a happy programming...
Attached project details:
> Development Board: TI Hercules TMS570LC4357 development board .
> INPUT: 4 pins are configured for external interrupt configuration:
PB2 [Ball F2] , PA0[Ball A5] , PA6[Ball H3] , PA7[Ball M1]
> OUTPUT: Output will be displayed on User LED2&3:
USER LED 2 = PB6[Ball J2]
USER LED 3 = PB7[Ball F1]
> Halcogen used for pin configuration. Kindly refer Halcogen project.