TODOPIC
Microcontroladores PIC => Lenguaje C para microcontroladores PIC => Mensaje iniciado por: javiergggg en 07 de Mayo de 2021, 18:37:17
-
Hola a todos, tengo un problema..., con un pic16f873a tomo dos señales analógicas x el canal AN0 y AN1...., patas 2 y 3 del pic; el programa está de tal forma que cuando el pic recibe el carácter A responde la tensión digitalizada en el canal AN0, y cuando el pic recibe el carácter B responde con la tensión digitalizada en el canal AN1; bien, cuando interrogo al pic con A responde el valor de AN0 y cuando interrogo con B responde con la tensión digitalizada en AN0...., como si recibiera A..... :oops: :oops: :oops:
-
Hola, no se comprende bien.
Quieres decir que inyectas una tensión análoga y luego según que valor tenga le das una identificación internamente?
-
Entonces tenes mal el programa. Pero sin el programa es dificil de ver donde esta el problema.
-
el programita...., la comunicación es por rs485
#include <16F873a.h>
#device adc=10 //resolucion de 1024 valores
#FUSES HS,NOWDT,PUT,PROTECT
#use delay(clock=20000000)
#use rs232(baud=9600, xmit=pin_c6, rcv=pin_c7, bits=8, parity=N)
#use standard_io (C)
#use standard_io (B)
#use standard_io (A)
//*#define ALL_ANALOG
float an;
float bn;
int16 a,b;
char valor;
#int_rda
void serial_isr(){
valor=getc();
switch(valor){
case 'A':
output_high(pin_c2);//* sacando un "1" por C2 habilito TRASNMISIÓN DEL MAX485.-
printf("%1.5f\r\n",an);
output_low(pin_c2); //*sacando un "0" por C2 deshabilito transmisión y habilito RECEPCIÓN.-
break;
case 'B':
output_high(pin_c2);//* sacando un "1" por C2 habilito TRASNMISIÓN DEL MAX485.-
printf("%1.5f\r\n",bn);
output_low(pin_c2); //*sacando un "0" por C2 deshabilito transmisi'on y habilito RECEPCIÓN.-
break;
}
}
void main()
{
valor=a=b=an=bn=0;
output_low(pin_c2);
enable_interrupts(int_rda);
enable_interrupts(global);
setup_adc_ports(all_analog);
//*setup_adc_ports(AN0_AN1_AN3);
setup_adc(ADC_CLOCK_INTERNAL);
while(true){
set_adc_channel(0); //* del canal se leera el valor analogico
delay_ms(20);
an=(5.0*read_adc())/1024.0;
delay_ms(15);
set_adc_channel(1); //* del canal se leera el valor analogico
delay_ms(20);
bn=(5.0*read_adc())/1024.0;
delay_ms(15);
}
}
-
el programita...., la comunicación es por rs485
#include <16F873a.h>
#device adc=10 //resolucion de 1024 valores
#FUSES HS,NOWDT,PUT,PROTECT
#use delay(clock=20000000)
#use rs232(baud=9600, xmit=pin_c6, rcv=pin_c7, bits=8, parity=N)
#use standard_io (C)
#use standard_io (B)
#use standard_io (A)
//*#define ALL_ANALOG
float an;
float bn;
int16 a,b;
char valor;
#int_rda
void serial_isr(){
valor=getc();
switch(valor){
case 'A':
output_high(pin_c2);//* sacando un "1" por C2 habilito TRASNMISIÓN DEL MAX485.-
printf("%1.5f\r\n",an);
output_low(pin_c2); //*sacando un "0" por C2 deshabilito transmisión y habilito RECEPCIÓN.-
break;
case 'B':
output_high(pin_c2);//* sacando un "1" por C2 habilito TRASNMISIÓN DEL MAX485.-
printf("%1.5f\r\n",bn);
output_low(pin_c2); //*sacando un "0" por C2 deshabilito transmisi'on y habilito RECEPCIÓN.-
break;
}
}
void main()
{
valor=a=b=an=bn=0;
output_low(pin_c2);
enable_interrupts(int_rda);
enable_interrupts(global);
setup_adc_ports(all_analog);
//*setup_adc_ports(AN0_AN1_AN3);
setup_adc(ADC_CLOCK_INTERNAL);
while(true){
set_adc_channel(0); //* del canal se leera el valor analogico
delay_ms(20);
an=(5.0*read_adc())/1024.0;
delay_ms(15);
set_adc_channel(1); //* del canal se leera el valor analogico
delay_ms(20);
bn=(5.0*read_adc())/1024.0;
delay_ms(15);
}
}
-
Pero que se supone que hace exactamente el programa???
-
hace esto: cuando envío un carácter "A" el pic me devuelve el valor de la tensión de AN0; cuando envío un carácter "B" el pic me debería devolver el valor de la tensión de AN1; el problema es que mando un A y devuelve el valor AN0....y cuando mando una B me devuelve el mismo valor !!!! es decir el de AN0.... :5]
-
ahhhh, no es un tema de hard...., porque mido en las patas y la tensión a convertir es la que debería ser....; o es una tontería que no alcanzo a darme cuenta o es peor....
-
El programa funciona lo mas bien. Buscá el error por el lado del terminal.
- Tienes que ingresar para ver archivos adjuntos -
-
gracias....!!!!! sabes que lo solucioné..., agregué retardos..., fuí probando con los tiempos en ms ....:
case 'A':
output_high(pin_c2);//* sacando un "1" por C2 habilito TRASNMISIÓN DEL MAX485.-
delay_ms(15);
printf("%1.5f\r\n",an);
delay_ms(5);
output_low(pin_c2); //*sacando un "0" por C2 deshabilito transmisión y habilito RECEPCIÓN.-
break;
case 'B':
output_high(pin_c2);//* sacando un "1" por C2 habilito TRASNMISIÓN DEL MAX485.-
delay_ms(15);
printf("%1.5f\r\n",bn);
delay_ms(5);
output_low(pin_c2); //*sacando un "0" por C2 deshabilito transmisión y habilito RECEPCIÓN.-
break;
-
Pero entonces vos mandabas los caracteres A y B con muy poca diferencia de tiempo. Lo que tenías que hacer era que mandar el siguiente caracter después que se recibió la respuesta.
-
Entonces está mal el programa por no considerar ese posible caso de enviar todo junto jejej.