Autor Tema: PIC 18f4550 y RS232  (Leído 4135 veces)

0 Usuarios y 1 Visitante están viendo este tema.

Desconectado the king

  • PIC10
  • *
  • Mensajes: 3
PIC 18f4550 y RS232
« en: 18 de Febrero de 2008, 20:19:06 »
Hola. Tengo un problema.
Estoy haciendo un proyecto en el cual uso el USB del PIC para darle ordenes y desde el PIC paso letras al PC por 232, mi sorpresa es que con un programita hecho en vb me salen caracteres muy raros,

Los envios desde el micro son en codigo ASCII y en VB ni me los combierte ni nada.
Pongo el codigo de recepcion de VB y un pantallazo a ver si le veis algo.

Saludos

Private Sub Form_Load()
velocidad = Form1.velocidad
puerto = Form1.puerto

MSComm1.Settings = Str$(velocidad) + ",n,8,1"  'cargo la configuracion
MSComm1.CommPort = puerto             'cargo el puerto
MSComm1.PortOpen = True          'abro el puerto
Timer1.Enabled = False  'INICIALIZO CON EL TIMER DESHABILITADO

End Sub

Private Sub Command1_Click()

dato = Text1.Text
   
   MSComm1.Output = dato   'envio un dato

End Sub

Private Sub Command2_Click()

datorecibido = MSComm1.Input 'Recibo un dato
Label1.Caption = datorecibido

Text2.Text = Text2.Text + datorecibido

If Option1 = True Then 'Aqui compruebo si hemos elegido Recepcion continua
    Timer1.Enabled = True   'Habilito el timer para recibie cada cierto tiempo
End If

End Sub
Private Sub Command3_Click()

Timer1.Enabled = False  'deshabilito el timer

End Sub

Private Sub Command4_Click()
                         
MSComm1.PortOpen = False  'cierro el puerto

Unload Me   'Descargo el formulario 2
Form1.Show  'Muestro el formulario 1

End Sub

Private Sub MSComm1_OnComm()
datorecibido = MSComm1.Input 'Recibo un dato

Label1.Caption = datorecibido

Text2.Text = Text2.Text + datorecibido

End Sub

Private Sub Timer1_Timer()

datorecibido = MSComm1.Input 'Recibo un dato
   
j = CInt(datorecibido)
i = Chr(j)

Label1.Caption = i
Text2.Text = Text2.Text + i

End Sub

Private Sub CmdSalir_Click()
MSComm1.PortOpen = False         'cierro el puerto
End
End Sub



El codigo del micro es el siguiente: solo para la transmision


#include <18f4550.h>
#fuses HSPLL,NOWDT,NOPROTECT,NOLVP,NODEBUG,USBDIV,PLL5,CPUDIV1,VREGEN
#use delay(clock=20000000)
#use standard_io(b)
#use rs232(baud=9600, xmit=PIN_C6, rcv=PIN_C7)

#define LEDV PIN_B4
#define LEDR PIN_B5
#define LED_ON output_high
#define LED_OFF output_low

void main() {

  do{

  LED_OFF(LEDR);
  LED_ON(LEDV); //encendemos led verde
  delay_ms(1000);

  putc(72);
  LED_OFF(LEDV); //encendemos led rojo
  LED_ON(LEDR);
  delay_ms(500);
 
  putc(79);
  LED_OFF(LEDR);
  LED_ON(LEDV); //encendemos led verde
  delay_ms(500);
 
  putc(76); 
  LED_OFF(LEDV); //encendemos led rojo
  LED_ON(LEDR);
  delay_ms(500);
 
  putc(65);
  LED_OFF(LEDR);
  LED_ON(LEDV);
  delay_ms(500);
 
  putc(32);
  LED_OFF(LEDV);
  LED_ON(LEDR);
  delay_ms(500)
 
  putc(72);
  LED_OFF(LEDR);
  LED_ON(LEDV);
  delay_ms(500);
 
  putc(79);
  LED_OFF(LEDV);
  LED_ON(LEDR);
  delay_ms(500);
 
  putc(76);
  LED_OFF(LEDR);
  LED_ON(LEDV);
  delay_ms(500);
 
  putc(65);
  LED_OFF(LEDV);
  LED_ON(LEDR);
  delay_ms(500);
 
  putc(79);
  LED_OFF(LEDR);
  LED_ON(LEDV);
  delay_ms(500);
 
  putc(83);
  LED_OFF(LEDV);
  LED_ON(LEDR);
  delay_ms(500);
 
  putc(32);
  LED_OFF(LEDR);
  LED_ON(LEDV);
  delay_ms(500);
 
  putc(85);
  LED_OFF(LEDV);
  LED_ON(LEDR);
  delay_ms(500);
 
  putc(83);
  LED_OFF(LEDR);
  LED_ON(LEDV);
  delay_ms(500);
 
  putc(66);
  LED_OFF(LEDV);
  LED_ON(LEDR);
  delay_ms(500);
 
  putc(32);
  LED_OFF(LEDR);
  LED_ON(LEDV);
  delay_ms(500);
 
  putc(80);
  LED_OFF(LEDV);
  LED_ON(LEDR);
  delay_ms(500);
 
  putc(82);
  LED_OFF(LEDR);
  LED_ON(LEDV);
  delay_ms(500);
 
  putc(69);
  LED_OFF(LEDV);
  LED_ON(LEDR);
  delay_ms(500);
 
  putc(80);
  LED_OFF(LEDR);
  LED_ON(LEDV);
  delay_ms(500);
 
  putc(65);
  LED_OFF(LEDV);
  LED_ON(LEDR);
  delay_ms(500);
 
  putc(82);
  LED_OFF(LEDR);
  LED_ON(LEDV);
  delay_ms(500);
 
  putc(65);
  LED_OFF(LEDV);
  LED_ON(LEDR);
  delay_ms(500);
 
  putc(68);
  LED_OFF(LEDR);
  LED_ON(LEDV);
  delay_ms(500);
 
  putc(79);
  LED_OFF(LEDV);
  LED_ON(LEDR);
  delay_ms(500);
 
  putc(32);
  LED_OFF(LEDR);
  LED_ON(LEDV);
  delay_ms(500);
 
   }while(true);
}



