Autor Tema: Problema con recepcion datos usart  (Leído 4574 veces)

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

Desconectado Trust

  • PIC16
  • ***
  • Mensajes: 141
Problema con recepcion datos usart
« en: 24 de Enero de 2009, 20:02:01 »
Hola, estoy haciendo pruebas con el puerto serie, usando el VB en el pc y el C de CCS en el pic.
Yo envio datos desde el pc y escribo en la lcd lo que recibe el pic. En el lcd no me aparece lo que yo envio desde el pc, me sale "X X".

Os pongo una parte del programa en VB:
Código: [Seleccionar]

Private Sub botonrojo_Click()
If Sharojo.Visible = False Then
Sharojo.Visible = True
Pserie1.PortOpen = True
Pserie1.Output = "a" & Chr(13)
Pserie1.PortOpen = False
Else
Sharojo.Visible = False
Pserie1.PortOpen = True
Pserie1.Output = "b" & Chr(13)
Pserie1.PortOpen = False
End If

Y ahora os pongo el programa que tengo en el pic. El programa es de la pagina Experimento básico 6: Escribiendo en el LCD lo recibido por la RS-232

Aqui os pongo el codigo:

Código: [Seleccionar]

include <16f876a.h>
#fuses XT,NOWDT,NOPROTECT,NOLVP,PUT,BROWNOUT
#use delay(clock=4000000)
#use standard_io(b)
#use rs232(baud=9600, xmit=PIN_C6, rcv=PIN_C7)

#define LCD_DB4 PIN_B4
#define LCD_DB5 PIN_B5
#define LCD_DB6 PIN_B6
#define LCD_DB7 PIN_B7

#define LCD_RS PIN_C0
#define LCD_RW PIN_C1
#define LCD_E PIN_C2

#include "flex_lcd.c"


char Keypress=' ';

#int_rda
void serial_isr() {

  Keypress=0x00;
  if(kbhit()){
    Keypress=getc();
  }
}


void main() {

  enable_interrupts(global);
  enable_interrupts(int_rda);

  printf("\r\n\LCD driver monitor\r\n");

  lcd_init();

  do {

    if(Keypress!=0x00){
      lcd_putc(Keypress);
      putc(Keypress);
      Keypress=0x00;
    }

  } while (TRUE);
}


No se si es que hay que hacer algun tipo de conversion o que hay que hacer. Tambien he probado ha enviar en vez de "a" un "1" y el resultado es el mismo no me muestra lo que yo envio.


Desconectado Trust

  • PIC16
  • ***
  • Mensajes: 141
Re: Problema con recepcion datos usart
« Respuesta #1 en: 25 de Enero de 2009, 08:45:00 »
Hola, sigo sin hacerlo funcionar. Cuando envio por ejemplo "a" o "b" o "1" o el caracter que se en el lcd me aparece una "X" o dos o tres "X". Creo que es un problema de conversion de datos y que el lcd no reconoce el dato que le escribo. Pero esto no lo he visto en ningun sitio, todo lo que he visto es que reciben un caracter enviado desde el pc y lo muestran directamente en el lcd. De momento solo me interesa saber recibir un dato y hacer una determinada tarea. Ya llevo varias semanas con esto y ya no se que hacer.
Pongo aqui el circuito del max232 por si esta mal hecho.


Desconectado Trust

  • PIC16
  • ***
  • Mensajes: 141
Re: Problema con recepcion datos usart
« Respuesta #2 en: 25 de Enero de 2009, 09:32:54 »
Ahora estoy probando el Serial Input/Output Monitor que es la primera vez que lo uso. Envio un 49 que es el "1" en ascii y en la lcd me sigue saliendo lo mismo, "X".
En el Line Status me aparecen en rojo: DRS, DCD, CTS, RING, ERROR, BREAK, TXD Y RXD.
En verde: RTS Y DTR.

¿Tendria que salir en verde el TXD cuando envio?
A mi me sale en rojo todo el tiempo.

Os pongo una imagen del Serial Input/Output Monitor del PCW CCS.


