# Interfaz RS232 PIC PC (Proyecto Completo VB6)



## D@rkbytes

En esta ocasión les traigo un proyecto completo de interfaz RS232 escrito en VB6
El programa consta del control de las principales características del puerto serial.
Permite el envío de datos en dos modos. (Decimal y Texto)
Recibe los datos seriales en tres modos. (Binario, Decimal y Texto)
Cuenta con una interfaz de usuario amigable, fácil de usar y configurar.

Esta es la ventana principal del programa.







 Este proyecto fue inicialmente realizado para el control de 8 relevadores conectados al puerto B de un PIC16F628A, y con el tiempo le fui agregando más cosas.
El aporte no estaría completo si no incluyera el respectivo código fuente del programa, por lo cual adjunto el proyecto con su código fuente en VB6, algunos ejemplos y esquemas para su uso.
Los proyectos están realizados en PIC BASIC PRO y también incluí uno en ensamblador. (No podía faltar)
Cada proyecto contiene su respectiva simulación en Proteus y su esquema para los que no lo tienen.
Incluyo el programa compilado (EXE) al igual que los archivos (HEX) y su código fuente.

El programa interfaz usa el control ActiveX MsComm32.ocx, el cual también adjunto para los que no tengan Visual Studio 6 Instalado.
Este componente ActiveX debe ser registrado con el programa REGSVR32.EXE que se encuentra en el directorio de sistema de Windows o con otro programa que registre componentes ActiveX.

Para la adaptación de los niveles RS232 utilicé la clásica interfaz a transistores, consiguiendo buena comunicación entre el PIC y la PC
Para mejores resultados es recomendable usar un MAX232

Nota: Este programa fue probado en Windows XP, Vista y Windows 7

Bien, espero que este proyecto didáctico les sea de utilidad.
Suerte y hasta luego. 
Atte. D@rkbytes


----------



## Meta

Hola:

¿Qué es eso de "Enviar CR"?

Para completar, añadiría el RTS CTS, para saber cuando un dispositivo está conectado o no.
http://es.wikipedia.org/wiki/RS-232

Un saludo.


----------



## D@rkbytes

Meta dijo:


> Hola:
> 
> ¿Qué es eso de "Enviar CR"?
> 
> Para completar, añadiría el RTS CTS, para saber cuando un dispositivo está conectado o no.
> http://es.wikipedia.org/wiki/RS-232
> 
> Un saludo.


Envíar un CR es envíar un Car Return (Retorno de Carro)
Lo usé para que al recibir los mensajes no se junten uno después de otro.
Envío un 13 (Car Return) seguido de un 10 (Line Feed) es como en VB hacer vbCrLf
Para pasar al siguiente renglón de un texto.

En los ejemplos que realice no es necesario usar el RTS ni el CTS. Pero la interfaz los puede activar.
Ya es cosa de cada uno agregar estas funciones de detección al código si las requieren. 
Saludos.


----------



## Meta

Hola:

Ahora loentiendo, no había caído. Está en la tabla ASCII y si lo uso también en mis proyectos del puerto serie.





http://www.asciitable.com/

Saludo.


----------



## D@rkbytes

Ahora la versión 2 de esta interfaz RS232 en VB6.

Mejoré, añadí algunos algoritmos y la compacté un poco mas, cambiando también el diseño.

Esta es la nueva apariencia de la interfaz.​ 


​ 
Escribí también algunos programas nuevos en PBP para experimentar con la interfaz.
Algunos de los programas los escribí con MicroCode Studio v5.0
Utilizando el nuevo compilador PICBASIC PRO v3.0
Pero nada impide compilarlos con PBP2 modificando la cabecera FSR, que incluí en cada programa.

Algunos de los nuevos ejemplos son...
.- Un Expansor de puertos para el PIC12F675 con el 74LS164
.- Envío de mensajes a un LCD 16x2 vía serial. (Lectura y escritura del LCD)
.- Un recuperador del valor del registro OSCCAL para el 12F675
.- Un calculador para el registro SPBRG en los PIC16
.- Un decodificador de estado de los pins en los PIC. (Interfaz incluida)
.- Termómetros usando el ADC del 12F675 y el 16F88 con el Sensor LM35. (Interfaz incluida)
Y algunos otros programas extra.

Como siempre, espero que estos aportes sean de ayuda,
para los que quieran experimentar con el casi extinto puerto serial de la PC.

Nota: Todos los ejemplos y proyectos incluyen el código fuente.
Más su respectivo diagrama esquemático y simulación en ISIS.

Cualquier duda y comentario quedo a sus ordenes.

Suerte y hasta luego.

Atte. D@rkbytes


----------



## Meta

Buen trabajo. Estás hecho un profesional.

¿Haz probado un sensor digital como el DS1820? Cada vez está en forma junto al LM35 analógico.

Saludo.


----------



## D@rkbytes

Meta dijo:


> Buen trabajo. Estás hecho un profesional.
> 
> ¿Haz probado un sensor digital como el DS1820? Cada vez está en forma junto al LM35 analógico.
> 
> Saludo.


  Saludos Meta.
Pues no, no he experimentado con ese sensor.
Vi que por acá en México venden el DS18B20 con encapsulado TO92.
Y que se trata de un sensor de temperatura del tipo One-Wire.
En cuanto tenga un tiempo iré a comprarlo y experimentare con el.
Y si logro algo posteare los resultados del proyecto.

Como se trata de una comunicación digital y no analógica como el LM35,
espero que los resultados de la lectura sean mas exactos.
Ya que con el LM35 no pude conseguir una lectura precisa. Muy aproximada eso si. 
Probé configurando el ADC a 10 Bits y a 8 Bits.
Pero no obtuve mucha diferencia, así que lo deje en 8 Bits,
y use esta conversión: Temp = (AD_Value * 150 / 77)
Donde 150 es la temperatura máxima de sensor LM35 y 77 la lectura del ADC a 150°C.
Esa fue la mejor forma de aproximarme al valor del sensor.

Un dato curioso...
Estuve buscando la forma de poner el símbolo ° en el LCD y no salía. 
Ya que antes de hacerlo vía serial, lo hice en protoboard con un LCD.
Buscando encontré dos formas de hacerlo.
Una es escribiendo el símbolo ascii ß seguido de la C
Y la otra escribiendo su valor hex. (DF) dec. (223) y luego la C
Con eso logre un cuadrito en el LCD representando el símbolo de grados.

Bien, gracias por los comentarios y a seguir experimentando.

Suerte y hasta luego.


----------



## Meta

Aquí hay ejemplso de códigos, te lo peudo pasar.
http://www.pic16f84a.org/proteus.html#Proteus_Capitulo_28

También tengo ejemplos del LM35 y DS18B20 para el 16F886 tanto en C como en ASM.

Informándome por injternet desde hace un tiempo, me comentaron que el DS18B20 es más preciso y estable que el LM35, sobre todo estabilidad.


----------



## harrito89

hola dark,

soy novato en la utilización del VB6 y poseo algunos conocimientos en Picbasic, pero ahora veo a los dos programas como una herramienta necesaria para el proyecto q*ue* estoy haciendo, el proyecto consite en contabilizar el tiempo perdido en el paro de una determinada ma*qu*ina y el número de veces q*ue* se resetea el cronometro, esa parte ya la tengo funcionando pero el maestro me dijo q*ue* le agregara el número de paros q*ue* hace la ma*qu*ina, un reloj q*ue* indique la hora en q*ue* se detuvo la ma*qu*ina y la hora en q*ue* arranco nuevamente y toda esa información mostrarla en el display y transmitirla a un programa en VB6 en su defecto a una hoja de excel.

anexo codigo en Pic basic y simulación en proteus

Saludos desde Colombia!!!*
*


----------



## D@rkbytes

Saludos harrito89.
Bien, pues estuve revisando tu código, y hay algunas cosas que modificar para que funcione bien.
Como exactamente tú sabes que es lo que tiene que hacer, eso te corresponde hacerlo tú.

Le agregue los cambios necesarios para poder enviar los datos a la interfaz.
Y la interfaz tiene la opción de guardar un log como archivo de texto.
Para poder guardar el log en un archivo de excel también se puede hacer desde VB6
Busca esa información por internet, y si no la consigues, yo la tengo por alguna carpeta.

Para usar la interfaz con tu programa, debes configurarla a 9600/N/8/1 Hanshaking: NONE
Puerto virtual COM2, ya que use el COM3 para la simulación.
Si no tienes puertos virtuales, deberás usar un puerto disponible de la PC.

Adjunto el programa con los cambios.
  Cualquier duda o comentario, estoy para servirte.

Suerte.


----------



## harrito89

hola dark


Disculpas por lo de las reglas del foro, gracias por tu aporte, pero no logro encontrar lo de VB6, tampoco puedo ver los datos enviados por el puerto serial, acaso se hace por hyperterminal???.

el funcionamiento del programa consiste en que apenas el relay cambia de posición activa el cronometro y suma uno en el contador de paro, los otros dos interruptores funcionan para colocar en cero el cronometro, los resets y lleva la cuenta de cuantas veces se ha reseteado el cronometro.

modifique el programa de tal manera de que cada vez q*ue *cambie el relay aumente el contador de paro, pero no logro hacerlo volverlo a cero con el interruptor q*ue* encera el contador de reset, aparte el cronometro va mas lento q*ue* antes no lo entiendo ¿*por* q*ue*?


cual*qu*ier duda del funcionamiento del programa me avisas

Saludos!!*
*


----------



## harrito89

se me olvidaba comentarte que agregando la pausa el cronometro no funciona.

tengo una duda.. se podría manejar con mas interrupciones para q*ue* no afecte al funcionamiento del cronometro, si es asi me podrías colaborar explicándome como colocarla estoy,  :S con el tema de las interrupciones he buscado en la red pero nada q*ue* entiendo.

gracias!!!!!!


----------



## D@rkbytes

Al parecer hay un error en el manejo de los registros para las interrupciones.
Y es por eso que el timer no esta funcionando como debe.
También hay algunas cosas del programa que estan mal orientadas.

Para ver el envío de datos del micro a la PC,
necesitas usar la interfaz que adjunte en el post #10 y tener puertos virtuales en tu PC.
Revisa los ejemplos que se adjuntan para que puedas ir entendiendo.
Busca por internet como crear puertos serie virtuales.
O como te mencione antes, montar el circuito en protoboard y usar un puerto de la PC.
Dejame ver que le puedo modificar y posteo el resultado.


----------



## harrito89

gracias por tu valiosa ayuda!!!

umm, las interrupciones hasta ahora las estoy conociendo, revisare los ejemplos y descargare el emulador de puertos seriales para practicarlos. al armar el circuito en la protoboard podria q la pc envie picos de voltaje que puedan afectar al pic??, con respecto al funcionamiento del programa en la parte donde dice reloj es para agregarle un reloj q indique la hora real, no se si es posible.

revisare lo que me sugieres y estare posteando mis resultados.

saludos!!


----------



## D@rkbytes

harrito89 dijo:


> gracias por tu valiosa ayuda!!!
> 
> umm, las interrupciones hasta ahora las estoy conociendo, revisare los ejemplos y descargare el emulador de puertos seriales para practicarlos. al armar el circuito en la protoboard podria q la pc envie picos de voltaje que puedan afectar al pic??, con respecto al funcionamiento del programa en la parte donde dice reloj es para agregarle un reloj q indique la hora real, no se si es posible.
> 
> revisare lo que me sugieres y estare posteando mis resultados.
> 
> saludos!!


Saludos.
Espero que ya hayas visto los ejemplos de comunicación PIC PC RS232.
Te podrás dar cuenta que use dos tipos de interfaz de adaptación de niveles RS232 a TTL
para el PIC, una con 2 transistores, y otra con el IC MAX232.
Cualquiera de los dos tipos funciona bien, pero mi preferida fue la de 2 TR NPN.
Como te mencione anteriormente, el programa tú lo tienes que realizar.
Yo en lo que te puedo ayudar es en la transmisión serial de datos del PIC a la PC o viceversa.
Ya que el tema trata de eso precisamente.
Ahora, para que vayas viendo algo acerca de como usar los timers del PIC para crear conteos,
adjunto dos ejemplos en PBP que posiblemente los puedas usar en tu programa.
también podrás ver como se puede mezclar lenguaje ensamblador en un programa de PBP.
En uno se envían los datos por medio del módulo USART del PIC hacia la PC.
Y para que tengas más conocimiento de los timers del PIC, hay varios ejemplos en el foro.
Espero que los ejemplos que he subido dentro del tema te sirvan de ayuda.

Suerte.


----------



## harrito89

hola!!

estuve revisando los ejemplos de comunicacion pic pc rs232, me son de gran ayuda pude comprender el tema a la perfección, pero tengo una duda, se podria pasar la señal rs232 a tcp/ip,sin necesidad de cambiar o agregar un pic adicional... ya que el puerto serial esta casi extinto.

por lo que veo en los ejemplos que acabas de adjuntar me toka modificar el programa en varios aspectos que no me habia fijado y adicionarle la transmision rs232.

buscare mas informacion en el foro

gracias men!!


----------



## carlitosferar

Hola:
Como veo que aún hay gente por aquí me lanzo con una consulta.

Antes aclarar, que no estoy dando mis primeros pasos en esto de los PICs, mas bien recién estoy tratando de separar las manos de la pared.

Y ahora sí, la pregunta: ¿Se puede utilizar la instrucción SEROUT en dos pines de un mismo micro?

La situación es la siguiente: Estoy con dos proyectos de Darkbytes
El de los 8 leds, (PC/Pic _ Pic/Pc) 
Y el de Serin/Serout (Pic/Pic)

Los cuales en forma individual funcionan a la perfección (Obvio)

Hardware super standad : Pic 16F628A y los clásicos modulitos de 433Mhz
Software : PBP sobre MPLAB y Proteus.

La idea era :
Del primer Pic conectado al PC (Master) enviar la información, del estado de algunos de los pins o leds, a otro Pic (Slave) vía RF.
Pero al querer Tx por otro pin un segundo “serout” (Recordemos que el primero es el retorno al PC)……Estos entran en conflicto.
He pensado en interrupciones alternativas, pero todavía no me da el bocho para implementarlas y ver que pasa.

Bueno de momento agradecería si me dicen si se puede, ya que info sobre Serin/Out hay mucha pero para este caso en particular no encuentro nada.

Un Saludo y Muchas Gracias.

PD: Muchas Gracias a Darkbytes. Su proyecto de “Interfaz” y los ejemplos adjuntos, empezaron a echar un poco de luz sobre mi desorientada ignorancia.

Dejo los zip originales.


----------



## D@rkbytes

Hola carlitosferar.


carlitosferar dijo:


> PD: Muchas Gracias a Darkbites. Su proyecto de “Interfaz” y los ejemplos adjuntos, empezaron a echar un poco de luz sobre mi desorientada ignorancia.


De nada, espero les sean de ayuda estos proyectos. 
Ya le quitaste varios bits a mi nick. 


carlitosferar dijo:


> La idea era :
> Del primer Pic conectado al PC (Master) enviar la información, del  estado de algunos de los pins o leds, a otro Pic (Slave) vía RF.
> Pero al querer Tx por otro pin un segundo “serout” (Recordemos que el primero es el retorno al PC)……Estos entran en conflicto.
> He pensado en interrupciones alternativas, pero todavía no me da el bocho para implementarlas y ver que pasa.
> 
> Bueno de momento agradecería si me dicen si se puede, ya que info sobre  Serin/Out hay mucha pero para este caso en particular no encuentro nada.
> 
> Un Saludo y Muchas Gracias.
> 
> PD: Muchas Gracias a Darkbites. Su proyecto de “Interfaz” y los ejemplos  adjuntos, empezaron a echar un poco de luz sobre mi desorientada  ignorancia.


La pregunta es... ¿Que llevas realizado del proyecto que pretendes, hasta ahora?
Ya que para poder ayudarte, es necesario que subas tu proyecto.
Esto hará que nos podamos dar una idea de lo que exactamente quieres hacer.
Porque los archivos que adjuntas, son ejemplos que subí anteriormente en el post #1.

Por lo mientras, te puedo decir que si puedes usar otro pin para SEROUT
No para HSEROUT porque el puerto B tiene ocupado el módulo USART.
Pero puedes declarar otra salida del puerto A y usarla como salida T2

Esperamos tu proyecto.

Suerte.


----------



## carlitosferar

Gracias Darkbytes por responder. 
Y perdón por el error en el nick, la próxima te llamo Darkword para compensar los bits robados.  

No puse nada de lo mio :

1ro_ Porque no hay nada para destacar, he hecho cientos de pruebas inútiles, lo he probado hasta con dos pics Masters y nada ….......me es imposible hacer 2 tx . 

2do_ Puse tus ejemplos para dejar en claro que partía de proyectos con GARANTÍA de funcionamiento. 

3ro_ Todos mis intentos no van mas allá de agregar alguna/as lineas al programa original de los “Relays”. 

4to_ Por todo esto (Inconsistencia del proyecto, por MI falta de conocimientos) es que no pedí ayuda con el proyecto en si, sino simplemente; saber si se podía, usar la instrucción dos veces. 

5to_ Ahora que mi ego està un poco menos dolido, ya que tu respuesta coincide con lo que pensaba.
(Por eso pregunte por Serout y no por Hserout). Aunque en los tantos intentos también pensé en cambiar los puertos y hacer una y una. 

Con respecto a las salidas las probé TODAS de la A.0 al A.7 y como dicen por aquí “No pasa ná”. :cabezon:

Pongo unas imágenes para que se vea cual es la idea. Su simplicidad explica porqué la había omitido antes. 

Se ve claramente que en el Master, se mantiene la configuración original del poy. "Relays", y simplemente agrego una linea para prender en forma permanente un led vía RF. 
Mientra que en el Slave pretendo OBLIGAR a que se prenda si o si (esto para saber si la tx se produce con éxito). 

Resultado: siempre NEGATIVO incluso, muere la tx al PC cuando cierro la conexión con el módulo RF. 

Este ejemplo lo hice simplificado para tratar de explicarme. Logicamente la idea es que prendan todos los leds en el Master y todos los posibles en el Slave, pero eso es para mas adelante, si logro la comunicación RF. 

Por las dudas reitero: La comunicación entre SOLO dos Pics via RF me funciona perfecto; lo que no puedo es juntar los dos proyectos. 

Dejo también los arch. correspondientes a MPLAP y Poteus. 
Y un RAR con las imágenes con mayor resolución. 

Un Saludo y Mil Gracias por la atención.


----------



## D@rkbytes

carlitosferar dijo:


> Gracias Darkbytes por responder.
> Y perdón por el error en el nick, la próxima te llamo Darkword para compensar los bits robados.


Saludos, dejemoslo en D@rkbytes 


carlitosferar dijo:


> Por las dudas reitero: La comunicación entre SOLO dos Pics via RF me  funciona perfecto; lo que no puedo es juntar los dos proyectos.


Bien, no tengo módulos de RF para realizar mejor las pruebas,
pero veamos si el proyecto que adjunto es más o menos lo que pretendes hacer.

Nota: Yo utilizo como editor MicroCode Studio, desde ahí compilo los programas para el PIC.

Suerte.


----------



## carlitosferar

F A N T A S T I CO ! ! !


Un millón de gracias es exactamente lo que pretendía hacer.
Ahora son las 2 de la mañana pero no pude resistirme a abrirlo.
No tenía ni idea de esa manera de tx el estado de los puertos (que burro soy)
Mañana me dedico a estudiar toooodos mis errores.
Y a aprender como se hace correctamente.

Como siempre los comentarios de linea son excelentes y con absoluto sentido didáctico.
De nuevo Infinitas Gracias .

Un Cordial Saludo desde el otro lado del charco.


----------



## carlitosferar

Hola:
Por temas ajenos no lo puedo armar hasta dentro de 15 dias, y no me parece correcto dejar pasar tanto tiempo para dar parte:
　
1*_ Agradecimiento: Jamás hubiese encontrado el error sin la ayuda de D@rkbytes 
(Programa + Simulación) Dado que el error estaba precisamente en la simulación. 
Y lo expongo, por si alguien como yo, va a pelo por internet, sin maestro, profesor , 
colega, conocido o pariente…....y quiere hacer dos Tx simultaneas, es probable: Que le 
pase lo mismo:
No es suficiente determinar y especificar la segunda Tx en el programa, tambien hay 
que hacerlo en la simulación; allí estaba la madre del borrego y por eso entraban 
en conflicto. (Casulamente se ve en las imagenes que había puesto anteriormente).

2*_ Ahora trabajando sobre el poy. de D@rkbytes.

a*_ Falla siempre la primera Tx al slave (Solo la primera). He probado mandar algo 
antes o después del inicio, he mandado 0s, 1nos, el puerto b completo pero las 
ignora. He cambiado las pausas y darle mas tiempo al slave pero todavía no logro 
solucionarlo. Por eso quería armarlo no sea que fuese también problema de 
simulación.

b*_ No me permite cambiar ni la oscilación del xtal , ni la velocidad de Tx . 
Directamente deja de funcionar, como si tuviese _copyright _ . He leído que 10 MHz 
es lo recomendable para Tx RF, pero era solo para ejercitar.

Bueno, he recuperado las ganas que ya es mucho, en cuanto lo arme comento, 
será lo primero después de un buen tiempo en huelga de soldadores caídos.

Un Saludo y Muchas Gracias.


----------



## D@rkbytes

Saludos nuevamente carlitosferar.


carlitosferar dijo:


> 1*_ Agradecimiento: Jamás hubiese encontrado el error sin la ayuda de D@rkbytes
> (Programa + Simulación) Dado que el error estaba precisamente en la simulación.
> Y lo expongo, por si alguien como yo, va a pelo por internet, sin maestro, profesor ,
> colega, conocido o pariente…....y quiere hacer dos Tx simultaneas, es probable: Que le
> pase lo mismo


Pues de nada, que bueno que te sirvió el proyecto.
Hay veces que un programa no funciona debido a errores de hardware por mal diseño.


carlitosferar dijo:


> 2*_ Ahora trabajando sobre el poy. de D@rkbytes.
> 
> a*_ Falla siempre la primera Tx al slave (Solo la primera). He probado mandar algo
> antes o después del inicio, he mandado 0s, 1nos, el puerto b completo pero las
> ignora. He cambiado las pausas y darle mas tiempo al slave pero todavía no logro
> solucionarlo. Por eso quería armarlo no sea que fuese también problema de simulación.


Esta causa tampoco la pude solucionar, intente de varias formas pero no se dejó.
Lo que si noté es que a veces al iniciar el programa, funciona normalmente y otras no.
Y si, el primer envío de datos es el que no es bien reconocido o simplemente no lo acepta.
Lo bueno es que solamente es el primero, los consecutivos no tuvieron problemas.


carlitosferar dijo:


> b*_ No me permite cambiar ni la oscilación del xtal , ni la velocidad de Tx .
> Directamente deja de funcionar, como si tuviese _copyright _ . He leído que 10 MHz
> es lo recomendable para Tx RF, pero era solo para ejercitar.


Pues no tiene copyright... Por el momento.  "No lo tendrá, es un aporte para F.D.E"
Si se puede cambiar tanto la selección de oscilador como la velocidad de Tx/Rx
Algo debes de estar haciendo mal en la programación.
O tienes que verificar que en la interfaz también hayas actualizado los parámetros.
Puedes trabajar con el oscilador interno del 16F628A a 4MHz, pero recomendable solo a 2400 bps.


carlitosferar dijo:


> Bueno, he recuperado las ganas que ya es mucho, en cuanto lo arme comento,
> será lo primero después de un buen tiempo en huelga de soldadores caídos.
> 
> Un Saludo y Muchas Gracias.


OK. Esperamos los resultados, esperando que todo funcione bien y logres corregir errores.

Suerte y hasta luego.


----------



## D@rkbytes

Saludos.
Después de algún tiempo de esperar a que surtieran el sensor DS18B20 por fin lo conseguí. 
Implemente un sistema sencillo de prueba, con un LCD 16x2 y transmisión de datos via puerto serie.
El PIC que utilice fue un 16F628A configurado con oscilador interno (4MHz), 
y un solo transistor BC548 para la adaptación de niveles RS232 del puerto serie.

El programa está escrito en PICBasic Pro y simulado en Proteus.
La interfaz para leer los datos en la PC está escrito en VB6, y es similar a la usada para el LM35

Características:
.- La transmisión de datos se realiza mediante el módulo USART del PIC a 9600bps.
.- El sistema es muy estable y con una granularidad de .5°
.- El programa también puede leer la temperatura negativa.
.- La temperatura es mostrada en grados centígrados en un LCD 16x2 (Use un JHD 162A)
.- La temperatura en mostrada en grados centígrados y grados Fahrenheit en la interfaz.
.- Cuenta con aviso de desconexión del sensor (Solo por LCD)

El sistema es una base piloto que puede servir para otros proyectos.
Y solo se implementaron los comandos básicos de inicialización y conversión de temperatura.
Incluyo los programas, esquema y simulación.

Espero sea de utilidad.

Suerte y hasta luego.


----------



## Meta

Hacerlo en ASM es cosas de pegarte media vida, pero lo haces. En cuando al a programar PBP, por qué ese lenguaje si el C es ESTANDAR y puedes meterte con más microcntroladores diferentes casi sin problemas como AVR, FreeScale, Rabbit, PIC, ARM, etc?

Por cierto, buen trabajo.


----------



## D@rkbytes

Meta dijo:


> Hacerlo en ASM es cosas de pegarte media vida, pero lo haces. En cuando al a programar PBP, por qué ese lenguaje si el C es ESTANDAR y puedes meterte con más microcntroladores diferentes casi sin problemas como AVR, FreeScale, Rabbit, PIC, ARM, etc?
> 
> Por cierto, buen trabajo.


Gracias Meta.
Así es, hacerlo en ensamblador se llevaría mucho tiempo y varias librerías.
Hacerlo en C, de todos modos es hacerlo en lenguaje de alto nivel. Y solo tengo PICs. 

Como ya tenia la base para PBP, pues solo me dedique a realizar las adaptaciones para el DS18B20
Que por cierto, es diferente al DS18S20. (Yo pensé que eran iguales, pero no.)
También lo empecé a escribir en C, pero hace tiempo tuve problemas con la librería LCD.C,
y deje el programa sin terminar. Ahora ya tengo ese caso resuelto,
y me daré un tiempo para retomar el programa.

Hasta luego.


----------



## Meta

Entendido.
Tengo el DS1820. Algo recuerdo que entre uno y otro varía los tiempos, es decir, lo que tarda en leer la temperatura.

Saludo.


----------



## D@rkbytes

Meta dijo:


> Entendido.
> Tengo el DS1820. Algo recuerdo que entre uno y otro varía los tiempos, es decir, lo que tarda en leer la temperatura.
> 
> Saludo.


Me parece que los tiempos de lectura son los mismos.
Lo que cambia es la forma de leer los bits, ya que tienen diferente resolución.
Aquí el enlace con la información de las diferencias. Differences Between the Two Devices
Busque información del DS1820 y me aparece en la hoja de datos, que es igual al DS18S20.

Me pasó que al leer el DS18B20 a una temperatura de 27°C, me marcaba 216°C 
Para resolver eso, dividí el resultado entre 8 y asunto arreglado. 
Así qué el programa puede funcionar para los dos sensores, haciendo ese cambio.

Con respecto al programa en C, ya lo termine.
Utilice una librería GNU que ya hace todo el proceso de lectura y escritura 1-Wire
También use una librería para el LCD que esta diseñada para trabajar con LCD 16x4 Flex_LCD416
pero funciona sobre LCD 16x2 de manera muy eficaz y es fácilmente modificable.

Adjunto el proyecto completo en PICC para PCWHD de CCS

Saludos.


----------



## carlitosferar

Hola: Ha pasado tanto tiempo que esto va a quedar como off-topic.
  Solo comentar que no escribí antes, no por descortés si no por bruto, ya que me fue imposible hacer funcionar los módulos RF.  El máster funciona a la perfección  pero “ Il figlio e morto”.
  En cuanto logre algún resultado comento.
  Un Saludo.


