Autor Tema: Consulta Interrupción externa y ADC CCS  (Leído 4814 veces)

0 Usuarios y 1 Visitante están viendo este tema.

Desconectado Prototipe88

  • PIC12
  • **
  • Mensajes: 92
Consulta Interrupción externa y ADC CCS
« en: 21 de Marzo de 2014, 09:45:28 »
Hola a todos. Hace dos días me puse a diseñar un pequeño programa con un PIC16F88 y quisiera corroborar unas cosas.
El programa realiza la sigueinte función: Desde otra plataforma enviaré al PIC una señal para que se produzca una interrupción externa (Por el pin RB0 de éste PIC). Una vez se produzca la interrupción mi idea es que dentro de la rutina de servicio a ésta interrupción se comience a leer el canal 0 del ADC. Luego el valor de ésta lectura se convertirá a voltios y se enviará por puerto serie a un Arduino y el PIC volverá a entrar en SLEEP.
Es uno de mis primeros programas en CCS y quiero verificar cosas para ver si voy por buen camino. Gracias y expongo el código.

#include <16F88.h>
#fuses HS, NOWDT, NOLVP, NOBROWNOUT, NOPROTECT, PUT
#use delay(clock 8000000) //8MHZ DEL CLOCK DEL PIC
#use rs232(baud=9600, xmit=PIN_B5, rcv=PIN_B2) //CONFIGURO PUERTO SERIE
#device adc=10 //INDICO EL NÚMERO DE BITS DEL ADC

#int_EXT // CREO QUE ÉSTO ME PERMITE INDICAR QUE LO SIGUIENTE SERÁ LA RUTINA DE SERVICIO A LA INT. DEL RB0
void intRBO () {
long valor=0; //DEFINO UNA VARIABLE DE 16BITS PARA GUARDAR EL VALOR DEL ADC
float voltios=0; //DEFINO UN FLOAT PARA EL VALOR DEL VOTAJE DEL ADC
set_adc_channel(0); //SELECCIONO CANAL 0 (PIN A0) DEL ADC PARA A LEER.
delay_us(20);
valor=read_adc();
voltios=(5.0*(valor/1024.0));
puts(voltios);
}

void main(void){

enable_interrupts(GLOBAL); //HABITILRO TODAS LAS INTERRUPCIONES GLOBALES
enable_interrupts(INT_EXT); //HABILITO LA INTERRUPCIÓN DEL PIN RB0
setup_adc_ports(sAN0); //INDICO EL PIN A0 COMO ENTRADA ANALÓGICA
setup_adc(ADC_CLOCK_INTERNAL); //CLOCK INTERNO PARA CONVERSIÓN ADC
SLEEP();

}


Supongo que en la configuración del puerto serie y en la interrupción externa no debo poner nada más. La idea es que cuando se envíe el resultado de la conversión ADC, en voltios, lo haga con sus decimales por eso defino un "float voltios". Quiero crear posteriormente un programa para conectarlo en el Arduino y me lea dicho valor. La cuestión es que no estoy seguro que sea tan fácil enviar por puerto serie un valor float.

Desconectado rivale

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 1707
Re: Consulta Interrupción externa y ADC CCS
« Respuesta #1 en: 21 de Marzo de 2014, 11:25:19 »
Hola prototipe88

algunos comentarios sobre tu código

- no es necesario que estes asignando el canal 0 del ADC en cada interrupción, si solo vas a usar ese canal, te recomiendo lo configures desde un inico y ya no lo cambies
-dentro del main te falta pones un ciclo infinito, ya que así como lo tienes, en cuanto despierte va a realizar lo de la interrupción y posteriormente se va a reiniciar tu pic.
-para enviar un flotante debes indicarle que imprimir, sería algo así printf("%f\n",voltios);
-no estas especificando si quieres que tu interrución quieres que se genere en flanco de subida o en flando de bajada, no recuerdo que valor tiene por default
"Nada es imposible, no si puedes imaginarlo"

Desconectado Prototipe88

  • PIC12
  • **
  • Mensajes: 92
Re: Consulta Interrupción externa y ADC CCS
« Respuesta #2 en: 21 de Marzo de 2014, 13:18:21 »
Hola prototipe88

algunos comentarios sobre tu código