[IMG]

Desconectado RedPic

  • Administrador
  • DsPIC33
  • *******
  • Mensajes: 5552
    • Picmania by Redraven
Re: Problema con recepcion datos usart
« Respuesta #3 en: 25 de Enero de 2009, 11:29:20 »
Trust:

Primero deberías comprobar que se ve bien el LCD independiente de si recibes algo o no y después comprobar si el PIC recibe o no independiente del LCD, y después todo junto si en programa del PC envía lo que deseas y se corresponde con lo que el PIC recibe. Puede ser que lo uno o lo otro.

Para el LCD debería colocar alguna salida sobre él independiente de si recibes o no algo. Para ello te propongo que coloques una salida de texto  antes del do {} while (TRUE);

O sea algo así:

Código: CSS
  1. void main() {
  2.  
  3.   char Text[]="\fLCD Test\n";
  4.  
  5.   enable_interrupts(global);
  6.   enable_interrupts(int_rda);
  7.  
  8.   printf("\r\n\LCD driver monitor\r\n");
  9.  
  10.   lcd_init();
  11.  
  12.   delay_ms(1000);
  13.   lcd_put_string(Text);  // Saca algo por el LCD
  14.   lcd_gotoxy(0,2);
  15.  
  16.   do {
  17.  
  18.     if(Keypress!=0x00){
  19.       lcd_putc(Keypress);
  20.       putc(Keypress);
  21.       Keypress=0x00;
  22.     }
  23.  
  24.   } while (TRUE);
  25. }

Esto hace que al darle corriente al PIC envíe primero el texto "LCD Test" al LCD y debes verlo. Si no lo ves entonces el problema está en el LCD.

Después debes comprobar si recibes algo.

Para ello podrías poner un LED en algún PIN y comprobar si por ejemplo se conmuta al recibir cualquier cosa o alguna en concreto.

Por ejemplo conmutando cuando reciba algo la interrupción:

Código: CSS
  1. #int_rda
  2. void serial_isr() {
  3.  
  4.   Keypress=0x00;
  5.   if(kbhit()){
  6.     Keypress=getc();
  7.     output_toggle(PIN_B0);
  8.   }
  9. }

o cuando reciba un carácter en concreto:

Código: CSS
  1. #int_rda
  2. void serial_isr() {
  3.  
  4.   Keypress=0x00;
  5.   if(kbhit()){
  6.     Keypress=getc();
  7.     if(Keypress=='1'){
  8.       output_toggle(PIN_B0);
  9.     }
  10.   }
  11. }

esto debería conmutar ese PIN solo cuando reciba un '1' ASCII.

De todas formas fíjate que en mi programa original de pruebas devuelvo lo recibido, así que el programa monitor debería recibir exactamente lo mismo que envíe al PIC, deberias escribir en el monitor e ir viendo lo escrito como con eco.

Código: CSS
  1. if(Keypress!=0x00){
  2.       lcd_putc(Keypress);
  3.       putc(Keypress);       // Esto devuelve lo que recibe (si es que recibe algo)
  4.       Keypress=0x00;
  5.     }

Bueno, por ahora creo que tienes cosas para investigar ...  :mrgreen:
Contra la estupidez los propios dioses luchan en vano. Schiller
Mi Güeb : Picmania

Desconectado nico

  • PIC16
  • ***
  • Mensajes: 180
Re: Problema con recepcion datos usart
« Respuesta #4 en: 25 de Enero de 2009, 11:44:26 »
Tres cosas que puedes probar, una es la velocidad configurada de tu port en la pc, que sea similar al colocado en el pic. Por otro lado, si tienes un osciloscopio, puedes monitorear la salida de los caracteres por el port del pc, para saber si salen como los esperas. Por ultimo envia algo con el hyperterminal o cualquier programa similar.

Espero te sirva....
Saludos.

Desconectado Trust

  • PIC16
  • ***
  • Mensajes: 141
