hola, primero gracias por responder.
ahora he estado probando este cto pero el programa del pic se me queda pegado. mejor les coment obien lo que intento de hacer:
tengo un pic 16f877a y por medio de la interrupcion externa de RB0 estoy midiento el pulso en alto que me entrega 2 sensores ultrasonicos que miden distancia (el programa casi todo es de REDPIC ya que lo saque de unos de sus tutoriales de como medir un pulso

)
estos sensores me entregan un pulso en la salida proporcional a la distancia que esta midiendo, con un maximo de 6.47 mts, medidos correctamentes, ya que he probado el programa con 1 sensor y me anda de lo mas bien, pero ahora quiero poner 2 como bien digo y quiero medirlo con la misma interrupcion, ahora para esto tengo que mantender encendido uno y apagar el otro para que no se mesclen las señales ultrasonicas ni la medicion, y viceversa pero este pun to me esta costando ya que el programa se queda pegado al conectar los dos sensores y no se porque, el punto es que es vital encender y apagar el tro sensor para hacer la lectura.
bueno le dejo el codigo para ver si yo estoy mal al hacer la mux en el programa o que onda, ademas le dejo un esquematico de como lo conecto
________ R1 ----° - sensor1 + °---->(5Vcc)
| |--->PIN_C0----->/\/\/\----|/ ^ diodo
| 1 | \ |____________________-|>|-_______
| 6 | | |
| F | GND |
| 8 | |
| 7 | R2 ----° - sensor2 + °---->(5Vcc) |
| 7 |--->PIN_C1----->/\/\/\----|/ ^ |
| A | \ | |
| | | | diodo |
| | GND |_-|>|-_ |
| | | |
| |--->PIN_B0_____________________________|_______________________|
| |
|________|
y aqui el codigo:
#include <16F877a.h>
#FUSES NOWDT, HS, NOPUT, NOPROTECT, BROWNOUT, NOLVP, NOCPD, NOWRT
#use delay(clock=4000000)
#define use_portd_lcd TRUE //definir portb lcd
#include<LCD420puertD.c> //libreria manejo lcd de 20x4 modificada por suky para el puerto D
#use standard_io(A)
#use standard_io(C)
#use standard_io(E)
float const uSxTick = 1; // Microsegundos por Tick de TMR1 a 4 Mhz
////////////////////////////////////////////////////////////////////////////////////
//
// Variables en RAM
//
////////////////////////////////////////////////////////////////////////////////////
int1 flagToggleFlanco=0; // Flag para cambiar de flanco
int16 t1=0x00,t2=0x00,tt=0x00; // Variables para guardar estados de ...
float st=0.0; // TMR1 en cada flanco y hacer la resta
float stConvert=0.0; // Convierte la medicion en cm del sensor 1
float stConvert1=0.0; // Convierte la medicion en cm del sensor 2
int counter=0; // genera la multiplexacion entre los pines C0 y C1
int1 flagHayDatos=0; // Flag para indicar que ya hay datos de ..
// dos flancos (de subida y bajada)
int1 flagHayTransmitir=0; // Flag para indicar que hay datos para ...
////////////////////////////////////////////////////////////////////////////////////
//
// Interrupción por Externa por Cambio de Flanco en RB0
//
////////////////////////////////////////////////////////////////////////////////////
#int_ext
void handle_ext_int(){
if(flagToggleFlanco==0){ // He recibido Flanco de Subida
t1=get_timer1(); // Guardo en t1 el valor de TMR1 al Flanco de Subida
ext_int_edge(0,H_TO_L); // Configuro para capturar siguiente flanco de Bajada
flagToggleFlanco=1; // Indico que el siguiente flanco será de Bajada
} else { // He recibido Flanco de Bajada
t2=get_timer1(); // Guardo en t2 el valor de TMR1 al Flanco de Bajada
ext_int_edge(0,L_TO_H); // Configuro para capturar siguiente flanco de subida
flagToggleFlanco=0; // Indico que el siguiente flanco será de Subida
set_timer1(0); // Reinicio TMR1
if(flagHayDatos==0){ // Si los datos anteriores han sido procesados ...
flagHayDatos=1; // Indico que ya hay nuevos datos de flancos para calcular
}
}
}
void main() {
lcd_init(); //inicializa lcd
////////////////////////////////////////// INICIALIZACIONES GENERALES
delay_ms(333); // Espero a que todo se estabilice e ...
disable_interrupts(global); // Inicializo el Micro y ...
disable_interrupts(int_timer1); // deshabilitando todo lo no necesario ...
disable_interrupts(int_timer2); // deshabilitando todo lo no necesario ...
disable_interrupts(int_ext);
disable_interrupts(int_rb);
setup_timer_1(T1_INTERNAL | T1_DIV_BY_1);
setup_timer_2(T2_DISABLED,0,1);
delay_ms(333);
/////////////////////////////////////////// INICIALIZACIONES PERTINENTES A LA APLICACION
ext_int_edge(0,L_TO_H); // Configuro captura de 1er flanco de subida
flagToggleFlanco = 0; // inicializo el Flag para cambiar de flanco
enable_interrupts(int_ext);
enable_interrupts(global);
output_high(PIN_C0);
output_low(PIN_C1);
do{
if(flagHayDatos==1){ // Detecto que ya hay datos de flancos ...
if(t2 > t1){ // Compruebo que estoy en la misma vuelta de TMR1
counter++;
tt = t2 - t1; // Calculo en Tick's de TMR1 el tiempo entre flancos
st = (uSxTick * tt)-1; // Calculo en uS el tiempo.
flagHayTransmitir=1; // Indico que tengo nuevo valor para transmitir
if(counter==1){ // Transmite el valor capturado del sensor 1 por C0 a....
output_low(PIN_C0); // Desactivo para pasar al otro sensor
output_high(PIN_C1); // Activo pin para tomar la medicion del sensor 2
stConvert=st/56; // Transformo el valor optenido en la medicion en cm
lcd_gotoxy(1,1);
printf(lcd_putc,"sensor 1");
lcd_gotoxy(1,2);
printf(lcd_putc,"Ticks =%3.1f[cm]",stConvert);
}
else if(counter==2) { // Transmite el valor capturado del sensor 2 por C1 a....
output_high(PIN_C0); // Activo pin para tomar la medicion del sensor 1
output_low(PIN_C1); // Desactivo pin para pasar al otro sensor
stConvert1=st/56; // Transformo el valor optenido en la medicion en cm
lcd_gotoxy(1,3);
printf(lcd_putc,"sensor 2");
lcd_gotoxy(1,4);
printf(lcd_putc,"Ticks =%3.1f[cm]",stConvert1);
counter=0;
}
}
flagHayDatos=0; // Indico que ya han sido procesados los datos.
}
st=0;
} while (TRUE); //...CICLO INFINITO...........
}