# Ayuda con VB.net y RS232 PIC 18F



## davidov.ibz (Mar 21, 2011)

Hola a todos, estoy liado con un proyecto donde he de trabajar con el puerto serie y un pic 18f4550, ahora mismo lo tengo montado, y gracias a las explicaciones que he ido encontrando he logrado comunicar con éxito el PC y el PIC.

El problema viene cuando quiero mandar un caracter ASCII desde VB.net al pic, si por ejemplo mando el ASCII "1" (código 49), el display que tengo montado en el pic me muestra "g" (código 103).

El código que uso (lo más simple que se me ha ocurrido para ir complicando poco a poco) es el siguiente:

*VB.net 2010:*

Public Class Form1

    Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
        Dim data(1) As Byte
        data(0) = Asc(1)              'Aquí es donde introduzco el caracter que deseo enviar.
        SerialPort1.Write(data, 0, 1)
        Label1.Text = data(0)
    End Sub

    Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
        SerialPort1.Open()
    End Sub
End Class

*PIC CCS (he quitado algunas líneas de los FUSES para que sea más legible):*

#use rs232(baud=9600, xmit=pin_C6, rcv=pin_C7, bits=8, parity=N)

int ch=0;

#int_rda
void serial_isr()
{
   ch=getchar();
}

void main()
{
   lcd_init();
   enable_interrupts(global);
   enable_interrupts(int_rda); 
   while(1)
   {
      printf(lcd_putc,"\nValor %u",ch);   //Ahora mismo lo que está imprimiendo es el valor del código ASCII que le llega, no el caracter.
   }     
}

Estoy seguro de que es alguna tontería que se me escapa por mi ignorancia, espero que alguien me pueda echar una mano.


----------



## Unikfriend (Mar 21, 2011)

Hi david,
lo primero que tiene que hacer es averiguar de que lado esta el problema,
utiliza un programa snnifer para monitorear el puerto ethernet.
Asi te puedes dar cuenta si el proble es en VB o en el PIC


----------



## davidov.ibz (Mar 22, 2011)

Si me lo permiten vuelvo a reacer mi consulta ya que he probado un ejemplo más sencillo aún y me está dando el mismo fallo, de modo que no es cosa del VB.net!

He adjuntado un PDF con las capturas de las simulaciones, el código y una foto del circuito montado.

Ahora mismo, envío un dato del PC al PIC con una aplicación de comunicación por puerto serie (una herramienta del compilador CCS), aunque creo que también se puede con hyperterminal.

Bueno, envío un dato, del PC al PIC, el PIC muestra ese dato en un display (si es un ASCII mostrará su valor numérico), y a su vez, el PIC manda un dato (la letra "K" concretamente) al PC.

Es una locura, este circuito simulado funciona de maravilla, pero en la realidad no hay manera, y me va a dar  algo!

Llevo una semana con esta tontería, por favor, estoy realmente desesperado, esto es solo el principio de un pedazo proyecto que tengo que hacer y creo que me voy a quedar por el camino...


Les incluyo por aquí el código de todas formas por si el error es tan tonto que no hace falta ver ni las capturas:


```
#include <18f4550.h>

//#device adc=10 

#fuses HSPLL                  //High Speed Crystal/Resonator con PLL habilitado
#fuses NOWDT                  //No hay Wach Dog Timer
#fuses NOPROTECT              //No hay protección contra lectura
#fuses NOLVP                  //No se habilita el Low Voltage ICSP Programing
#fuses NODEBUG
#fuses USBDIV
#fuses PLL5
#fuses CPUDIV1
#fuses VREGEN

#use delay (clock = 48000000)

#use rs232(baud=9600, xmit=pin_C6, rcv=pin_C7, bits=8, parity=N)

#include "flex_lcd_izq.c"     

int ch;

#int_rda
void serial_isr() 
{
    ch=getchar();                //Recojo el valor del carácter en ch
    puts("K");                   //Escribo el caracter K
}

void main()
{
   lcd_init();
   enable_interrupts(global);
   enable_interrupts(int_rda);
   
   while(1)  
   {
      printf(lcd_putc, "\n\r Valor %u",ch);
   }
}
```


----------



## Unikfriend (Mar 22, 2011)

Hi, me equivoque pense que hablabas de ethernet pero hablas de rs232,
por que no pones el print dentro de la interrupcion,
que se supone que imprime si no recibe dato?


void serial_isr() 
{
    ch=getchar();                                        //Recojo el valor del carácter en ch
    puts("K");                                              //Escribo el caracter K
    printf(lcd_putc, "\n\r Valor %u",ch);
}

void main()
{
   lcd_init();
   enable_interrupts(global);
   enable_interrupts(int_rda);

   while(1)  
   {

   }
}




ya revisaste la linea de RX con el osciloscopio o reeviendo el mismo dato recibido,
tambien puedes hacer un for para verificar que estas usando el mapa de caracteres correcto,

for(ch=33;ch<128;ch++)
  printf(lcd_putc, "\n\r Valor %u",ch);


----------



## EINNER C (Mar 22, 2011)

davidov.ibz dijo:


> Si me lo permiten vuelvo a reacer mi consulta ya que he probado un ejemplo más sencillo aún y me está dando el mismo fallo, de modo que no es cosa del VB.net!
> 
> He adjuntado un PDF con las capturas de las simulaciones, el código y una foto del circuito montado.
> 
> ...



si puedes subir en un comprimido el archivo de simulacion para poder ver mas calaramente y trabajar en el, si lo subes, mirare en la noche que puedo hacer, ahora no tengo mucho tiempo, pero estoy seguro de que es un error simple, y se puede solucionar, hasta luego


----------



## davidov.ibz (Mar 22, 2011)

Solucionado!!

Tenía un MAX 232 por casa, así que lo monté en lugar del MAX 233 y me ha funcionado  
Ahora lo que quiero hacer es volver a poner el MAX 233 otra vez, por que me da la impresión de que tenía algo mal conectado y por eso me hacía cosas raras.

Muchas gracias por contestarme de todos modos, seguramente estaré más por aquí, ya que el proyectito que tengo se las trae XD

Siguiente paso conseguir que comunique una cámara TTL con el pic, a ver que pasa


----------