Re: Problema con recepcion datos usart
« Respuesta #5 en: 25 de Enero de 2009, 13:45:07 »
Hola RedPic, muchisimas gracias por tu ayuda.  :P
El Lcd si que funciona bien, lo he probado con otros programas que he hecho y va bien.
He probado el primer codigo que me has puesto y me sale error en la instruccion:
lcd_put_string(Text);  // Saca algo por el LCD

Uso el PCW CCS C.

Esa instruccion es la primera vez que la veo. ¿Es compatible con el compilador que uso?

Voy a probar los otros ejemplos que me has puesto.
Muchas gracias RedPic y tambien gracias a nico.

Pronto escribo de como me va.

Desconectado Trust

  • PIC16
  • ***
  • Mensajes: 141
Re: Problema con recepcion datos usart
« Respuesta #6 en: 25 de Enero de 2009, 14:05:19 »
Hola RedPic, ya he conseguido compilar el codigo, el problema era que tenia que inlcluir la segunda version del Lcd_flex, o sea : Lcd_Flex_2.c.

Ahora me compila pero, por la pantalla del LCD me salen las "X".
¿Te ha pasado eso alguna vez?

Voy a probas los otros ejemplos.

Desconectado Trust

  • PIC16
  • ***
  • Mensajes: 141
Re: Problema con recepcion datos usart
« Respuesta #7 en: 25 de Enero de 2009, 15:48:57 »
Hola RedPic, tengo muchas cosas que investigar y ya he investigado muchas.
He probado los codigos y cuando:

Código: [Seleccionar]
#int_rdavoid serial_isr() {   
Keypress=0x00; 
if(kbhit()){   
Keypress=getc();   
output_toggle(PIN_B0); 
 }
}


Este ejemplo funciona bien, cambia el led de encendido/apagado cuando el pic recibe algun dato del pc

Pero este otro no me funciona:

Código: [Seleccionar]

#int_rdavoid serial_isr() {
   Keypress=0x00; 
if(kbhit()){   
Keypress=getc();   
 if(Keypress=='1'){     
 output_toggle(PIN_B0); 
  } 
}
}

