Hola buenas, como podreis saber si haveis leido los mensajes, estoy haciendo con dos micros (PIC16F870) unos "emuladores" de cogido trinario.
Lo que estoy es haciendo que un PIC me sirva de codificador como un MC145026 y otro de decodificador como un MC145027, la parte del codificador esta practicamente lista lo que me falta solucionar, es la parte del decodificador, para medir el ancho de los pulsos y asi ver si son unos (que en trinario un "1" es dos pulsos largos en alto, separado por un corto en bajo) o zeros (dos periodos largos en bajo separados por uno corto en alto), mi idea era saber cuanto tiempo se esta en alto, porque asi sabre si en realidad me esta mandando un uno o un zero, y medir el tiempo con el timer1, pero no me funciona... no se que parte del codigo es la que no me va... el codificador, envia las señales bien, pero el timer parece que no me cuente bien lo que me llega por RC2, aqui dejo el codigo, y pediria una ayudita porfavor... me he estado mirando el foro para las interrupciones y mediciones de pulsos y he hecho una mezcla de codigos que he encontrado y me pueden servir, aqui les dejo el codigo completo haber si me pueden decir donde esta el fallo... o si me pueden dar alguna sugerencia para solucionarlo, muchas gracias.
void main()
{
set_tris_a (0b00000000); //Todos los puertos como salidas.
set_tris_b (0b00000000); //Todos los puertos como salidas.
set_tris_c (0b00000100); //Todos los puertos como salidas menos
//el pin C2 como entrada.
output_a (0b00000000);
output_b (0b00000000);
output_c (0b00000000);
//DEFINICO D'INTERRUPCIONS//
setup_psp(PSP_DISABLED);
setup_adc_ports(NO_ANALOGS);
setup_adc(ADC_OFF);
setup_psp(PSP_DISABLED);
//HABILITACIO D'INTERRUPCIONS//
setup_timer_0(RTCC_INTERNAL|RTCC_DIV_1);
setup_timer_1(T1_internal | T1_DIV_BY_1 );//Configuramos el timer1 con el prescaler a 1
//asi cuenta de 1us en 1us.
setup_ccp1(CCP_CAPTURE_FE); //Habilitamos el modo captura.
setup_timer_2(T2_DISABLED,0,1); //Dejamos desabilitado el timer2
enable_interrupts (int_timer1); //Habilitamos el timer1.
enable_interrupts (global); //Sino habilitaramos las interrupciones globales
//no nos funcionaria ninguna interrupcion.
while(1)
{
trans_bit(); //Transforma el codigo trinario en bits ("1" y "0").
envia_bits();
// guardar_adres(); //Rutina para guardar los tiempos en la palabra adecuada.
// guardar_dades(); //Rutina que guarda los datos de las 2 palabras.
}
}
void trans_bit() //Esta rutina nos quiere medir la duración de los pulsos y
{ //segun su longitud transformarlos a bits normales de "0" y "1".
int i=0; //Variable donde guardamos el tiempo que dura el pulso.
int p; //Variable para incrementar "pols" y así guardar los pulsos
//en diferente posicion para luego compararlos.
int repeat; //Variable para que repita el bucle for 2 veces.
for (repeat=0;repeat<2;repeat++);
{
for (;!input(rebre);)output_high(pin_C4); //Esperamos el inicio del pulso (flanco subida).
set_timer1(0); //Cuando llegue se pone a cero el Timer1.
for (;input(rebre)
//Esperamos al final del pulso (flanco de bajada).
i=CCP_1;
output_low(pin_c4);
output_high(pin_B1);
delay_ms(200);
output_low(pin_b1);//Cuando llegue guardamos el tiempo en la variable i.
if ((i>140)&(i<155))
{ pols[p]=1;p++; //Comparamos la duracion del pulso si esta entre(140-155)es
output_high(pin_c4);//un pulso corto y guardamos un 0 en la posicion p de pols.
delay_ms(200);
output_low(pin_c4);
delay_ms(600);
output_high(pin_c4);
delay_ms(200);
output_low(pin_c4);
}
if ((i>160)&(i<1045))
{ pols[p]=1;p++; //Comparamos la duracion del pulso si esta entre(170-860)es
output_high(pin_c5);//un pulso largo y guardamos un 1 en la posicion p de pols.
delay_ms(600);
output_low(pin_c5);
delay_ms(200);
output_high(pin_c5);
delay_ms(600);
output_low(pin_c5);
}
if((repeat==1)&(pols[0]==0)&(pols[1]==0)){bit=0;}//Si entra aqui significa que la sequencia de los 2
//pulsos es un "0" y lo guardará como como tal en "bit".
if((repeat==1)&(pols[0]==1)&(pols[1]==1)){bit=1;}//Si entra aqui significa que la sequencia de los 2
} //pulsos es un "1" y lo guardará como como tal en "bit".
}