Curso de programación de PIC en PICBasic Pro

buenas noches amigos por favor les pido podrían ayudarme con este proyecto. se trata de una red de suministro de agua automatizada.
la misma posee :
sensores de flujo (sensor hall, salida cuadrada, 0 y 1, 0v y 5v)
sensor de nivel (sensor ultrasónico hc-sr04)
pic16f877a
comunicación serial inhalambrica entre pic y pic, (transceiver kyl-210)
comunicación serial entre pc (visual basic) y pic
electroválvulas 12vdc
entre otros..

en principio pensaba utilizar 3 pic16f877a;
uno para el control y monitoreo de sensores válvulas... recibir y enviar información inalámbricamente por su puerto serial portc.6 y portc.7..con el transceiver kyl-210.
otro para recibir y enviar información por el puerto serial portc.6 y portc.7 inalámbricamente igual con otro kyl-210... este a su vez activaría alguno pines entre 1 y 0 los cuales se conectaban a un tercer pic.
este tercer pic, según el estado de los pines enviaba o recibia información a o desde la pc igualmente por su puerto serial portc.6 y portc.7 en un programa en visual basic donde se visualizara todo el proceso..
otro para recibir esa información...

este simulando, me funcionaba , si se puede decir bien. los tres pic y visual basic se comunicaba bien..

pero me entere que se puede enviar y recibir datos por cualquier pin del pic. entonce decidi reducir la cantidad de pic a 2.

aquí fue donde comezo todo el problema!
no he podido comunicar los 2 pic inhalambricamente. ya que uno de ellos se comunicara al pc por su puerto serial portc.6 y portc.7, y también se comunicara con el otro pic mediante el transceiver kyl-210 pero a otros pin cualquiera del pic (ya he probado varios y nada). y el otro pic solo se conecta al kly-210 ademas de los sensores y válvulas.
puedo observar por que los kyl-210 tiene luces para tx y rx. y si están enviando y recibiendo (pero al parecer no en el mismo idioma) y lo pruebo conectando el otro kyl-210 a la pc por rs-232 y con un programa que es para probar los mismos, y me envía caracteres muy diferentes a lo que quiero que envie o reciban..
por favor me podrian decir que estoy haciendo mal???
el serin y serout desde otro pin del pic funciona igual?
o cuales tengo que utilizar?? serin2, serout2, hserin, hserout, debug, debugin??? y si me pueden decir como seria???

y otra consulta como desactivo el conversor a/d del pic16f877a??? necesito esos pines como entradas y salidas, pa los sensores de nivel (hc-sr04), que aun no incluyo en programación.

por favor ayúdenme no ignoren este mensaje ni lo borren.. por favor... solo necesito una ayudadita de ustedes los expertos..
En lo que a mi respecta, sólo te podré ayudar con la comunicación serial, lo demás ya corre por tu cuenta.

Existen algunos problemas al tratar de establecer comunicación serial a 9600 bps,
con tan solo 4MHz como frecuencia de reloj para el PIC, "Ésto ya se a tratado en otros temas".
Al ser PICBasic Pro un lenguaje de alto nivel, utiliza recursos y no los registros para lograr un propósito.
Así que para trabajar en PBP a 9600 bps, es recomendable aumentar la frecuencia de reloj.
También es importante tener en cuenta las temporizaciones del programa para que no exista desincronización.
Se debe también tener en cuenta que pasará tras el regreso de una sub rutina y su continuación.

He modificado solamente el primer programa, qué es dónde realizas doble recepción y transmisión de datos.
Pruébalo con la interfaz que adjunto creando dos instancias.
"Crear dos instancias, es ejecutar dos programas idénticos a la vez."
Una instancia la configuras para trabajar virtualmente por el puerto 3, y la otra para trabajar por el puerto 5
Cada vez que se crea una nueva instancia, el programa pregunta si se desea crear otra nueva.
Cada instancia del programa tendrá un identificador de ventana "Handle Window" ó HWND
También se le puede identificar por el número de conexión al puerto en la parte baja del programa.

Debido a tus pocos conocimientos en el tema de PBP y RS-232, sé que te costará algo de trabajo entender.
Pero aquí tienes un tema que te puede ayudar bastante en tu proyecto.
Interfaz RS232 PIC PC (Proyecto Completo VB6)

Adjunto el programa con los cambios realizados, dónde ya se puede establecer comunicación bilateral.

Suerte.
 

Adjuntos

  • kano2468 16F877A Serial COM.rar
    166 KB · Visitas: 186
Última edición:
En lo que a mi respecta, sólo te podré ayudar con la comunicación serial, lo demás ya corre por tu cuenta.

Existen algunos problemas al tratar de establecer comunicación serial a 9600 bps,
con tan solo 4MHz como frecuencia de reloj para el PIC, "Ésto ya se a tratado en otros temas".
Al ser PICBasic Pro un lenguaje de alto nivel, utiliza recursos y no los registros para lograr un propósito.
Así que para trabajar en PBP a 9600 bps, es recomendable aumentar la frecuencia de reloj.
También es importante tener en cuenta las temporizaciones del programa para que no exista desincronización.
Se debe también tener en cuenta que pasará tras el regreso de una sub rutina y su continuación.

He modificado solamente el primer programa, qué es dónde realizas doble recepción y transmisión de datos.
Pruébalo con la interfaz que adjunto creando dos instancias.
"Crear dos instancias, es ejecutar dos programas idénticos a la vez."
Una instancia la configuras para trabajar virtualmente por el puerto 3, y la otra para trabajar por el puerto 5
Cada vez que se crea una nueva instancia, el programa pregunta si se desea crear otra nueva.
Cada instancia del programa tendrá un identificador de ventana "Handle Window" ó HWND
También se le puede identificar por el número de conexión al puerto en la parte baja del programa.

Debido a tus pocos conocimientos en el tema de PBP y RS-232, sé que te costará algo de trabajo entender.
Pero aquí tienes un tema que te puede ayudar bastante en tu proyecto.
Interfaz RS232 PIC PC (Proyecto Completo VB6)

Adjunto el programa con los cambios realizados, dónde ya se puede establecer comunicación bilateral.

Suerte.


buen diaaa
D@rkbytes muchisiiiiiimasssssssss gracias hermanoooooo.... gracias por tu respuesta...
te comento que ya lo había logrado de tanto insistir, buscar, estudiar.. lo consegui con algunos detalles.. pero tu información me ayudara bastante para que funcione correctamente..
y por supuesto que lo voy a implementar como tu lo hicisteee....
pero tengo unas dudas....

@ Device WDT_OFF,PWRT_ON ?????? que hace???? disculpa mi ignorancia...!! jejeje
en esta línea:
Sensar:
SerOut TX,T9600,[B0] ; Sólo para saber si el caractér recibido es = a $

no la entiendo muy bien.. va para visual basic, pero seria para que se confirme si visual basic recibe la info??? o algo asi?

en estas líneas
SerOut PORTB.4,T9600,["X",A,13,10] 'ENVIA EL COMANDO PARA HACER PURGA
SerOut TX,T9600,[SENSOR1,13,10] 'ENVIA DATOS POR TX A LA PC, A VISUAL BASIC