- no es necesario que estes asignando el canal 0 del ADC en cada interrupción, si solo vas a usar ese canal, te recomiendo lo configures desde un inico y ya no lo cambies
-dentro del main te falta pones un ciclo infinito, ya que así como lo tienes, en cuanto despierte va a realizar lo de la interrupción y posteriormente se va a reiniciar tu pic.
-para enviar un flotante debes indicarle que imprimir, sería algo así printf("%f\n",voltios);
-no estas especificando si quieres que tu interrución quieres que se genere en flanco de subida o en flando de bajada, no recuerdo que valor tiene por default



entonces quedaría así:

void main(void){

enable_interrupts(GLOBAL); //HABITILRO TODAS LAS INTERRUPCIONES GLOBALES
enable_interrupts(INT_EXT); //HABILITO LA INTERRUPCIÓN DEL PIN RB0
setup_adc_ports(sAN0); //INDICO EL PIN A0 COMO ENTRADA ANALÓGICA
setup_adc(ADC_CLOCK_INTERNAL); //CLOCK INTERNO PARA CONVERSIÓN ADC

while(TRUE){
SLEEP();
 }
}



dos cosas: no sé si hay que definir más correctamente el puerto serie... es que quiero que sea con un bit de parada y todo eso.
Luego mi interrupción quiero que sea por flanco ascendente. Cuando yo desde otro pic le envie un nivel alto. Otra cosa mas... a nivel de experiencia como ves enviar un valor de muchos decimales con "fprint"??

Desconectado rivale

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 1707
Re: Consulta Interrupción externa y ADC CCS
« Respuesta #3 en: 21 de Marzo de 2014, 13:31:57 »
así esta mejor, ya tienes tu ciclo infinito

te faltó poner esta linea en el main
set_adc_channel(0);
asi escoges el canal en un inicio y no tienes que cambiarlo de nuevo


tu puerto esta bien configurado, si quieres puedes especificarle la paridad y lo que quieras, aunque estas usando la configuración común.

para configurar el flanco ascendente usa
ext_int_edge(l_to_h);

puedes aumentar tu velocidad de rs232 si quieres y asi transmites mas datos por segundo.


no se si necesites el valor en voltaje que esas leyendo del ADC, puede que no sea necesario convertirlo si lo que requieres es una comparación o una gráfica, o también podrias convertir los datos a flotante en el dispositivo que recibe los datos.

una pregunta, porque quieres enviar lo datos a un arduino?
"Nada es imposible, no si puedes imaginarlo"

Desconectado Prototipe88

  • PIC12
  • **
  • Mensajes: 92
Re: Consulta Interrupción externa y ADC CCS
« Respuesta #4 en: 21 de Marzo de 2014, 13:59:18 »
así esta mejor, ya tienes tu ciclo infinito

te faltó poner esta linea en el main
set_adc_channel(0);
asi escoges el canal en un inicio y no tienes que cambiarlo de nuevo


tu puerto esta bien configurado, si quieres puedes especificarle la paridad y lo que quieras, aunque estas usando la configuración común.

para configurar el flanco ascendente usa
ext_int_edge(l_to_h);

puedes aumentar tu velocidad de rs232 si quieres y asi transmites mas datos por segundo.


no se si necesites el valor en voltaje que esas leyendo del ADC, puede que no sea necesario convertirlo si lo que requieres es una comparación o una gráfica, o también podrias convertir los datos a flotante en el dispositivo que recibe los datos.

una pregunta, porque quieres enviar lo datos a un arduino?


Quiero enviar la información al arduino para que éste la gestione ya que recibirá no solo información de un pic, sino de varios. Tendré varios sensores conectados cada uno con su pic y enviaran info al arduino. Si, utilizaré el bus serie para sacar la informacion de los pics pero hacia el arduino se transmitira via RS485 utilizando MAX485 entonces podre enviar informacion de uno en uno hacia el arduino. El arduino recibirá la informacion por su puerto serie. Utilizo MAX485 para poder colgar mas pics al bus ya que enviaran de uno en uno la informacion por ese bus. en la entrada del arduino otro max485 me permitira recibir la información por el puerto serie.

Respecto a lo de los datos en coma flotante... necesitaré precisón, es decir necesitaré enviar el valor numérico del adc...en el caso que no haga la conversion en el pic y lo haga en el arduino estoy en las mismas porque tendré que transmitir el dato en voltaje hacia otro sistema (y será en coma flotante y de varios decimales). Me han comentado que quizás no sea tan preciso el comando fprint y no me imprima todos los decimales que yo quiero recibir por puerto serie...

