int initUARTWithInterrupts(){ POINTVAL_(IRQ_DISABLE1) = 1<<29; //disable MINI UART interrupts (just for safety). NOTE that mini uart is 29 (AUX) ringInit(); unsigned int ra; /* Firstly set up GPIO pins*/ ra = POINTVAL_(GPFSEL1); //get current register value ra &= ~(0b111<<12); //unset registers 12-14 (for GPIO 14) ra |= 0b010<<12; //set alternative function 5, which enables UART (on GPIO 14) //the same for GPIO 15 ra &= ~(0b111<<15); //unset registers 12-14 (for GPIO 15) ra |= 0b010<<15; //set alternative function 5, which enables UART (on GPIO 15) POINTVAL_(GPFSEL1) = ra; //write set register value back /* Configure UART */ POINTVAL_(AUX_ENABLES) = 0b1; //set 1st bit to 1, which enables mini UART POINTVAL_(AUX_MU_IER_REG) = 0b101; //(THIS IS DIFFERENT FROM NON INTERRUPT UART) Enables receive interupts (note errors in doucmentation) POINTVAL_(AUX_MU_LCR_REG) = 0b11; // first bit must set to enable 8-bit mode, 2nd bit must be set for some reason so that //normal data are sent, but IMPORTANT..that is not mentioned in documentation !! POINTVAL_(AUX_MU_MCR_REG) = 0; // set to 0 - nothing used POINTVAL_(AUX_MU_IIR_REG) = 0b11000110; //(THIS IS DIFFERENT FROM NON INTERRUPT UART) (note errors in docs) POINTVAL_(AUX_MU_BAUD_REG) = MINIUART_BAUD_RATE; POINTVAL_(AUX_MU_CNTL_REG) = 0b11; //enable Tx, Rx uart_putstring("UART with Interrupts inited\r\n"); POINTVAL_(IRQ_ENABLE1) = 1<<29; return 0; }
void circleRight(void) { IR_Read ir; Data_t data; List_t *list=NULL; int i; ringInit(&list,RINGSIZE); /* Get initial readings */ for(i=0;i<RINGSIZE;i++) { /* Read from IRs */ readIR(&ir); /* Convert to distance */ convertFullDistance(&ir,&data); /* Push data onto the ring */ ringPush(&list,data); delay(20); } setSpeed(); while(1) { if(i>80) { setSpeed(); i=0; } readIR(&ir); convertFullDistance(&ir,&data); // data.turn_angle = followRight(data.frontRight,data.backRight); data.turn_angle = left(&data,&list->data); setSteeringAngle(data.turn_angle); ringPush(&list,data); i++; delay(60); } }
void navigation(void){ int i; IR_Read ir; Data_t data; List_t *list=NULL; ringInit(&list,RINGSIZE); /* Get initial readings */ for(i=0;i<RINGSIZE;i++) { /* Read from IRs */ readIR(&ir); /* Convert to distance */ convertFullDistance(&ir,&data); data.trackState = DEFAULT; /* Push data onto the ring */ ringPush(&list,data); delay(20); } //delay(9000); setSpeed(); i=0; while(1) { if(i>80) { setSpeed(); i=0; } data.trackState = DEFAULT; if(cooldown(list)) turnstate = STRAIGHT; /* Read from IRs */ readIR(&ir); /* Convert to distance */ convertFullDistance(&ir,&data); /* Determine track state */ trackDetection(list,&data); if(analogRead(AIN4)*0.0114 < 10) { digitalWrite(P8_9,HIGH); } else { digitalWrite(P8_9,LOW); } ringPush(&list,data); if(turnstate==FOLLOWRIGHT) { data.turn_angle = right(&data,&list->data); } else if(turnstate==FOLLOWLEFT) { data.turn_angle = left(&data,&list->data); } else if(turnstate==STRAIGHT) { data.turn_angle = straight(&data,&list->data); } /* Update servo */ setSteeringAngle(data.turn_angle); // printf("\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n"); // printf("Front Left Distance: %f, Front Left Sensor: %d\n",data.frontLeft,ir.FrontLeft); // printf("Front Right Distance: %f, Front Right Sensor: %d\n",data.frontRight,ir.FrontRight); // printf("Back Left Distance: %f, Back Left Sensor: %d\n",data.backLeft,ir.BackLeft); // printf("Back Right Distance: %f, Back Right Sensor: %d\n",data.backRight,ir.BackRight); // printf("Turn angle calculated: %d\n\n",data.turn_angle); delay(60); // if(data.trackState==FOLLOWRIGHT) turn_angle=trackStateHandling; // else printf("Follow left\n"); // printf("Cooldown: %d\n",*cooldown); i+=1; } }