Пример #1
0
/* Interrupciones: TIMER1 */
void interrupt(){
  unsigned long duration = 0;
  // If the interrupt was generated by timer0 overflow
  /* Con 8MHz: 4/(8*10^6)*256*256*3 = 0.09 segundos ingreso a interrupcion */
  if(INTCON.RBIF){
    T1CON.TMR1ON = 1;       // ON Counter
    while(Echo == 1);
    T1CON.TMR1ON = 0;
    TMR = (unsigned int) TMR1H << 8;
    TMR = TMR + TMR1L;          // Combine 2x counter byte into single integer

    duration = (TMR/10) * 8;  // Duration Formula = TMR * 0.2us(Clock speed) * 4 (Timer Prescale)

    distance_cm = duration / 58 ;   // Refer HC-SR04 Datasheet
    distance_inc = duration / 148;
    if(distance_cm < 30)
      {
        if (!bandera_mover && bandera_automatico) {/* Si hay obstaculo y esta en Automatico*/
          darVuelta();
        }else if(!bandera_mover && !bandera_automatico){
          pararVehiculo();
          bandera_mover = 0;
        }
      }else {
      bandera_mover = 1;
      avanzarVehiculo();
    }
      distance_cm = 0, distance_inc = 0, TMR = 0;

    INTCON.RBIF = 0;        // Clear PortB Interrupt Flag
  }

  contadorInterrupt++;                /* contando 20 entradas a la interrupcion */
  return;
}
Пример #2
0
void Calesita::operar(){
	do{
		log << "Calesita esperando que llegue mas gente." << endl;
		if (!hayQueSalir()) esperarClientes();
		if (pids.size() > 0)
		{
			log << "Calesita dando una vuelta con " << pids.size() << " pasajeros." << endl;
			darVuelta();
			log << "Calesita termino de dar la vuelta." << endl;
		}
	} while(!hayQueSalir() || pids.size() > 0);

}