13,10 podrias decirme que función hacen??? me imagino que tengo ponerlo tal cual en el otro pic es cierto?, pero en visual basic?
y los datos que envía a visual basic, ejemplo: [SENSOR1,13,10] no debería ser asi: ,[#SENSOR1,13,10].. bueno digo por que asi fue que me funciono.. a mi..

y una ultima duda, yo lo logre conectando portb.4 y portb.5 a la pc mediante resistencias de 1k. si intercambio los puertos de tu programación funciona igual verdad?


gracias por todo viejo. te gradezco un mundo de verdad
espero tu respuesta.
gracias
 
tengo unas dudas....

@ Device WDT_OFF,PWRT_ON ?????? que hace???? disculpa mi ignorancia...!! jejeje
Esa es la palabra de configuración para el PIC.
Determina varios parámetros sobre el funcionamiento del microcontrolador.
Lee este documento Significado de los Fuses y también busca información acerca de ello.

en esta línea:
Sensar:
SerOut TX,T9600,[B0] ; Sólo para saber si el caractér recibido es = a $

no la entiendo muy bien.. va para visual basic, pero seria para que se confirme si visual basic recibe la info??? o algo asi?
El comentario lo dice, y sólo fue puesto para hacer un eco de los datos enviados al PIC.
Al hacer eso puedes saber que está recibiendo el PIC, ya que debe regresar lo mismo que envías.
Si regresa un dato diferente al enviado, entonces puedes saber que algo anda mal.
en estas líneas
SerOut PORTB.4,T9600,["X",A,13,10] 'ENVIA EL COMANDO PARA HACER PURGA
SerOut TX,T9600,[SENSOR1,13,10] 'ENVIA DATOS POR TX A LA PC, A VISUAL BASIC

13,10 podrias decirme que función hacen??? me imagino que tengo ponerlo tal cual en el otro pic es cierto?, pero en visual basic?
El 13 equivale a enviar un retorno de carro, y el 10 a enviar un salto de línea.
Que vendría siendo como en Visual Basic usar "vbCrLf"
Tan solo sirve para que los datos no se muestren uno detrás del otro.
Los puedes eliminar en las líneas de código donde no se necesiten.
Consideremos que este fue un programa debug, y contiene código que puedes quitar.
y los datos que envía a visual basic, ejemplo: [SENSOR1,13,10] no debería ser asi: ,[#SENSOR1,13,10].. bueno digo por que asi fue que me funciono.. a mi..
Si, todo depende de la forma en que quieras recibir los datos, y solamente se usa para números.
y una ultima duda, yo lo logre conectando portb.4 y portb.5 a la pc mediante resistencias de 1k. si intercambio los puertos de tu programación funciona igual verdad?
Posiblemente, en tu programa estás usando los pines del módulo USART, pero les das un uso normal,
porque la recepción y transmisión la haces por software, y no usando el módulo.
Para eso tendrías que usar HSerOut y HSerIn y entonces si lo harías usando el módulo USART.
Lee la información del tema que te mencioné, ahí encontrarás lo que necesitas saber.
gracias por todo viejo. te agradezco un mundo de verdad
De nada, Saludos.
 
Esa es la palabra de configuración para el PIC.
Determina varios parámetros sobre el funcionamiento del microcontrolador.
Lee este documento Significado de los Fuses y también busca información acerca de ello.


El comentario lo dice, y sólo fue puesto para hacer un eco de los datos enviados al PIC.
Al hacer eso puedes saber que está recibiendo el PIC, ya que debe regresar lo mismo que envías.
Si regresa un dato diferente al enviado, entonces puedes saber que algo anda mal.
El 13 equivale a enviar un retorno de carro, y el 10 a enviar un salto de línea.
Que vendría siendo como en Visual Basic usar "vbCrLf"
Tan solo sirve para que los datos no se muestren uno detrás del otro.
Los puedes eliminar en las líneas de código donde no se necesiten.
Consideremos que este fue un programa debug, y contiene código que puedes quitar.

Si, todo depende de la forma en que quieras recibir los datos, y solamente se usa para números.

Posiblemente, en tu programa estás usando los pines del módulo USART, pero les das un uso normal,
porque la recepción y transmisión la haces por software, y no usando el módulo.
Para eso tendrías que usar HSerOut y HSerIn y entonces si lo harías usando el módulo USART.
Lee la información del tema que te mencioné, ahí encontrarás lo que necesitas saber.

De nada, Saludos.


eres el mas mejor D@rkbytes jejejeje
gracias por tu ayuda de verdad creo que entendí jejejeje

de todas maneras para salir de duda.. con esto:
El comentario lo dice, y sólo fue puesto para hacer un eco de los datos enviados al PIC.
Al hacer eso puedes saber que está recibiendo el PIC, ya que debe regresar lo mismo que envías.
Si regresa un dato diferente al enviado, entonces puedes saber que algo anda mal.

quieres decir que "$" es: cualquier cosa extraña que se reciba por rx... osea lo que se recibe cuando hay mala comunicación o algo anda mal es decir figuritas extrañas....


de antemano muchas gracias me has ayudado mucho. soy nuevo programando y quisiera aprender bastante sobre el tema. pero aquí en Maracay Venezuela es difícil conseguir donde te den un curso de programación de pic, y si lo consigues te dan lo básico lo que medio uno sabe.
te adjunto una imagen del programa en visual basic, para que me des tu punto de vista, de verdad tu lo debes ver muy fácil pero llegar a esto me ha costado mucho, prácticamente volver a estudiar y todo lo he hecho en menos de 2 meses. yo quisiera que este proyecto funcionara lo mejor posible, pero tampoco tengo tanto conocimiento en visual basic solo lo básico. y bueno hay voy. todavía me falta agregar lo de los sensores de nivel. y hacer que el prototipo funcione.

gracias un saludo.
 

Adjuntos

  • programa en visualbasic.jpg
    programa en visualbasic.jpg
    86.1 KB · Visitas: 65
eres el mas mejor D@rkbytes jejejeje
gracias por tu ayuda de verdad creo que entendí jejejeje

de todas maneras para salir de duda.. con esto:


quieres decir que "$" es: cualquier cosa extraña que se reciba por rx... osea lo que se recibe cuando hay mala comunicación o algo anda mal es decir figuritas extrañas....


de antemano muchas gracias me has ayudado mucho. soy nuevo programando y quisiera aprender bastante sobre el tema. pero aquí en Maracay Venezuela es difícil conseguir donde te den un curso de programación de pic, y si lo consigues te dan lo básico lo que medio uno sabe.
te adjunto una imagen del programa en visual basic, para que me des tu punto de vista, de verdad tu lo debes ver muy fácil pero llegar a esto me ha costado mucho, prácticamente volver a estudiar y todo lo he hecho en menos de 2 meses. yo quisiera que este proyecto funcionara lo mejor posible, pero tampoco tengo tanto conocimiento en visual basic solo lo básico. y bueno hay voy. todavía me falta agregar lo de los sensores de nivel. y hacer que el prototipo funcione.

gracias un saludo.


buenas noches.. D@rkbytes
creo que pude hacer funcionar el proyecto, con tu ayuda por supuesto!

te adjunto los archivos para que me des tu punto de vista si no es mucha molestia. y si me puedes corregir algunas cosas y falllitas que tengo que aun no se como solucionar.
como por ejemplo cuando se sensa el sensor 2, la pc suena como un error..
otro es que tuve que quitar del serout al pc el 13,10 ya que no me hacia una función el visual basic, es de ocultar y mostrar imágenes, comote dije no se mucho de visual basic tampoco.
y otro es que cuando cualquiera de los sensores su valor sea 0 me envía dos mensajes, ya que no encontré como ponerlo, intente con select case, y no pude o no supe, lo hice con if.. then.. else... endif... osea:
Código:
Low PORTD.4          'ESTO SOLO SON LED PARA VERIFICAR EL FUNCIONAMIENTO
   SerOut TX,T9600,["X",e,13,10]  'ENVIA POR PORTB.4, KYL-210, PIDE INFO DE SENSOR1
   Pause 100
   SerIn RX,T9600,["se"],SENSOR1   'ESPERA POR EL PORTB.5 CONECTADO AL KYL-210                                                       'RESPUESTA  DEL SENSOR 1 EN EL OTRO PIC
   Pause 100
   if SENSOR1 > 30 then
   SerOut TXPIN,T9600,[" FLUJO EN TUBERIA PRINCIPAL: CORRECTO "]             'ENVIA DATOS POR TX A LA PC, A VISUAL BASIC
   ELSE   
   SerOut TXPIN,T9600,[" FLUJO EN TUBERIA PRINCIPAL: BAJO "]
   endif
   if sensor1 = 0 then
   SerOut TXPIN,T9600,[" *FALLA TUBERIA PRINCIPAL* "]
   endif 
   Pause 1000
   High PORTD.4                          'ESTO SOLO SON LED PARA VERIFICAR EL FUNCIONAMIENTO
   Return


ahh aun no pruebo incluyendo los sensores de nivel...

saludos gracias y disculpa la molestia..
 

Adjuntos

  • proyecto visual basic.rar
    42 KB · Visitas: 87
  • PROYECTO microcode.rar
    103.7 KB · Visitas: 100
  • simulacion.rar
    29.6 KB · Visitas: 83
Saludos kano2468

Estuve revisando tus programas y noté que aún no incluyes la palabra de configuración el tus códigos.
Ahora más que nada es importante que la incluyas, pues cambiaste de 4MHz a 20MHz.
Y el compilador usará XT_OSC y necesitas usar HS_OSC
También estará el Watch Dog Timer habilitado, y eso te puede estar reseteando el microcontrolador.
Es recomendable habilitar el fuse PWRTE "Power Up Timer" para estabilizar voltajes al iniciar.
En cuanto al fuse BOREN "Brown-Out Reset" puede quedar habilitado.
Su uso provocará un reset cuando exista un bajo voltaje en la alimentación del PIC.
Por lo tanto, si tu fuente de alimentación es estable, y con suficiente amperaje, puede quedar habilitado.
Tienes que tener en cuenta esto cuando trabajas con la misma fuente para activar motores, válvulas, etc.

El símbolo $ usado en el Select Case puede ser cualquiera, ése es un símbolo muy usado, por eso lo usé.
Pero puedes usar el que quieras, no es para saber si el caractér es basura.
En ese caso lo que se utilizaría es la opción "Else".
Así cualquier dato no incluido en la selección, entrará en la parte contraria "Else".

Pasando al programa en Visual Basic, es recomendable el uso de Option Explicit
Para esto tienes dos opciones...
Puedes escribir Option Explicit en la cabecera del programa, o ir al menú Herramientas/Opciones...
Ahí seleccionas "Requerir declaración de variables"
Con esto obligas al compilador a que detecte los tipos de variables no declaradas en el programa.
Y en tu código existen errores por no usar esta sentencia.
Si miras bien tu programa, sobre todo en los bucles For del Timer1, verás que escribes... For y = o To 2
En vez de For y = 0 To 2

Te recomiendo que en vez de usar un timer, uses el evento OnComm del control MSComm32
Así la recepción de datos no estará limitada por la temporización de Timer1, y podrás tener más control.

Otra recomendación es que tengas un control sobre los posibles errores que puedan ocurrir.
Por ejemplo... ¿Qué pasaría si tu programa fuera ejecutado en una PC que no tiene puertos seriales?
Obviamente se producirá en error que terminará tu programa abruptamente. Y eso no es deseado.

En cuanto a hacer comparaciones con cadenas de texto, no lo veo funcional.
Solamente puedes guardar un byte dentro de la variable de recepción. Y en tu programa comparas cadenas.
Es mejor que envíes un caractér ó número, y posteriormente lo compares.

También te recomiendo que no diseñes formularios tan grandes, no todos tienen grandes resoluciones de pantalla.
Puedes hacer uso de las API de Windows para saber la resolución de la pantalla, y dar aviso al usuario.
Cuando un programa es mayor en tamaño que la resolución en pixeles de la pantalla, éste se sale.
Se pierde visibilidad de los controles, quedando incomodo para el usuario.
En estos casos lo que se hace, es crear formularios redimensionables que se puedan ajustar a la pantalla.
Trata en lo posible de no usar gráficos pesados, eso hace que tu programa ocupe mucha memoria.
Siempre son buen vistos los programas ligeros, de rápida carga, y menos consumo de recursos.
"Por eso me gustan los programas realizados en ensamblador de 32 bits" MASM32
Nota que tu programa compilado "*.exe" pesa más de 4Mb y no tiene mucho código.
Eso es debido al uso de gráficos que puedes sustituir por mensajes, o imágenes GIF.
Ahora que si te gusta la programación gráfica puedes usar DirectX para VB y verás mejores resultados.

Saludos y suerte.
 
Última edición:
Estuve revisando tus programas y noté que aún no incluyes la palabra de configuración el tus códigos.
Ahora más que nada es importante que la incluyas, pues cambiaste de 4MHz a 20MHz.
Y el compilador usará XT_OSC y necesitas usar HS_OSC
También estará el Watch Dog Timer habilitado, y eso te puede estar reseteando el microcontrolador.
Es recomendable habilitar el fuse PWRTE "Power Up Timer" para estabilizar voltajes al iniciar.
En cuanto al fuse BOREN "Brown-Out Reset" puede quedar habilitado.
Su uso provocará un reset cuando exista un bajo voltaje en la alimentación del PIC.
Por lo tanto, si tu fuente de alimentación es estable, y con suficiente amperaje, puede quedar habilitado.
Tienes que tener en cuenta esto cuando trabajas con la misma fuente para activar motores, válvulas, etc.

buenas noches gracias por tu respuesta.. esto creo que lo puedo hacer con el programa que uso para programar el pic.. adjunto imágenes... en la parte de fuses... espero que sea asi..

la fuente del pic es diferente de la de las válvulas y sensores, los pic tiene fuentes independientes..

El símbolo $ usado en el Select Case puede ser cualquiera, ése es un símbolo muy usado, por eso lo usé.
Pero puedes usar el que quieras, no es para saber si el caractér es basura.
En ese caso lo que se utilizaría es la opción "Else".
Así cualquier dato no incluido en la selección, entrará en la parte contraria "Else".

aquí todavía tengo dudas.. pero creo que no hay problemas con esto me ha funcionado bien..

Pasando al programa en Visual Basic, es recomendable el uso de Option Explicit
Para esto tienes dos opciones...
Puedes escribir Option Explicit en la cabecera del programa, o ir al menú Herramientas/Opciones...
Ahí seleccionas "Requerir declaración de variables"
Con esto obligas al compilador a que detecte los tipos de variables no declaradas en el programa.
Y en tu código existen errores por no usar esta sentencia.
Si miras bien tu programa, sobre todo en los bucles For del Timer1, verás que escribes... For y = o To 2
En vez de For y = 0 To 2

listo activado y corregido errores....

Te recomiendo que en vez de usar un timer, uses el evento OnComm del control MSComm32
Así la recepción de datos no estará limitada por la temporización de Timer1, y podrás tener más control.

en principio intente utilizarlo, pero no supe como hacerlo, si me pudieras dar un ejemplo te lo agradecería..

Otra recomendación es que tengas un control sobre los posibles errores que puedan ocurrir.
Por ejemplo... ¿Qué pasaría si tu programa fuera ejecutado en una PC que no tiene puertos seriales?
Obviamente se producirá en error que terminará tu programa abruptamente. Y eso no es deseado.

si tienes razón,pero ni siquiera me había pasado por la mente eso.. y ni idea de como solucionarlo, tocaria seguir indagando.

En cuanto a hacer comparaciones con cadenas de texto, no lo veo funcional.
Solamente puedes guardar un byte dentro de la variable de recepción. Y en tu programa comparas cadenas.
Es mejor que envíes un caractér ó número, y posteriormente lo compares.

listo cambie por letras, que en principio lo tenia asi, pero haciendo pruebas cambio todo. por mi inexperiencia trabajo probando como funciona cada cosa.

También te recomiendo que no diseñes formularios tan grandes, no todos tienen grandes resoluciones de pantalla.
Puedes hacer uso de las API de Windows para saber la resolución de la pantalla, y dar aviso al usuario.
Cuando un programa es mayor en tamaño que la resolución en pixeles de la pantalla, éste se sale.
Se pierde visibilidad de los controles, quedando incomodo para el usuario.
En estos casos lo que se hace, es crear formularios redimensionables que se puedan ajustar a la pantalla.
Trata en lo posible de no usar gráficos pesados, eso hace que tu programa ocupe mucha memoria.
Siempre son buen vistos los programas ligeros, de rápida carga, y menos consumo de recursos.
"Por eso me gustan los programas realizados en ensamblador de 32 bits" MASM32
Nota que tu programa compilado "*.exe" pesa más de 4Mb y no tiene mucho código.
Eso es debido al uso de gráficos que puedes sustituir por mensajes, o imágenes GIF.
Ahora que si te gusta la programación gráfica puedes usar DirectX para VB y verás mejores resultados.

Saludos y suerte.
[/QUOTE]

en eso te refieres al tamaño de la ventana del programa? lo tengo asi ya que queda perfecto en la pantalla de mi pc. que eso donde pienso correrlo.
graficos pesados? te refieres a las imágenes prediseñadas? es lo que consegui ni idea si existe algo parecido.

como funciona el directX para vb??? ya lo descarque pero no encuentro como utilizarlo..?


gracias por tu ayuda amigo..
 

Adjuntos

  • programador.jpg
    programador.jpg
    147.5 KB · Visitas: 26
  • fuse edit.png
    fuse edit.png
    11.7 KB · Visitas: 14
Saludos nuevamente kano2468

Los fuses que tienes establecidos no están bien, debes usar esta palabra de configuración...
@ Device PIC16F877A
@ Device HS_OSC, WDT_OFF, PWRT_ON

Define OSC 20
Vista de los fuses con WinPIC800. "Es el que uso"
16F877A_Fuses.jpg

Si el programa en Visual Basic se ve bien en tu PC, y únicamente lo vas a usar tu, puedes dejarlo así.
En cuanto al uso de DirectX en VB6 existen muchos ejemplos en internet.
En la pagina que te mencioné puedes descargar un ejemplo sencillo y explicado, pero está en inglés.
Cómo esto ya se saldría del tema, no creo conveniente seguir explicando su uso.
Pero adjunto un ejemplo para que tengas una idea de lo que se puede hacer con DirectX.
Es la base de muchos juegos y aplicaciones multimedia.

Por ahora que empiezas, y para que no compliques tu programa, es preferible que lo dejes así.
Ya más adelante y cuando te adentres en la programación, podrás mejorarlo.

Lo importante por ahora es que logres realizar la comunicación entre los dispositivos y la PC.

Suerte.
 

Adjuntos

  • Uso de DirectX en VB.rar
    142.3 KB · Visitas: 79
buenas noches....

Los fuses que tienes establecidos no están bien, debes usar esta palabra de configuración...
@ Device PIC16F877A
@ Device HS_OSC, WDT_OFF, PWRT_ON

cuando los coloco me da error en el compilación... yo utilizo microcode, picbasicpro...
si los activo en el programador igualmente necesito usar esas palabras de configuración?

Define OSC 20
Vista de los fuses con WinPIC800. "Es el que uso"
Ver el archivo adjunto 93956

Si el programa en Visual Basic se ve bien en tu PC, y únicamente lo vas a usar tu, puedes dejarlo así.
En cuanto al uso de DirectX en VB6 existen muchos ejemplos en internet.
En la pagina que te mencioné puedes descargar un ejemplo sencillo y explicado, pero está en inglés.
Cómo esto ya se saldría del tema, no creo conveniente seguir explicando su uso.
Pero adjunto un ejemplo para que tengas una idea de lo que se puede hacer con DirectX.
Es la base de muchos juegos y aplicaciones multimedia.

Por ahora que empiezas, y para que no compliques tu programa, es preferible que lo dejes así.
Ya más adelante y cuando te adentres en la programación, podrás mejorarlo.​


ok esta bien..

Lo importante por ahora es que logres realizar la comunicación entre los dispositivos y la PC.

en la simulación funciona espero que cuando lo monte funcione...

una consulta y vuelve me a disculpar por tanta molestia....
en esta parte donde recibo los datos de cada sensor por ejemplo este:
SensorNT1:
LOW PORTD.0
SerOut TX,T9600,["X",I,13,10]
PAUSE 100
SerIn RX,T9600,["si"],SENSORT1
IF SENSORT1 > 40 THEN
SerOut TXPIN,T9600,["M"]
else
SerOut TXPIN,T9600,["N"]
IF SENSORT1 = 0 THEN
SerOut TXPIN,T9600,["O"]
PAUSE 100
ENDIF
HIGH PORTD.0
RETURN


como puedo hacer esta selccion? o para que me envie el carácter que es? por que si SENSORT1es > a 40 ok mandara M la pc, Fino..
si SENSORT1 es < a 40 mandara N OK fino, pero si SENSORT1 es = 0 me manda N Y O juntos.. intente con select case y no pude, o no supe. y aun no lo logro.. me podrias sugerir algo? por favor...


gracias y saludos..​
 
Saludos compañeros!, primero quiero agradecer a todos los que aportaron conocimientos que me han ayudado grandemente. Bueno les comento que estoy haciendo una especie de calculadora con teclado y mostrarlo en LCD pero solo las operaciones básicas (suma,resta,multiplicación y division), basándome en el ejemplo del amigo mecatrodatos. Mi problema surge cuando quiero decirle al pic que ya ingrese un numero y que me pida el otro numero ( o los otros) para realizar la operación, me explico?, es decir, ingreso por ejemplo el 6, y que el pic lo reconozca como un primer digito, luego que ingrese por ejemplo el 5, y al presionar la tecla de (sumar) me muestre en el lcd el numero (5+6=11).

aqui tengo el codigo pero por los momentos solo puedo leer la tecla del teclado :)
Código:
Define  LCD_DREG        PORTD
Define  LCD_DBIT        4
Define  LCD_RSREG       PORTD
Define  LCD_RSBIT       2
Define  LCD_EREG        PORTD
Define  LCD_EBIT        3

TRISA=%00000000
TRISB=%00001111
                  'declaracion de filas y columnas
fila1 VAR portB.0
fila2 VAR portB.1
fila3 VAR portB.2
fila4 VAR portB.3
columna1 VAR portB.4
columna2 VAR portB.5
columna3 VAR portB.6
tecla VAR BYTE         
PAUSE 500

TECLA="@"
LCDOUT $FE, 1
LCDOUT $FE,$0F
lcdout $fe,"Introduzca numero"
inicio:
GOSUB teclado

if tecla<>"@"  then
if tecla="*" or tecla ="#" then
LCDOUT TECLA
LCDOUT $FE,$14
TECLA="@"
PAUSE 10
else
lcdout dec TECLA
LCDOUT $FE,$14
TECLA="@"
PAUSE 10
endif
ENDIF
LCDOUT $FE,$10
GOTO inicio

teclado:  'buscar en el teclado para ver la tecla presionada
HIGH columna1
IF fila1=1 THEN TECLA=1
PAUSE 10
IF fila2=1 THEN TECLA=4
PAUSE 20
IF fila3=1 THEN TECLA=7
PAUSE 20
IF fila4=1 THEN TECLA="*"
PAUSE 20
LOW columna1                  

HIGH columna2
IF fila1=1 THEN TECLA=2
PAUSE 20
IF fila2=1 THEN TECLA=5
PAUSE 20
IF fila3=1 THEN TECLA=8
PAUSE 20
IF fila4=1 THEN TECLA=0
LOW columna2
PAUSE 20

HIGH columna3
IF fila1=1 THEN TECLA=3
PAUSE 20
IF fila2=1 THEN TECLA=6
PAUSE 20
IF fila3=1 THEN TECLA=9
PAUSE 20
IF fila4=1 THEN TECLA="#"
LOW columna3
pause 10

IF TECLA<>"@" THEN
RETURN
ELSE
GOTO TECLADO
ENDIF
end



buenas noches....



cuando los coloco me da error en el compilación... yo utilizo microcode, picbasicpro...
si los activo en el programador igualmente necesito usar esas palabras de configuración?



ok esta bien..



en la simulación funciona espero que cuando lo monte funcione...

una consulta y vuelve me a disculpar por tanta molestia....
en esta parte donde recibo los datos de cada sensor por ejemplo este:
SensorNT1:
LOW PORTD.0
SerOut TX,T9600,["X",I,13,10]
PAUSE 100
SerIn RX,T9600,["si"],SENSORT1
IF SENSORT1 > 40 THEN
SerOut TXPIN,T9600,["M"]
else
SerOut TXPIN,T9600,["N"]
IF SENSORT1 = 0 THEN
SerOut TXPIN,T9600,["O"]
PAUSE 100
ENDIF
HIGH PORTD.0
RETURN


como puedo hacer esta selccion? o para que me envie el carácter que es? por que si SENSORT1es > a 40 ok mandara M la pc, Fino..
si SENSORT1 es < a 40 mandara N OK fino, pero si SENSORT1 es = 0 me manda N Y O juntos.. intente con select case y no pude, o no supe. y aun no lo logro.. me podrias sugerir algo? por favor...


gracias y saludos..

Saludos amigo kano2468 tu problema cuando SENSORT1=0 te envia N Y O juntos es porque segun tu codigo tienes que cuanod sensor1 es menor que 40 te envia n y cuando sensor1=0 te envia O, entonces se te cumplen las dos condiciones al mismo tiempo es decir 0 es menor que 40 y sensor1 < 40. Entonces trata de hacer lo siguiente: para la parte de sensor1 < 40 colocale otra condicion es decir: if SENSORT1 < 40 and SENSORT1 > 0 then.... me entiendes lo que te quiero decir?
Bueno intenta hacerlo y comenta a ver en que te podemos ayudar, saludos!!!
 
Última edición:
Saludos compañeros!, primero quiero agradecer a todos los que aportaron conocimientos que me han ayudado grandemente. Bueno les comento que estoy haciendo una especie de calculadora con teclado y mostrarlo en LCD pero solo las operaciones básicas (suma,resta,multiplicación y division), basándome en el ejemplo del amigo mecatrodatos. Mi problema surge cuando quiero decirle al pic que ya ingrese un numero y que me pida el otro numero ( o los otros) para realizar la operación, me explico?, es decir, ingreso por ejemplo el 6, y que el pic lo reconozca como un primer digito, luego que ingrese por ejemplo el 5, y al presionar la tecla de (sumar) me muestre en el lcd el numero (5+6=11).

aqui tengo el codigo pero por los momentos solo puedo leer la tecla del teclado :)
Código:
Define  LCD_DREG        PORTD
Define  LCD_DBIT        4
Define  LCD_RSREG       PORTD
Define  LCD_RSBIT       2
Define  LCD_EREG        PORTD
Define  LCD_EBIT        3

