Problema Comunicacion en serie PIC a PC. VB6 + CCS + Proteus -> Simbolos extraños!

Hola amigos, tengo un problemilla, haber si me podeis ayudar...


trato de hacer un programa que capture señal analogica con un pic y la envie a un pc mediante un max232,
y tengo un un problemilla (problemon)!

software:
Proteus
PCW ccs
Virtual Serial Port Driver
Visual basic 6

Me descargue un ejemplo que funciona, lo malo es que esta diseñado para un pic 16f84 en conjunto con un ADC,
y lo que necesito es hacerlo correr en un 16f876a.

Trato de hacerlo en ccs y utilizando el mismo vb cambiando algunos parametros como el Mscom, Baud rate, etc.
con el fin de adaptarlo a las necesidades...

Y creo que el problema radica en el codigo CCS del pic16f876a que no envia adecuadamente los datos ya que
¡EL VIRTUAL TERMINAL DE PROTEUS SOLO ARROJA SIMBOLOS EXTRAÑOS!, y el visual basic recive incongruencias o nada.

Podia alguien ayudarme?, estoy bastante presionado porque debo acabarlo para el martes y no me sale estoy atascado!


Agradeceria la ostia a quien me ayudase ya que necesito solucion o mi jefe no se jajaj acabamos de empezar las praktikas y no la quiero cagar jaja

1Aqui estan los codigos fuente
https://docs.google.com/file/d/0BzzRKo_lcYklZ1dHLWpSellnS3M/edit?usp=sharing

1En esta foto el esquema de lo que pretendo hacer,
eskema+fletxas.png


2Aqui el resultado de las virtual terminal de ambos pics (puse el que va y el que no va en el mismo proteus para apreciar mejor)
prot.png


3 aqui visual basic reciviendo el dato del pic16f84, el que va y no necesito :D


vb_prot.png


4Aqui el programa visual basic que uso

Código:
Dim Cadena As String

Private Sub Conectar_Click()
   MSComm1.CommPort = 5 ' esto variaaa segun
   MSComm1.PortOpen = True
   MSComm1.Settings = "1200,N,8,1"
   MSComm1.InputLen = 0
   MSComm1.RThreshold = 1
   MSComm1.RTSEnable = True
   Siempre_Encima Form1, True
   Me.Caption = "Conectado"
End Sub

Private Sub Desconectar_Click()
  If MSComm1.PortOpen Then
   MSComm1.PortOpen = False
   Me.Caption = "Desconectado"
  End If
End Sub

Private Sub Form_Unload(Cancel As Integer)
  Desconectar_Click
End Sub

Private Sub MSComm1_OnComm()
  Dim i As Integer
  Dim Valor As String
  Valor = MSComm1.Input
  i = InStr(Valor, Chr(13))
  If i = 0 Then
    Cadena = Cadena & Valor
  Else
    Cadena = Cadena & Left(Valor, i - 1)
    Rx.Text = Rx.Text & vbCrLf & Cadena
    Rx.SelStart = Len(Rx.Text)
    Cadena = ""
  End If
End Sub



5Aqui el programa ccs

Código:
#include <16F876a.h>
#device adc = 8   /// must be improved to 10 bites
#fuses XT, NOWDT,NOPROTECT

#use delay(clock=4000000)
#use rs232(baud=1200,xmit=PIN_C6)
//#use rs232(baud=1200,parity=N,xmit=PIN_C6,rcv=PIN_C7,bits=8,stop=2)   /// framentos de mil pruebas
//#use RS232(BAUD=1200,XMIT=PIN_C6,RCV=PIN_C7,PARITY=N,BITS=8,STREAM=STR_PC) 
int trace;
void main () {
 setup_adc(ADC_CLOCK_INTERNAL);
   setup_adc_ports(AN0)   ;
   set_adc_channel(0);
   
   while(1){
   
   set_tris_A(0x01);
   set_tris_B(0x00);
   set_tris_C(0x00);
  trace= read_adc();
   putc(trace);
 // putc(PUTCHAR(65));  // mas pruebas
    delay_ms(500);
   }
   
}

Podeis ayudarmee??? e intentado mil formas, he mancillado a google, y obligue a mirar a taringa y wikipedia y aun asi no he podido saciarme jajaja
Un saludo gracias!
 
Última edición:
Primero yo dejaría la línea de código del PIC:

#use rs232(baud=1200,parity=N,xmit=PIN_C6,rcv=PIN_C7,bits=8,stop=1)

Ya que aquí se especifica todo lo necesario para comunicación serie.
* La velocidad (1200 bps), sin paridad (parity=N), 8 bits de datos (bits=8), un bit de parada (stop=1)
* Los pines de transmisión y recepción (xmit=PIN_C6,rcv=PIN_C7)

Si revisas el código de la aplicación de VB, esta configuración que te dí para el PIC, coincide con la del programa.

Por otro lado, el error grave en el PIC y la causa por la que te aparecen todos esos símbolos raros, es que estas transmitiendo un dato binario mediante putc().
Esto es porque el valor de la variable trace es un número entre 0 y 255.
Si lo que quieres transmitir es el valor de dicho numero utiliza la función itoa(), la cual te convierte un int en caracteres numéricos así:

putc(itoa(trace));
 
Saludos polimetro.
En si, en tu código de CCS solamente había un problema.
Únicamente tenías que enviar los datos de esta forma...
printf("Valor = %u\r\n",trace);
Así ya lo podrás leer en VB6

Al código en VB6 solo le hacía falta agregar un método de detección de errores.

Adjunto tu proyecto con las correcciones, ya funcionando.

Suerte.
 

Adjuntos

  • COM Serial.rar
    46.1 KB · Visitas: 201
Porque la velocidad de entrada no es la misma que el de salida, ponlo en 9.600 baudios, es el estandar mínimo
recomendable en términos de compatibilidad de equipos viejos.
 
Atrás
Arriba