TODOPIC
Microcontroladores PIC => Lenguaje C para microcontroladores PIC => Mensaje iniciado por: f-traxx en 20 de Julio de 2010, 13:29:41
-
Hola, necesito una ayudita ya que no encuentro el problema que tengo en el codigo, es una cosa muy sencilla, y seguro que es una tonteria pero no he conseguido dar con ella, aqui os explico mi situación.
Tengo un pulsador que quando lo pulso quiero que envie una trama de datos, que ya tengo definida, el problema que tengo es que el pic hace caso omiso del pulsador, una ayudita porfavor, me he leido muchos y muchos temas del foro pero no encuentro el maldito error.
Aqui os dejo los archivos, Issis para simulacion y codigo, todo en un RAR.
Gracias.
-
No pude ejecutar la simulación. Pero si el problema es que la trama se envia sin que presiones el pulsador, puedes modifcar el IF dentro del WHILE de este modo.
if (input(polsador))
{
delay_ms(40);
atent();
envia_paraula();
delay_ms(DT*3);
envia_paraula();
delay_ms(DT*3);
}
-
Gracias por contestar, pero no se ha arreglado, no es que la trama se envie sin pulsar el pulsador, es que aleatoriamente me envia una trama de pulsos muyyy pequeños (que no son la trama que tendria que enviar) y que aparte no me hace caso del pulsador, quando le doy al "polsador" tendira que enviar una trama de bits por el puerto C6 y no lo hace, aqui dejo lo que se ve en el osciloscopio, eso es lo que me envia quando quiere, y repito no me hace caso del pulsador...
Gracias por vuestra ayuda.
-
Me havia olvidado la foto...
-
Tienes negada la entrada del pulsador: al pulsar envias a masa. Modifica el IF de este modo:
if ( ! input(polsador))
{
delay_ms(40);
atent();
envia_paraula();
delay_ms(DT*3);
envia_paraula();
delay_ms(DT*3);
}
-
que quieres decir que tengo negada la entrada del pulsador? ya lo he hecho y nada... :(
-
Lo adapté a mis nececidades :lol:
En la simulacion puedes ver como solo envia la trama cuando presionas el boton.
-
Muchas gracias, por lo que parece, solo has cambiado el while por el for y has sacado todo esto:
setup_adc_ports(NO_ANALOGS);
setup_adc(ADC_OFF);
setup_psp(PSP_DISABLED);
setup_timer_0(RTCC_INTERNAL|RTCC_DIV_1);
setup_timer_1(T1_DISABLED);
setup_timer_2(T2_DISABLED,0,1);
disable_interrupts(GLOBAL);
Me puedes decir donde estaba el error? o porque crees que sucedia?
Muchas gracias de nuevo
-
:-/ :-/ :-/
(http://img.photobucket.com/albums/v165/carlyvalente/SCR0008.png)
Esto es tu programa en C funcionando.
Te envío tu programa corregido.
El error estaba en que al parecer no le gusta los decimales en la pausa . Poner 3.5 no le gusta y se quedaba en la parra, por eso en lugar de 3.5ms lo puse en us (3500).
-
:-/ Ya esta el programa terminado ahora me falta ajustar las pausas y ya!!
Por cierto pibe.
Pedazo de osciloscopio tienes ee.... MUCHAS GRACIAS A LOS DOS, vaya tonteria lo de los tiempos, bueno cosas de novatos...
-
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".
}
-
Para estos codigos largos por varias razones, estaria mejor que adjuntes el archivo en lugar de copiarlo :(
-
Gracias por la respuesta, para las proximas veces lo tendre en cuenta.
Pero si me comentaras donde puede esta el problema me iria mucho mejor.
Gracias todos los consejos son buenos.
-
Hola, tengo una pregunta para los entendidos...
tengo el siguiente codigo:
void handle_ccp1_int()
{
if(flagToggleFlanco==0) // He recibido Flanco de Subida
{
t1=get_timer1(); // Guardo en t1 el valor de TMR1 al Flanco de Subida
setup_ccp1(CCP_CAPTURE_FE); // 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
setup_ccp1(CCP_CAPTURE_RE); // 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
}
}
}
No se podria escribir asi tambien?? y asi luego te ahorras hacer la resta de t2-t1
void handle_ccp1_int()
{
if(flagToggleFlanco==0) // He recibido Flanco de Subida
{
set_timer1(0); // Guardo en t1 el valor de TMR1 al Flanco de Subida
setup_ccp1(CCP_CAPTURE_FE); // Configuro para capturar siguiente flanco de Bajada
flagToggleFlanco=1; // Indico que el siguiente flanco será de Bajada
}
else // He recibido Flanco de Bajada
{
t1=get_timer1(); // Guardo en t2 el valor de TMR1 al Flanco de Bajada
setup_ccp1(CCP_CAPTURE_RE); // 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
}
}
}
-
Hola, veo que mis preguntas tiene mucho exito....
Aqui va otra, tengo un codigo para contar el ancho de los pulsos, pero no hay forma de que me funcione... he copiado el codigo de otro foro que hay: - Midiendo un pulso. 2ª Parte. Tiempo en Alto Mediante INTCCP en modo Capture.
El codigo es el siguiente, os lo adjunto en un fichero de CCS.
Me pueden decir que error puede haber??
Por si hay alguna buena persona... gracias.