TRISA=%00000000
TRISB=%00001111
                  'declaracion de filas y columnas
fila1 VAR portB.0
fila2 VAR portB.1
fila3 VAR portB.2
fila4 VAR portB.3
columna1 VAR portB.4
columna2 VAR portB.5
columna3 VAR portB.6
tecla VAR BYTE         
PAUSE 500

TECLA="@"
LCDOUT $FE, 1
LCDOUT $FE,$0F
lcdout $fe,"Introduzca numero"
inicio:
GOSUB teclado

if tecla<>"@"  then
if tecla="*" or tecla ="#" then
LCDOUT TECLA
LCDOUT $FE,$14
TECLA="@"
PAUSE 10
else
lcdout dec TECLA
LCDOUT $FE,$14
TECLA="@"
PAUSE 10
endif
ENDIF
LCDOUT $FE,$10
GOTO inicio

teclado:  'buscar en el teclado para ver la tecla presionada
HIGH columna1
IF fila1=1 THEN TECLA=1
PAUSE 10
IF fila2=1 THEN TECLA=4
PAUSE 20
IF fila3=1 THEN TECLA=7
PAUSE 20
IF fila4=1 THEN TECLA="*"
PAUSE 20
LOW columna1                  

HIGH columna2
IF fila1=1 THEN TECLA=2
PAUSE 20
IF fila2=1 THEN TECLA=5
PAUSE 20
IF fila3=1 THEN TECLA=8
PAUSE 20
IF fila4=1 THEN TECLA=0
LOW columna2
PAUSE 20

