Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <stdbool.h>
- #include <inc/hw_memmap.h>
- #include <time.h>
- #include <stdlib.h>
- #include <xdc/std.h>
- #include <xdc/runtime/System.h>
- #include <xdc/runtime/Error.h>
- #include <ti/sysbios/BIOS.h>
- #include <ti/sysbios/knl/Clock.h>
- #include <ti/sysbios/knl/Task.h>
- #include <ti/sysbios/knl/Event.h>
- #include <ti/sysbios/knl/Semaphore.h>
- #include <ti/sysbios/knl/Queue.h>
- #include <ti/sysbios/hal/Hwi.h>
- #include <driverlib/gpio.h>
- #include <driverlib/pin_map.h>/*supplies GPIO_PIN_x*/
- #include <driverlib/sysctl.h>
- #include <EK_TM4C1294XL.h>
- #include <ti/drivers/SPI.h>
- #include <ti/drivers/UART.h>
- #include <ti/drivers/GPIO.h>
- #include <ti/drivers/gpio/GPIOTiva.h>
- #include <driverlib/ssi.h>
- #include <inc/hw_ssi.h>
- #include <inc/hw_memmap.h>
- #include "inc/hw_ints.h"
- #include "EK_TM4C1294XL.h"
- #include "Board.h"
- #define CLICKBUTTON GPIOTiva_PC_6 | GPIO_CFG_IN_PD | GPIO_CFG_IN_INT_RISING
- #define VERBOSE 0
- #define UP 1
- #define DOWN 2
- #define LEFT 3
- #define RIGHT 4
- #define BUTTON 5
- void click_init(char mikrobus);
- void readjoystick();
- void sendertsk();
- void initGPIO();
- void initUart(void);
- void initmiddle();
- void SSI_write(uint16_t address, uint16_t data);
- void SSI_write_data(uint8_t data[8]);
- void uarttask(UArg arg0, UArg arg1);
- void buttonpressedfxn(UArg arg0);
- Queue_Handle myQ;
- /* This structure can be added to a Queue because the first field is a Queue_Elem. */
- typedef struct Rec {
- Queue_Elem elem;
- Int data;
- } Rec;
- uint32_t ui32SysClkFreq;
- uint8_t buttonpressed=0;
- unsigned int left_right, up_down, old_left_right, old_up_down;
- unsigned int middle_left_right, middle_up_down;
- /*
- * ======== main ========
- */
- Int main()
- {
- Task_Params tskParams;
- Task_Params taskUARTParams;
- Task_Handle taskUART;
- Hwi_Params tempHWIParams;
- Hwi_Handle tempHwi;
- Error_Block eb;
- ui32SysClkFreq=Board_initGeneral(120000000);
- initGPIO();
- initUart();
- Error_init(&eb);
- myQ = Queue_create(NULL, &eb);
- if (myQ == NULL) {
- System_abort("Queue create failed");
- }
- Hwi_Params_init(&tempHWIParams);
- tempHWIParams.arg = 0;
- tempHWIParams.enableInt = true;
- tempHwi = Hwi_create(INT_GPIOC_TM4C129, buttonpressedfxn, &tempHWIParams, &eb);
- if (tempHwi == NULL)
- {
- System_abort("HWI create failed");
- }
- Hwi_enableInterrupt(INT_GPIOC_TM4C129);
- GPIOIntEnable(GPIO_PORTC_BASE, GPIO_PIN_6);
- //GPIOTiva_PJ_0 | GPIO_CFG_IN_PU | GPIO_CFG_IN_INT_RISING,
- //GPIO_setCallback(GPIOTiva_PC_4 | GPIO_CFG_INPUT | GPIO_CFG_IN_INT_RISING, buttonpressed);
- //GPIO_enableInt(GPIOTiva_PC_4 | GPIO_CFG_INPUT | GPIO_CFG_IN_INT_RISING);
- /* create a ledblink task */
- Task_Params_init(&tskParams);
- tskParams.priority = 15;
- tskParams.arg0 = NULL;
- tskParams.arg1 = NULL;
- Task_create(&readjoystick, &tskParams, NULL);
- //Create UART Task
- Task_Params_init(&taskUARTParams);
- taskUARTParams.priority = 15;/*15 is default 16 is highest priority -> see RTOS configuration*/
- taskUARTParams.arg0 = NULL;
- taskUARTParams.arg1 = NULL;
- taskUART = Task_create((Task_FuncPtr)uarttask, &taskUARTParams, &eb);
- if (taskUART == NULL) {
- System_abort("TaskUART create failed");
- }
- BIOS_start(); /* does not return */
- return(0);
- }
- void initUart(void)
- {
- SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOK);
- SysCtlPeripheralEnable(SYSCTL_PERIPH_UART4);
- GPIOPinConfigure(GPIO_PK0_U4RX);
- GPIOPinConfigure(GPIO_PK1_U4TX);
- GPIOPinTypeUART(GPIO_PORTK_BASE, GPIO_PIN_0 | GPIO_PIN_1);
- UART_init();
- }
- void uarttask(UArg arg0, UArg arg1)
- {
- char input;
- UART_Handle uart;
- UART_Params uartParams;
- Rec *rr;
- //const char echoPrompt[] = "\fEchoing characters:\r\n";
- /* Create a UART with data processing off. */
- UART_Params_init(&uartParams);
- uartParams.writeDataMode = UART_DATA_BINARY;
- uartParams.readDataMode = UART_DATA_BINARY;
- uartParams.readReturnMode = UART_RETURN_FULL;
- uartParams.readEcho = UART_ECHO_OFF;
- uartParams.baudRate = 115200;
- uart = UART_open(Board_UART4, &uartParams);
- if (uart == NULL) {
- System_abort("Error opening the UART");
- }
- while (1) {
- rr=Queue_get(myQ);
- if((rr->data>0)&&(rr->data<6)) {
- input=(char)rr->data;
- UART_write(uart, &input, 1);
- input=0;
- UART_write(uart, &input, 1);
- } else {
- input=0;
- }
- Task_sleep(50);
- }
- }
- // Get ADC values
- unsigned int GetADC(unsigned short channel) { // Returns 0..4095
- uint32_t tmp=0,tmp2;
- GPIOPinWrite(GPIO_PORTH_BASE, GPIO_PIN_2, 0); //set cs low
- SSIDataPut(SSI2_BASE, 0x06); //send address // SPI communication using 8-bit segments
- channel = channel << 6; // Bits 7 & 6 define ADC input
- SSIDataPut(SSI2_BASE, channel);
- while (SSIBusy(SSI2_BASE));
- while (SSIDataGetNonBlocking(SSI2_BASE,&tmp));
- //while(!(SSIDataGetNonBlocking(SSI2_BASE,&tmp)));
- tmp2=tmp & 0x0F;
- tmp2 = tmp2 << 8; // Shift ADC value by 8
- while (SSIDataGetNonBlocking(SSI2_BASE,&tmp));
- //while(!(SSIDataGetNonBlocking(SSI2_BASE,&tmp)));
- //tmp2|=tmp & 0X0F;
- tmp2|=tmp;
- GPIOPinWrite(GPIO_PORTH_BASE, GPIO_PIN_2, GPIO_PIN_2);
- return tmp2; // Returns 12-bit ADC value
- }
- void buttonpressedfxn(UArg arg0)
- {
- //GPIOIntDisable(GPIO_PORTC_BASE, GPIO_PIN_6);
- //Hwi_clearInterrupt(INT_GPIOC_TM4C129);
- buttonpressed=1;
- GPIOIntClear(GPIO_PORTC_BASE, GPIO_PIN_6);
- }
- void initGPIO()
- {
- SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOC);
- GPIOPinTypeGPIOInput(GPIO_PORTC_BASE, GPIO_PIN_6);
- SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOD); /* ist das obere booster board GPIOQ ist das untere */
- SysCtlPeripheralEnable(SYSCTL_PERIPH_SSI2);
- SPI_init();
- GPIOPinConfigure(GPIO_PD3_SSI2CLK);/*hier nur Clock, RX und TX. Slave Select wird manuell gemacht */
- GPIOPinConfigure(GPIO_PD1_SSI2XDAT0);
- GPIOPinConfigure(GPIO_PD0_SSI2XDAT1);
- GPIOPinTypeSSI(GPIO_PORTD_BASE, GPIO_PIN_0 | GPIO_PIN_1 | GPIO_PIN_3); /*SPI aktivieren wichtig PIN 2 für SS auslassen */
- SysCtlPeripheralEnable(GPIO_PORTH_BASE); /*H2 ist der Pin für Slave select */
- GPIOPinTypeGPIOOutput(GPIO_PORTH_BASE, GPIO_PIN_2);
- SSIClockSourceSet(SSI2_BASE,SSI_CLOCK_SYSTEM); /*Clock festlegen für SPI */
- SSIConfigSetExpClk(SSI2_BASE, 120000000, SSI_FRF_MOTO_MODE_0, SSI_MODE_MASTER, 1000000,8); /*CPU ist auf 120 Mhz, Click board/ SPI läuft auf 2 Mhz */
- SSIEnable(SSI2_BASE);
- return;
- }
- void initmiddle()
- {
- unsigned int votemid1=0,votemid2=0,votemid3=0;
- unsigned int averagemid=0, countmid=0;
- votemid1 = GetADC(0);
- averagemid=votemid1;
- countmid++;
- Task_sleep(10);
- votemid1 = GetADC(0);
- averagemid+=votemid1;
- countmid++;
- Task_sleep(10);
- votemid1 = GetADC(0);
- averagemid+=votemid1;
- countmid++;
- Task_sleep(10); // let joystick settle down and then read middle value
- votemid2 = GetADC(0);
- averagemid+=votemid2;
- countmid++;
- Task_sleep(10);
- votemid3 = GetADC(0);
- averagemid+=votemid3;
- countmid++;
- Task_sleep(10);
- if((votemid1==votemid2)||(votemid2==votemid3))
- middle_up_down=votemid2;
- else if (votemid1==votemid3)
- middle_up_down=votemid1;
- else
- middle_up_down=2048; //dont trust read init values and take logic middle
- #ifdef VERBOSE
- System_printf("middle_up_down: %d averagemid: %d\n",middle_up_down,(averagemid/countmid));
- System_flush();
- #endif
- votemid1 = GetADC(1);
- averagemid=votemid1;
- countmid++;
- Task_sleep(1);
- votemid1 = GetADC(1);
- averagemid+=votemid1;
- countmid++;
- Task_sleep(10);
- votemid1 = GetADC(1);
- averagemid+=votemid1;
- countmid++;
- Task_sleep(1); // let joystick settle down and then read middle value
- votemid2 = GetADC(1);
- averagemid+=votemid2;
- countmid++;
- Task_sleep(1);
- votemid3 = GetADC(1);
- averagemid+=votemid3;
- countmid++;
- Task_sleep(1);
- if((votemid1==votemid2)||(votemid2==votemid3))
- middle_left_right=votemid2;
- else if (votemid1==votemid3)
- middle_left_right=votemid1;
- else
- middle_left_right=2048; //dont trust read init values and take logic middle
- #ifdef VERBOSE
- System_printf("middle_left_right: %d averagemid: %d\n",middle_left_right,(averagemid/countmid));
- System_flush();
- #endif
- }
- void readjoystick()
- {
- //unsigned int last_leftright=2, last_updown=2;
- unsigned int middle_percent_ud=416, middle_percent_lr=416;
- Rec r1;
- initmiddle();
- up_down=0;
- left_right=0;
- for(;;) {
- if(buttonpressed!=0) {
- r1.data=BUTTON;
- Queue_put(myQ, &(r1.elem));
- buttonpressed=0;
- #ifdef VERBOSE
- System_printf("button\n");
- System_flush();
- #endif
- }
- up_down = GetADC(0);
- if ((up_down < (middle_up_down-middle_percent_ud))||(up_down > (middle_up_down+middle_percent_ud))) {
- if ((up_down < middle_up_down)) {
- r1.data=UP;
- Queue_put(myQ, &(r1.elem));
- #ifdef VERBOSE
- System_printf("up\n");
- #endif
- } else {
- r1.data=DOWN;
- Queue_put(myQ, &(r1.elem));
- #ifdef VERBOSE
- System_printf("down\n");
- #endif
- }
- Task_sleep(150);
- //System_printf("updown: %d middle_up_down:%d\n",up_down,middle_up_down);
- #ifdef VERBOSE
- System_flush();
- #endif
- continue;
- }
- left_right = GetADC(1);
- if ((left_right < (middle_left_right-middle_percent_lr))||(left_right > (middle_left_right+middle_percent_lr))) {
- if ((left_right < middle_left_right)) {
- r1.data=LEFT;
- Queue_put(myQ, &(r1.elem));
- #ifdef VERBOSE
- System_printf("left\n");
- #endif
- } else {
- r1.data=RIGHT;
- Queue_put(myQ, &(r1.elem));
- #ifdef VERBOSE
- System_printf("right\n");
- #endif
- }
- #ifdef VERBOSE
- System_flush();
- #endif
- Task_sleep(150);
- continue;
- }
- //r1.data=0;
- //Queue_put(myQ, &(r1.elem));
- Task_sleep(50);
- }
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement