Interfaz RS232 PIC PC (Proyecto Completo VB6)

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 :D!.


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 :D, espero se entienda mejor.

Saludos y Gracias!.

PD: ya lo pude solucionar, al parecer :D! el problema era mi codigo en CCS :/!,
 
Última edición:
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.
 

Adjuntos

  • PRUEBAS BUENAS.rar
    52.4 KB · Visitas: 50
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.
 

Adjuntos

  • PRUEBAS BUENAS II.rar
    52.4 KB · Visitas: 76
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 :aplauso::aplauso::aplauso::aplauso::aplauso:
 
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?
 
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
 

Adjuntos

  • 12F675 Separar cadena.rar
    35.5 KB · Visitas: 64
Última edición:
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?
 
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.
 
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 :D, ya esta funcionando solo me falta optimizarlo un poco, y me funciono a 8mhz 9600bps.
 
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.
 

Adjuntos

  • Serial Port Control RC1.rar
    107.3 KB · Visitas: 121
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!!.
 
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.
 
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.
 

Adjuntos

  • beta.rar
    26.8 KB · Visitas: 55
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.
 
Última edición:
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 :D!, 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!!!!
 
Nueva versión RC1. (Candidata a definitiva.)

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

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

Adjuntos

  • SPCTRL vRC1.rar
    352.1 KB · Visitas: 97
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
 
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 !
 
Atrás
Arriba