Desconectado rivale

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 1707
Re: Consulta Interrupción externa y ADC CCS
« Respuesta #5 en: 21 de Marzo de 2014, 14:09:19 »

Quiero enviar la información al arduino para que éste la gestione ya que recibirá no solo información de un pic, sino de varios. Tendré varios sensores conectados cada uno con su pic y enviaran info al arduino. Si, utilizaré el bus serie para sacar la informacion de los pics pero hacia el arduino se transmitira via RS485 utilizando MAX485 entonces podre enviar informacion de uno en uno hacia el arduino. El arduino recibirá la informacion por su puerto serie. Utilizo MAX485 para poder colgar mas pics al bus ya que enviaran de uno en uno la informacion por ese bus. en la entrada del arduino otro max485 me permitira recibir la información por el puerto serie.

Respecto a lo de los datos en coma flotante... necesitaré precisón, es decir necesitaré enviar el valor numérico del adc...en el caso que no haga la conversion en el pic y lo haga en el arduino estoy en las mismas porque tendré que transmitir el dato en voltaje hacia otro sistema (y será en coma flotante y de varios decimales). Me han comentado que quizás no sea tan preciso el comando fprint y no me imprima todos los decimales que yo quiero recibir por puerto serie...



depende de que precisión requieras, considera que el valor mínimo que podrias leer en tu ADC es 5V /1024= 4.88 mV. al imprimir en punto flotante tu puede indicarle cuantos decimales quieres que te imprima.



"Nada es imposible, no si puedes imaginarlo"

Desconectado Prototipe88

  • PIC12
  • **
  • Mensajes: 92
Re: Consulta Interrupción externa y ADC CCS
« Respuesta #6 en: 21 de Marzo de 2014, 17:11:14 »

Quiero enviar la información al arduino para que éste la gestione ya que recibirá no solo información de un pic, sino de varios. Tendré varios sensores conectados cada uno con su pic y enviaran info al arduino. Si, utilizaré el bus serie para sacar la informacion de los pics pero hacia el arduino se transmitira via RS485 utilizando MAX485 entonces podre enviar informacion de uno en uno hacia el arduino. El arduino recibirá la informacion por su puerto serie. Utilizo MAX485 para poder colgar mas pics al bus ya que enviaran de uno en uno la informacion por ese bus. en la entrada del arduino otro max485 me permitira recibir la información por el puerto serie.

Respecto a lo de los datos en coma flotante... necesitaré precisón, es decir necesitaré enviar el valor numérico del adc...en el caso que no haga la conversion en el pic y lo haga en el arduino estoy en las mismas porque tendré que transmitir el dato en voltaje hacia otro sistema (y será en coma flotante y de varios decimales). Me han comentado que quizás no sea tan preciso el comando fprint y no me imprima todos los decimales que yo quiero recibir por puerto serie...



depende de que precisión requieras, considera que el valor mínimo que podrias leer en tu ADC es 5V /1024= 4.88 mV. al imprimir en punto flotante tu puede indicarle cuantos decimales quieres que te imprima.







Por ejemplo si utilizo lo siguiente para enviar el valor por el puerto serie: fprint("%1.6f\r\n",voltios); para imprimir el valor más pequeño (0,00488). ¿Se enviarían correctamente los decimales indicados sin ninguna perdida de información a nivel numérico?

Gracias por tus respuestas rivale.

Desconectado rivale

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 1707
Re: Consulta Interrupción externa y ADC CCS
« Respuesta #7 en: 21 de Marzo de 2014, 17:19:15 »
con eso tendrias hasta 6 decimales, solo el 6 quedaria redondeado, pero esto porque tu le especificas que lo redondee a 6, puedes ponerle mayor cantidad de decimales si lo requieres
"Nada es imposible, no si puedes imaginarlo"

Desconectado Prototipe88

  • PIC12
  • **
  • Mensajes: 92
Re: Consulta Interrupción externa y ADC CCS
« Respuesta #8 en: 22 de Marzo de 2014, 14:05:33 »
con eso tendrias hasta 6 decimales, solo el 6 quedaria redondeado, pero esto porque tu le especificas que lo redondee a 6, puedes ponerle mayor cantidad de decimales si lo requieres


Muchas gracias por tu magnífica respuesta! En cuanto me ponga a implementar fisicamente el conexionado y realize las pruebas comento algo :)


 

anything