Autor Tema: ayuda con cadena de datos  (Leído 1420 veces)

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

Desconectado scientist

  • Colaborador
  • PIC24F
  • *****
  • Mensajes: 999
ayuda con cadena de datos
« en: 11 de Septiembre de 2008, 01:53:43 »
Hola amigos del foro, me encuentro en un problemilla, lo que pasa es que estoy haciendo un programa que lea una cadena de datos del puerto serial UART de un pic 18f2550, y que esa cadena la mande al puerto usb en forma de dispositivo CDC, el problema que encuentro es que no manda nada de nada, se me hace muy raro que no detecte la interrupcion, cuando pongo un texto en una aplicacion que hice en C# desde la coomputadora al pic, si logra mandar la cadena de datos del usb al serial, pero no lo he logrado del serial al usb, alguna ayuda? gracias de antemano

PD primero quise hacerlo por interrupcion RDA y no me salia nada, despues intento hacerlo desde el ciclo while, y nada
NO le digas a DIOS que tienes un gran problema, dile a tu problema que tienes un GRAN DIOS!!
Alma mia y castillo mio, mi Dios en quien yo confiare....

Desconectado MLO__

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 4581
Re: ayuda con cadena de datos
« Respuesta #1 en: 11 de Septiembre de 2008, 13:46:04 »
Hola.

Me parece extrano que no te funcionen las interrupciones. El programa que te adjunto corre bien, lo que hace el PIC es enviar por serial un char cada cierto tiempo y queda a la espera del dato por el mismo serial, una vez recibido el dato completo envia el resultado de una operacion por USB. El manejo del serial esta basado en los ejemplos del maestro RedPic

