Ejemplo n.º 1
0
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;
	}
}