----------



## D@rkbytes

Saludos nuevamente carlitosferar


carlitosferar dijo:


> Ha pasado tanto tiempo que esto va a quedar como off-topic.


Seguimos dentro del tema, no te preocupes.


carlitosferar dijo:


> Solo comentar  que no escribí antes,
> no por descortés si no por bruto, ya que me fue  imposible hacer funcionar los módulos RF.


  


carlitosferar dijo:


> El máster funciona a la  perfección  pero “ Il figlio e morto”.


Posiblemente algo estas pasando por alto. Espero pronto des con la falla.


carlitosferar dijo:


> En cuanto logre algún resultado comento.
> Un Saludo.


OK. Por lo que veo ya llevas bastante avanzado el proyecto.

Te deseo suerte.


----------



## carlitosferar

Gracias D@rk. Siempre al pie del cañón.
Un cordial Saludo


----------



## carlitosferar

3 meses para prender un led, buen promedio NO?, voy como una moto.

 He logrado que el bello durmiente abra los ojos. Trataré de contar mi experiencia en forma rápida.
 1er pregunta: Por qué demonios no lograba comunicación entre pics, ni siquiera cableado????? Respuesta: La velocidad. Primer despertar del led  al bajar la velocidad a 1200 baudios. Solo entre pics ...No con en el PC.(Estoy trabajando con Osc 10MHz).
 2da pregunta y gran descubrimiento: Volviendo a estudiar y montar la comunicación pic a pic, ratifico que los módulos funcionan y los circuitos también. Pongo los dos programas en pantalla para compararlos y aparece la gran diferencia. El la comunicación pic-pic solo se tx el estado de un bit y en el otro (motivo de toda esta historia) pretendíamos mandar el puerto B en su totalidad. Por lo tanto  concluyo : Estos modulitos no son capaces de tx tanta información y mucho menos de forma segura. (son para llaveros que uno los pude gatillar 100 veces hasta que emiten la señal deseada.
 Bien; a menos velocidad,y transmitiendo un solo bit logré comunicación RF y Distancia.
 Pero los resultados eran erráticos y nada fiables. Y lo mas grave: Un solo bit.
 Otro gran problema es que en la simulación todo funciona pero en la práctica (en este caso en particular) NADA funcionaba. 

 Bien como con esto llevo meses , solo comento lo mas anegdótico. 

 He aprovechando también otro aporte tuyo https://www.forosdeelectronica.com/f26/tutorial-microcode-studio-pro-usarlo-62636/#post559677

 Y lamento Dark pero para que este bicho funcione con mis modestísimos conocimiento, he transformado tu bella “Sirenita” de 2 lineas en un “Portero de discoteca” . Que ademas de largo (Para lo que hace) es L E N T I I I C I M O. [/SIZE]
  Pero es verdaderamente fiable, ya que el objetivo final (quien sabe cuando) será usarlo vía Internet. Probado en casa, unos 10 metros y efectividad del 100%.
 Dejo una foto durante las pruebas con las placas "Cableadas" se ven los módulos RF desconectados. La proto con la prueba pic a pic se colo en la foto.
 Un Gran Saludo y mil gracias por la invalorable ayuda. Ah gracias también por recomendarme MicroCode  lejos mejor que MPL.   Seguiré informando avances (Si los hay).


----------



## jmanuelxd

hola D@rkbytes.

*Qu*isiera q*ue* me ayudara con un tema de como recepcionar una trama enviada desde un terminal de pesaje (balanza), en el hiperterminal me entrega esta trama 
	

	
	
		
		

		
			




y estos otros datos son en hexadecimal , decimal, 





espero  de su ayuda gracias.


----------



## D@rkbytes

jmanuelxd dijo:


> hola D@rkbytes.
> 
> *Qu*isiera q*ue* me ayudara con un tema de como recepcionar una trama enviada desde un terminal de pesaje (balanza), en el hiperterminal me entrega esta trama http://plus.google.com/photos/113100426515887601309/albums/5788057146377535825
> y estos otros datos son en hexadecimal , decimal,
> https://plus.google.com/photos/113100426515887601309/albums/5788057035467711489
> 
> espero  de su ayuda gracias.


¿Tendrás algún ejemplo? Ya que los enlaces que pones me dirigen a iniciar sesión en Google
y no se puede ver ninguna foto.

PD. Adjunta tu proyecto aquí mismo en el foro, para poderlo ver.

Saludos.


----------



## carlitosferar

Hola: Gracias por los cumplidos.
Dejo unas fotos (Ya va tomando forma)
Saludos.

Pd1: En el espacio que queda iran 4 relay .
PD2: El miseria no quiso ni cortarle los cables a los trafos.


----------



## jmanuelxd

hola D@rkbytes

Acá te adjunto las imágenes de lo *que* estoy tratando de recepcionar los datos *que* me entrega la balanza

gracias manuel.


----------



## D@rkbytes

jmanuelxd dijo:


> hola D@rkbytes
> 
> Acá te adjunto las imágenes de lo *que* estoy tratando de recepcionar los datos *que* me entrega la balanza
> 
> gracias manuel.


A ver si es esto más o menos lo que estas buscando.
Supongamos que la trama de la balanza es como esto: @-0  36786  0000
Entonces utilizamos esta instrucción...

*HSERIN 1000,MainProgram,[Skip 5,STR Datos\5]*
; Si en 1 segundo (1000mS) no se reciben datos, regresa a la etiqueta MainProgram
; Salta 5 caracteres y recibe los siguientes 5, que los almacena dentro de una matriz de 5 datos.

El problema con este algoritmo, es que siempre tiene que haber 5 caracteres,
después de saltar los primeros 5. De otra forma, no son tomados en cuenta.
Pero como veo que después del peso, siguen otros más "Los espacios cuentan", puede funcionar.

Y para mostrar el resultado, haces por ejemplo...
*LCDOUT $FE,$1,"Peso:"
LCDOUT $FE,$C0,Datos[0],Datos[1],Datos[2],Datos[3],Datos[4],"Kg."*

Al hacer uso de este método, se logra lo que se ve en la imagen adjunta.

Espero que esto sea lo que estas buscando.
Haz tu programa, y en lo que tengas duda, consultas.

Suerte.


----------



## jmanuelxd

con el programa  que estoy editando es en pic simulator ide y en la sintaxis tengo el problema.
he editado en pic simulator ide lo siguiente:



		Código:
	

AllDigital
TRISC = 0
Dim data As Word
Dim space As Word
Dim dec As Word
Dim unid As Word
Dim dot As Word
Dim milsm As Word
Dim centsm As Word
Dim decm As Word

loop:
Serin RC7, 9600, data          'leo el 1 dato y lo guerdo en el registro data
    If data = 0x6b Then     'pregunto por el 1 dato leido 'k'
WaitMs 10                          'espero los 10
WaitUs 400                          'datos que son esos espaciops leidos
Endif

Serin RC7, 9600, space          'vuelvo a leer el 11 dato
    If space = 0x20 Then            'pregunto por el espacio q esta delant del valor del peso
Serin RC7, 9600, dec              'si leo el espacio, lee la decena del valor del peso
Serin RC7, 9600, unid      'leo la unid y la guardo
Serin RC7, 9600, dot       '  .
Serin RC7, 9600, milsm0   '  .
Serin RC7, 9600, centsm  '  .
Serin RC7, 9600, decm     'leo la decima y lo guardo
Endif

Goto loop

End


----------



## D@rkbytes

jmanuelxd dijo:


> con el programa  que estoy editando es en pic simulator ide y en la sintaxis tengo el problema.


Saludos.
Me parece que hacerlo con el PIC Simulator IDE va a resultar algo complejo de lograrlo.
Te recomiendo que uses PICBasic Pro o Proton que tienen un set más amplio de instrucciones.

Adjunto el programa en PBP que realice para mostrar el ejemplo que cite anteriormente.

Suerte.


----------



## willyfv

@d-rkbytes
Saludos, gracias por el gran aporte que has hecho, tengo varias duda:
* es posible trabajar el asm del primer ejemplo que has colocado a 8 mhz
* los datos enviados en formato hexadecimal desde visual basic lo puedo grabar en una eeprom 24lc256(son aproximadente 1200 datos) como puedo hacer que esos datos en hexadecimal se graben en la eeprom


----------



## D@rkbytes

Saludos willyfv


willyfv dijo:


> Saludos, gracias por el gran aporte que has hecho


De nada. Espero que te sea de utilidad. 


willyfv dijo:


> tengo varias dudas:
> * ¿es posible trabajar el asm del primer ejemplo que has colocado a 8 mhz?


En ese ejemplo se uso un PIC16F628A usando el oscilador interno a 4MHz, que es su frecuencia de trabajo.
Nota que se usaron los pines predeterminados del oscilador como salidas.

Para trabajar el mismo ejemplo a 8MHz. Tendrías que cambiar el PIC por un PIC16F88
Solo que cambia la configuración de pines.
Este PIC si puede trabajar con oscilador interno a 8MHz ó puedes utilizar otro PIC.
También tienes que hacer cambios en la configuración del registro SPBRG cambiando...
*movlw    0x19*    ; 9600bps a 4MHz.
*movwf    SPBRG*
Por...
*movlw    0x33*    ; 9600bps a 8MHz.
*movwf * *SPBRG*
Y modificar la rutina de retardo de 100Ms. Que esta calculada para funcionar a 4MHz. Para que funcione a 8MHz.
Para la configuración de los registros del módulo USART puedes usar el programa SPBRG Calculator



willyfv dijo:


> * ¿los datos enviados en formato hexadecimal desde visual basic lo puedo  grabar en una eeprom 24lc256?


Los números no son enviados al PIC en formato hexadecimal sino en formato ASCII
Si yo le quiero mandar el número 128 al PIC, lo que se le debe mandar es el caracter *€*
Ó Para enviarle el número 255, lo que se le manda es el caracter *ÿ*


willyfv dijo:


> ¿como puedo  hacer que esos datos en hexadecimal se graben en la eeprom?


Para eso necesitas establecer comunicación con la EEPROM 24LC256 utilizando el protocolo* I²C
*Esto ya se sale del tema, pero ejemplos para trabajar con PIC y memorias EEPROM I²C hay muchos. 

 Espero te sirva la información.

Suerte.


----------



## willyfv

gracias por tu respuestas


la idea es usar el mismo 16f628a ya que tengo varios disponible

*******************
*movlw    0x19*    ; 9600bps a 4MHz.
*movwf    SPBRG* 
Por...
*movlw    0x33*     ; 9600bps a 8MHz.
*movwf *  *SPBRG*

aclarado,gracias

**************


Los  números no son enviados al PIC en formato hexadecimal sino en formato  ASCII Si yo le quiero mandar el número 128 al PIC, lo que se le debe  mandar es el caracter *€* Ó Para enviarle el número 255, lo que se le manda es el caracter *ÿ*

ya esta parte de aqui ya la domine

***************

para la eeprom ya estoy estudiando

*******



gracias por aclararme las dudas


----------



## oscarintintin

un saludo a todos, tengo un problema, ojala alguien me pueda ayudar. recién estoy aprendiendo a utilizar el puerto serial, tal vez me salga un poco del tema por que estoy usando CCS. mi problema es al momento de simular en proteus y el hyperterminal (eh usado  Virtual Serial Port Driver), al momento de darle play a la simulación me sale el pantallazo azul y se reinicia. les dejo el archivo, y gracias de antemano por ayuda. me base en esta ejemplo http://robotypic.blogspot.com/2010/09/control-de-un-pic-desde-el-pc-por-el.html


----------



## D@rkbytes

oscarintintin dijo:


> un saludo a todos, tengo un problema, ojala alguien me pueda ayudar. recién estoy aprendiendo a utilizar el puerto serial, tal vez me salga un poco del tema por que estoy usando CCS. mi problema es al momento de simular en proteus y el hyperterminal (eh usado  Virtual Serial Port Driver), al momento de darle play a la simulación me sale el pantallazo azul y se reinicia. les dejo el archivo, y gracias de antemano por ayuda. me base en esta ejemplo http://robotypic.blogspot.com/2010/09/control-de-un-pic-desde-el-pc-por-el.html


Saludos.
Revise tu programa y no encontré problemas, solo lo adapte un poco para probarlo con la interfaz que diseñe.
También lo probe con el HyperTerminal, y funciono bien.
El único detalle que encontré, fue en el diseño de la simulación.
En el programa estableces una velocidad de reloj de 20MHz. Pero al PIC de la simulación lo dejaste en 1MHz.
También agregue unos Switch's y cambie el puerto del COMPIM al puerto COM2,
para utilizar el puerto virtual COM3 en las pruebas con la interfaz y el HyperTerminal.

Así que no sé a que se deba lo del pantallazo azul que mencionas. A mi me funciono sin problemas.
No mencionas que es lo que se reinicia, me supongo ha de ser tu computadora.

Adjunto los gráficos durante las pruebas y el programa con las modificaciones como lo adapte.
Para visualizar la información con el HT, solo es cuestión de acomodar espacios entre palabras.

PD. Dentro de la carpeta se encuentra el archivo *.HT de la prueba con el HyperTerminal.

Suerte.


----------



## digito

oscarintintin dijo:


> un saludo a todos, tengo un problema, ojala  alguien me pueda ayudar. recién estoy aprendiendo a utilizar el puerto  serial, tal vez me salga un poco del tema por que estoy usando CCS. mi  problema es al momento de simular en proteus y el hyperterminal (eh  usado  Virtual Serial Port Driver), al momento de darle play a la  simulación me sale el pantallazo azul y se reinicia. les dejo el  archivo, y gracias de antemano por ayuda. me base en esta ejemplo http://robotypic.blogspot.com/2010/09/control-de-un-pic-desde-el-pc-por-el.html


Hola he comprobado todo y funciona perfectamente, la pregunta es que Versiòn de Proteus utilizas para
tus pruebas ?


----------



## oscarintintin

utilizo la versión 7.7 SP2 de proteus.He probado ahora en una maquina virtual XP, pensando que el error podría ser que tengo windows 7 de 64 bits, y al igual que en la maquina normal me bota el pantallaso azul y se reinicia el equipo. gracias por su colaboracion.


----------



## digito

Entonces los problemas pueden ser DOS(2), esto sucede cuando se generan los puertos virtuales con ELTIMA los cuales uno de los puerto virtual ocupa la misma direcciòn de un puerto fisico real (verificar en la gestiòn de dispositivo), y la otra sì el sistema operativo que deberìa ser a 32bit no totalmente compatible con Proteus 7.7 sp2 (la versiòn de este ultimo es correcta).   


          *** Atenciòn con Virus *** Muchos Saludos y espero che la informaciòn te sirva.



Aquì està un ejemplo de conflicto de puerto Serial "COM"


----------



## oscarintintin

Sigo sin poder solucionar el problema, lo que me indico Digito, no están ocupando la misma dirección (imagen error1).
El error que me arroja el pantallazo azul es  : ATTEMPTED_SWITCH_FROM_DPC USBPORT.SYS les dejo la foto de la pantalla azul tal vez puedan brindarme una mano. Gracias¡


----------



## digito

Hola, tenès una periferica USB (MODEM) instalada que te da ese problema, en general ese tipo de problema aparecìa en XP SP1, sin embargo es incompatible con el sistema operativo que tenes.

Consejo: Si podes instalar un S.O. a 32Bit mejor (no hay muchos driver todavia compatibles a 64Bit),
Actualizar los Driver Chipset de la placa madre... !!! Atenciòn a la periferica USB utilizada y su Driver (sobre todo Modem). Muchos Saludos, tenemos Horarios diferentes (almeno 4 o 5 Horas adelante aquì).

                                   BUONA FORTUNA


----------



## oscarintintin

solo para informales, eh instalado otro SO (XP sp3), dicho sea de paso a dado algunos problemillas en la instalacion debido a que mi disco es sata. Resultados, los mismos pantallaso azul, tal vez el error este al momento de crear los puertos virtuales o sera el proteus(7.7)?

​Listo, la falla era el virtual serial port drive7, eh utilizado virtual  serial port drive 6 para XP y funciona correctamente, la 6.9 debe  funcionar en win7-64bits, pero no lo eh podido probar ya que se me  vencio el tiempo del demo; pero e utilizado Advanced virtual com port wn  win7-64bits y todo okey. gracias por su colaboracion


----------



## digito

Hasta la Proxima y muchas suerte, un gracias a D@rkbytes y a toda esta gran Comunidad.


----------



## luis30

Buenas tardes, tengo una consulta que hacerles, estoy modificando el programa para crear una interfaces de comunicación con el PIC en VB6, omití mucha parte del código solo me quede con el menú de conexiones del los puertos COM, el menú del conector DB9 el acerca de y el Ontop (casi todo jaja), bueno lo que quiero hacer es monitorear 12 datos constantes que son enviados por un PIC 16f887 provenientes de sus puertos ADC, los cuales ocultaran unas imagenes dependiendo si el rango sobrepasa al establecido. aca pongo imagenes para ver si se entiende mejor el problema !

Este es mi codigo.



		PHP:
	

#include <16F887.h>
#device *=16                    // Mejora el uso de memoria ROM
#Fuses XT, NOWDT
//#device ADC=10
#Use Delay(Clock=4 000 000)
#include <lcd.c>
#Use rs232(baud=9600, xmit=pin_c0, rcv=pin_c1)
#byte puerto_b = 06

char  espacio=13;
long dato[12]={0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00};
int i=0;

void main(){

   delay_ms(200);

  while(i<12){
       setup_ADC_ports( ALL_ANALOG );   ///Todos los puertos analogos a0-e2
       setup_ADC(ADC_Clock_Div_32);  ///Configuras la velocidad de muestreo
       
       set_adc_channel(i);   //lee canal 1
       delay_ms(10);
       dato[i]=read_ADC();      
       delay_ms(20);
       printf("%x %c ",dato[i],espacio);
       delay_ms(50);
       i++;
if(i>=12){
i=0;
}
}
}








lo que quiero hacer hacer algo asi.

led=com.input

if led >= 0xE1 then
img_r_01.visible = false
img_v_01.visible = true
else if led <= 05 then
img_r_01.visible = true
img_v_01.visible = false
end if

pero asignarle una variable a cada dato leido por el puerto rs232 el problema es que no entiendo mucho de vb6 ni del manejo de este, estoy leyendo acerca del manejo de eventos para este puerto pero no e logrado nada.

de antemano gracias por su ayuda.


----------



## D@rkbytes

Saludos luis30.
Mira si el ejemplo que adjunto es más o menos lo que quieres hacer.
Si no es así, será necesario que adjuntes tu proyecto completo y nos expliques mejor que es lo que realmente deseas hacer.

Suerte.


----------



## luis30

Gracias por tu ayuda !, bueno no es exactamente lo que busco, pero mira ya avance algo el proyecto batalle mucho para lograrlo pero ya tengo mas o menos la idea de como funciona el puerto ahora lo que quiero hacer es reducir esto:



		PHP:
	

If (sNum = "+") Then
 img_v_0.Visible = False
 img_r_0.Visible = True
 End If

 If (sNum = "-") Then
 img_r_0.Visible = True
 img_v_0.Visible = False
 End If

 If (sNum = "=") Then
 img_r_0.Visible = False
 img_v_0.Visible = True
 End If

If (sNum1 = "+") Then
 img_v_1.Visible = False
 img_r_1.Visible = True
 End If

 If (sNum1 = "-") Then
 img_r_1.Visible = True
 img_v_1.Visible = False
 End If

 If (sNum1 = "=") Then
 img_r_1.Visible = False
 img_v_1.Visible = True
 End If


a algo como esto:


		PHP:
	

For i = 0 To 11
If (sNum[i] = "+") Then
 img_v_ [i].Visible = False
 img_r_ [i].Visible = True
 End If

 If (sNum[i] = "-") Then
 img_r_ [i].Visible = True
 img_v_ [i].Visible = False
 End If

 If (sNum[i] = "=") Then
 img_r_ [i].Visible = False
 img_v_ [i].Visible = True
 End If
 
Next i


pero no funciona creo que mi lógica no es la correcta :/!, tratare de subir el proyecto, lo que pasa es que no tengo mi pc y me meto al foro desde el trabajo pero así resolví el problema bueno resolví a medias.



		PHP:
	

Private Sub Prueba(com As MSComm)
Dim a As Long
Dim BufferIn As String
Dim sNum1, sNum3, sNum5, sNum7, sNum9, sNum11, sNum13 As String
Dim sNum, sNum2, sNum4, sNum6, sNum8, sNum10, sNum12, conv As String
Dim Rc As String
Dim i As Byte


i = 0
Rc = Chr(13)
a = com.InBufferCount
BufferIn = com.Input

sNum = Mid(BufferIn, 1, 1)
sNum1 = Mid(BufferIn, 2, 1)
sNum2 = Mid(BufferIn, 3, 1)
sNum3 = Mid(BufferIn, 4, 1)
sNum4 = Mid(BufferIn, 5, 1)
sNum5 = Mid(BufferIn, 6, 1)
sNum6 = Mid(BufferIn, 7, 1)
sNum7 = Mid(BufferIn, 8, 1)
sNum8 = Mid(BufferIn, 9, 1)
sNum9 = Mid(BufferIn, 10, 1)
sNum10 = Mid(BufferIn, 11, 1)
sNum11 = Mid(BufferIn, 12, 1)
'sNum12 = Mid(BufferIn, 13, 1)
'sNum13 = Mid(BufferIn, 14, 1)
conv = Mid(BufferIn, 1, 12)

If (conv = "============") Then
img_v_0.Visible = True
img_v_1.Visible = True
img_v_2.Visible = True
img_v_3.Visible = True
img_v_4.Visible = True
img_v_5.Visible = True
img_v_6.Visible = True
img_v_7.Visible = True
img_v_8.Visible = True
img_v_9.Visible = True
img_v_10.Visible = True
img_v_11.Visible = True
End If

'Esto es lo que quiero resolver o acortar 
For i = 0 To 11
 If (sNum = "+") Then
 img_v_ [i].Visible = False
 img_r_ [i].Visible = True
 End If

 If (sNum = "-") Then
 img_r_ [i].Visible = True
 img_v_ [i].Visible = False
 End If

 If (sNum = "=") Then
 img_r_ [i].Visible = False
 img_v_ [i].Visible = True
 End If
 
Next i


Espero que se entienda mejor con el código y gracias de antemano


----------



## D@rkbytes

Yo optaría por usar un *Select Case* como lo hice en el ejemplo del _post #64_.
Se me ocurre que es más fácil hacerlo de esa forma, y no comprendo para que usas un bucle.
Espero que cuando subas tu proyecto nos expliques bien que es lo que quieres hacer.

Saludos.


----------



## oFRGOo

Hola y gracias a todos por los aportes y versiones que suben, yo tengo una duda que capas me puedan ayudar sobre la comunicación serial entre pic, en el archivo que les envió esta un pic enviando datos por todo un puerto, ¿se podría habilitar mas de un puerto de entrada para que me reciba mas que un puerto de salida?


----------



## D@rkbytes

oFRGOo dijo:


> ¿se podría habilitar mas de un puerto de entrada para que me reciba mas que un puerto de salida?


Busca en la ayuda de CCS sobre los parámetros de #USE RS232 (*options*)
Verás que existe un elemento llamado STREAM al cual se le dá un identificador para el puerto RS-232.
De esa forma puedes tener varios pines de entrada y salida serial por software.

Saludos.


----------



## oFRGOo

Ok gracias, D@rkbytes ahora lo busco..a ver como me va.


----------



## luis30

oFRGOo dijo:


> Hola y gracias a todos por los aportes y versiones que suben, yo tengo una duda que capas me puedan ayudar sobre la comunicación serial entre pic, en el archivo que les envió esta un pic enviando datos por todo un puerto, ¿se podría habilitar mas de un puerto de entrada para que me reciba mas que un puerto de salida?



Hola mira lo puedes manejar asi..

#use rs232(baud=9600, xmit=PIN_B1,rcv=PIN_B2, stream=CANAL1)
#use rs232(baud=9600, xmit=PIN_A2,rcv=PIN_A3, stream=CANAL2)
#use rs232(baud=9600, xmit=PIN_C6,rcv=PIN_C7, stream=CANAL3)

fprintf(CANAL2,"Hola mundo"); 

Oviando que puedes imprimir por cualquiera de los canales seleccionados cambiando al canal que quieras, espero te sirva !.

D@rkbytes perdón por no contestar no había podido entrar y pues sigo en ratos con este proyecto, mira te adjunto mis avances para ver si me puedes tirar una mano, el problema que tengo es que manejo 13 datos, el puerto mscomm se activa hasta que los 13 datos son recibidos pero mi programa manda datos cada 50ms es decir que 50x12ms es el tiempo que tarda entre ciclo y ciclo por lo cual en ocasiones el programa me da lecturas erróneas al no saber como manejar la recepción de datos correctamente :/! e intentado de varias formas pero la que mejor me a funcionado es esta aun que lleva un poco de retrasos al tiempo real de medida me funciona 3 mediciones de 5, y en ocasiones el PIC no acepta la instrucción enviada.

Espero le puedas echar un vistazo !! gracias!!


----------



## D@rkbytes

luis30 dijo:


> el problema que tengo es que manejo 13 datos, el puerto mscomm se activa hasta que los 13 datos son recibidos pero mi programa manda datos cada 50ms es decir que 50x12ms es el tiempo que tarda entre ciclo y ciclo por lo cual en ocasiones el programa me da lecturas erróneas al no saber como manejar la recepción de datos correctamente :/! e intentado de varias formas pero la que mejor me a funcionado es está, aunque lleva un poco de retrasos al tiempo real de medida me funciona 3 mediciones de 5, y en ocasiones el PIC no acepta la instrucción enviada.


Prueba cambiando la frecuencia de trabajo del microcontrolador, por ejemplo con los 8MHz del oscilador interno y si puedes utilizar un cristal de 20MHz también puedes aumentar la velocidad de transmisión.
Con 4MHz en ocasiones no es apto para trabajar a 9600bps y suelen enviarse datos erróneos.



luis30 dijo:


> Espero le puedas echar un vistazo


Revisé tus programas para el PIC, pero como carecen de comentarios en la mayor parte de las rutinas, es muy difícil saber que es lo que hacen.
Tampoco se sabe de que se trata tu proyecto ni que es lo que quieres hacer.

Saludos.


----------



## luis30

D@rkbytes dijo:


> Prueba cambiando la frecuencia de trabajo del microcontrolador, por ejemplo con los 8MHz del oscilador interno y si puedes utilizar un cristal de 20MHz también puedes aumentar la velocidad de transmisión.
> Con 4MHz en ocasiones no es apto para trabajar a 9600bps y suelen enviarse datos erróneos.



Con la velocidad te refieres al cristal o los baudios? supongo que a ambos, lo que pasa es que utilice al principio 4mhz externos y hacia lo mismo, después use los 8mhz internos y sigue igual probare con uno de 13.5mhz que tengo y cambiando los baudios como dices !.




> Revisé tus programas para el PIC, pero como carecen de comentarios en la mayor parte de las rutinas, es muy difícil saber que es lo que hacen.
> Tampoco se sabe de que se trata tu proyecto ni que es lo que quieres hacer.
> 
> Saludos.



lo siento no acostumbro comentar mis códigos :/!, bueno el propósito es que trabajo con unidades de recepción de cable (Vídeo HD y Análogo),y en muchos casos traen el conector o circuiteria del cable HDMI dañados y pues lo que trato de hacer es un tester que verifique las lecturas de las cargas de este circuito aplicando 5v al chasis mandando hacia la circuiteria interna del receptor este valor y obteniendo sus cargas diagnosticarla, por medio de LEDS si fallo o si paso, Este circuito lo e probado y funciona sin la interfaz en VB6. pero no encontré otra forma de mandarle los datos al VB6 para proyectar lo en los LEDS, lo que trato de hacer es configurar 13 puertos análogos del pic para después compararlo con una variable o voltaje de referencia ya establecidos que serian set y setb en el programa que pongo lo demás solo son las comparaciones y el resultado lo mando con un printf si el dato pasa pongo = y si es inferior - y si se pasa +, lo interpreto con VB6 con IF cuando llegan 13 datos el evento salta y de ahí saco con mid el calor dependiendo de la posición de cada carácter para ocultar y mostrar las imágenes. creo que eso es , espero se entienda mejor.

Saludos y Gracias!.

PD: ya lo pude solucionar, al parecer ! el problema era mi codigo en CCS :/!,


----------



## elchessjera

hola buen dia soy nuevo en el foro y en esto de la programacion lo que pasa es que estoy estudiando mecatronica y me encargaron desarrollar un proyecto de unas alarmas pero el problema que tengo es que no se como mandar una instruccion para que yo al presionar un boton en mi circuito me prenda un led en visual basic estoy utilizando css ojala y me puedan orientar anexo mis avances gracias.


----------



## D@rkbytes

elchessjera dijo:


> el problema que tengo es que no se como mandar una instrucción para que yo al presionar un botón en mi circuito me prenda un led en visual basic estoy utilizando css


Con las modificaciones que realicé a tus programas ya se pueden encender y apagar 4 LED's en la interfaz.

Ejemplo:
Se activa el sensor del pin RB2 y se enciende el LED Azul en la interfaz, si se desactiva se apaga.
Se activa el sensor del pin RB3 y se enciende el LED Verde en la interfaz, si se desactiva se apaga.
Y así mismo con los otros dos sensores.

No modifiqué los programas para hacer que se enciendan LEDS's en el microcontrolador.
Eso creo que lo puedes realizar fácilmente, pero pienso que deberías hacer las funciones por separado.
Es decir, poner indicadores para los sensores y otros para los pines que quieras activar.

También lo puedes hacer de la forma como está en los programas que he subido de la interfaz.

Suerte.


----------



## elchessjera

muchisimas gracias D@rkbytes por tu respuesta esta super genial me puse a revisar el codigo de visual y hay mucha funciones que no conocia te lo agradesco muchisimo en cuanto termine con este proyecto prometo subirlo para que otras personas en esta misma situacion puedan aprovecharlo y otra vez gracias


----------



## luis30

Hola D@rkbytes una pregunta, como puedo hacer que reciba esto:



		PHP:
	

Select Case szData
   Case Is = "1"
    szData = RS232.Input
    LED = Asc(szData)
    txtRX.Text = LED
    
    Select Case LED
    Case Is >= 225
        Image1.Visible = False
        Image2.Visible = True
    Case Is <= 213
        Image1.Visible = True
        Image2.Visible = False
    End Select
    
End Select


Marca un error, quiero recibir una cadena de texto algo así:



		PHP:
	

   while(true){
       set_adc_channel(i);   //lee canal con valor de I
       delay_ms(20);
       dato[i]=read_ADC();   //guarda el valor en la variable la cuenta I
       delay_ms(20);
         printf("%d" i);    //imprime el valor de I
         delay_ms(1000);
         printf("%c" dato[i]); // imprime el valor del adc para I en la cuenta
         delay_ms(1000);
            i++;
         delay_ms(200);
         if (i>=12){
         printf("%c" espacio);  // termina la secuencia con enter
         break;
         }
   }


pero al recibir el 1 en el select case si me salta a la secuencia pero no puedo leer los datos que siguen por ejemplo quiero recibir "I0" a la espera del valor adc, seria la interpretación "I0:255" y ejecuta una acción y quedo en espera de otro valor en "I", por decir "I1:230"  ejecuta otra acción me explico?


----------



## D@rkbytes

Puedes utilizar los clásicos "cut-strings" de Visual Basic para dividir una cadena.
Éstos son...
Left, Right, Mid y Split.

Algo así cómo en el proyecto modificado del _post #74_

Adjunto un ejemplo usando la función Split de VB6


----------



## luis30

D@rkbytes dijo:


> Puedes utilizar los clásicos "cut-strings" de Visual Basic para dividir una cadena.
> Éstos son...
> Left, Right, Mid y Split.
> 
> Algo así cómo en el proyecto modificado del _post #74_
> 
> Adjunto un ejemplo usando la función Split de VB6



umm bueno es prácticamente lo que hago pero me genera errores de lectura, le puse un retardo con el API de Windows de 10ms y funciona mejor el programa y también al código PIC le cambie los delays y funciona bien pero muy lento, quería ganar algo de velocidad para que sea en tiempo real pero queda con un retraso de 3seg "+-", y si lo monitorea con mas velocidad es impreciso, uso el InputLen y el MID para sacar los valores y proyectarlos, crees que haya alguna forma mejor de hacerlo?


----------



## D@rkbytes

luis30 dijo:


> umm bueno es prácticamente lo que hago pero me genera errores de lectura, le puse un retardo con el API de Windows de 10ms y funciona mejor el programa y también al código PIC le cambie los delays y funciona bien pero muy lento, quería ganar algo de velocidad para que sea en tiempo real pero queda con un retraso de 3seg "+-", y si lo monitorea con mas velocidad es impreciso, uso el InputLen y el MID para sacar los valores y proyectarlos, crees que haya alguna forma mejor de hacerlo?


En ese ejemplo que adjunté, no se genera un retraso tan alto cómo mencionas.
Lo probé físicamente antes de subir el ejemplo y funciona perfectamente en tiempo real.

Algo que puedes hacer, es aumentar la frecuencia de trabajo a unos 8MHz, 10Mhz ó al máximo de 20MHz.
Sin embargo a esa velocidad de trabajo de 4MHz usando el oscilador interno y con 9600bps me anduvo bien.

Trata que los tiempos de los retardos sean cortos en el receptor para que no se pierda la sincronización.

Suerte.


----------



## luis30

D@rkbytes dijo:


> En ese ejemplo que adjunté, no se genera un retraso tan alto cómo mencionas.
> Lo probé físicamente antes de subir el ejemplo y funciona perfectamente en tiempo real.
> 
> Algo que puedes hacer, es aumentar la frecuencia de trabajo a unos 8MHz, 10Mhz ó al máximo de 20MHz.
> Sin embargo a esa velocidad de trabajo de 4MHz usando el oscilador interno y con 9600bps me anduvo bien.
> 
> Trata que los tiempos de los retardos sean cortos en el receptor para que no se pierda la sincronización.
> 
> Suerte.



Gracias D@rkbytes utilice tu ejemplo anterior los guarde en un text y de ahi tomo los valores y despues lo borro, antes esperaba 13 datos con el inputlen en 0 y el RThreshold = lo cual hacia mas lento el codigo y esperaba que los datos fueran esos y luego los proyectaba , ya esta funcionando solo me falta optimizarlo un poco, y me funciono a 8mhz 9600bps.


----------



## D@rkbytes

Después de algún tiempo he realizado algunos cambios y agregados a la interfaz para puerto serial RS-232.

Adjunto el programa con las nuevas modificaciones y agregados que me han solicitado.

Saludos.


----------



## luis30

hola @Darkbytes disculpa las molestias, recurro a ti por una duda, estoy realizando un programa en vb6, el cual funciona como un hyperterminal, con la ritchtextbox tomo los datos de entrada y los visualizo, esto para poner en modo boot un dispositivo, al llegar a cierto punto debo mandar el comando chr(3), esto si lo hace pero al estar el textbox recibiendo datos el command button no responde se traba, mientras el buffer este ocupado se traba quisiera saber si hay alguna forma de liberar memoria para que el programa responda libremente al mismo tiempo que recibe datos..

Gracias de antemano!!.


----------



## D@rkbytes

Una forma de liberar memoria, es destruyendo objetos, pero no tiene caso hacerlo cuando se están usando.
Lo mejor es que adjuntes tu proyecto para saber de que forma estás recibiendo datos y ver que origina ese problema.

¿Por qué utilizas un RichTextBox en vez de un TextBox?

Saludos.


----------



## luis30

D@rkbytes dijo:


> Una forma de liberar memoria, es destruyendo objetos, pero no tiene caso hacerlo cuando se están usando.
> Lo mejor es que adjuntes tu proyecto para saber de que forma estás recibiendo datos y ver que origina ese problema.
> 
> ¿Por qué utilizas un RichTextBox en vez de un TextBox?
> 
> Saludos.



Pues no tiene importancia si uso el textbox o el rich solo lo hice para mejor presentación pero no tiene mucha importancia.

aquí esta el proyecto esta basado en un ejemplo tuyo, el programa en si funciona solo con lo que te digo que se tilda el boton de CTRLC al recibir datos en demacia..

Gracias de antemano.


----------



## D@rkbytes

Analizando en dónde podía estar el error que comentas, se detectó un Stack Overflow.
El error está en el *Private Sub* *Prueba(com As MSComm)
*
Elimina de esa parte la instrucción *DoEvents*
Esto consume mucha memoria al ser llamado muchas veces y es cuando se produce la falla en el programa.

También noto que estás re declarando variables dentro de las sub rutinas.
Si vas a usar las mismas variables dentro de varias sub rutinas debes declararlas en la cabecera del programa.

Un bug que se corrigió en la versión 2 del programa interfaz, fue esta:
En la subrutina *Private Sub cmdConnect_Click()*
Se debe cambiar la forma de tomar el valor para el número de puerto por esto:
*RS232.CommPort = CStr(Mid(cmbPort.Text, 4))* ' Al hacer esto, se elimina "COM"

Como recomendación, si vas a recibir una gran cantidad de datos, debes limpiar el TextBox cada tantos caracteres o cada determinado tiempo para evitar consumo de memoria.

Suerte.


----------



## luis30

D@rkbytes dijo:


> Analizando en dónde podía estar el error que comentas, se detectó un Stack Overflow.
> El error está en el *Private Sub* *Prueba(com As MSComm)
> *
> Elimina de esa parte la instrucción *DoEvents*
> Esto consume mucha memoria al ser llamado muchas veces y es cuando se produce la falla en el programa.
> 
> También noto que estás re declarando variables dentro de las sub rutinas.
> Si vas a usar las mismas variables dentro de varias sub rutinas debes declararlas en la cabecera del programa.
> 
> Un bug que se corrigió en la versión 2 del programa interfaz, fue esta:
> En la subrutina *Private Sub cmdConnect_Click()*
> Se debe cambiar la forma de tomar el valor para el número de puerto por esto:
> *RS232.CommPort = CStr(Mid(cmbPort.Text, 4))* ' Al hacer esto, se elimina "COM"
> 
> Como recomendación, si vas a recibir una gran cantidad de datos, debes limpiar el TextBox cada tantos caracteres o cada determinado tiempo para evitar consumo de memoria.
> 
> Suerte.



hice los cambios que me sugieres y el programa funciona mucho mejor gracias !, lo de borrar el textbox cada tantos caracteres ya lo había pensado pero tengo que sacar datos de lo que recibo por eso no lo había puesto de esa forma, pero al parecer es la única.

gracias!!!!


----------



## D@rkbytes

Nueva versión RC1. (Candidata a definitiva.)

Esta nueva versión tiene varias mejoras en cuanto a las versiones anteriores.


Se adjunta el código fuente de esta nueva versión.​


----------



## willyfv

Saludos D@rkbytes..

He estado realizando este proyecto pero no he podido comunicarme de forma rs232 con el pic 12f675, he leido y no se si borre el oscilador, el programador que uso es un leaper-48.. espero que me puedas orientar en algo


----------



## D@rkbytes

Si piensas que se ha perdido el valor de fábrica de OSCCAL, realiza una prueba usando un cristal.


----------



## willyfv

Gracias D@rkbytes no se había borrado era ruido en la linea de vcc y gnd


----------



## Jose1306

D@rkbytes dijo:


> Saludos.
> Después de algún tiempo de esperar a que surtieran el sensor DS18B20 por fin lo conseguí.
> Implemente un sistema sencillo de prueba, con un LCD 16x2 y transmisión de datos via puerto serie.
> El PIC que utilice fue un 16F628A configurado con oscilador interno (4MHz),
> y un solo transistor BC548 para la adaptación de niveles RS232 del puerto serie.
> 
> El programa está escrito en PICBasic Pro y simulado en Proteus.
> La interfaz para leer los datos en la PC está escrito en VB6, y es similar a la usada para el LM35
> 
> Características:
> .- La transmisión de datos se realiza mediante el módulo USART del PIC a 9600bps.
> .- El sistema es muy estable y con una granularidad de .5°
> .- El programa también puede leer la temperatura negativa.
> .- La temperatura es mostrada en grados centígrados en un LCD 16x2 (Use un JHD 162A)
> .- La temperatura en mostrada en grados centígrados y grados Fahrenheit en la interfaz.
> .- Cuenta con aviso de desconexión del sensor (Solo por LCD)
> 
> El sistema es una base piloto que puede servir para otros proyectos.
> Y solo se implementaron los comandos básicos de inicialización y conversión de temperatura.
> Incluyo los programas, esquema y simulación.
> 
> Espero sea de utilidad.
> 
> Suerte y hasta luego.



Hola D@rkbytes. Esto es para MicroCode verdad ? Se puede adaptar bien en Proton IDE ? 

Saludos y gracias !


----------



## D@rkbytes

Jose1306 dijo:


> Hola D@rkbytes. ¿Esto es para MicroCode, verdad ?
> ¿Se puede adaptar bien en Proton IDE?


Saludos.
También he subido ejemplos en C y ensamblador.
Y por supuesto que de PICBasic con MCS se puede migrar fácilmente a PICBasic de Proton IDE.


----------



## Jose1306

Intente adaptarlo pero no se por que motivo me dice que el sensor no esta conectado...  Tampoco me lee el valor de temperatura.  

¿?¿?

Adjunto las modificaciones que realice con simulación y todo


----------



## D@rkbytes

Adjunto el programa con los cambios para Proton IDE.


----------



## Jose1306

Perdón por la demora.

Muchas gracias D@rkbytes !!!!!!!!

Intente probar el código en un 18f4550 conectándolo al puerto E2/AN7 y me devuelve un '0' cuando lo lee, indicando que el sensor esta ocupado. Probé ejecutándolo paso a paso en Proteus pero no logro darme cuenta a que se debe, lo que se es que salta a la subrutina "No_listo".

Alguna idea sobre eso ?

Estaré configurando mal el puerto E.2 ?

Adjunto el código y la simulación.


Saludos.


----------



## D@rkbytes

En la simulación yo veo un PIC18F4520  
Como quiera, en el PIC18F4550 no se configuran los pines E/S como digitales con el registro CMCON.
En ese PIC se usa el registro ADCON1 y se le debe dar el valor 15 (0x0F)
Tampoco sé para que configuras el registro INTCON con  el valor 7
Al usar Proton, puedes establecer todo digital con *All_Digital = On
*La frecuencia del simulador la tienes en 1 MHz, debes establecerla a 4 MHz, que es la frecuencia por defecto cuando no se declara en el compilador.


----------



## Jose1306

4520 !!!!!   Se ve que meti mal el dedo... Ya lo cambie... 

Muy atento D@rkbytes. Gracias.



D@rkbytes dijo:


> La frecuencia del simulador la tienes en 1 MHz, debes establecerla a 4 MHz, que es la frecuencia por defecto cuando no se declara en el compilador.



La frecuencia la configuro a 1 MHz porque sino corre muy rápido el micro en tiempo real. 

Corregí todos esos errores pero el me dice que el sensor no esta conectado.. "SENSOR DS18B20 NO CONECTADO" 

Mis modificaciones: 


		Código:
	

Declare Onboard_USB No

Config_Start
    FOSC = INTOSC_EC, PBADEN = OFF, ICPRT = On
    MCLRE = OFF, FCMEN = OFF, IESO = On, PWRT = On, WDT = OFF, LVP = OFF
Config_End 

;*******************************************************************************   
OSCTUNE = %100000
OSCCON = %01000111           ; Frecuencia 1MHz del reloj interno.
;******************************************************************************* 

All_Digital = On

ADCON1 = 0x0F   

Declare LCD_Type 0              
Declare LCD_DTPin PORTB.4         
Declare LCD_DTPort PORTB            
Declare LCD_ENPin PORTB.2   
Declare LCD_RSPin PORTB.1 
Declare LCD_Interface 4 
Declare LCD_Lines 2  

; Declaración de variables
Dim Ocupado As Byte
Dim TempX   As Word
Dim Temp1   As Word
Dim Temp2   As Word


Symbol DQ = PORTE.2           ; Pin del DS18B20 DQ One-Wire
Symbol DQ_DIR = TRISE.2        ; Puerto E2 ds 18B20

Inicio:
    Cls                         ; Inicializar el LCD (También lo borra)            
    Print At 1,1,"Inicializando..."
    DelayMS 1000
    Print At 1,1,"  Temperatura   "
    Print At 2,5,"000.0",0xDF," C"
; Enviar ceros para estabilizar el puerto
    ;HSerOut [0]
    DelayMS 100
 
 Programa:   
    GoSub Leer_DS18B20
    Print At 1,1,"  Temperatura   "
    If TempX.11 = 1 Then            ; Si el bit 11 de "TempX" está en 1, entonces la temperatura es negativa.
        Temp1 = (~TempX >> 4)
        Temp2 = (16-(TempX.LowByte & 0x0F)) * 625
        Temp2 = Temp2 / 20
        Print At 2,1,"   -",Dec Temp1,".",Dec2 Temp2, " ",0xDF,"C   "
        ; Enviar la lectura por el módulo USART
        ;HSerOut ["-",Dec Temp1,".",Dec2 Temp2]
    Else                           'Si el bit11 es 0 la temperatura es positiva
        Temp1 = (TempX >> 4)
        Temp2 = (TempX.LowByte & 0x0F) * 625
        Temp2 = Temp2 / 20
        Print At 2,1,"    ",Dec Temp1,".",Dec2 Temp2, " ",0xDF,"C   "
        ;HSerOut [Dec Temp1,".",Dec2 Temp2]
    End If
    DelayMS 500
    GoTo Programa           

    
; Rutina para leer el DS18B20
Leer_DS18B20: 
    
    DQ_DIR = 0
    DQ = 0
    DelayUS 500           
    DQ_DIR = 1
    DelayUS 100
    ; Verificar si el sensor está conectado.
    If DQ = 1 Then
        Print At 1,2,"SENSOR DS18B20"
        Print At 2,3,"NO CONECTADO  "
        DelayMS 1000
        GoTo Leer_DS18B20
    End If
    
    OWrite DQ,1,[0xCC,0x44]         ; Indicar conversión.
No_Listo:
    ORead DQ,4,[Ocupado]            ; Verificar si el sensor está ocupado.
    If Ocupado = 0 Then No_Listo    ; Si está ocupado, regresar a "No_Listo"
    OWrite DQ,1,[0xCC,0xBE]         ; Indicar leer la temperatura.
    ; Guardar los datos de la lectura.
    ORead DQ,2,[TempX.LowByte,TempX.HighByte]
    
    Return
    
    End


Saludos !!


----------



## D@rkbytes

Jose1306 dijo:


> La frecuencia la configuro a 1 MHz porque si no, corre muy rápido el micro en tiempo real.


Eso es debido a una mala configuración del registro OSCCON.


Jose1306 dijo:


> Corregí todos esos errores pero el me dice que el sensor no está conectado. "SENSOR DS18B20 NO CONECTADO"


Nuevamente adjunto el programa con los cambios necesarios y para  Fosc = 4 MHz.


----------



## Jose1306

Perfecto !

Porque declaraste  *Create_Coff* = *On* ?

Muchas gracias nuevamente D@rkbytes! 

Saludos !!!!


----------



## roberttorres

Buenas
La sentencia "Create_Coff = On" sirve para que al compilar tu programa ademas de crear el archivo.hex tambien  cree el archivo .coff que es para debuguear(depurador).


----------



## leemkapoh

Hola D@rkbytes,

He probado tu post proyecto #1 no funciona en hardware real, que funciona sólo en la simulación en proteus, ¿usted probó en hardware real?.

Kapoh.


----------



## D@rkbytes

No sé a qué "proyecto #1" te refieres, pero todos fueron probados físicamente.


----------



## pandacba

Hace una semana que entraste al foro, tan rápido lo probaste?.
D@rkbytes no publicaría nada que no haya archiprobado hasta el hatazgo, claro en tan poco tiempo en el foro no es posible que te des  idea de quien, ni de su constante aporte y ayuda en programación de Pic's


----------



## leemkapoh

Hola D@rk,
Qué significo el proyecto post número uno es aquí:
post número uno
He probado con un convertidor de USB a DB9.
El DB9 antes en a tablero del microcontrolador conecta al Max232 al puerto de serie TTL

Una salida TX y RX de esta placa que conectado al lado de TX y RX en PIC16F628A PORTA 2 y PORTA 3, pero no han resultado igual como cuando traté de simulación en proteus.

Cuando me simulación en proteus que trabajan muy bien, así que podría usted por favor ayudarme, cuál es problema en mi prueba en hardware real.

Gracias,
Kapoh

	Mensaje automáticamente combinado: Abr 21, 2018

He probado con un convertidor de USB a DB9. 


	Mensaje automáticamente combinado: Abr 21, 2018

Pandacba:
No sé lo que quieres decir!, realmente estoy utilizando MikroC, tan bien como proyecto de D@rk quiero a probado probado con uno original, una vez que mi prueba está bien entonces quiero crear un código en MikroC.

en PICBasic microcódigo Studio aprendiendo, que soy muy ciego con este compilador, yo copio D@rk proyecto entonces probé a interpretado a MikroC.

Este mi proyecto sobre UART en MikroC:


		Código:
	

char timeout; // counter

void main(void) {

    CMCON = 7; // disable comparators (all digital)
    
    // PORTA: all outputs except RA5,6,7 (_MCLR and ext_osc pins)
    PORTA   = 0; // leds off
    TRISA   = 0b11100000;
    // Rx_Led0..3 = RA0..RA3 (1 lit, LED anodes)

    // PORTB default: all inputs (internal pullups), nor used
    //TRISB = 0xFF;
    NOT_RBPU_bit = 0; // pullups on to avoid floating inputs

    Delay_100ms();    // library function
    UART1_Init(1200); //
    Delay_100ms();

    while(1) { // infinite loop

      do { // wait for a char received via RF (TTL level RS232)
         Delay_1ms(); // library function
      } while (!UART1_Data_Ready());

      if (UART1_Read() != 0xAA) // read the received data (ident char?)
         continue;
      
      // wait with appr 20 ms timeout for the next (LED control) char:
      timeout = 20;
      do {
         if (UART1_Data_Ready()) {
           PORTA = UART1_Read(); // set LED port
           break;
         }
         Delay_1ms();
      } while (--timeout, !Z_bit); // until !timeout

    } // infinite loop

} // end of main()

// ----- end of RX program (4 ram, 101 code)


Sobre el código para el lado de RX

Gracias,
Kapoh


----------



## pandacba

El problema es presisamente que no es un puerto  real, estas usando un comvertidor y en muchos casos no es lo mismo, ese convertidor sirve en algunos casos y en otros no


----------



## chclau

Cuando usas un convertidor de USB a RS232 hay (al menos) dos cosas que tienes que tener en cuenta:

1) Que se hayan instalados los drivers para el convertidor
2) Cual es el numero de puerto serial del convertidor. En los puertos reales RS-232, normalmente es un numero 'bajo'  - COM1, COM2, etc. En los convertidores, y segun mi experiencia, normalmente se usan numeros 'altos' - COM8, COM9... COM15. Puedes verificar que numero de puerto serial tiene tu convertidor mirando el 'Device Manager'
3) Ante la duda, tratar de comunicarse con el dispositivo utilizando un programa terminal estandard, como Hyper Terminal o Teraterm. Una vez que has verificado que puedes intercambiar comandos con el programa terminal, pasas a depurar cual es el problema en tu aplicacion.


----------



## leemkapoh

Pandacba :
El problema es presisamente que no es un puerto real, estas usando un comvertidor y en muchos casos no es lo mismo, ese convertidor sirve en algunos casos y en otros no 
 ^^ Probablemente tienes razón, hago lo que sé, así que usar USB a convertidor de DB9 y también serie de TTL, que después no funciona como que mi problema aquí, espero que algunos de aquí fue lo que proyecto va me explicó entonces que saber la forma correcta.

	Mensaje automáticamente combinado: Abr 22, 2018

Chclau :
En primer lugar gracias por tus consejos.
En cuanto a tus consejos, aquí están mis respuestas:

1). Sí, los controladores se ha instalado en el puerto, juzgado el PORT2 y trató de USB3 pero no trabajo, ver mi foto.


2).  No estoy intentado todavía utiliza el Puerto Com 8 o superior a 8, generalmente cuando lo flasheo o chip ardiente utiliza K128 o uso K150 con       Puerto Com 2-4 está bien.
     Como bien tu Consejo, colocar en el puerto más alta que el Puerto Com 8 probé.

3). Antes de hacer conexión entre el hardware al software, hago un par usar un VSPE (puerto Virtual), que significa entre dos com puerto debe 
    estar    conectado antes de su uso.


Explicar si así todavía tiene dudas, podría usted darme más profundo, cuando se prueba el proyecto en hardware real, entonces intentado hacer como haces.




Este mi proyecto de muestra acerca de la interfaz, podría usted por favor prueba este interfaz en hardware real... Nota: Si usted todavía tiene.

Gracias,
Kapoh.

	Mensaje automáticamente combinado: Abr 22, 2018

Hola,
Sigo con duda y pegados, que en hardware real no trabajarla, en proteus funciona muy bien.

Gracias,
Kapoh.


----------



## D@rkbytes

leemkapoh dijo:


> Este mi proyecto sobre UART en MikroC


Eso no es un proyecto, ese es el código.
El problema puede estar en la palabra de configuración y para saberlo sí es necesario que adjuntes el proyecto de mikroC.
Si yo compilo ese programa le pondré una palabra de configuración correcta y posiblemente funcionará en físico.
Por ese motivo siempre les recomiendo que adjunten los proyectos de mikroC dentro de un archivo comprimido.

Nota. El problema no es con la aplicación que realizaste, ya que los datos que envía son correctos.


----------



## leemkapoh

Hola D@rk,

Mi código está trabajando muy bien, había probado ese código en el hardware real, se recibe el código de lado, puedo hacer que código de transmisión de 433 Mhz.

Mucho tiempo no uso Visual Basic 6, solo regreso para actualizar mi lenguaje en Visual Basic 6.

Espero que desea escribir o intérprete mi codigo en MikroC en su interfaz VB.6, así aprendo a partir de ahí, entonces le trató de simulación en proteus y también puede implementación en hardware real.

