TODOPIC
Microcontroladores PIC => Todo en microcontroladores PIC => Mensaje iniciado por: the king 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
-
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?
-
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
-
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 (http://picmania.garcia-cuervo.net/Conceptos.php#USB4Mhz).
-
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
-
A mandar, que para eso estamos. :mrgreen:
-
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. :) :)