TODOPIC

Microcontroladores PIC => Lenguaje C para microcontroladores PIC => Mensaje iniciado por: arielmdq en 23 de Marzo de 2014, 01:00:49

Título: lectura adc en lcd pero representado en barras
Publicado por: arielmdq en 23 de Marzo de 2014, 01:00:49
Hola que tal gente  !!!!! queria consultar por que hace muy poco que estoy con la programacion de microcontroladores y estoy tratando de hacer un medidor de nivel con un pic 16f877a y mostrarlo en un lcd 2 x 16 pero en forma de barras el tema es que busco bastante  y todo lo que me sale es el ejemplo de neoteo (medidor de nivel-vumetro) que es perfecto el efecto que logra  pero esta hecho en lenguaje basic y no entiendo nada yo uso el CCS . Si alguien me puede dar una mano con esto se lo agradeceria estoy encerrado en un bucle infinito y no puedo salir ja ja !!! . Un pequeño ejemplo , un link que no sea el de neoteo , algo para orientarme .Desde ya muchas gracias el foro esta buenisimo !!! saludos a todos !!!
Título: Re: lectura adc en lcd pero representado en barras
Publicado por: QIQE en 23 de Marzo de 2014, 11:41:19
En tu librería tendrás alguna función para generar nuevos caracteres  deberás generar una vara dos y tres ya que me parece que el caracter blanco es el espacio y hay un carácter que deja todo lleno y luego usarlos como mejor te convenga un saludo
Título: Re: lectura adc en lcd pero representado en barras
Publicado por: MGLSOFT en 23 de Marzo de 2014, 11:51:36
Lee sobre el uso de la CGRAM.
Con esa generas tus caracteres y después los muestras.
El ejemplo en Basic te dará una idea.

Por mas que te ayudemos, si eso no lo entiendes bien, nunca podrás innovar nada...
Título: Re: lectura adc en lcd pero representado en barras
Publicado por: rivale en 24 de Marzo de 2014, 12:23:57
como te comenta MGLSOFT

tienes que ver como crear nuevos caracteres (CGRAM)

mira aqui:
http://www.todopic.com.ar/foros/index.php?topic=36174.0 (http://www.todopic.com.ar/foros/index.php?topic=36174.0)
Título: Re: lectura adc en lcd pero representado en barras
Publicado por: arielmdq en 24 de Marzo de 2014, 19:41:31
muchas gracias amigos por las respuestas por lo menos ahora se por donde empezar en unos dias les cuento
                                                        Saludos !!!
Título: Re: lectura adc en lcd pero representado en barras
Publicado por: arielmdq en 26 de Marzo de 2014, 20:39:12
Hola gente !!!!! como andan les ecribo para contarles que al fin hice el programa , tal vez no me exprese bien al hacer la primera pregunta pero de todos modos me sirvio para aprender mas , lo que hice es un medidor de angulo de timon de un barco este representa en una pantalla lcd cuantos grados se mueve el timon tanto a babor como a estribor , al comienzo puse el ejemlo de neo teo por que cuando lo vi era eso mas o menos lo que queria y se me trabaron las neuronas en eso, pero cada tanto se me acomodan y algo me sale, ja ja , muy basico obiamente por que soy un principiante pero bueno funciona, hasta ahora en isis proteus, mas adelante les contare en fisico . Mi duda ahora es por que debe haber una manera mas sencilla de hacerlo y les queria mostrar el programa a ver que opinan ya que gracias a sus comentarios es como se abren posibilidades de aprender mas les mando un Saludo !!!! y como siempre mil gracias por ayudar !!!!
Título: Re: lectura adc en lcd pero representado en barras
Publicado por: AngelGris en 26 de Marzo de 2014, 23:17:08
  ¿Le sacaste una foto al monitor?  :D En ISIS en "File" tienes la opción de exportar gráficos lo cual permite exportar tu diagrama (incluso corriendo la simulación) a .BMP que luego puedes convertir a .JPG y/o .PNG para subirlo al foro.

  Para subir código te aconsejo utilizar la opción GeSHi del editor de mensajes del foro.
Título: Re: lectura adc en lcd pero representado en barras
Publicado por: arielmdq en 27 de Marzo de 2014, 08:02:32
Ja ja ja!!!!!!!!!  :D gracias Angelgris no tenia ni idea de como lo hacian  jua jua que bruto !!!!! igual sigo sin entender como subir el codigo con el GeSHi
Título: Re: lectura adc en lcd pero representado en barras
Publicado por: AngelGris en 27 de Marzo de 2014, 09:01:25
Ja ja ja!!!!!!!!!  :D gracias Angelgris no tenia ni idea de como lo hacian  jua jua que bruto !!!!! igual sigo sin entender como subir el codigo con el GeSHi

  Cuando estés escribiendo un mensaje y quieres subir código, vas a a la opción GeSHi y se despliega una lista de posibles lenguajes y/o formatos de texto. Eliges el que esté acorde al código a subir. En el mensaje propiamente dicho te aparecerán las etiquetas
[ code= formato elegido ] y [ /code ] y es entre dichas etiquetas que tienes que colocar tu código....

Código: C
  1. unsigned char variable;
  2. void main(void)
  3. {
  4. }

En el ejemplo anterior el formato elegido es C
Título: Re: lectura adc en lcd pero representado en barras
Publicado por: arielmdq en 27 de Marzo de 2014, 12:43:39
Código: C
  1. #include<16f88.h>
  2. #device adc =10
  3. #use delay (clock=4M)
  4. #fuses XT,NOWDT
  5. #include <lcd.c>
  6.  
  7.  
  8. void main()
  9. {
  10. int16 q;
  11. //float p;
  12.   setup_adc_ports(sAN0|sAN1|sAN2|VSS_VDD);
  13.    setup_adc(ADC_CLOCK_DIV_2);
  14. lcd_init();
  15.  
  16. while(1){
  17. set_adc_channel(0); //habilitacion canal 0
  18. delay_us(20);
  19.  
  20. q = read_adc();     //lectura canal 0
  21. //p =(float) read_adc() / 64; //conversion a tension
  22.  
  23. if (q<96&&q>0)
  24. {
  25.  
  26. lcd_gotoxy(6,1);
  27. printf(lcd_putc,"35\337er");
  28. delay_ms(100);
  29.  
  30. lcd_gotoxy(8,2);
  31. printf(lcd_putc,"|>>>>>>>>");
  32. delay_ms(100);
  33.  
  34.  
  35. }
  36.  
  37. if (q<160&&q>96)
  38. {
  39.  
  40. lcd_gotoxy(6,1);
  41. printf(lcd_putc,"30\337er");
  42. delay_ms(100);
  43.  
  44. lcd_gotoxy(8,2);
  45. printf(lcd_putc,"|>>>>>>> ");
  46. delay_ms(100);
  47.  
  48.  
  49. }
  50.  
  51. if (q<224&&q>160)
  52. {
  53.  
  54. lcd_gotoxy(6,1);
  55. printf(lcd_putc,"25\337er");
  56. delay_ms(100);
  57.  
  58. lcd_gotoxy(8,2);
  59. printf(lcd_putc,"|>>>>>>  ");
  60. delay_ms(100);
  61.  
  62.  
  63. }
  64.  
  65. if (q<288&&q>224)
  66. {
  67.  
  68. lcd_gotoxy(6,1);
  69. printf(lcd_putc,"20\337er");
  70. delay_ms(100);
  71.  
  72. lcd_gotoxy(8,2);
  73. printf(lcd_putc,"|>>>>>   ");
  74. delay_ms(100);
  75.  
  76.  
  77. }
  78.  
  79. if (q<352&&q>288)
  80. {
  81.  
  82. lcd_gotoxy(6,1);
  83. printf(lcd_putc,"15\337er");
  84. delay_ms(100);
  85.  
  86. lcd_gotoxy(8,2);
  87. printf(lcd_putc,"|>>>    ");
  88. delay_ms(100);
  89.  
  90.  
  91. }
  92. if (q<416&&q>352)
  93. {
  94.  
  95. lcd_gotoxy(6,1);
  96. printf(lcd_putc,"10\337er");
  97. delay_ms(100);
  98.  
  99. lcd_gotoxy(8,2);
  100. printf(lcd_putc,"|>>     ");
  101. delay_ms(100);
  102.  
  103.  
  104. }
  105.  
  106. if (q<480&&q>416)
  107. {
  108.  
  109. lcd_gotoxy(7,1);
  110. printf(lcd_putc,"5\337er");
  111. delay_ms(100);
  112.  
  113. lcd_gotoxy(8,2);
  114. printf(lcd_putc,"|>      ");
  115. delay_ms(100);
  116.  
  117.  
  118. }
  119. //**************a la via**************
  120. if  (q>480&&q<544)
  121. {
  122.  
  123. lcd_gotoxy(8,1);
  124. printf(lcd_putc,"\f       0");
  125. delay_ms(100);
  126.  
  127.  
  128. lcd_gotoxy(1,2);
  129. printf(lcd_putc,"       |        ");
  130. delay_ms(100);
  131. }
  132. //*****************************************
  133. if (q>544&&q<608)
  134. {
  135.  
  136.  
  137. lcd_gotoxy(7,1);
  138. printf(lcd_putc,"5\337br");
  139. delay_ms(100);
  140.  
  141. lcd_gotoxy(1,2);
  142. printf(lcd_putc,"      <|       ");
  143. delay_ms(100);
  144. }
  145.  
  146. if (q>608&&q<672)
  147. {
  148.  
  149.  
  150. lcd_gotoxy(6,1);
  151. printf(lcd_putc,"10\337br");
  152. delay_ms(100);
  153.  
  154. lcd_gotoxy(1,2);
  155. printf(lcd_putc,"     <<|        ");
  156. delay_ms(100);
  157. }
  158. if (q>672&&q<736)
  159. {
  160.  
  161.  
  162. lcd_gotoxy(6,1);
  163. printf(lcd_putc,"15\337br");
  164. delay_ms(100);
  165.  
  166. lcd_gotoxy(1,2);
  167. printf(lcd_putc,"    <<<|        ");
  168. delay_ms(100);
  169. }
  170. if (q>736&&q<800)
  171. {
  172.  
  173.  
  174. lcd_gotoxy(6,1);
  175. printf(lcd_putc,"20\337br");
  176. delay_ms(100);
  177.  
  178. lcd_gotoxy(1,2);
  179. printf(lcd_putc,"   <<<<|        ");
  180. delay_ms(100);
  181. }
  182.  
  183. if (q>800&&q<864)
  184. {
  185.  
  186.  
  187. lcd_gotoxy(6,1);
  188. printf(lcd_putc,"25\337br");
  189. delay_ms(100);
  190.  
  191. lcd_gotoxy(1,2);
  192. printf(lcd_putc,"  <<<<<|        ");
  193. delay_ms(100);
  194. }
  195.  
  196. if (q>864&&q<928)
  197. {
  198.  
  199.  
  200. lcd_gotoxy(6,1);
  201. printf(lcd_putc,"30\337br");
  202. delay_ms(100);
  203.  
  204. lcd_gotoxy(1,2);
  205. printf(lcd_putc," <<<<<<|        ");
  206. delay_ms(100);
  207. }
  208.  
  209. if (q>928&&q<992)
  210. {
  211.  
  212.  
  213. lcd_gotoxy(6,1);
  214. printf(lcd_putc,"35\337br");
  215. delay_ms(100);
  216.  
  217. lcd_gotoxy(1,2);
  218. printf(lcd_putc,"<<<<<<<|        ");
  219. delay_ms(100);
  220. }
  221.  
  222.  
  223. }
  224. }
Título: Re: lectura adc en lcd pero representado en barras
Publicado por: arielmdq en 27 de Marzo de 2014, 17:57:48
Bueno ANGELGRIS gracias a tu ayuda  ahora creo que si quedo  :)  soy duro cheee arranque de muy  grande ja ja !!! igual me gustaria saber que opinas del programa pero dame con un caño si es necesario que no pasa nada ,siempre me lo tomo bien me gusta reirme de los errores, si para eso estamos para aprender, te mando un saludo desde mar del plata 
Título: Re: lectura adc en lcd pero representado en barras
Publicado por: AngelGris en 27 de Marzo de 2014, 18:15:00
  Si siempre utilizas el mismo canal del ADC, no es necesario colocarlo dentro del while. Simplemente lo seleccionas, y haces la espera de 20us pero fuera del while.

  No entiendo el porque la espera luego de hacer cada escritura en el LCD.
Título: Re: lectura adc en lcd pero representado en barras
Publicado por: arielmdq en 28 de Marzo de 2014, 08:29:48
Probe sacar la lectura del adc fuera del while y no me funciona solo me funciona dentro del while , vos crees que si o si deberia estar fuera ?. y los tiempos pense que habia que darle un pequeño tiempo despues de cada lectura pero No ya se los saque y funciona perfecto . Ahora otra pregunta compre un lcd 2 x 16 y no me vino con ninguna hoja de datos lo unico que dice atras en la plaqueta es  INTECH ITM 1602B   y tiene 16 conexiones busque el datasheet y encontre un solo esquemita nada mas , vos  usaste este lcd alguna vez ? lo conoces?  me podes pasar algun dato o donde lo puedo buscar ?    Muchas gracias por tu colaboracion !!!! Saludos!!!!!
Título: Re: lectura adc en lcd pero representado en barras
Publicado por: AngelGris en 28 de Marzo de 2014, 09:14:44
  Lo siento, me expresé mal. Lo que puedes dejar fuera del while es la selección del canal del ADC, no la lectura del mismo. Sería algo así...

Código: C
  1. void mian(void)
  2. {
  3.   set_adc_channel(0);
  4.   delay_us(20);
  5.   while (1)
  6.   {
  7.     q = read_adc();
  8.     ....
  9.     ....
  10.     ....
  11.   }
  12. }

  Nunca he trabajado con LCD. Estuve a punto de desarmar un sintetizador Korg M1 para sacárselo (hacía un año que lo tenía), pero justo me llamó el cliente para venir a retirarlo