HIGH columna3
IF fila1=1 THEN TECLA=3
PAUSE 20
IF fila2=1 THEN TECLA=6
PAUSE 20
IF fila3=1 THEN TECLA=9
PAUSE 20
IF fila4=1 THEN TECLA="#"
LOW columna3
pause 10

IF TECLA<>"@" THEN
RETURN
ELSE
GOTO TECLADO
ENDIF
end





Saludos amigo kano2468 tu problema cuando SENSORT1=0 te envia N Y O juntos es porque segun tu codigo tienes que cuanod sensor1 es menor que 40 te envia n y cuando sensor1=0 te envia O, entonces se te cumplen las dos condiciones al mismo tiempo es decir 0 es menor que 40 y sensor1 < 40. Entonces trata de hacer lo siguiente: para la parte de sensor1 < 40 colocale otra condicion es decir: if SENSORT1 < 40 and SENSORT1 > 0 then.... me entiendes lo que te quiero decir?
Bueno intenta hacerlo y comenta a ver en que te podemos ayudar, saludos!!!

Muchas gracias amigo... gracias por tu respuesta. intentare eso y comento.. asi como tu también agradezco por que he recibido gran ayuda para realizar mi proyecto, en especial al sr. Dar@bytes que me ha ayudado bastante y el cual he molestado mucho.