También ya probé su interfaz VB6 y su estudio de microcódigo de PBP en hardware real, pero no trabajo.

Qué son:

0). de desarrollo Junta PIC16F628A, con resonador cerámico oscilador 4 Mhz.
1). Desde la interfaz de PC Visual Basic 6, establecer el puerto de remito en el puerto      del convertidor del USB (Aten).
2). esta placa de Desarrollo Conecte con USB convertidor Db9 (Aten), ves mi foto.
3). de este convertidor del USB (db9), conecté a dB9 a RS232 serial TTL.
4). este DB9 a RS232 TTL, el RX y TX conecté a Junta de desarrollo del PIC16F628A.

Estoy seguro de que la configuración es correcta, he probado los de simulación está funcionando bien, pero cuando traigo a hardware real, no trabajo.

Gracias,
Kapoh.


----------



## D@rkbytes

leemkapoh dijo:


> También ya probé su interfaz VB6 y su estudio de microcódigo de PBP en hardware real, pero no trabajo.


Tiene que ser problema de hardware.


leemkapoh dijo:


> 0). de desarrollo Junta PIC16F628A, con resonador cerámico oscilador 4 Mhz.


Nos hace falta ver la palabra de configuración.


leemkapoh dijo:


> 1). Desde la interfaz de PC Visual Basic 6, establecer el puerto de remito en el puerto del convertidor del USB (Aten).
> 2). esta placa de Desarrollo Conecte con USB convertidor Db9 (Aten), ves mi foto.
> 3). de este convertidor del USB (db9), conecté a dB9 a RS232 serial TTL.
> 4). este DB9 a RS232 TTL, el RX y TX conecté a Junta de desarrollo del PIC16F628A.