Título: Re: lectura adc en lcd pero representado en barras
Publicado por: arielmdq en 28 de Marzo de 2014, 19:43:00
Ahora si ,ahi lo probe como me dijiste y si  funciona :) , bueno lo voy a grabar en el pic y en cuanto este seguro de como se conecta la lcd  probare todo el circuito , te agradezco toda la info despues te cuento como me fue . Saludos !!!!
Título: Re: lectura adc en lcd pero representado en barras
Publicado por: arielmdq en 05 de Abril de 2014, 19:34:01
Hola que tal amigos :) !!! bueno me surgio otro problema con este programita :( les cuento a ver si alguien me puede ayudar lo que por ahi para uds es muy facil o sencillo se ve que para mi es todo lo contrario ja ja .Al grano: como ya les conte, el programa marca el angulo que se mueve el timon de un barco, mediante un potenciometro entro en el canal adc del pic y represento tanto en simbolos como en grados la posicion del cursor del potenciometro hasta aca todo funciona perfectamente el problema surge  que aunque el potenciometro no llegue de 0 a 5 volts (osea de 0 a 1023 en el adc )  la escala representada en la pantalla si tiene que llegar a los maximos para los dos lados ( la escala esta representada con un 0 al centro y aumentando cada 5º hasta un maximo de 35º tanto a un lado como al otro ) el tema es que al instalar esto yo tengo que colocar el potenciometro al centro donde me marcara el 0 y luego tendria que poder elegir una escala que cumpla con las condiciones de llegar tanto a un extremo como al otro marcando los 35º finales  y lo tengo que poder hacer con el programa y este es el desafio para mi , espero haberme expresado correctamente sino preguntenme a ver si los puedo orientar mas a mi problema y ojala me puedan ayudar  desde ya muchas gracias a todos,Saludos!!!!!
adujunto el programa
Código: C
  1. #include<16f88.h>
  2. #device adc =10
  3. #use delay (clock=4M)
  4. #fuses XT,NOWDT
  5. #include <lcd.c>
  6.  
  7.  
  8.  
  9. void main()
  10. {
  11.  
  12.  
  13. //***************************************
  14. int16 q;
  15.  
  16.   setup_adc_ports(sAN0|sAN1|sAN2|VSS_VDD);// habilitacion de canales adc >
  17.   setup_adc(ADC_CLOCK_DIV_2);            // solo para pic 16f88
  18.   set_adc_channel(0); //habilitacion canal 0
  19.   delay_us(20);
  20.  
  21. lcd_init();
  22.  
  23. while(1){
  24.  
  25. q = read_adc();     //lectura canal 0
  26.  
  27.  
  28. if (q==0)
  29. {
  30. output_high(PIN_a3);//led************************
  31. lcd_gotoxy(6,1);
  32. printf(lcd_putc,"35\337er   top");
  33.  
  34.  
  35. lcd_gotoxy(8,2);
  36. printf(lcd_putc,"|>>>>>>>>");
  37.  
  38. }
  39.  
  40. if (q<96&&q>0)
  41. {
  42. output_low(PIN_a3);//led************************
  43. lcd_gotoxy(6,1);
  44. printf(lcd_putc,"35\337er      ");
  45.  
  46. lcd_gotoxy(8,2);
  47. printf(lcd_putc,"|>>>>>>>>");
  48.  
  49. }
  50.  
  51. if (q<160&&q>96)
  52. {
  53.  
  54. lcd_gotoxy(6,1);
  55. printf(lcd_putc,"30\337er");
  56.  
  57. lcd_gotoxy(8,2);
  58. printf(lcd_putc,"|>>>>>>> ");
  59.  
  60. }
  61.  
  62. if (q<224&&q>160)
  63. {
  64.  
  65. lcd_gotoxy(6,1);
  66. printf(lcd_putc,"25\337er");
  67.  
  68. lcd_gotoxy(8,2);
  69. printf(lcd_putc,"|>>>>>>  ");
  70.  
  71. }
  72.  
  73. if (q<288&&q>224)
  74. {
  75.  
  76. lcd_gotoxy(6,1);
  77. printf(lcd_putc,"20\337er");
  78.  
  79. lcd_gotoxy(8,2);
  80. printf(lcd_putc,"|>>>>>   ");
  81.  
  82. }
  83.  
  84. if (q<352&&q>288)
  85. {
  86.  
  87. lcd_gotoxy(6,1);
  88. printf(lcd_putc,"15\337er");
  89.  
  90.  
  91. lcd_gotoxy(8,2);
  92. printf(lcd_putc,"|>>>    ");
  93.  
  94. }
  95. if (q<416&&q>352)
  96. {
  97.  
  98. lcd_gotoxy(6,1);
  99. printf(lcd_putc,"10\337er");
  100.  
  101.  
  102. lcd_gotoxy(8,2);
  103. printf(lcd_putc,"|>>     ");
  104.  
  105.  
  106.  
  107. }
  108.  
  109. if (q<480&&q>416)
  110. {
  111.  
  112. lcd_gotoxy(7,1);
  113. printf(lcd_putc,"5\337er");
  114.  
  115.  
  116. lcd_gotoxy(8,2);
  117. printf(lcd_putc,"|>      ");
  118.  
  119.  
  120.  
  121. }
  122. //**************a la via**************
  123. if  (q>480&&q<544)
  124. {
  125.  
  126. lcd_gotoxy(1,1);
  127. printf(lcd_putc,"       0        ");
  128.  
  129.  
  130.  
  131. lcd_gotoxy(1,2);
  132. printf(lcd_putc,"       |        ");
  133.  
  134. }
  135. //*****************************************
  136. if (q>544&&q<608)
  137. {
  138.  
  139.  
  140. lcd_gotoxy(7,1);
  141. printf(lcd_putc,"5\337br");
  142.  
  143.  
  144. lcd_gotoxy(1,2);
  145. printf(lcd_putc,"      <|       ");
  146.  
  147. }
  148.  
  149. if (q>608&&q<672)
  150. {
  151.  
  152.  
  153. lcd_gotoxy(6,1);
  154. printf(lcd_putc,"10\337br");
  155.  
  156.  
  157. lcd_gotoxy(1,2);
  158. printf(lcd_putc,"     <<|        ");
  159.  
  160. }
  161. if (q>672&&q<736)
  162. {
  163.  
  164.  
  165. lcd_gotoxy(6,1);
  166. printf(lcd_putc,"15\337br");
  167.  
  168.  
  169. lcd_gotoxy(1,2);
  170. printf(lcd_putc,"    <<<|        ");
  171.  
  172. }
  173. if (q>736&&q<800)
  174. {
  175.  
  176.  
  177. lcd_gotoxy(6,1);
  178. printf(lcd_putc,"20\337br");
  179.  
  180.  
  181. lcd_gotoxy(1,2);
  182. printf(lcd_putc,"   <<<<|        ");
  183.  
  184. }
  185.  
  186. if (q>800&&q<864)
  187. {
  188.  
  189.  
  190. lcd_gotoxy(6,1);
  191. printf(lcd_putc,"25\337br");
  192.  
  193.  
  194. lcd_gotoxy(1,2);
  195. printf(lcd_putc,"  <<<<<|        ");
  196.  
  197. }
  198.  
  199. if (q>864&&q<928)
  200. {
  201.  
  202.  
  203. lcd_gotoxy(6,1);
  204. printf(lcd_putc,"30\337br");
  205.  
  206.  
  207. lcd_gotoxy(1,2);
  208. printf(lcd_putc," <<<<<<|        ");
  209.  
  210. }
  211.  
  212. if (q>928&&q<992)
  213. {
  214. output_low(PIN_a4);//led************************
  215.  
  216. lcd_gotoxy(1,1);
  217. printf(lcd_putc,"     35\337br      ");
  218.  
  219.  
  220. lcd_gotoxy(1,2);
  221. printf(lcd_putc,"<<<<<<<|        ");
  222.  
  223. }
  224.  
  225. if (q>992&&q<1023)
  226. {
  227. output_high(PIN_a4);//led************************
  228.  
  229. lcd_gotoxy(1,1);
  230. printf(lcd_putc,"top  35\337br      ");
  231.  
  232.  
  233. lcd_gotoxy(1,2);
  234. printf(lcd_putc,"<<<<<<<|        ");
  235.  
  236. }
  237. }
  238. }
Título: Re: lectura adc en lcd pero representado en barras
Publicado por: MGLSOFT en 05 de Abril de 2014, 19:51:21
Porque habrias de calibrar justo al centro tu potenciometro, con lo dificil que es??

Mejor hacer una rutina de calibracion que contemple calibracion del cero y del tope.
Aclaracion: El pote debe ser de escala lineal!!

seria mas o menos asi:

En tu programa muestreas el conversor A/D y para representar los grados solo buscas el valor al cual corresponden, y muestras tantas barras como debas hacerlo. :mrgreen: :mrgreen:
Título: Re: lectura adc en lcd pero representado en barras
Publicado por: arielmdq en 06 de Abril de 2014, 11:46:29
Hola MGLSOFT  te agradezco mucho tu respuesta :lol: pero estoy demasiado verde para hacer lo que me propones ,entiendo que  debe ser la mejor opcion para hacerlo pero hasta ahora solo me doy cuenta de como leer el adc y poder representarlo en la lcd ; por eso pensaba que tal vez se podian hacer un par de tablas y seleccionar la que mas se acercaba al rango de escala que necesitaba ya que no necesito tanta presicion , bueno soy conciente de todo lo que me falta aprender asi que  seguire leyendo y tratare de hacer algun curso  personalizado o algo asi . Muchas gracias por tu ayuda  :)   Saludos desde mar del plata !!!
Título: Re: lectura adc en lcd pero representado en barras
Publicado por: arielmdq en 17 de Abril de 2014, 08:35:11
Hola amigos !!! vulevo al tema ya que estuve trabajando bastante en el y lo eh modificado bastante , tanto que lo de la representacion de la lectura en barras ya no es un problema por que decidi usar un caracter convencional  .
Bueno el tema ahora es que decidi hacer regulaciones a las escalas, es decir usar 4 canales adc: con uno fijar el parametro de uno de los topes, con otro regular el centro, con otro el otro tope y con el ultimo el cursor que es el que lee los datos e imprime en pantalla , pero lo que me esta sucediendo es que me lee solo los datos de un tope y el del centro, es como si no se estuviese cumpliendo la funcion que hace las cuentas no le encuentro cual puede ser el error . Adjunto el nuevo programa a ver si alguien me puede ayudar .Desde ya muchas gracias !!!!  :)
PD: solo para reducir el programa y sea mas entendible, puse la lectura de un solo lado
Código: C
  1. #include<16f88.h>
  2. #device adc =10
  3. #use delay (clock=4M)
  4. #fuses XT,NOWDT
  5. #include <lcd.c>
  6.  
  7.                      
  8. int16 a=0,b=0,c=0,d=0,e=0,f=0;
  9. int16 cursor=0,toper=0,topbr=0,cero=0;
  10. int16 resultadoEr =0;
  11. int16 calculoBandaEr(int16 cero,int16 toper);
  12.  
  13.  
  14. void main()
  15. {
  16.    
  17.      setup_adc_ports(sAN0|sAN1|sAN2|VSS_VDD);// habilitacion de canales adc >
  18.      setup_adc(ADC_CLOCK_DIV_2);            
  19.    
  20.      lcd_init();
  21.    
  22. while(1){
  23.  
  24.     set_adc_channel(0);
  25.    delay_us(20);
  26.    cero=read_adc();//varlable que se ajustara solo cuando se calibre el instrumento
  27.  
  28.    //****************************************************************
  29.  
  30.    set_adc_channel(1);
  31.    delay_us(20);
  32.    toper=read_adc(); //varlable que se ajustara solo cuando se calibre el instrumento
  33.    
  34.    int16 resultadoEr= calculoBandaEr(cero,toper);// funcion que hace las cuentas para representar la escala
  35.    
  36.    a=resultadoEr*2;
  37.    b=resultadoEr*3;
  38.    c=resultadoEr*4;
  39.    d=resultadoEr*5;  
  40.    e=resultadoEr*6;  
  41.    f=resultadoEr*7;
  42.    
  43.    //*********************************************************
  44.    set_adc_channel(2); //habilitacion canal 2
  45.    delay_us(20);
  46.    cursor=read_adc();     //lectura canal 2 a variable cursor
  47.    
  48.    //*********************************************
  49.  
  50.  
  51. if(cursor==toper)
  52.   {
  53.   output_high(PIN_a3);//led************************
  54.   lcd_gotoxy(1,1);
  55.   printf(lcd_putc,"      35\337er  top ");
  56.   lcd_gotoxy(1,2);
  57.   printf(lcd_putc,"       |>>>>>>>>");
  58.  
  59.   }
  60.  
  61. if (cursor==a)
  62. {
  63.  
  64. lcd_gotoxy(1,1);
  65. printf(lcd_putc,"      30\337er     ");
  66. lcd_gotoxy(1,2);
  67. printf(lcd_putc,"       |>>>>>>> ");
  68.  
  69. }
  70. if(cursor==b)
  71. {
  72. lcd_gotoxy(1,1);
  73. printf(lcd_putc,"      25\337er     ");
  74. lcd_gotoxy(1,2);
  75. printf(lcd_putc,"       |>>>>>>  ");
  76. }
  77. if (cursor==c)
  78. {
  79. lcd_gotoxy(1,1);
  80. printf(lcd_putc,"      20\337er     ");
  81. lcd_gotoxy(1,2);
  82. printf(lcd_putc,"       |>>>>>   ");
  83. }
  84.  
  85. if (cursor==d)
  86. {
  87. lcd_gotoxy(1,1);
  88. printf(lcd_putc,"      15\337er    ");
  89. lcd_gotoxy(1,2);
  90. printf(lcd_putc,"       |>>>    ");
  91. }
  92. if (cursor==e)
  93. {
  94.  
  95. lcd_gotoxy(1,1);
  96. printf(lcd_putc,"      10\337er    ");
  97. lcd_gotoxy(1,2);
  98. printf(lcd_putc,"       |>>     ");
  99. }
  100. if(cursor==f)
  101. {
  102. lcd_gotoxy(1,1);
  103. printf(lcd_putc,"       5\337er    ");
  104. lcd_gotoxy(1,2);
  105. printf(lcd_putc,"       |>       ");
  106. }
  107.  
  108. if (cursor==cero)
  109. {
  110.   lcd_gotoxy(1,1);
  111.   printf(lcd_putc,"       0        ");
  112.   lcd_gotoxy(1,2);
  113.   printf(lcd_putc,"       |        ");
  114. }
  115.  
  116.  
  117.  
  118. }
  119.  
  120. }
  121.   int16 calculoBandaEr(int16 cero, int16 toper){
  122. int16 resultadoEr =0;
  123.  
  124.     resultadoEr=(cero-toper)/7;
  125.    return resultadoEr;
  126.    
  127.  }