puedo consultarte algo? con respecto a visual basic y el pic???
si puedes ayudarme te lo agradecería..
estoy tratando de enviar a visual basic desde el pic el nivel exacto de cada tanque y que se vea en una progressbar, pero como tengo pocos conocimiento de visual basic, del pic a visual basic solo envio caracteres como "A" "B" "M" y en visual basic según lo que reciba hago algo como por ejemplo:
Código:
Private Sub MSComm1_OnComm()
A = MSComm1.Input 'el dato que ingresa guardarlo en variable A
If A = "M" Then
Text1.Text = " TANQUE 100% LLENO "
ProgressBar1.Value = 100
End If

y asi envio desde el pic:

Código:
Sensor_4:
   Low PORTD.7  'esto es un led, solo para verificar funcionamiento 
   SerOut TX,T9600,["X",h,13,10] 'envía a pic2 conectado con sensores, solicitando info de s4
   Pause 100
   SerIn RX,T9600,["sh"],SENSOR4 'recibe info de s4
   if SENSOR4 > 30 then               'según como sea el valor decide:
   SerOut TXPIN,T9600,["J"]             'ENVIA DATOS POR TXpin A LA PC, A VISUAL BASIC
   else
   SerOut TXPIN,T9600,["K"]
   endif
   if sensor4 = 0 then
   SerOut TXPIN,T9600,["L"]
   endif 
   Pause 1000
   High PORTD.7
   Return

