Interfaz RS232 PIC PC (Proyecto Completo VB6)

Saludos willyfv
Saludos, gracias por el gran aporte que has hecho
De nada. Espero que te sea de utilidad. :)
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

* ¿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 ÿ
¿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.
 
Última edición:
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
 
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
 

Adjuntos

  • pruebas.rar
    44.5 KB · Visitas: 69
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.
 

Adjuntos

  • HT_Prueba_001.gif
    HT_Prueba_001.gif
    18.6 KB · Visitas: 51
  • SPCTRL_Prueba_001.gif
    SPCTRL_Prueba_001.gif
    20.3 KB · Visitas: 61
  • prueba II.rar
    45.5 KB · Visitas: 138
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 ?
 
Última edición por un moderador:
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.
 
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"
 

Adjuntos

  • FE_2013.jpg
    FE_2013.jpg
    55.5 KB · Visitas: 32
Última edición por un moderador:
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¡
 

Adjuntos

  • error.jpg
    error.jpg
    168.3 KB · Visitas: 22
  • error2.jpg
    error2.jpg
    90 KB · Visitas: 16
Última edición:
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
 
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
 
Última edición por un moderador:
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 :D!

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;
}
}
}

13111908432216179.jpg


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 <= 0:LOL:5 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.
 
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.
 

Adjuntos

  • Programas VB6 y PICC.rar
    117.6 KB · Visitas: 109
Gracias por tu ayuda :D!, 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
 
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.
 
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?
 

Adjuntos

  • comuncacion serial pic.zip
    27.3 KB · Visitas: 76
  • serial pic.jpg
    serial pic.jpg
    295.8 KB · Visitas: 35
¿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.
 
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!.

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 :LOL:!! gracias!!
 

Adjuntos

  • Tester.rar
    717.7 KB · Visitas: 69
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.

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.
 
Atrás
Arriba