Título: Re: lectura adc en lcd pero representado en barras
Publicado por: allennet en 18 de Abril de 2014, 13:18:00
lo primero que veo es el clok adc es muy rapido

ADC_CLOCK_DIV_2      1.25Mhz
ADC_CLOCK_DIV_4       2.5Mhz
ADC_CLOCK_DIV_8      5Mhz en este caso seria este
Título: Re: lectura adc en lcd pero representado en barras
Publicado por: arielmdq en 19 de Abril de 2014, 16:04:34
Gracias Allennet por tu respuesta , lo acabo de probar pero tampoco funciona le he sacado las cuentas de dentro del while y funciona mejor osea me imprime los resultados pero me hace fallas tanto en el centro como en el tope bueno seguire probando , gracias por tu aporte .Saludos !!!
Título: Re: lectura adc en lcd pero representado en barras
Publicado por: allennet en 20 de Abril de 2014, 11:25:18
lo revise otra vez, tomaste los valores de la resta de toper - cero invertido y se desbordaba dando numeros cercanos a 65000
le agrege un goto tambien esta funvcionando  :-/
Título: Re: lectura adc en lcd pero representado en barras
Publicado por: arielmdq en 21 de Abril de 2014, 08:17:47
Si ahi funciona , muchas gracias ALLENNET si estaba teniendo un problema en las cuentas y ademas poniendo el conversor como me dijiste funciona correctamente , te agradezco mucho por tu ayuda y dedicacion  ((:-)) aca subo la parte del codigo y cuando lo termine lo subo completo SALUDOS!!!
Código: C
  1. #include<16f88.h>
  2. #device adc =10
  3. #use delay (clock=4M)
  4. #fuses XT,NOWDT
  5. #include <lcd.c>
  6.                      
  7. int16 calculoBandaEr(int16 cero,int16 toper);
  8. int16 z=0, a=0,b=0,c=0,d=0,e=0,f=0;
  9.  
  10. //int16 calculoBandaBr(int16 cero, int16 topbr);
  11. //int16 g=0,h=0,i=0,j=0,k=0,l=0,m=0;
  12.  
  13. int16 cursor=0,toper=0,topbr=0,cero=0;
  14. int16 resultadoEr =0;
  15.  
  16.  
  17. void main()
  18. {
  19.    
  20.    setup_adc_ports (sAN0|sAN1|sAN2|sAN3|VSS_VDD); // habilitacion de canales adc >
  21.    setup_adc (ADC_CLOCK_DIV_8); // ayuda Allennet
  22.    
  23.    
  24.    
  25.    set_adc_channel (0);
  26.    delay_us (20);
  27.   topbr = read_adc ();
  28. //resultadoBr = calculoBandaBr(topbr,cero);
  29.  
  30.    set_adc_channel (3);
  31.    delay_us (20);
  32.    cero = read_adc();
  33.  
  34.    set_adc_channel (1);
  35.    delay_us (20);
  36.    toper = read_adc ();
  37.    
  38.    resultadoEr = calculoBandaEr (cero, toper);
  39.    z=  resultadoEr + toper;
  40.    a = (resultadoEr * 3)+toper;
  41.    b =( resultadoEr * 4)+toper;
  42.    c =( resultadoEr * 5)+toper;
  43.    d =( resultadoEr * 6)+toper;
  44.    e =( resultadoEr * 7)+toper;
  45.    f =( resultadoEr * 8)+toper;
  46.  
  47.     lcd_init ();
  48.    
  49.    WHILE (1) {        
  50.      
  51.        
  52.       //*********************************************************
  53.       set_adc_channel (2); //habilitacion canal 0
  54.       delay_us (20);
  55.       cursor = read_adc (); //lectura canal 2 a variable cursor
  56.      
  57.       //*********************************************
  58.         IF (cursor >0 && cursor<= toper)
  59.       {
  60.    
  61.          output_high (PIN_a3); //led************************
  62.          lcd_gotoxy (1,1) ;
  63.          printf (lcd_putc, "      40\337er top ");
  64.          lcd_gotoxy (1, 2) ;
  65.          printf (lcd_putc, "       |>>>>>>>>");
  66.       }
  67.         IF (cursor > toper && cursor <=z)
  68.       {
  69.          lcd_gotoxy (1,1) ;
  70.          printf (lcd_putc, "      35\337er     ");
  71.          lcd_gotoxy (1, 2) ;
  72.          printf (lcd_putc, "       |>>>>>>>>");
  73.       }
  74.  
  75.       IF (cursor >z && cursor <a)
  76.       {
  77.      
  78.          lcd_gotoxy (1, 1) ;
  79.          printf (lcd_putc, "      30\337er     ") ;
  80.          lcd_gotoxy (1, 2) ;
  81.          printf (lcd_putc, "       |>>>>>>> ");
  82.       }
  83.    
  84.       IF (cursor >a &&cursor<b)
  85.       {
  86.    
  87.          lcd_gotoxy (1, 1) ;
  88.          printf (lcd_putc, "      25\337er     ") ;
  89.          lcd_gotoxy (1, 2) ;
  90.          printf (lcd_putc, "       |>>>>>> ");
  91.       }
  92.  
  93.       IF (cursor >b && cursor<c)
  94.       {
  95.      
  96.          lcd_gotoxy (1, 1) ;
  97.          printf (lcd_putc, "      20\337er     ") ;
  98.          lcd_gotoxy (1, 2) ;
  99.          printf (lcd_putc, "       |>>>>>   ");
  100.       }
  101.  
  102.       IF (cursor >c && cursor<d)
  103.       {
  104.    
  105.          lcd_gotoxy (1, 1) ;
  106.          printf (lcd_putc, "      15\337er     ");
  107.          lcd_gotoxy (1, 2) ;
  108.          printf (lcd_putc, "       |>>>        ");
  109.       }
  110.  
  111.       IF (cursor >d && cursor<e)
  112.       {
  113.    
  114.          lcd_gotoxy (1, 1) ;
  115.          printf (lcd_putc, "      10\337er     ");
  116.          lcd_gotoxy (1, 2) ;
  117.          printf (lcd_putc, "       |>>         ") ;
  118.       }
  119.  
  120.       IF (cursor>e&&cursor<f)
  121.       {
  122.    
  123.          lcd_gotoxy (1, 1) ;
  124.          printf (lcd_putc, "       5\337er     ");
  125.          lcd_gotoxy (1, 2) ;
  126.          printf (lcd_putc, "       |>         ");
  127.       }
  128.  
  129.       IF (cursor == cero)
  130.       {
  131.    
  132.          lcd_gotoxy (1, 1) ;
  133.          printf (lcd_putc, "       0        ");
  134.          lcd_gotoxy (1, 2) ;
  135.          printf (lcd_putc, "       |        ");
  136.       }
  137.    }
  138. }
  139.  
  140. //funcion
  141. int16 calculoBandaEr(INT16 cero, int16 toper)
  142. {
  143.    
  144.    RETURN (cero - toper) / 8;
  145. }
  146. int16 calculoBandaBr(INT16 cero, int16 topbr)
  147. {
  148.    
  149.    RETURN ( topbr -cero ) / 8;
  150. }