Código: C#
  1. #include <18F2550.h>
  2. #device adc=10
  3. #fuses XT,NOWDT,PROTECT,NOLVP,NODEBUG,USBDIV,PLL1,CPUDIV1,VREGEN,FCMEN,PUT//good work
  4. #use delay(clock=4000000)//cristal de 4MHz
  5. #use rs232(baud=9600,parity=N,xmit=PIN_C6,rcv=PIN_C7,bits=8)//CONFIGURACION BALANZA
  6.  
  7. #include <usb_cdc.h>
  8. #include <input.c>
  9. #include <stdlib.h>
  10.  
  11. #define LED_ON  output_high
  12. #define LED_OFF output_low
  13. #define LED6    PIN_B6//BANDERA DE COMUNICACION
  14. #define LED7    PIN_B7//BANDERA DE NUMERACION
  15. #define LED5    PIN_B5
  16. #define LED4    PIN_B4
  17. #define LED3    PIN_B3
  18. #define LED2    PIN_B2
  19. #define LED1    PIN_B1
  20. #define LED0    PIN_B0
  21.  
  22. int const lenbuff=4;
  23. float const area_Td=3.8;
  24.  
  25. int1 data_rdy=0;
  26. int1 enviar_inicio=0;
  27. int1 enviar_stop=0;
  28.  
  29. char rcvchar;
  30. char cbuff[lenbuff];
  31. int xbuff=0x00;
  32. int ints=0, i;
  33. int32 time=0;
  34. float valor;
  35.  
  36. void addcbuff(char c);
  37.  
  38. #int_TIMER1////////////////////////////////////////////////////////////////////INTERRUPCION PARA EL TIMER1
  39. void TIMER1_isr (void)
  40. {//                                                                                                     tiempo de envio T = 9.96sg
  41.  ++ints;
  42.  if(ints>=19)//                                                                         t = 524.288mS
  43.         {
  44.          ints=0;
  45.          enviar_inicio=TRUE;
  46.          time+=10;
  47.         }
  48. }
  49. #int_rda///////////////////////////////////////////////INTERRUPCION PARA ENVIAR DATOS AL BUFFER DEL SERIAL
  50. void serial_isr()
  51. {
  52.   rcvchar=0x00;
  53.   if(kbhit())
  54.  {
  55.     rcvchar=getc();
  56.     addcbuff(rcvchar);
  57.   }
  58. }
  59. //////////////////////////////////                      SUBFUNCIONES                    /////////////////////////////////////
  60. void addcbuff(char c)
  61. {
  62.   switch(c)
  63.  {
  64.     case '\r':  break;
  65.         case '\n':  break;
  66.         case 'c' :  break;
  67.         case 's' :  break;
  68.         case ' ' :  break;
  69.         case 't' :  enviar_stop=TRUE;break;
  70.         case '!' :  data_rdy=TRUE;break;
  71.     default:    cbuff[xbuff++]=c;
  72.   }
  73. }
  74. /////////////////////////////////////////////////////////////////////////////////////////////////////////
  75.  void inicbuff(void)
  76. {
  77.   int i;
  78.  
  79.   for(i=0;i<lenbuff;i++)
  80.         {
  81.     cbuff[i]=0x00;
  82.         }
  83.   xbuff=0x00;
  84. }
  85. /////////////////////////////////////////////////////////////////////////////////////////////////////////
  86. void usb_debug_task(void) {
  87.    static int8 last_connected;
  88.    static int8 last_enumerated;
  89.    int8 new_connected;
  90.    int8 new_enumerated;
  91.    static int8 last_cdc;
  92.    int8 new_cdc;
  93.  
  94.    new_connected=usb_attached();
  95.    new_enumerated=usb_enumerated();
  96.    new_cdc=usb_cdc_connected();
  97.  
  98.    if (new_enumerated)
  99.       LED_ON(LED1);
  100.    else
  101.       LED_OFF(LED1);
  102.  
  103.    if (new_cdc)
  104.       LED_OFF(LED2);
  105.    else
  106.       LED_OFF(LED2);
  107.  
  108.    if (usb_cdc_carrier.dte_present)
  109.       LED_OFF(LED3);
  110.    else
  111.         {
  112.       time=0;
  113.           usb_cdc_putc(0x0C);
  114.         }
  115.  
  116.    last_connected=new_connected;
  117.    last_enumerated=new_enumerated;
  118.    last_cdc=new_cdc;
  119. }
  120. /////////////////////////////////////////////////////////////////////////////////////////////////////////
  121. void main(void)
  122. {
  123.  delay_ms(500);
  124.  inicbuff();
  125.  LED_ON(LED6); 
  126.  usb_cdc_init();
  127.  usb_init();
  128.  while(!usb_cdc_connected()) {}
  129.  LED_OFF(LED6);
  130.  
  131.  setup_timer_1(T1_INTERNAL|T1_DIV_BY_8);
  132.  enable_interrupts(int_timer1);
  133.  enable_interrupts(int_rda);
  134.  enable_interrupts(global);
  135.  usb_cdc_putc(0x0c);
  136.  
  137.  while (TRUE)
  138.         {
  139.      usb_task();
  140.          usb_debug_task();
  141.  
  142.         if(enviar_inicio)
  143.                 {
  144.                 enviar_inicio=FALSE;
  145.                 printf("cp\r\ncp\r\n");
  146.                 }
  147.  
  148.         if(data_rdy)
  149.                 {
  150.                         delay_ms(100);
  151.                         valor = atof(cbuff);
  152.                         valor /= area_Td;
  153.                         printf(usb_cdc_putc,"%lu,%2.1f\r\n",time, valor);
  154.                         inicbuff();
  155.                         data_rdy=FALSE;
  156.                 }
  157.        
  158.         if(enviar_stop)
  159.                 {
  160.                         printf("0p\r\n");
  161.                         delay_ms(250);
  162.                         enviar_stop=FALSE;
  163.                 }
  164.         }
  165. }

Espero te sirva de guia.

Saludos
El papel lo aguanta todo

Desconectado scientist

  • Colaborador
  • PIC24F
  • *****
  • Mensajes: 999
Re: ayuda con cadena de datos
« Respuesta #2 en: 11 de Septiembre de 2008, 19:03:05 »
Muchas gracias MLO, al parecer era un mal funcionamiento, pero mio, y no del micro, si funcionan correctamenre las interrupciones, ahora tengo problemas con lo del protocolo rts y cts en serial, es lo que al parecer esta haciendo el mal funcionamiento, gracias y saludos
NO le digas a DIOS que tienes un gran problema, dile a tu problema que tienes un GRAN DIOS!!
Alma mia y castillo mio, mi Dios en quien yo confiare....