Con un solo adaptador de USB a TTL RS-232 es suficiente.
Por USB yo uso el PL2303 o el FT232RL
Por puerto COM (Hardware RS-232) uso transistores o el MAX232


leemkapoh dijo:


> Estoy seguro de que la configuración es correcta, he probado la simulación y está funcionando bien, pero cuando traigo a hardware real, no trabaja.


Por eso insisto que necesitamos ver la palabra de configuración.
Y por favor, también adjunta el esquema que estás usando.

Te recuerdo qué, si usas un cristal o resonador para el oscilador, los pines RA6 y RA7 dejan de ser terminales I/O
El pin RA4 es de drenador abierto, (Open Drain) por lo tanto, únicamente proporciona el estado lógico 0
Para conseguir el estado lógico 1, se requiere una resistencia pull-up
Esto hace que no se puedan controlar cargas de la misma forma que las otras salidas. (RA0, RA1, RA2, RA3, RA6 y RA7)
Y RA5 únicamente puede ser entrada cuando se configura para no ser el reset.
Lo anterior lo menciono por esto:


		C:
	

PORTA = UART1_Read(); // set LED port

En fin, si no quieres subir el proyecto de mikroC, no se te puede brindar una mejor ayuda.

PD:
Esa espera cargando componentes en tu aplicación, es totalmente innecesaria y desespera bastante.


----------



## leemkapoh

Hola D@rkbytes. Gracias por responder mi post. Con un solo adaptador de USB a TTL RS-232 es suficiente.
Por USB yo uso el PL2303 o el FT232RL. Por puerto COM (Hardware RS-232) uso transistores o el MAX232

Aten convertidor del USB no se puede ejecutar con controlador PL2303 o FT232RL, hay en el paquete cuando compré ese convertidor.

Ya intenté eliminar controlador de Aten, pero cuando instalé PL2303 para ventanas 7 64 bits no detecta para convertidor de USB Aten.

Por favor me podriais dar una foto para qué USB que utilizas?. ( Por USB yo uso el PL2303 o el FT232RL ).

Para esquema de I utiliza su diseño de proyecto así como en el proteus, ver adjunto por favor.

Oscilador, ¿cuál es usted consulte para utilizar, así como cableado en proteus, que uso el oscilador interno o externo y ¿qué frecuencia de cristal si uso para cristal externo?.

Para el hardware quemar o flash PIC16F628A, usé K128, había intentado usando HS o XT puesta en K128 pero teniendo el mismo problema.

También intenté su archivo hexadecimal relé pero no funciona en mi hardware real, nada está bien si funciona en simulación en Proteus.

Podría por favor dibujar en proteus para su uso en la conexión de hardware real para el PIC16F628A esquemático como oscilador que utilice, por favor a volver a dibujar en mi esquema adjuntada.

Olvidé en mi anterior post para subir en MikroC archivos, para que puedas encontrar en mis archivos adjuntos.

Para la barra de progreso, que es sólo como hacer una mirada de la diferencia, realmente no es función en relación con la Página principal.

Para la Junta de desarrollo utilizado como como este enlace ;
Development Board PIC16F628A

En un momento creo que solo hablar de su proyecto con estudio de microcódigo, porque uso uno está trabajando muy bien su interfaz VB.6.0 y archivos hexagonales, pero no funciona al utilizar en hardware real.

Intenté comprar algo como su convertidor USB, creo que así como te refieres a uno es similar.
Sólo pido USB a grado TTL serie Industrial UART FT232RL en línea, espero que mañana que parte vendrá, solo para información de nuestro tiempo es ahora es noche, una vez llegado se trató de siguiente así como su información.
Aquí hay un enlace:
USB Converter
¿Sabía usted Oshonsoft?, ¿qué piensas de ese compilador, es igual con MicroStudio, lo compré hace una semana para PIC16F y PIC18F compilador.


Gracias,
Kapoh.


----------



## D@rkbytes

leemkapoh dijo:


> Por favor me podriais dar una foto para qué USB que utilizas?


El de arriba es el adaptador con el chip PL2303 y los dos de abajo usan el chip FT232RL



leemkapoh dijo:


> También intenté su archivo hexadecimal relé pero no funciona en mi hardware real, nada está bien si funciona en simulación en Proteus.


Por eso te digo que el problema es de hardware, pueden ser conexiones, fuses y hasta problemas con el adaptador a RS-232


leemkapoh dijo:


> Podría por favor dibujar en proteus para su uso en la conexión de hardware real para el PIC16F628A esquemático como oscilador que utilice, por favor a volver a dibujar en mi esquema adjuntada.


Es el mismo que el del ejemplo del post #1 y funciona correctamente en montaje físico.


leemkapoh dijo:


> Olvidé en mi anterior post para subir en MikroC archivos, para que puedas encontrar en mis archivos adjuntos.


Ahora ya pude ver la palabra de configuración y aunque no es la correcta para un cristal/resonador de 4 MHz, debería funcionar.


leemkapoh dijo:


> Oscilador, ¿cuál es usted consulte para utilizar, así como cableado en proteus, que uso el oscilador interno o externo y ¿qué frecuencia de cristal si uso para cristal externo?


El oscilador interno es de 4 MHz, no apto para un baud rate superior a 4800, puede funcionar a 9600 pero ya con problemas.
Con un cristal de 4 MHz, va más o menos bien a 9600 Bps, pero es mejor usar una frecuencia superior.
Con 20 MHz he realizado muy buena comunicación hasta 128000 Bps.
Para el oscilador a cristal hasta 4 MHz, se usa el fuse XT, y superior a 4 MHz hasta 20 MHz, se usa el fuse HS (High Speed)



leemkapoh dijo:


> ¿Sabía usted Oshonsoft?, ¿qué piensas de ese compilador, es igual con MicroStudio, lo compré hace una semana para PIC16F y PIC18F compilador.


Si lo conozco, de hecho conozco muchos compiladores, lo he usado y puedo decir que personalmente no me gusta.
Así como tampoco me gusta nada de mikroelectronica (Ni su compilador Basic, ni el de C "mikroC")
El compilador que más me gusta y en el cual desarrollo proyectos industriales, es BoostC Compiler de SourceBoost
Es muy parecido al compilador HI-TECH de Microchip, pero BoostC tiene mayor soporte y muchas ventajas superiores.
Para programar microcontroladores en Basic, lo mejor es Proton IDE

PD:
Subir la conexión como diagrama por bloques, no es conveniente porque no podemos ver la conexión real entre componentes.

Mostrar este tipo de diagramas no sirve de mucho.
Por favor, adjunta un esquema verdadero punto a punto y no ese tipo de diagramas por bloques.


----------



## leemkapoh

Hola D@rkbytes. Hoy mi convertidor USB llegó, lo probé con su interfaz en VB6 y mi nueva junta hacer con oscillador externo de cristal 12 Mhz, pero no trabajó. Imagen aquí sobre la conexión. Mi nuevo convertidor USB es rojo un FT232RL (derecha) similar como bien usted convertidor de USB.





La conexión son PC con interfaz VB6-> USB FT232RL TX-RX-tierra-> microcontrolador Board TX-RX-tierra.
TX a RX - RX a TX - tierra a tierra, no estoy dado un suministro de 5 voltios, convertidor del USB porque tiene la fuente de PC.

Gracias,
Kapoh.


----------



## D@rkbytes

Cuando se usa un adaptador de USB a TTL RS-232, ya no se debe usar ningún emulador de puertos.
Los puertos virtuales afectan a los físicos y deben ser desinstalados.


----------



## leemkapoh

Hola D@rk,
Acabo de hacer un pequeño programa para revisar la función mi convertidor USB, encontrará archivos adjuntos.
Descripción para utilizar:
1). de pin TX dar un 4, 7 K Ohm o 1 K Ohm a Led (+) y el otro pin (-) a tierra.
2). de pin RX da un 4, 7 K Ohm o 1 K Ohm a Led (+) y el otro pin (-) a tierra.
3). conectar la toma de tierra Pin de convertidor de USB a cada Led.
He probado mi marca que nuevo convertidor USB con mi pequeño programa está funcionando muy bien.
Bueno D@rk observado, lo pruebo mañana su sugerencia.

Gracias,
Kapoh.


----------



## MaShicO

D@rkbytes dijo:


> Ahora la versión 2 de esta interfaz RS232 en VB6.
> 
> Mejoré, añadí algunos algoritmos y la compacté un poco mas, cambiando también el diseño.
> 
> Esta es la nueva apariencia de la interfaz.
> 
> 
> 
> 
> 
> ​



Hola amigo D@rkbytes tengo un problema al momento de querer instalar tu programa de VB6 que lo posteaste en el año 2012 , cuando quiero ejecutar el programa me sale éste error por parte del archivo MSSCOM32.OCX . Quisiera saber dónde lo tengo que pegar , instalar o no se , quisiera q*ue* me orientes por favor porque quiero usar tu interfaz ya que me hace muy interesante , espero q*ue* me ayudes , gracias . Disculpa si te escribo por acá. Dejo el error q*ue* me aparece en imagen.


----------



## D@rkbytes

Registra el componente con REGSVR32.exe
El Activex MSCOMM32.ocx puede ir en la misma carpeta donde está el programa o en el directorio de sistema de Windows, según tu versión.
Se registra ejecutando CMD en modo administrador y proporcionando el nombre del archivo a registrar.
Se escribe lo siguiente en CMD: regsvr32.exe mscomm32.ocx

Después de eso debe aparecer un mensaje indicando si el suceso fue exitoso o si ocurrió algún problema.
Por Internet puedes encontrar más información sobre registrar componentes Activex.

Nota:
Si el componente se encuentra en algún directorio del sistema, como c:windows\system32 o c:windows\syswow64
REGSVR32.exe podrá registrarlo sin proporcionar ruta de archivo, caso contrario, habrá que proporcionarle la ruta correcta de archivo.
También se puede copiar cmd.exe a la carpeta del Activex o desde el explorador ejecutarlo en dicha carpeta.


----------



## MaShicO

D@rkbytes dijo:


> Registra el componente con REGSVR32.exe
> El Activex MSCOMM32.ocx puede ir en la misma carpeta donde está el programa o en el directorio de sistema de Windows, según tu versión.
> Se registra ejecutando CMD en modo administrador y proporcionando el nombre del archivo a registrar.
> Se escribe lo siguiente en CMD: regsvr32.exe mscomm32.ocx
> 
> Después de eso debe aparecer un mensaje indicando si el suceso fue exitoso o si ocurrió algún problema.
> Por Internet puedes encontrar más información sobre registrar componentes Activex.
> 
> Nota:
> Si el componente se encuentra en algún directorio del sistema, como c:windows\system32 o c:windows\syswow64
> REGSVR32.exe podrá registrarlo sin proporcionar ruta de archivo, caso contrario, habrá que proporcionarle la ruta correcta de archivo.
> También se puede copiar cmd.exe a la carpeta del Activex o desde el explorador ejecutarlo en dicha carpeta.




Gracias *por* la orientación D@rkbytes , hice todo como me lo indicaste pero me salia un error de los componentes DLL no entendí porque y un error 0x8000201c algo asi , lo averigué *por* internet y me mandaban a formatear la PC . Pero si no fuera x el comentario que hiciste al subir la interfaz donde dices que esto solo es para aquellos q no posean VB6 , con esto decidí mejor instalar el VB6 y así logré poder abrir tu interfaz , debo de admitir que soy novato para usar el VB6 ,pero si tengo conocimientos en PBP y me da muchas ganas de seguir aprendiendo temas como la interfaz con VB , le echaré todas las ganas del mundo y gracias *por* tus grandes aportes D@rkbytes .Saludos desde Perú.


----------



## JLEF2007

Hola 
*D@rkbytes*

Intenté descargar tus ejemplos de Lectura de Puertos Seriales y mi PC me elimina uno de ellos porque dice que está infectado de Virus...


----------



## MaShicO

JLEF2007 dijo:


> Hola
> *D@rkbytes*
> 
> Intenté descargar tus ejemplos de Lectura de Puertos Seriales y mi PC me elimina uno de ellos porque dice que está infectado de Virus...


Te refieres a los códigos del Microcode Studio o a los programas que D@rbytes posteò para la interfaz serial con Visual Basic ?


----------



## D@rkbytes

JLEF2007 dijo:


> Intenté descargar tus ejemplos de Lectura de Puertos Seriales y mi PC me elimina uno de ellos porque dice que está infectado de Virus.


Recomendación... Cambia de antivirus.


----------



## JUNIORPOICON

D@rkbytes dijo:


> Ahora la versión 2 de esta interfaz RS232 en VB6.
> 
> Mejoré, añadí algunos algoritmos y la compacté un poco mas, cambiando también el diseño.
> 
> Esta es la nueva apariencia de la interfaz.
> 
> 
> 
> 
> ​
> Escribí también algunos programas nuevos en PBP para experimentar con la interfaz.
> Algunos de los programas los escribí con MicroCode Studio v5.0
> Utilizando el nuevo compilador PICBASIC PRO v3.0
> Pero nada impide compilarlos con PBP2 modificando la cabecera FSR, que incluí en cada programa.
> 
> Algunos de los nuevos ejemplos son...
> .- Un Expansor de puertos para el PIC12F675 con el 74LS164
> .- Envío de mensajes a un LCD 16x2 vía serial. (Lectura y escritura del LCD)
> .- Un recuperador del valor del registro OSCCAL para el 12F675
> .- Un calculador para el registro SPBRG en los PIC16
> .- Un decodificador de estado de los pins en los PIC. (Interfaz incluida)
> .- Termómetros usando el ADC del 12F675 y el 16F88 con el Sensor LM35. (Interfaz incluida)
> Y algunos otros programas extra.
> 
> Como siempre, espero que estos aportes sean de ayuda,
> para los que quieran experimentar con el casi extinto puerto serial de la PC.
> 
> Nota: Todos los ejemplos y proyectos incluyen el código fuente.
> Más su respectivo diagrama esquemático y simulación en ISIS.
> 
> Cualquier duda y comentario quedo a sus ordenes.
> 
> Suerte y hasta luego.
> 
> Atte. D@rkbytes