asi lo hago con cada sensor de flujo y nivel, pero como te dije quisiera recibir el valor exacto y mostrarlo en la progressbar de cada tanque. como podría hacer eso?? en realida también quería hacerlo con los sensores de flujo, enviar el valor exacto, y en visual basic decidir que hacer... pero no supe.. soy un novato. te adjunto el programa en visual basic.

gracias.. y un saludo..
 

Adjuntos

  • proyecto visual basic.rar
    42.3 KB · Visitas: 60
Buenas noches amigos.. informo que ya tengo mi proyecto casi culminado...
lo importante es que ya tengo lo que parecía mas difícil que era la comunicación pic a pic por rf, y pic a pc por rs232. esta ultima la logre con 2 resistencias una de 22k y otra de 1k. y colocando la velocidad dato invertido: N9600 en vez de dato verdadero: T9600, ya que no se esta utilizando el max232 y los datos no pasaran por el inversor que tiene integrado...

en el proyecto aun tengo fallas con el sensor de nivel, estoy utilizanzo el sensor ultrasonico hc-sr04.. el cual pruebo por separado del proyecto y me funciona bien.. pero dentro del proyecto no funciona.. me manda puro 0,

la distancia de los cables influye??? son como 2 o 3 metros el mas largo

estos son los códigos que utilizo en el proyecto:

