#define instante 15 #define prendido 3 #define apagado 0 #define prendidoToco 4 #define espero2doBoton 1 #define alarma 5 #define pozo 2 char control; char ticsBoton; char toque; char ticsLuz; char distInicial; char estado; void main(){ //instalar int. enable(); estado = apagado; tics = 0; control = 0; while(true){ switch (estado) { case apagado: if ((IN(STATUS)&0x3)>=1){ ticsBoton = 0; estado = espero2doBoton; } break; case espero2doBoton: if(ticsBoton>instante){ estado = pozo; } else if ((IN(STATUS)&0x3)==3){ estado = prendido; control = control|1; OUT(CONTROL, control); } break; case pozo: if ((IN(STATUS)&0x3)==0){ estado = apagado; } break; case prendido: if ((IN(STATUS)&0x3)<=2){ estado = pozo; control = control & 0xFE; OUT(CONTROL, control); } else if (toque){ estado = prendidoToco; toque = 0; } break; case prendidoToco: delta = abs(IN(DISTANCE)-distInicial); if (delta > TOL_MM){ ticsLuz = 0; control = control | 2; //luz control = control | 8; //freno OUT(CONTROL, control); // prendo luz y freno estado = alarma; } break; case alarma: if (ticsLuz % 100 != 0){ // cada 1 seg control = control & 0xF7; // apago luz OUT(CONTROL, control); } else{ control = control | 8; // prendo luz OUT(CONTROL, control); } if ((IN(STATUS)&0x3)<=2){ estado = pozo; control = control && 0xF7; // apago freno control = control & 0xF7; // apago luz OUT(CONTROL, control); } break; } } } void int timer(){ ticsLuz++; ticsBoton++; } void int tope(){ toque = 1; distInicial = IN(DISTANCE); }