Autor Tema: Problemas con comunicacion usb emulando puerto serie cdc-RS232  (Leído 3557 veces)

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

Desconectado jaalm741

  • PIC10
  • *
  • Mensajes: 10
Problemas con comunicacion usb emulando puerto serie cdc-RS232
« en: 04 de Diciembre de 2010, 19:03:26 »
Hola gente del foro, les cuento que tengo problemas para leer el pic desde la pc a traves del puerto usb,  utilizo el pic 18f4550 con bootloader y el mchpdfusb de microchip todo en C18, ya me lei todos los datasheet e informes de microchip y supuestamente debería estar funcionando pero no es así. (Tambien lei una pagina de Alfredo Arosini que explica como hacer andar el usb y en windows vista funciona perfecto (la maquina de un amigo) pero no en win xp (en mi maquina)).
Grabo el pic con el bootloader, despues en "mi pc" , propiedades, hardware, administrador de dispositivos, aparece en "otros dispositivos " cdc - RS232 emulation demo ", cambio el driver un archivo que me da microchip en la carpeta "inf" y luego me lo reconoce como "COM3" y lo ve como un puerto serie.  Desde una consola utilizo el lenguaje de scrip TCL (active tcl)
y puedo abrir para escritura perfectamente el pic y lo puedo controlar, el problema es que cuando lo abro para lectura me sale un carte que dice "no se puede abrir COM3 , acceso denegado". y no se que hacer  :huh:

Aqui le paso el codigo fuente que utilizo.