Espero que veais el fallo

Saludos



Desconectado maunix

  • Moderadores
  • DsPIC33
  • *****
  • Mensajes: 4751
    • Mi Sitio Web Personal
Re: PIC 18f4550 y RS232
« Respuesta #1 en: 18 de Febrero de 2008, 22:31:23 »
Una de las cosas que puede suceder, es que tengas mal el baudeaje.

Viendo tu código observo que configuraste tu oscilador en 20Mhz y el fuse del PLL está activado.  Ahora bien, en el hardware ¿qué cristal le has puesto?
- La soberbia de un Einstein es entendible.. la de un salame es intolerable (A.Dolina)
- En teoría no hay diferencia entre la teoría y la práctica. En la práctica... si la hay.
- Lee, Lee, Lee y luego pregunta.(maunix)
- Las que conducen y arrastran al mundo no son las máquinas, sino las ideas (V. Hugo)
- Todos los hombres se parecen por sus palabras; solamente las obras evidencian que no son iguales.(Moliere)
- Todo debería ser hecho tan simple como sea posible pero no mas simple que eso.(A.Einstein)

Desconectado the king

  • PIC10
  • *
  • Mensajes: 3
Re: PIC 18f4550 y RS232
« Respuesta #2 en: 19 de Febrero de 2008, 17:48:32 »
Hola.

le he puesto 20Mhz y la velocidad de transmision es 9600bps en los 2 lados.

¿Quieres decir que tengo que quitar el PLL????????

Gracias

Desconectado RedPic

  • Administrador
  • DsPIC33
  • *******
  • Mensajes: 5544
    • Picmania by Redraven
Re: PIC 18f4550 y RS232
« Respuesta #3 en: 19 de Febrero de 2008, 19:08:57 »
Tiene razón Maunix, con un cristal de 20 Mhz y los fuses HSPLL y PLL5 activados tu 18F4550 está "corriendo" realmente a 48 Mhz por lo que al declarar #use delay(clock=20000000) estás engañando al compilador diciéndole que está funcionando a 20 Mhz en lugar de los 48 Mhz reales. Al calcular éste los timmings necesarios para enviar los bits serie a 9600 baudios usa información errónea y por eso no son capaces de ponerse de acuerdo ambos.

Puedes hacer dos cosas:
1.- Pon el fuse HS y quita los HSPLL y PLL5 y así #use delay(clock=20000000) será cierto ya que tu PIC "correra" realmente a 20 Mhz ó ...
2.- Pon #use delay(clock=48000000) que es la velocidad real con HSPLL y PLL5 activados.

Puedes ver mas información sobre la configuración del clock en Consiguiendo 4 Mhz para los 48 Mhz necesarios en los PIC's con USB 2.0.
« Última modificación: 19 de Febrero de 2008, 19:11:23 por RedPic »
Contra la estupidez los propios dioses luchan en vano. Schiller
Mi Güeb : Picmania

Desconectado the king

  • PIC10
  • *
  • Mensajes: 3
Re: PIC 18f4550 y RS232
« Respuesta #4 en: 19 de Febrero de 2008, 19:59:01 »
Gracias por vuestra ayuda, teniais razon, probe de quitar el PLL y funcionaba perfecto, luego probe de poner 48Mhz y tachan... perfectro otra vez.

He puesto 48Mhz, por que trabajo en paralelo con el USB.

Gracias de nuevo.

Saludos

Desconectado RedPic

  • Administrador
  • DsPIC33
  • *******
  • Mensajes: 5544
    • Picmania by Redraven
Re: PIC 18f4550 y RS232
« Respuesta #5 en: 19 de Febrero de 2008, 20:00:00 »
A mandar, que para eso estamos.  :mrgreen:
Contra la estupidez los propios dioses luchan en vano. Schiller
Mi Güeb : Picmania

Desconectado maunix

  • Moderadores
  • DsPIC33
  • *****
  • Mensajes: 4751
    • Mi Sitio Web Personal
Re: PIC 18f4550 y RS232
« Respuesta #6 en: 19 de Febrero de 2008, 20:47:42 »
le he puesto 20Mhz y la velocidad de transmision es 9600bps en los 2 lados.

¿Quieres decir que tengo que quitar el PLL????????

Si, a eso me refería pero Diego ya te dió la solución.  La pregunta era porque si le habías colocado otro cristal pero la proporcionalidad del PLL daba correcta entonces no iba por allí el problema.

En tu caso como el HSPLL cambia el clock te cambia la referencia para el baudrate generator y por eso tenías el problema.  :) :)

- La soberbia de un Einstein es entendible.. la de un salame es intolerable (A.Dolina)
- En teoría no hay diferencia entre la teoría y la práctica. En la práctica... si la hay.
- Lee, Lee, Lee y luego pregunta.(maunix)
- Las que conducen y arrastran al mundo no son las máquinas, sino las ideas (V. Hugo)
- Todos los hombres se parecen por sus palabras; solamente las obras evidencian que no son iguales.(Moliere)
- Todo debería ser hecho tan simple como sea posible pero no mas simple que eso.(A.Einstein)