/* 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; }
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); }