El programa del pic no me sabe reconocer que dato le estoy enviando, si es 1, 2, a o b o lo que sea. Solo he conseguido que detecte que hay algo (el primer ejemplo) pero, no se como hacer para que el pic me reconozca que dato concretamente le estoy enviando, entonces un programa que no sabe exactamente que es lo que recibe pues no me vale.  :(

En el SIOW de PCH cuando envio un "1" aparece detras un "?".
¿Esto porque es?

Ya no se me ocurre que hacer, habre probado como unas 200 veces y no me va bien.  :(
¿Me puedes enviar algun codigo parecido?
« Última modificación: 25 de Enero de 2009, 15:58:39 por Trust »

Desconectado RedPic

  • Administrador
  • DsPIC33
  • *******
  • Mensajes: 5552
    • Picmania by Redraven
Re: Problema con recepcion datos usart
« Respuesta #8 en: 25 de Enero de 2009, 16:04:11 »
¿Tienes el PIC 16F876A con un cristal de 4 Mhz?
Contra la estupidez los propios dioses luchan en vano. Schiller
Mi Güeb : Picmania

Desconectado Trust

  • PIC16
  • ***
  • Mensajes: 141
Re: Problema con recepcion datos usart
« Respuesta #9 en: 25 de Enero de 2009, 16:18:10 »
No,estoy probando con un 18f4550 a 12 mhz pero tambien lo he probado a 4 mhz.

Pongo el codigo:

Citar
#include <18f4550.h>  // PIC que se va a utilizar
#fuses HSPLL,NOWDT,NOPROTECT,NOLVP,NODEBUG,USBDIV,PLL3,CPUDIV1,VREGEN  //Ordenes para el programador
#use delay(clock=12000000)  //fosc= 12 Mhz


#use rs232(baud=9600, xmit=PIN_C6, rcv=PIN_C7)

// Asignacion del pineado de LCD  16X2, 16 caracteres por linea
// Usando una interfaz de 4 bits
// Uso una LCD con el controlador HD44780
//#define LCD_DB4   PIN_b4  //Bus datos
//#define LCD_DB5   PIN_b5  //Bus datos
//#define LCD_DB6   PIN_b6  //Bus datos
//#define LCD_DB7   PIN_b7  //Bus datos
//#define LCD_RS    PIN_b2  //Seleccion de registro
//#define LCD_RW    PIN_b3  //Lectura/Escritura
//#define LCD_E     PIN_b1  //Enable "Activacion"

//#include "flex_lcd.c"     //libreria manejo lcd



char Keypress=' ';

#int_rda
void serial_isr() {

  Keypress=0x00;
  if(kbhit()){
    Keypress=getc();
       
       
       
   if(Keypress=='3'){      output_toggle(PIN_B0);
   }
 
  } 
}


void main() {

  char Text[]="\fLCD Test\n";
 enable_interrupts(global); 
 enable_interrupts(int_rda);   
 printf("\r\n\LCD driver monitor\r\n");   
// lcd_init();   
 delay_ms(1000); 
 //lcd_putc("Hola");  // Saca algo por el LCD 
 //lcd_gotoxy(0,2);   
 do {     
 if(Keypress!=0x00)
 {       

 putc(Keypress);
 //lcd_putc(Keypress);
 Keypress=0x00;   
 }   
 } while (TRUE);
 }

Desconectado Trust

  • PIC16
  • ***
  • Mensajes: 141
Re: Problema con recepcion datos usart
« Respuesta #10 en: 25 de Enero de 2009, 16:51:49 »
Ya me funciona con una placa en la que tengo un 16F876A, 4 leds y la lcd aun no lo he probado pero por lo menos los leds si me van.

En el SIOW con el 16F876A si que devuelve lo que le envio pero, en el 18F4550 no lo devuelve.
Puede que sea por mala configuracion de los fuses?
Lo pongo aqui:

Citar

#fuses HSPLL,NOWDT,NOPROTECT,NOLVP,NODEBUG,USBDIV,PLL3,CPUDIV1,VREGEN

Muchas gracias RedPic.
Voy haciendo pruebas y pronto escribo mas.
 :-)

Desconectado RedPic

  • Administrador
  • DsPIC33
  • *******
  • Mensajes: 5552
    • Picmania by Redraven
Re: Problema con recepcion datos usart
« Respuesta #11 en: 25 de Enero de 2009, 17:04:53 »
A pesar de todo ponle bien el TRIS al puerto C del 18F4550 (estos PICs grandes son así de puñeteros)

Código: CSS
  1. set_tris_c(0b10000000);                  // Habilito como entrada RC7 para canal RS232
Contra la estupidez los propios dioses luchan en vano. Schiller
Mi Güeb : Picmania

Desconectado jhon364

  • PIC10
  • *
  • Mensajes: 6
Re: Problema con recepcion datos usart
« Respuesta #12 en: 16 de Febrero de 2009, 14:30:32 »
Hola Trust apenas me estoy empapando con tu tema pero queria hacerte una pregunta estas seguro que le estas diciendo cuantos bits va a recibir porque esto lo hago de la siguiente manera:

#use RS232(BAUD=9600, BITS=8 ,PARITY=N, XMIT=PIN_C6, RCV=PIN_C7)

y tu no tienes la parte de cuantos bits son creo que el ccs por defecto toma 9 bits si no lo cambias prueba denuevo con esto puede ser que sea esta la falla. Porque yo o probé así y me funcionó con todos los ejemplos que he hecho ah y tambien en la parte de definir la variable quisiera salir de una duda que tengo no se para que le colocas  Char Keypress=' '; para definirla disculpa la ignorancia pero es que nunca lo he usado y la he visto mucho por ahí en los foros.... yo siempre la defino Char Keypress; y nada mas.

espero este sea el problema porque a mi nunca me han quedado mal los pic y el ccs es un compilador muy potente....

saludos un placer haber leido tu problema cualquier cosa escribes como solucionaste el problema.



 

anything