Código: C
  1. /* ============================================================================== */
  2. /* ==                             <- INCLUCIONES ->                            == */
  3. /* ============================================================================== */
  4.  
  5. #include "GenericTypeDefs.h"       // Define todos los tipos de variables
  6. #include "Compiler.h"
  7. #include "usb_config.h"
  8. #include "usb_device.h"
  9. #include "usb.h"
  10. #include "usb_function_cdc.h"
  11. #include "HardwareProfile.h"
  12.  
  13. #include <stdlib.h>
  14. #include <string.h>
  15. #include <stdio.h>
  16. #include <p18F4550.h>
  17. #include <delays.h>
  18.  
  19. /* ============================================================================== */
  20. /* ==                           <- CONFIGURACION ->                            == */
  21. /* ============================================================================== */
  22. /* ==  Es igual al Bootloader original de la MCE Starter Kit y no se carga     == */
  23. /* ============================================================================== */
  24.  
  25. #define GetSystemClock()        48000000
  26.  
  27. /* ============================================================================== */
  28. /* ==                         <- V A R I A B L E S ->                          == */
  29. /* ============================================================================== */
  30.  
  31. #pragma udata
  32.  
  33. char LeerBuffer[64];        // Dato que llega del PC
  34. char EscribirBuffer[64];    // Para devolver num bits + 1
  35. BYTE numBytesRead;          // Para devolver num bits + 1
  36.  
  37. /* ============================================================================== */
  38. /* ==                <- P R O T O T I P O S   P R I V A D O S ->               == */
  39. /* ============================================================================== */
  40.  
  41. void ProcessIO(void);
  42. void USBDeviceTasks(void);
  43. void InitUSART(void);
  44.  
  45.  
  46. /* ============================================================================== */
  47. /* ==      <- REMAPEADO  Para Bootloader original de la MCE Starter Kit ->     == */
  48. /* ============================================================================== */
  49.  
  50. #define REMAPPED_RESET_VECTOR_ADDRESS                   0x800
  51. #define REMAPPED_HIGH_INTERRUPT_VECTOR_ADDRESS  0x808
  52. #define REMAPPED_LOW_INTERRUPT_VECTOR_ADDRESS   0x818
  53. extern void _startup (void);        // Ver c018i.c en directorio del C18
  54.        
  55. #pragma code REMAPPED_RESET_VECTOR = REMAPPED_RESET_VECTOR_ADDRESS
  56. void _reset (void)
  57. {
  58.         _asm goto _startup _endasm     
  59. }
  60.  
  61. #pragma code HIGH_INTERRUPT_VECTOR = 0x808 //0x08 corregido por Alfredo.
  62. void High_ISR (void)   
  63. {      
  64.         _asm goto REMAPPED_HIGH_INTERRUPT_VECTOR_ADDRESS _endasm       
  65. }
  66.        
  67. #pragma code LOW_INTERRUPT_VECTOR = 0x818 //0x18 corregido por Alfredo.
  68. void Low_ISR (void)    
  69. {      
  70.         _asm goto REMAPPED_LOW_INTERRUPT_VECTOR_ADDRESS _endasm        
  71. }
  72.  
  73. /* ============================================================================== */
  74. /* ==                     <- D E C L A R A C I O N E S ->                      == */
  75. /* ============================================================================== */
  76. #pragma code
  77.  
  78. void main(void)
  79. {                                                       // INICIALIZA EL SISTEMA  
  80.         TRISAbits.TRISA1 = 1;   // Entrada Detecta alimentación externa
  81.         TRISAbits.TRISA2 = 1;   // Entrada Detecta alimentación USB
  82.         TRISD   =   0;          // Puerto D inicializado como salida
  83.         USBDeviceInit();            // usb_device.c.  Initializes USB module SFRs and firmware variables to known states.
  84.         InitUSART();            // Inicializa USART
  85.  
  86.         while(1)
  87.     {
  88.                 USBDeviceTasks();        
  89.                 if(mUSBUSARTIsTxTrfReady())        // Si el canal de transmisión/ recepción está libre
  90.                         if(getsUSBUSART(LeerBuffer,4)) // Lee lo enviado por la PC a travez del USB
  91.                         {      
  92.                                 switch(LeerBuffer[0])      // Lee el primer caracter, que es el código de la tarea
  93.                                 {
  94.                                         case 97: PORTD=0x0F; break;
  95.                                         case 112: PORTD=0xFF; break;
  96.                                         case 98:                               
  97.                                         if(mUSBUSARTIsTxTrfReady())   // Verifica que pueda enviar
  98.                                                 {putsUSBUSART('a');}      // Envía la cadena
  99.                                 }
  100.                     }                          
  101.                 ProcessIO();        // Está aquí
  102.         }                              
  103. }                          
  104.  
  105. /* ============================================================================== */
  106. /* ==                      <- CUERPO DE LOS PROTOTIPOS ->                      == */
  107. /* ============================================================================== */
  108.  
  109. void ProcessIO(void)   
  110. {    
  111.     if((USBDeviceState < CONFIGURED_STATE)||(USBSuspendControl==1)) return;
  112.     CDCTxService();
  113. }      
  114.  
  115. void USBCBSuspend(void)
  116. {
  117.  // Rellenar   
  118. }
  119.  
  120. #if 0
  121. void __attribute__ ((interrupt)) _USB1Interrupt(void)
  122. {
  123.     #if !defined(self_powered)
  124.         if(U1OTGIRbits.ACTVIF)
  125.         {
  126.             LATAbits.LATA7 = 1;
  127.        
  128.             IEC5bits.USB1IE = 0;
  129.             U1OTGIEbits.ACTVIE = 0;
  130.             IFS5bits.USB1IF = 0;
  131.        
  132.             //USBClearInterruptFlag(USBActivityIFReg,USBActivityIFBitNum);
  133.             USBClearInterruptFlag(USBIdleIFReg,USBIdleIFBitNum);
  134.             //USBSuspendControl = 0;
  135.             LATAbits.LATA7 = 0;
  136.         }
  137.     #endif
  138. }
  139. #endif
  140.  
  141. void USBCBWakeFromSuspend(void)
  142. {
  143.         //Rellenar
  144. }
  145.  
  146. void USBCB_SOF_Handler(void)
  147. {
  148.     // No need to clear UIRbits.SOFIF to 0 here.
  149.     // Callback caller is already doing that.
  150. }
  151.  
  152. void USBCBErrorHandler(void)
  153. {
  154.     //Rellenar
  155. }
  156.  
  157. void USBCBCheckOtherReq(void)
  158. {
  159.     USBCheckCDCRequest();
  160. }
  161.  
  162.  
  163. void USBCBStdSetDscHandler(void)
  164. {
  165.     // Must claim session ownership if supporting this request
  166. }  
  167.  
  168. void USBCBInitEP(void)
  169. {
  170.     CDCInitEP();
  171. }
  172.  
  173.  
  174. void USBCBSendResume(void)
  175. {
  176.     static WORD delay_count;
  177.    
  178.     USBResumeControl = 1;                // Start RESUME signaling
  179.    
  180.     delay_count = 1800U;                // Set RESUME line for 1-13 ms
  181.     do
  182.     {
  183.         delay_count--;
  184.     }while(delay_count);
  185.     USBResumeControl = 0;
  186. }
  187.  
  188. #if defined(ENABLE_EP0_DATA_RECEIVED_CALLBACK)
  189. void USBCBEP0DataReceived(void)
  190. {
  191. }
  192. #endif
  193.  
  194. void InitUSART(void)
  195. {
  196.         TXSTAbits.SYNC    = 0;   // No es sincrónica la conexión
  197.         TXSTAbits.BRGH    = 0;   // Es baja velocidad
  198.         TXSTAbits.TXEN    = 1;   // Habilita la transmisión
  199.         RCSTAbits.SPEN    = 1;   // Configura los pines RX en RC7 y Tx en RC6
  200.         RCSTAbits.CREN    = 1;   // Habilita recepción contínua
  201.         BAUDCONbits.BRG16 = 0;   // Transmitimos en 8 bits.
  202.         BAUDCONbits.ABDEN = 0;   // Auto Baud Detect es no
  203.         SPBRG             = 77;  // (48000000/64/9600)-1 = 77.12 para SYNC=0 BRG16=0 BRGH=0(da 64)9600Baudios
  204.         TRISCbits.TRISC6  = 0;   // RC6 es salida y corresponde a Tx
  205.         TRISCbits.TRISC7  = 1;   // RC7 es entrada y corresponde a Rx
  206. }
  207.  
  208. /** Fin de archivo main.c **/