Título: Re: lectura adc en lcd pero representado en barras
Publicado por: arielmdq en 21 de Abril de 2014, 19:22:05
Bueno solucionados los inconvenientes,ya esta el programa funcionando :-/, al menos en la simulacion, ahora lo voy a hacer fisico espero salga todo bien y despues les cuento ,AGRADEZCO  a todos los que me ayudaron  :) aqui va el codigo completo Sauldos !!!
Código: C
  1. #include<16f88.h>
  2. #device adc =10
  3. #use delay (clock=4M)
  4. #fuses XT,NOWDT
  5. #include <lcd.c>
  6.                      
  7. int16 calculoBandaEr(int16 cero,int16 toper);
  8. int16 z=0, a=0,b=0,c=0,d=0,e=0,f=0;
  9.  
  10. int16 calculoBandaBr(int16 cero, int16 topbr);
  11. int16 g=0,h=0,i=0,j=0,k=0,l=0,m=0;
  12.  
  13. int16 cursor=0,toper=0,topbr=0,cero=0;
  14. int16 resultadoEr =0,resultadoBr =0;
  15.  
  16.  
  17. void main()
  18. {
  19.    
  20.    setup_adc_ports (sAN0|sAN1|sAN2|sAN3|VSS_VDD);
  21.    setup_adc (ADC_CLOCK_DIV_8);
  22.    set_tris_a(0b00001111);
  23.     //*************************************************************************
  24.  
  25.    set_adc_channel (3);
  26.    delay_us (20);
  27.    cero = read_adc();
  28. //***************************************************************************
  29.        
  30.    set_adc_channel (0);
  31.    delay_us (20);
  32.    topbr = read_adc ();
  33.    resultadoBr = calculoBandaBr(topbr,cero);//( topbr -cero ) / 8;
  34.    g = resultadoBr + cero;
  35.    h =cero+resultadoBr+resultadoBr;
  36.    i =cero+(resultadoBr*3);
  37.    j =cero+(resultadoBr*4);
  38.    k =cero+(resultadoBr*5);
  39.    l =cero+(resultadoBr*6);
  40.    m =cero+(resultadoBr*7);
  41.    
  42.  
  43.    set_adc_channel (1);
  44.    delay_us (20);
  45.    toper = read_adc ();
  46.    
  47.    resultadoEr = calculoBandaEr (cero, toper);
  48.    z=  resultadoEr + toper;
  49.    a = (resultadoEr * 3)+toper;
  50.    b =( resultadoEr * 4)+toper;
  51.    c =( resultadoEr * 5)+toper;
  52.    d =( resultadoEr * 6)+toper;
  53.    e =( resultadoEr * 7)+toper;
  54.    f =( resultadoEr * 8)+toper;
  55.  
  56.        
  57.    lcd_init ();
  58.    
  59.    WHILE (1) {    
  60.        
  61.       //*********************************************************
  62.       set_adc_channel (2);
  63.       delay_us (20);
  64.       cursor = read_adc ();
  65.      
  66.       //*********************************************
  67.         IF (cursor >0 && cursor<= toper)
  68.       {
  69.    
  70.         // output_high (PIN_a3); //led************************
  71.          lcd_gotoxy (1,1) ;
  72.          printf (lcd_putc, "      40\337er top ");
  73.          lcd_gotoxy (1, 2) ;
  74.          printf (lcd_putc, "       |>>>>>>>>");
  75.       }
  76.         IF (cursor > toper && cursor <=z)
  77.       {  
  78.          lcd_gotoxy (1,1) ;
  79.          printf (lcd_putc, "      35\337er     ");
  80.          lcd_gotoxy (1, 2) ;
  81.          printf (lcd_putc, "       |>>>>>>>>");
  82.       }
  83.  
  84.       IF (cursor >z && cursor <a)
  85.       {
  86.      
  87.          lcd_gotoxy (1, 1) ;
  88.          printf (lcd_putc, "      30\337er     ") ;
  89.          lcd_gotoxy (1, 2) ;
  90.          printf (lcd_putc, "       |>>>>>>> ");
  91.       }
  92.    
  93.       IF (cursor >a &&cursor<b)
  94.       {
  95.    
  96.          lcd_gotoxy (1, 1) ;
  97.          printf (lcd_putc, "      25\337er     ") ;
  98.          lcd_gotoxy (1, 2) ;
  99.          printf (lcd_putc, "       |>>>>>> ");
  100.       }
  101.  
  102.       IF (cursor >b && cursor<c)
  103.       {
  104.      
  105.          lcd_gotoxy (1, 1) ;
  106.          printf (lcd_putc, "      20\337er     ") ;
  107.          lcd_gotoxy (1, 2) ;
  108.          printf (lcd_putc, "       |>>>>>   ");
  109.       }
  110.  
  111.       IF (cursor >c && cursor<d)
  112.       {
  113.    
  114.          lcd_gotoxy (1, 1) ;
  115.          printf (lcd_putc, "      15\337er     ");
  116.          lcd_gotoxy (1, 2) ;
  117.          printf (lcd_putc, "       |>>>        ");
  118.       }
  119.  
  120.       IF (cursor >d && cursor<e)
  121.       {
  122.    
  123.          lcd_gotoxy (1, 1) ;
  124.          printf (lcd_putc, "      10\337er     ");
  125.          lcd_gotoxy (1, 2) ;
  126.          printf (lcd_putc, "       |>>         ") ;
  127.       }
  128.  
  129.       IF (cursor>e&&cursor<f)
  130.       {
  131.    
  132.          lcd_gotoxy (1, 1) ;
  133.          printf (lcd_putc, "       5\337er     ");
  134.          lcd_gotoxy (1, 2) ;
  135.          printf (lcd_putc, "       |>         ");
  136.       }
  137. //*****************************************************************************
  138.       IF (cursor == cero)
  139.       {
  140.    
  141.          lcd_gotoxy (1, 1) ;
  142.          printf (lcd_putc, "       0        ");
  143.          lcd_gotoxy (1, 2) ;
  144.          printf (lcd_putc, "       |        ");
  145.       }
  146. //*****************************************************************************      
  147.    if (cursor>cero&&cursor<g)
  148.        {
  149.    lcd_gotoxy(1,1);
  150.    printf(lcd_putc,"       5\337br  ");
  151.    lcd_gotoxy(1,2);
  152.    printf(lcd_putc,"      <|       ");
  153.  
  154.    }
  155.  
  156.    if (cursor>g&&cursor<h)
  157.    {
  158.    lcd_gotoxy(1,1);
  159.    printf(lcd_putc,"      10\337br   ");
  160.    lcd_gotoxy(1,2);
  161.    printf(lcd_putc,"     <<|        ");
  162.  
  163.    }
  164.    if (cursor>h&&cursor<i)
  165.    {
  166.    lcd_gotoxy(1,1);
  167.    printf(lcd_putc,"      15\337br   ");
  168.    lcd_gotoxy(1,2);
  169.    printf(lcd_putc,"    <<<|        ");
  170.  
  171.    }
  172.    if (cursor>i&&cursor<j)
  173.    {
  174.    lcd_gotoxy(1,1);
  175.    printf(lcd_putc,"      20\337br    ");
  176.    lcd_gotoxy(1,2);
  177.    printf(lcd_putc,"   <<<<|        ");
  178.  
  179.    }
  180.    if (cursor>j&&cursor<k)
  181.    {
  182.    lcd_gotoxy(1,1);
  183.    printf(lcd_putc,"      25\337br    ");
  184.    lcd_gotoxy(1,2);
  185.    printf(lcd_putc,"  <<<<<|        ");
  186.  
  187.    }
  188.  
  189.    if (cursor>k&&cursor<l)
  190.    {
  191.    lcd_gotoxy(1,1);
  192.    printf(lcd_putc,"      30\337br    ");
  193.    lcd_gotoxy(1,2);
  194.    printf(lcd_putc," <<<<<<|        ");
  195.  
  196.    }
  197.  
  198.    if (cursor>l&&cursor<m)
  199.    {
  200.    lcd_gotoxy(1,1);
  201.    printf(lcd_putc,"      35\337br      ");
  202.    lcd_gotoxy(1,2);
  203.    printf(lcd_putc,"<<<<<<<|        ");
  204.  
  205.    }
  206.  
  207.    if (cursor>m&&cursor<=topbr)
  208.    {
  209.  //  output_high(PIN_a4);//led************************
  210.  
  211.    lcd_gotoxy(1,1);
  212.    printf(lcd_putc,"top   40\337br      ");
  213.    lcd_gotoxy(1,2);
  214.    printf(lcd_putc,"<<<<<<<|        ");
  215.  
  216. }
  217.      
  218.    }
  219. }
  220.  
  221.  
  222. //funciones*********************************************
  223.  
  224. int16 calculoBandaEr(int16 cero, int16 toper)
  225. {
  226.    
  227.    RETURN (cero - toper) / 8;
  228. }
  229. int16 calculoBandaBr(int16 topbr,int16 cero )
  230. {
  231.    
  232.    RETURN ( topbr -cero ) / 8;
  233. }