Buena tarde D@rkbytes estoy por empezar un proyecto en Visual Basic.
Quiero empezar primero seleccionando el Puerto Comm, pero que lea los puertos comm que hay en la pc y estos se agreguen en la lista ComboBox. 
Ahora quiero agregar un Led que encienda al momento de conectar, y que el CommandButton cambie de "Conectar" a "Desconectar". En caso haya error en la conexion o quizás no encuentre puertos en la pc me envie una ventana con mensaje de error.
En el TextBox que dice "01" (Le llamaremos txtproducto) solo se puedan digitar _dos digitos* ,*_ ahora no se, si se podria hacer que estos textos trabajen con un tipo de fuente de texto determinado, si se puede seria excelente, y si no se puede, ni modo.
en el TextBox que dice "00.00" (Le llamaremos txtprecio) solo trabajen 4 digitos y que el punto decimal aparezca por defecto, y que solo se puedan digitar los numeros.


Ahora lo que el programa quiero que realice es lo siguiente:
A travez de un Pic18f2550 se va acomunicar con el puerto serial, este a la vez tiene que recibir la siguiente trama de datos: 
A1111B2222C3333D4444E5555F6666G7777 ==>> Esta trama la e probado con tu Serial Port Control y funciona normal. (Enviando y recibiendo los mismos datos de envio).



Ahora en el txtprecio (donde espero se pueda configurar solo 4 digitos y que el punto decimal sea por default) , aqui se va a a enviar el nuevo precio a cambiar y que aparcera en los displays.
En el txtproducto indistintamente del dato que se coloque va a enviar las letras: A,B,C,D,E,F,G. para tener un orden al momento de enviar toda la trama de datos.
Una vez que modifiquemos los txtprecio se van a enviar a travez del puerto comm que por default va a tener que estar configurado: "9600,n,8,1"

*Nota:
La función del checkbox será: al momento de estar activada va a poner en modo no editable el textproducto y el textprecio de su misma fila, pero va a modificar el precio que este en txtproducto por 00.00; que al momento de recibir este dato en el pic, va apagar los displays que corresponda de acuerdo a la letra del orden txtproducto (A,B,C,D,E,F,G). 

Espero me respondas y me puedas apoyar
Gracias de antemano.


----------



## D@rkbytes

Todo lo que mencionas se puede hacer, lo que no se puede es hacerlo por ti.


----------



## JUNIORPOICON

D@rkbytes dijo:


> Todo lo que mencionas se puede hacer, lo que no se puede es hacerlo por ti.



Si te entiendo, y no te estaba diciendo que me hagan el programa jajajaja. Estuve averiguando y avance bastante.
Sin embargo quieron que me ayuden con un problema que tengo en visualbasic .
Agregue un Text1 y deseo que este tenga el punto decimal por defecto (ejemplo: "00.00") . 
Ahora el Text1 esta configurado:
     MaxLength = 5  ==>> porque son 4 numeros mas el punto decimal.

Asi esta configurado internamente. pero me esta dando problemas con el punto decimal, se que estoy haciendo algo mal, pero ya no doy mas.

Private Sub Txt1_KeyPress(KeyAscii As Integer)
Txt1.Text = Format(Val(Txt1.Text), "##.##")
End Sub

Al momento de digitar el Text1, aparece el punto decimal y no hace lo que necesito.  
Gracias por responder.


----------



## D@rkbytes

Yo nada más usaría algo así:


		Código:
	

Private Sub Text1_KeyPress(KeyAscii As Integer)
    ' Sólo se admitirán dígitos y el punto.
    If InStr("0123456789.", Chr(KeyAscii)) = 0 Then
        If KeyAscii <> 8 Then KeyAscii = 0
    End If
End Sub


----------



## JUNIORPOICON

D@rkbytes dijo:


> Yo nada más usaría algo así:
> 
> 
> Código:
> 
> 
> Private Sub Text1_KeyPress(KeyAscii As Integer)
> ' Sólo se admitirán dígitos y el punto.
> If InStr("0123456789.", Chr(KeyAscii)) = 0 Then
> If KeyAscii <> 8 Then KeyAscii = 0
> End If
> End Sub



Gracias por responder
Pero creo que no me explique bien.
El punto decimal yo no quiero digitarlo, yo quiero que aparezca por defecto y solo digitar los números. En caso se pudiera, si ya no se puede no habria de otra, que hacerlo como propones.


----------



## D@rkbytes

JUNIORPOICON dijo:


> El punto decimal yo no quiero digitarlo, yo quiero que aparezca por defecto y solo digitar los números.


Entonces crea un TextBox personalizado.

Adjunto el Control de Usuario personalizado.


----------



## JUNIORPOICON

D@rkbytes dijo:


> Entonces crea un TextBox personalizado.
> 
> Adjunto el Control de Usuario personalizado.



Disculpa por la interrogante y por la ignorancia, pero, :

Donde copio ese archivo, en System32 o en cual carpeta de visual basic.


----------



## D@rkbytes

Es un Componente ActiveX, se puede colocar en cualquier parte, en la carpeta del proyecto, en System32, SysWOW64, etc.
El asunto es registrarlo, si lo cargas con VB el mismo entorno lo registra.
Si te complica, mejor subo el Control de Usuario, ese hasta contiene el código.


----------



## JUNIORPOICON

JUNIORPOICON dijo:


> Buena tarde D@rkbytes estoy por empezar un proyecto en Visual Basic.
> Quiero empezar primero seleccionando el Puerto Comm, pero que lea los puertos comm que hay en la pc y estos se agreguen en la lista ComboBox.
> Ahora quiero agregar un Led que encienda al momento de conectar, y que el CommandButton cambie de "Conectar" a "Desconectar". En caso haya error en la conexion o quizás no encuentre puertos en la pc me envie una ventana con mensaje de error.
> En el TextBox que dice "01" (Le llamaremos txtproducto) solo se puedan digitar _dos digitos* ,*_ ahora no se, si se podria hacer que estos textos trabajen con un tipo de fuente de texto determinado, si se puede seria excelente, y si no se puede, ni modo.
> en el TextBox que dice "00.00" (Le llamaremos txtprecio) solo trabajen 4 digitos y que el punto decimal aparezca por defecto, y que solo se puedan digitar los numeros.
> Ver el archivo adjunto 188961
> 
> Ahora lo que el programa quiero que realice es lo siguiente:
> A travez de un Pic18f2550 se va acomunicar con el puerto serial, este a la vez tiene que recibir la siguiente trama de datos:
> A1111B2222C3333D4444E5555F6666G7777 ==>> Esta trama la e probado con tu Serial Port Control y funciona normal. (Enviando y recibiendo los mismos datos de envio).
> 
> Ver el archivo adjunto 188962
> 
> Ahora en el txtprecio (donde espero se pueda configurar solo 4 digitos y que el punto decimal sea por default) , aqui se va a a enviar el nuevo precio a cambiar y que aparcera en los displays.
> En el txtproducto indistintamente del dato que se coloque va a enviar las letras: A,B,C,D,E,F,G. para tener un orden al momento de enviar toda la trama de datos.
> Una vez que modifiquemos los txtprecio se van a enviar a travez del puerto comm que por default va a tener que estar configurado: "9600,n,8,1"
> 
> *Nota:
> La función del checkbox será: al momento de estar activada va a poner en modo no editable el textproducto y el textprecio de su misma fila, pero va a modificar el precio que este en txtproducto por 00.00; que al momento de recibir este dato en el pic, va apagar los displays que corresponda de acuerdo a la letra del orden txtproducto (A,B,C,D,E,F,G).
> 
> Espero me respondas y me puedas apoyar
> Gracias de antemano.



estimado* D@rkbytes*
buenas noches.

mira para enviar mensajes a travez del puerto comm uso etas lineas de comando:

Private Sub cmdEnvia_Click()
' Enviar mensaje al puerto serial
If VarConnect = False Then
    txtRecibe.Text = "Recuerde establecer una conexión antes de envíar mensajes."
        Exit Sub
            End If

RS232.Output = Txt1.Text 

If Txt1.Enabled = False Then
txtRecibe.SetFocus
Else
Txt1.SetFocus
End If

End Sub


sin embargo para recibir mensajes a travez del puerto comm, tengo estas lineas:

Private Sub Recibe()
szData = RS232.Input
RS232.InputMode = comInputModeText

        txtRx.Text = txtRx.Text & szData
End Sub


se que estoy haciendo algo mal porque no me esta recibiendo datos por ningun lado. 
Gracias por responder.


----------



## D@rkbytes

La recepción se ejecuta en el Sub OnComm() del control MSComm
Como son varios eventos los que se pueden ejecutar, se suele utilizar una selección con Select Case.
La constante del evento de recepción será: comEvReceive


----------



## JUNIORPOICON

D@rkbytes dijo:


> La recepción se ejecuta en el Sub OnComm() del control MSComm
> Como son varios eventos los que se pueden ejecutar, se suele utilizar una selección con Select Case.
> La constante del evento de recepción será: comEvReceive



algo asi :

Private Sub RS232_OnComm()
' Recibir los datos del puerto serie
Dim szData$

Select Case RS232.CommEvent
' Evento para recibir datos
           Case comEvReceive
           ' Leer datos del puerto
             szData = RS232.Input
             txtRx.Text = txtRx.Text & szData

End Select

End Sub

hice algo asi y no me resulta. voy por mal camino supongo.
no se necesita configurar algo mas en el MSComm .??  . ya me estoy desesperando, pero no me dare por vencido.


----------



## D@rkbytes

Ese fragmento de código forma parte de los ejemplos que he subido y funciona correctamente.
Solo tú puedes determinar en qué parte está el error de lo que estás haciendo.


----------



## JUNIORPOICON

D@rkbytes dijo:


> Solo tú puedes determinar en qué parte está el error de lo que estás haciendo.



Exactamente* D@rkbytes *yo no habia configurado bien el MSComm.
Ahora tengo otra duda.
En el TextBox se puede configurar internamente que indistintamente del dato que se coloque que envie las letras: A,B,C,D,E,F,G, .por ejemplo:
Mi TextBox1 esta configurado Maxlength = 2 y es Alfanumerico.  
Ahora si yo digito: 84 - internamente se pueda enviar la letra A , a travez del puerto comm.?? y que este valor (84) se siga mostrando en el TextBox.


----------



## D@rkbytes

Eso también se solucionaría con una selección de datos.
Dato = Val(TextBox1.Text)
Select case Dato
Case 84
Envío "A"
Case "X"
Envío "X"
Etc.
End Select

Como dijo Sylvester Stallone: "Te hace falta ver más Box"


----------



## JUNIORPOICON

D@rkbytes dijo:


> Como dijo Sylvester Stallone: "Te hace falta ver más Box"



jajajajajajajajajaja....!!! tienes razón.

como tenia que enviar una trama seguida a travez del puerto comm, por ejemplo:
RS232.Output = Txt1.Text & Txt2.Text & .....
opte por esta solucion, creo que mas fácil  
RS232.Output = "A" & Txt2.Text & "B".....

y asi solo enviaria los datos de los TextBox que me interesan.



JUNIORPOICON dijo:


> En el TextBox se puede configurar internamente que indistintamente del dato que se coloque


----------



## JUNIORPOICON

*D@rkbytes *buen día.

Tengo una súper duda, e visto que en el TextBox tiene el DataFormat.



Veo tambien que se puede configurar y es lo que quiero saber o si tienes algun ejemplo de como y cuando se usa esto y que haga caso al momento de ejecutar.



Saludos, un abrazo.


----------



## D@rkbytes

El DataFormat únicamente sirve cuando el objeto está vinculado a una base de datos.


----------



## JUNIORPOICON

Hola* D@rkbytes*
buenas noches.
Tengo una duda muy grande.
Como puedo hacer para crear un botón que me permita descargar algun archivo,ya sea .pdf, .txt, .jpg, si tuvieras algún ejemplo básico sería excelente.

Gracias de antemano.
Saludos.


----------



## D@rkbytes

Adjunto 5 ejemplos de libre distribución.


----------



## JUNIORPOICON

Hola
*D@rkbytes*

gracias por el apoyo, pero creo que lo que estoy buscando es algo mas sencillo.
Por ejemplo el programa Pickit 2 tiene en su barra de menús la opción Help, en donde estan guardados archivos pdf para descargar, en este caso manual de usuario.



Algo así desearia crear, no creo que sea tan complicado o si.?

Estoy tratando de buscar informacion pero no encuentro por ningun lado.


Un abrazo.


----------



## D@rkbytes

Con las API de Windows se puede.
Por ejemplo, con esta:


		Código:
	

Public Declare Function URLDownloadToFile Lib "urlmon" Alias "URLDownloadToFileA" ( _
    ByVal pCaller As Long, _
    ByVal szURL As String, _
    ByVal szFileName As String, _
    ByVal dwReserved As Long, _
    ByVal lpfnCB As Long) As Long


Ejemplo de uso:


		Código:
	

Private Sub cmdDownload_Click()   
    Dim lRet As Long   
    Dim szURLArchivo As String
    Dim szArchivoLocal As String
    
    szURLArchivo = "http://www.la_pagina/archivo.pdf"
    szArchivoLocal = "C:\archivo.pdf"
    
    Me.MousePointer = vbHourglass
    lRet = URLDownloadToFile(0, szURLArchivo, szArchivoLocal, 0, 0)
    Me.MousePointer = vbDefault
                
    If lRet = 0 Then
        ' Abrir el archivo descargado.
        ShellExecute hWnd, "open", szArchivoLocal, "", "", vbNormalFocus
    Else
        MsgBox "Ocurrió un error al descargar el archivo.", vbInformation, "Error de descarga"
    End If
End Sub


En la parte para abrir el archivo usé la API ShellExecute pero ahí puedes hacer lo que quieras.


----------



## JUNIORPOICON

Muchas gracias
*D@rkbytes*

Era lo que necesitaba. Saludos.


----------

