Hola a todos, después de haberme leído y comido todos los posts de Redpic, me dedico a hacer mi propio programa, el tema es el siguiente, tengo 2 circuitos, 1 con un pic que envía pulsos (mi generador de funciones
), con otro pic con interfaz rs232 que recibe por interrupción en B0, el tren de pulsos generado por el primer circuito es interpretado con el 2do circuito..
Con mi circuito envio la siguiente secuencia.
START BIT = 1 en alto por 1500 us
luego envio 4 bits
1
0
1
1
es decir la letra B
y luego un stop BIT que es un 1 en 2500 us.
Cada 1 y 0 que seria lo del dato dura 100 us, en este caso yo tengo conocimiento de cuanto dura cada bit, pero no logro terminar de entender como determinar la cantidad de bits que tengo por el ancho..
Yo se que un bit 1 dura 100 us, para la interrupción uso el siguiente código:
#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
}
}
}
Ese código me estaría dando el ancho del pulso en ALTO,
t2 - t1 me da el total del pulso en ALTO, si ese total lo divido por los 100us, que es el tiempo de 1 bit en alto, me daria la cantidad de bits es decir la cantidad de unos 111111 ??
Indefectiblemente si la proxima vez que entro en la int, hago t1 - t2, me da el tiempo que estuve en LOW, es decir BAJO, si eso lo divido por el tiempo que dura un bit en bajo/alto para este caso es lo mismo, obtengo la cantidad de bits en bajo...
Es esta la forma de hacerlo?
Después deberé escribir en un vector, unos o ceros dependiendo...
En el ejemplo de Redpic del control remoto IR, el usa el siguiente código:
#int_ext
void ext_isr() {
// Obtengo datos de Timer0
tt = get_timer0();
t = tt-tti;
tti= tt;
// Si he recibido el Start Bit puedo guardar
if(start_recived==1){
// Bit "0"
if(t>40 && t<50){ sbits[ntbits]='0'; }
// Bit "1"
if(t>85 && t<90){ sbits[ntbits]='1'; }
// Si he recibido 32 bits entonces hay dato
if(++ntbits==total_bits){
hay_dato=1;
}
}
// Detecto Start Bit
if(t>525 && t<530){
start_recived=1;
limpia_bits();
}
}
Entiendo que el código de Redpic, detecta dependiendo lo que dura cada tick, si es un 1 o un 0, pero en que parte calcula el numero de ceros o unos dependiendo el ancho del pulso, a menos que en el infrarrojo indefectiblemente después de 1 venga un 0...
Nose si me hago entender.
UN saludo