este es una parte del pic 1 cuando solicita al pic 2 información sobre el nivel en el tanque1
Código:
SensorNT1:
   LOW PORTD.0   'esto es solo son led para identificar el funcionamiento
   LOW PORTD.1
   SerOut TX,T9600,["X",9,13,10]   'envía a pic2 comando solicitando info de sensor tanque1
   PAUSE 500
   SerIn RX,T9600,5000,SensorNT1,["stuno"],SENSORt1       'recibe informacion
   SerOut TXPIN,T9600,[#SENSORT1]       'envía a visual basic, solo para verificar el valor
   PAUSE 2000
   if sensort1 > 81 then SerOut TXPIN,T9600,["M"]    'según sea el valor decide '(vacio)
   IF SENSORT1 < 80 AND SENSORT1 > 61 THEN SerOut TXPIN,T9600,["N"]   '25% lleno
   IF SENSORT1 < 60 AND SENSORT1 > 41 THEN SerOut TXPIN,T9600,["O"]    '50% lleno
   IF SENSORT1 < 40 AND SENSORT1 > 21 THEN SerOut TXPIN,T9600,["P"]    '75 % lleno
   IF SENSORT1 < 20 THEN SerOut TXPIN,T9600,["Q"]               '100% lleno
   PAUSE 3000 
   HIGH PORTD.0     'led solo para verfificar funcionamiento
   HIGH PORTD.1
   RETURN

parte del pic 2 donde recibe solicitud de información del sensor del tanque1
Código:
RecibeRF:  '''''del pic 1
   HIGH PORTD.7
   SERIN RX,T9600,60000,SENSAR,["X"],B0 ' recibe y decide, en este caso seria 9, SENSORNT1
   if B0 = 1 THEN CALL purga1
   IF B0 = 2 THEN CALL purga2
   IF B0 = 3 THEN CALL purga3
   IF B0 = 4 THEN CALL purga4
   IF B0 = 5 THEN CALL SENSORUNO
   IF B0 = 6 THEN CALL SENSORDOS
   IF B0 = 7 THEN CALL SENSORTRES
   IF B0 = 8 THEN CALL SENSORCUATRO
   IF B0 = 9 THEN CALL SENSORNT1
   if B0 = 11 THEN CALL SENSORNT2
   IF B0 = 12 THEN CALL SENSORNT3
   LOW PORTD.7
   RETURN


                                 ''''PRUEBO asi:
SENSORNT1:                'SENSOR TANQUE 1,
   pause 40
   DISPAROT1 = 0          'Inicializa el valor de DISPARO
   PulsOut DISPAROT1,10    'Manda un pùlso de disparo para empezar a medir
   GoSub LEER_ECOST1       'Llamada a funcion para leer el ancho del eco recibido
   RETURN 
   LEER_ECOST1:
   select case SENSORT1
   case 1
   goto LEER_ECOST1
   case 0
   pulsin sensort1,1,NIVELT1
   NIVELST1 = NIVELT1/58
   PAUSE 1000
   SEROUT TX,T9600,["stuno",NIVELST1,13,10]
   END SELECT
   return

                               '''y asi: y no funciona tampoco.. manda 0... 0 0 0
SENSORNT2:                'SENSOR TANQUE 2
   high disparot2
   pauseus 10
   low disparot2
   pulsin sensort2,1,NIVELT2
   NIVELST2 = NIVELT2/58
   PAUSE 1000
   SEROUT TX,T9600,["stdos",NIVELST2,13,10]
   RETURN



Aquí el código donde pruebo el sensor independientemente y funciona bien... no entiendo por que no funciona en el proyecto.

Código:
'****************************************************************
'*  Name    : UNTITLED.BAS                                      *
'*  Author  : [select VIEW...EDITOR OPTIONS]                    *
'*  Notice  : Copyright (c) 2013 [select VIEW...EDITOR OPTIONS] *
'*          : All Rights Reserved                               *
'*  Date    : 03/06/2013                                        *
'*  Version : 1.0                                               *
'*  Notes   :                                                   *
'*          :                                                   *
'****************************************************************
INCLUDE "modedefs.bas"
DEFINE OSC 4
TRISA = %000010
TRISB = %00000110 ' Configuración el Puerto A
TRISD = %00000000
ADCON1 = 6
CMCON = 7
DISPARO VAR PORTA.0
SENSOR VAR PORTA.1
ALARMA  VAR PORTD.0 
CONTADOR VAR WORD
DISTANCIA VAR WORD 
ALARMA = 0

INICIO:
if portb.0 = 1 then call sensornt1
goto inicio
end

sensornt1:
pause 40
disparo = 0          'Inicializa el valor de DISPARO
PulsOut DISPARO,10    'Manda un pùlso de disparo para empezar a medir
GoSub LEER_ECO       'Llamada a funcion para leer el ancho del eco recibido
GoTo INICIO 
LEER_ECO:
select case sensor
case 1
goto LEER_ECO
case 0
pulsin SENSOR,1,DISTANCIA
DISTANCIA = DISTANCIA/58
PAUSE 1000
SEROUT PORTC.6,T9600,[#DISTANCIA]
IF  DISTANCIA < 22 AND DISTANCIA > 10 THEN ALARMA = 0
IF  DISTANCIA < 9 AND DISTANCIA > 1 THEN ALARMA = 1
END select
RETURN

END


adjunto proyecto completo y si alguien me puede ayudar en esta parte se lo agradecería.. es solo los sensores de nivel que me falta para completar el proyecto..


saludos a todos. espero su ayuda amigoos se los agradezco.
 

Adjuntos

  • PROYECTO.rar
    129.2 KB · Visitas: 96
  • proyecto visual basic.rar
    45.5 KB · Visitas: 70
  • proteus simulacion.rar
    29.6 KB · Visitas: 73
Hola como te va, veo que preguntas sobre la distancia de los cable por la comunicaciòn Uart,

ese problema se puebe soluzionar utilizando simple I.C. como MAX 485, MAX 487 etc.

Encontraras en los Datasheet como utilizarlo sea en TX como en RX.

Espero que te haya dado indicaciones utiles.

* Por el lado de la programaciòn de los PIC no te puedo ayudar tanto (utilizo Mikrobasic Pro)*

Muchos Saludos
 
Hola a todos los participantes de este interesante tema tengo el pic16f628a quiero hacer una ruleta de leds tengo el codigo y el circuito adjuntado. El problema es que a pesar de colocar cmcon=7 para utilizar los puertosa como digitales solo me funcionan hasta el led a3. El problema solo es el puertoa el puertob funciona normal. gracias
 

Adjuntos

  • pic16f628a.rar
    18.2 KB · Visitas: 76
buen dia, disculpe, la falla que tengo es que cuando inserto en el programa
@ device xt_osc ; oscilador externo XT
define osc 4
...
me aparece error, al parecer el error son esas dos lineas, ya que cuando borro los espacios entre ellos, despues de @ borro el espacio y tambien despues de device, el error ya no vuelve aparecer, estaria bien ponerlo en esta forma..

@devicext_osc ; oscilador externo XT
define osc 4

asi no me arroja errores.
 
buenas tardes..
aun tengo problemas con los sensores hc-sr04 los tengo conectado al puerto A del pic16f877a, funcionan bien cuando conecto 1 por uno, MUY bien, pero los conecto todos al pic al mismo tiempo y no funcionan, no me me da la lectura.
el trigger de cada uno esta en el porta0, porta1, porta2, respectivamente, y los echo en porta3, porta4, y porta5, respectivamente. los intercambio y nada.. postivio y negativo desde la misma fuente del pic..
que podrá ser.. si alguien tiene una idea se lo agradecería/... por favor ayúdenme..
aquí el código de configuración:
Código:
@ Device PIC16F877A 
@ Device HS_OSC, WDT_OFF, PWRT_ON
INCLUDE "modedefs.bas" 'LIBRERIA PARA COMUNICACION SERIAL
DEFINE OSC 20          'OSCILADOR 20 MHZ
TRISA = %111000   ' Configuración el Puerto A
TRISB = %11111111 ' Configuración el Puerto B
TRISD = %00000000 ' Configuración el Puerto D
TRISC = %10111000 ' Configuración el Puerto C
ADCON1 = 6        'DESAHLILITA CONVERTIDOR A/D
CMCON = 7         'DESAHILITA COMPARADORES ANALOGICOS
TX VAR PORTC.6    ' PUERTO TX
RX VAR PORTC.7    ' PUERTO RX
B0  VAR BYTE         'DECLARACION DE VARIABLES
SENSOR1 VAR BYTE     '  '' 
SENSOR2 VAR BYTE     '  ''
SENSOR3 VAR BYTE     '  ''
SENSOR4 VAR BYTE     '  ''
FRECUENCIA1 VAR BYTE '  ''
FRECUENCIA2 VAR BYTE '  ''
FRECUENCIA3 VAR BYTE '  ''
FRECUENCIA4 VAR BYTE '  ''
NIVELT1 VAR word     '  ''
NIVELT2 VAR word     '  ''
NIVELT3 VAR word     '  ''
DISPAROT1 VAR PORTA.0  'PUERTO DE DISPARO SENSOR TANQUE 1
DISPAROT2 VAR PORTA.1  'PUERTO DE DISPARO SENSOR TANQUE 2
DISPAROT3 VAR PORTA.2  'PUERTO DE DISPARO SENSOR TANQUE 3
SENSORT1 VAR PORTA.3 'PUERTO DE ENTRADA SEÑAL SENSOR TANQUE 1
SENSORT2 VAR PORTA.4 'PUERTO DE ENTRADA SEÑAL SENSOR TANQUE 2
SENSORT3 VAR PORTA.5 'PUERTO DE ENTRADA SEÑAL SENSOR TANQUE 3
PORTA = %000000   ' Inicializa el puerto "A".
PORTD = %00000000 ' Inicializa el puerto "D".
PORTB = %00000000 ' Inicializa el puerto "B".
PORTC = %00000000 ' Inicializa el puerto "C".


Buenas noches amigos.. informo que ya tengo mi proyecto casi culminado...
lo importante es que ya tengo lo que parecía mas difícil que era la comunicación pic a pic por rf, y pic a pc por rs232. esta ultima la logre con 2 resistencias una de 22k y otra de 1k. y colocando la velocidad dato invertido: N9600 en vez de dato verdadero: T9600, ya que no se esta utilizando el max232 y los datos no pasaran por el inversor que tiene integrado...

en el proyecto aun tengo fallas con el sensor de nivel, estoy utilizanzo el sensor ultrasonico hc-sr04.. el cual pruebo por separado del proyecto y me funciona bien.. pero dentro del proyecto no funciona.. me manda puro 0,

la distancia de los cables influye??? son como 2 o 3 metros el mas largo

estos son los códigos que utilizo en el proyecto:

este es una parte del pic 1 cuando solicita al pic 2 información sobre el nivel en el tanque1
Código:
SensorNT1:
   LOW PORTD.0   'esto es solo son led para identificar el funcionamiento
   LOW PORTD.1
   SerOut TX,T9600,["X",9,13,10]   'envía a pic2 comando solicitando info de sensor tanque1
   PAUSE 500
   SerIn RX,T9600,5000,SensorNT1,["stuno"],SENSORt1       'recibe informacion
   SerOut TXPIN,T9600,[#SENSORT1]       'envía a visual basic, solo para verificar el valor
   PAUSE 2000
   if sensort1 > 81 then SerOut TXPIN,T9600,["M"]    'según sea el valor decide '(vacio)
   IF SENSORT1 < 80 AND SENSORT1 > 61 THEN SerOut TXPIN,T9600,["N"]   '25% lleno
   IF SENSORT1 < 60 AND SENSORT1 > 41 THEN SerOut TXPIN,T9600,["O"]    '50% lleno
   IF SENSORT1 < 40 AND SENSORT1 > 21 THEN SerOut TXPIN,T9600,["P"]    '75 % lleno
   IF SENSORT1 < 20 THEN SerOut TXPIN,T9600,["Q"]               '100% lleno
   PAUSE 3000 
   HIGH PORTD.0     'led solo para verfificar funcionamiento
   HIGH PORTD.1
   RETURN

parte del pic 2 donde recibe solicitud de información del sensor del tanque1
Código:
RecibeRF:  '''''del pic 1
   HIGH PORTD.7
   SERIN RX,T9600,60000,SENSAR,["X"],B0 ' recibe y decide, en este caso seria 9, SENSORNT1
   if B0 = 1 THEN CALL purga1
   IF B0 = 2 THEN CALL purga2
   IF B0 = 3 THEN CALL purga3
   IF B0 = 4 THEN CALL purga4
   IF B0 = 5 THEN CALL SENSORUNO
   IF B0 = 6 THEN CALL SENSORDOS
   IF B0 = 7 THEN CALL SENSORTRES
   IF B0 = 8 THEN CALL SENSORCUATRO
   IF B0 = 9 THEN CALL SENSORNT1
   if B0 = 11 THEN CALL SENSORNT2
   IF B0 = 12 THEN CALL SENSORNT3
   LOW PORTD.7
   RETURN


                                 ''''PRUEBO asi:
SENSORNT1:                'SENSOR TANQUE 1,
   pause 40
   DISPAROT1 = 0          'Inicializa el valor de DISPARO
   PulsOut DISPAROT1,10    'Manda un pùlso de disparo para empezar a medir
   GoSub LEER_ECOST1       'Llamada a funcion para leer el ancho del eco recibido
   RETURN 
   LEER_ECOST1:
   select case SENSORT1
   case 1
   goto LEER_ECOST1
   case 0
   pulsin sensort1,1,NIVELT1
   NIVELST1 = NIVELT1/58
   PAUSE 1000
   SEROUT TX,T9600,["stuno",NIVELST1,13,10]
   END SELECT
   return

                               '''y asi: y no funciona tampoco.. manda 0... 0 0 0
SENSORNT2:                'SENSOR TANQUE 2
   high disparot2
   pauseus 10
   low disparot2
   pulsin sensort2,1,NIVELT2
   NIVELST2 = NIVELT2/58
   PAUSE 1000
   SEROUT TX,T9600,["stdos",NIVELST2,13,10]
   RETURN



Aquí el código donde pruebo el sensor independientemente y funciona bien... no entiendo por que no funciona en el proyecto.

Código:
'****************************************************************
'*  Name    : UNTITLED.BAS                                      *
'*  Author  : [select VIEW...EDITOR OPTIONS]                    *
'*  Notice  : Copyright (c) 2013 [select VIEW...EDITOR OPTIONS] *
'*          : All Rights Reserved                               *
'*  Date    : 03/06/2013                                        *
'*  Version : 1.0                                               *
'*  Notes   :                                                   *
'*          :                                                   *
'****************************************************************
INCLUDE "modedefs.bas"
DEFINE OSC 4
TRISA = %000010
TRISB = %00000110 ' Configuración el Puerto A
TRISD = %00000000
ADCON1 = 6
CMCON = 7
DISPARO VAR PORTA.0
SENSOR VAR PORTA.1
ALARMA  VAR PORTD.0 
CONTADOR VAR WORD
DISTANCIA VAR WORD 
ALARMA = 0

INICIO:
if portb.0 = 1 then call sensornt1
goto inicio
end

sensornt1:
pause 40
disparo = 0          'Inicializa el valor de DISPARO
PulsOut DISPARO,10    'Manda un pùlso de disparo para empezar a medir
GoSub LEER_ECO       'Llamada a funcion para leer el ancho del eco recibido
GoTo INICIO 
LEER_ECO:
select case sensor
case 1
goto LEER_ECO
case 0
pulsin SENSOR,1,DISTANCIA
DISTANCIA = DISTANCIA/58
PAUSE 1000
SEROUT PORTC.6,T9600,[#DISTANCIA]
IF  DISTANCIA < 22 AND DISTANCIA > 10 THEN ALARMA = 0
IF  DISTANCIA < 9 AND DISTANCIA > 1 THEN ALARMA = 1
END select
RETURN

END


adjunto proyecto completo y si alguien me puede ayudar en esta parte se lo agradecería.. es solo los sensores de nivel que me falta para completar el proyecto..


saludos a todos. espero su ayuda amigoos se los agradezco.
 
buenas tardes..
aun tengo problemas con los sensores hc-sr04 los tengo conectado al puerto A del pic16f877a, funcionan bien cuando conecto 1 por uno, MUY bien, pero los conecto todos al pic al mismo tiempo y no funcionan, no me me da la lectura.
el trigger de cada uno esta en el porta0, porta1, porta2, respectivamente, y los echo en porta3, porta4, y porta5, respectivamente. los intercambio y nada.. positivo y negativo desde la misma fuente del pic..
que podrá ser.. si alguien tiene una idea se lo agradecería/... por favor ayúdenme.
Saludos kano2468

Es algo complicado seguir el código de tu proyecto por los parámetros de SerIn.
Lo que te recomiendo es que lo hagas por pasos hasta ver en que parte del programa deja de funcionar.
Cuando agregas el uso de SerIn dentro de subrutinas, tienes que esperar a que se reciba algo.
Solamente hasta que se reciba algo, el programa continúa con la siguiente instrucción.
Ya que la instrucción SerIn detiene el programa dentro de un bucle definido por la etiqueta de retorno.
En algunas partes si tomas control pero en otras no, y puede ser que el programa quede en un bucle.

Mencionas que colocas los sensores uno por uno, pero que al colocar todos deja de funcionar.
Repite el proceso, pero fijándote que cada subrutina cumpla con las condiciones para retornar.

Suerte.
 
Saludos kano2468

Es algo complicado seguir el código de tu proyecto por los parámetros de SerIn.
Lo que te recomiendo es que lo hagas por pasos hasta ver en que parte del programa deja de funcionar.
Cuando agregas el uso de SerIn dentro de subrutinas, tienes que esperar a que se reciba algo.
Solamente hasta que se reciba algo, el programa continúa con la siguiente instrucción.
Ya que la instrucción SerIn detiene el programa dentro de un bucle definido por la etiqueta de retorno.
En algunas partes si tomas control pero en otras no, y puede ser que el programa quede en un bucle.

Mencionas que colocas los sensores uno por uno, pero que al colocar todos deja de funcionar.
Repite el proceso, pero fijándote que cada subrutina cumpla con las condiciones para retornar.

Suerte.

saludos D@rkbytes gracias por tu respuesta.
no amigo ninguno de los dos pic se quedan en un bucle ya que puedo observar el funcionamiento tanto de los pic (por los leds) como el de las antenas cuando envían y reciben (igual por los leds tx y rx), el problema es cuando conecto 2 o los 3 echo de cada sensor en cada uno de sus puertos (ra3, ra4,ra5) la medida o lectura que me arroja es 0, en todas (los triggers están conectados en ra0, ra1, ra2). si conecto un solo echo de un solo sensor en su puerto, si me da la medida exacta, o aproximada. osea funciona bien.

mi pregunta es si tendre configurados bien el puerto A como entradas/salidas digitales??
es decir con esta configuración funciona bien:
Código:
ADCON1 = 6        'DESAHLILITA CONVERTIDOR A/D
CMCON = 7         'DESAHILITA COMPARADORES ANALOGICOS
he conseguido por internet varias formas de como desactivarlos pero en realidad no se cual es la forma verdadera o si todas funcionan.
una es con este:
Código:
ADCON1 = 7

otra con esta configuración:
Código:
To make portA as normal port, you must declare
CMCON = 7 to shut off the comparators and
ADCON0.0 = 0 to shut off the A/D converter 1
ADCON1.PCFG0 = 0
ADCON1.PCFG1 = 1
ADCON1.PCFG2 = 1
ADCON1.PCFG3 = 0
to shut off the A/D converter 2

cual de estas sera?
con esto deshabilito también los de puertoE?
será que cambio de puerto (dejo los triggers en portA y pongo los echos en portB?)
o tendre que cambiar todo?

gracias por tu ayuda.
 
cual de estas sera?
con esto deshabilito también los de puertoE?
será que cambio de puerto (dejo los triggers en portA y pongo los echos en portB?)
o tendre que cambiar todo?

ADCON1 = 6 y ADCON1 = 7, es exactamente lo mismo, mira este post sobre la hoja de datos.
Has lo que te mencioné, ve agregando sensor por sensor hasta que veas cuando dejan de funcionar.
También puedes tener caídas de tensión, ruidos etc.

El problema de no poder ayudarte bien, es que no todos tenemos los sensores.

Saludos.
 
Atrás
Arriba