Que tal Miguel, la verdad es que la solución ofrecida por bmb parece buena, a decir la verdad no lo he probado, así que te felicito bmb por encontrar soluciones tan rápido, pero si como dices lo que quieres es aprender, creo que será mejor como te dije, por interupciones, además que si el circuito lo vas a alimentas de baterías portatiles te consumira menos.
El código que te propongo, por lo que he podido entender por tú explicación es que los sensores distan entre si una distancia, llamemosla X, nose que micro querias utilizar, pero para ir aprendiendo y no tener muchas complicaciones, y para lo que pides que haga, vale y sobra con un 16f628a, que es como el conocido 16f84, pero con mejoras, más ram, osc interno...
En css no suelo programar, pero supongo que tienes alguna manera de meter codigo asm, en HIC es asm("xxx");, supongo que será mey parecido...
Para este caso que la interrupción sea por flanco de subida o bajada nos da lo msimo.
Para medir más o menos el tiempo podemos hacer las siguientes cuentas, con un clock de 4 mhz tardaría un ciclo por instrucción (dos las de salto) así que con el clock interno sería la mitad, por lo que 2 intrucciones cada 1 microsegundo...
Si me acurdo bien, s = v*t, como s la llamamos X, sería X=v*t, así que si sepearamos los sensores unos 2 cm (0,02 m) y desde que se produce una interrupción hasta que analiza otra podremos poner unas 10 lineas de codigo, serian unos 5 microseg, quedando v=0,02/0,000005 = 4000 m/s debe de ir el objeto para que no lo detectemos.
Así que analizado tood lo anterior:
FUSES (Habilitando interrupciones general, de RB0 y RB Port Change) + info pag. 26 datasheet (GIE, INTE, RBIE) *Nota: Uno de los sensores RB0 y otro de RB4:RB7
TRISB = 0x11; //Todo salidas menos el 4 y 0 (sensores)
void main(){
while (1){ //bucle infinito
asm("SLEEP"); // (Hasta que no haya una interrupción no sigue el código, y las interrupciones solo pueden ser las habilitadas por nosotros)
if (INTF==1){ //si la interrupción a sido por b0
while(!RBIF); //me quedo hasta que se haga también la interrupción de RB4-RB7
LATB = 08; //Enciendo b3
INTF = 0; //Bajo bandera rb0
RBIF = 0; //Bajo banderas de rb4-7
}
if (RBIF==1){ //si la interrupción a sido por b4:7
while(!INTF); //me quedo hasta que se haga también la interrupción de RB0
LATB = 08; //Enciendo b3
INTF = 0; //Bajo bandera rb0
RBIF = 0; //Bajo banderas de rb4-7
}
} //cierro bucle infinito y vuelvo a sleep
}
*Nota, los RB4 al RB7 que no utilicemos deberemos llevarlos a gnd o ponerlos como salida para que no generen interrupciones falsas.
**Nota: Los pines no utilizados a gnd o salida para que no se dispare el consumo.
De esta manera bajas el consumo hasta que se detecta algo. El micro como leeras en datasheet tarda unos pocos ciclos en despertarse, estamos hablando de unos 100 o 200, eso quiere decir que para nuestro proposito sobra.
Ah!!! El isis no es capaz de simular el sleep!!!
Espero no haberte pegado mucho la chapa, creo que de esta manera aprenderas más, y te pegaras con más cosas del micro. El esquema de las interrupciones lo tienes en la figura 14-14 de la pag. 106.
Salu2