Aqui les dejo el codigo fuente del programa de la pc en tcl (active tcl)

Código: C
  1. set escribir [open COM3 w]
  2. set leer [open COM3 r]
  3. fconfigure $leer -mode 9600,n,8,1
  4. fconfigure $escribir -mode 9600,n,8,1
  5. puts $escribir "b"
  6. set a [gets $leer]
  7. close $escribir

Desde ya muchas gracias

Desconectado jaalm741

  • PIC10
  • *
  • Mensajes: 10
por fin encontre la solucion al problema
« Respuesta #1 en: 08 de Diciembre de 2010, 19:03:44 »
La Solución al problema , lo que pasa es que el MCHPDFUSB de microchip no funciona con USB 1.0 solo funciona con USB 2.0
Gente este codigo las va a servir para porobar comunicar su pc con su PIC 18f4550 , funciona correctamente.
Prueben con otro leguaje como visual basic y envienle una letra "a" o "b" o "p " y veran como el pic reacciona a los estimulos.
si quieren despues les subo el PCB de la placa para que entrenen con usb.
Nos vemos

Desconectado bmfranky

  • PIC16
  • ***
  • Mensajes: 165
    • La Tienda De Fran
Re: Problemas con comunicacion usb emulando puerto serie cdc-RS232
« Respuesta #2 en: 09 de Diciembre de 2010, 07:43:37 »
Hola jaalm741, creo que el problema lo tienes en que abres 2 veces el puerto y no lo cierras, con lo que al intentar abrirlo por segunda vez, no puedes porque ya esta abierto, prueba a cerrarlo y veras como si funciona, o a abrirlo como lectura escritura.

Citar

      set escribir [open COM3 w]//->abre1
 
      set leer [open COM3 r]//;->abre2
 
      fconfigure $leer -mode 9600,n,8,1//>aqui as abierto para leer, pero no cierras
 
      fconfigure $escribir -mode 9600,n,8,1//>aqui te da error
   
      puts $escribir "b"
   
      set a [gets $leer]
   
      close $escribir
   
       

Porque no pruebas:
Citar
set Port [open COM3 rw]//->abre como lectura escritura.
fconfigure $Port -mode 9600,n,8,1//
puts $Port "b"
set a [gets $Port]
close $Port

 

Haber que pasa.
Visiten La Tienda De Fran ;-) Aqui. y mi nueva Web Aqui.


 

anything