Estoy mandando 3 señales ADC diferentes del pic ya que mido tres cosas diferentes y hasta ahí lo hace, el problema es que cuando para la lectura y mando a llamar otra señal para que me la muestre, me sigue mandando la primera señal que seleccione.
CitarEstoy mandando 3 señales ADC diferentes del pic ya que mido tres cosas diferentes y hasta ahí lo hace, el problema es que cuando para la lectura y mando a llamar otra señal para que me la muestre, me sigue mandando la primera señal que seleccione.
Solo coloque una , prácticamente lo que tengo es el mismo código pero para cada una de ellas
Según el código que pasaste, jamás estas enviando las 3 señales, y solo una sola...
Solo coloque una , prácticamente lo que tengo es el mismo código pero para cada una de ellas
Solo coloque una , prácticamente lo que tengo es el mismo código pero para cada una de ellas
Esa redacción parece un trabalenguas, pero lo que entendí es que "enviar tres señales" te refieres a escoger un canal ADC para leer su información y enviarla a un PC vía RS232 ¿Verdad?
Si esa deducción está bien, ese código que enviaste es para un solo canal, ya que el código es similar para cualquiera de los 3 canales ADC. ¿Estoy en lo correcto?
Si esta segunda deducción es correcta, ¿Cuál es el código o como haces para informarle al MCU que deseas leer información de un canal determinar? En lo que compartiste no se aprecia algún método o proceso que permita al microcontrolador escoger un canal ADC.
Pero si deseas leer otro canal ADC debes enviar algo para informar al MCU que deseas eso.de casualidad podrías explicarme cómo hacerlo ?, Cómo te comento estoy comenzando a familiarizarme en las comunicaciones seriales gracias 😅
En tu código:Código: C
adc_Vdc=ADC_Read(2);
Estás leyendo siempre el canal 2 del ADC
¿Cómo esperas que el MCU escoja otro canal?
Pero si deseas leer otro canal ADC debes enviar algo para informar al MCU que deseas eso.de casualidad podrías explicarme cómo hacerlo ?, Cómo te comento estoy comenzando a familiarizarme en las comunicaciones seriales gracias 😅
En tu código:Código: C
adc_Vdc=ADC_Read(2);
Estás leyendo siempre el canal 2 del ADC
¿Cómo esperas que el MCU escoja otro canal?
Pero si deseas leer otro canal ADC debes enviar algo para informar al MCU que deseas eso.de casualidad podrías explicarme cómo hacerlo ?, Cómo te comento estoy comenzando a familiarizarme en las comunicaciones seriales gracias 😅
En tu código:Código: C
adc_Vdc=ADC_Read(2);
Estás leyendo siempre el canal 2 del ADC
¿Cómo esperas que el MCU escoja otro canal?
Así como envías esos caracteres (recive[0]=='I', etc) podrías enviar un quinto en recive[4], '1', para el canal '1', '2', para el canal dos etc.Código: C
switch(recive[4]) { case '1': adc_Vdc=ADC_Read(1); break; case '2': adc_Vdc=ADC_Read(2); break; //etc etc }
Algo que también veo raro o peligroso es recive en tu códigoCódigo: C
recive[i]
¿Qué valor tiene i? ¿Dónde lo inicializas?
de casualidad podrías explicarme cómo hacerlo ?, Cómo te comento estoy comenzando a familiarizarme en las comunicaciones seriales gracias 😅
Estás leyendo siempre el canal 2 del ADC
¿Cómo esperas que el MCU escoja otro canal?
Así como envías esos caracteres (recive[0]=='I', etc) podrías enviar un quinto en recive[4], '1', para el canal '1', '2', para el canal dos etc.Código: C
switch(recive[4]) { case '1': adc_Vdc=ADC_Read(1); break; case '2': adc_Vdc=ADC_Read(2); break; //etc etc }
Algo que también veo raro o peligroso es recive en tu códigoCódigo: C
recive[i]
¿Qué valor tiene i? ¿Dónde lo inicializas?
Lo voy a intentar con el recive [4] y comento si llega a funcionar, respecto a i la estoy iniciando en 0 para usarla como un contador en un interruptor
de casualidad podrías explicarme cómo hacerlo ?, Cómo te comento estoy comenzando a familiarizarme en las comunicaciones seriales gracias 😅
Estás leyendo siempre el canal 2 del ADC
¿Cómo esperas que el MCU escoja otro canal?
Así como envías esos caracteres (recive[0]=='I', etc) podrías enviar un quinto en recive[4], '1', para el canal '1', '2', para el canal dos etc.Código: C
switch(recive[4]) { case '1': adc_Vdc=ADC_Read(1); break; case '2': adc_Vdc=ADC_Read(2); break; //etc etc }
Algo que también veo raro o peligroso es recive en tu códigoCódigo: C
recive[i]
¿Qué valor tiene i? ¿Dónde lo inicializas?
Lo voy a intentar con el recive [4] y comento si llega a funcionar, respecto a i la estoy iniciando en 0 para usarla como un contador en un interruptor
Tampoco explicas como está tu código dentro del lazo principal, me imagino que es más o menos así:Código: C
void main() { while(1) { if (funcionQueEsperaUnaTramaDesdeElPC()) { if(recive[0]=='I' && recive[1] == 'V' && recive[2]=='d' && recive[3]=='c') //primer if { while(1) { adc_Vdc=ADC_Read(2);//conversion de analogico a digital (0-1023) //etc etc etc if(recive[0]=='S' && recive[1] == 'V' && recive[2]=='d' && recive[3]=='c') { break; } } } if(recive[0]=='I' && recive[1] == 'V' && recive[2]=='d' && recive[3]=='c') //Segundo if { while(1) { adc_Vdc=ADC_Read(1);//conversion de analogico a digital (0-1023) //etc etc etc if(recive[0]=='S' && recive[1] == 'V' && recive[2]=='d' && recive[3]=='c') { break; } } } } } }
Estás esperando que llegue la trama al arreglo recive mediante una función o tarea (funcionQueEsperaUnaTramaDesdeElPC()) y cuando eso sucede procedes al paso donde lees el canal 2 (adc_Vdc=ADC_Read(2)), tan pronto como sales de ese lazo, la parte de abajo no se ejecuta, ya que para salir enviaste 'S', 'V, 'd' y 'c', con esos valores no se ejecuta el segundo if y sales de todo el proceso nuevamente a esperar otra trama desde el PC.
Y es por eso cuando envías nuevamente la trama para leer el sensor, vuelves a adc_Vdc=ADC_Read(2) y nunca vas a ejecutar adc_Vdc=ADC_Read(1)
Es que si estoy conciente de que no entra al segundo if pero la verdad no sé porque, eh estado investigando para trata de hacerlo por mi cuenta(solucionar el error) pero la verdad sigo en comprender el porque hace eso.
Cuando envío la palabra svdc se indica al microcontrolador que inicia la lectura del ADC, la S está en la primera posición del vector, sobre estar seguro de que esta en la posición 0 se podría igualar el contador i=0 para que inicialice el vector en la posición 0 al momento de meter otro dato según yo lo metería adelante del segundo if abajo del delay_ms(500) que estoy dando dentro del while pero en eso sí tengo duda no estoy seguro.CitarEs que si estoy conciente de que no entra al segundo if pero la verdad no sé porque, eh estado investigando para trata de hacerlo por mi cuenta(solucionar el error) pero la verdad sigo en comprender el porque hace eso.
Mirando el códigoCódigo: C
if (UART1_Data_Ready() == 1) //Se vuelve a leer la entrada { recive[i]=UART1_Read(); // Guardamos el valor o caracter UART1_Read_Text(recive,".",11); // Leer el dato hasta que encuentre un "." o termine de leer los if(recive[0]=='S' && recive[1] == 'V' && recive[2]=='d' && recive[3]=='c')
Responde estas preguntas...
- ¿Qué pasaría si yo envío el texto "SVdc." desde la PC? ¿La 'S' esta en recive[0] ? ¿ Que seguridad tengo que siempre este en la posición 0 ?
- ¿Qué pasaría si detrás del . existen otros caracteres como el salto de linea y el retorno de carro? es decir "SVdc.\n\r"
- ¿Qué pasaría si justamente debido a otros caracteres extras tengo algo asi: "\n\rSVdc.\n\r"?
- Mientras envías, en tu función "bloqueante", y mientras convertis valores float a string, perdes tiempo, tiempo en que puede estar recibiéndose caracteres y ocurrir un overflow, donde supongamos perdiste el "SV" y llego solo "dc." ¿Cómo te proteges ante este problema?
- Supongamos que ocurre también el caso anterior, y envias varias veces el "dc.SVdc.SVdc.", El carácter 'S' queda en la posición 0?
La respuestas a estas preguntas son las que van a hacer que te plantees para que funcione correctamente