Autor Tema: [AYUDA]Comunicacion serie entre pic 18f2550 USB_CDC y MATLAB  (Leído 5550 veces)

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

Desconectado Edsmind

  • PIC10
  • *
  • Mensajes: 6
[AYUDA]Comunicacion serie entre pic 18f2550 USB_CDC y MATLAB
« en: 01 de Julio de 2012, 14:49:40 »
Buenos Días, :-)

He estado durante bastante tiempo documentándome para mis proyectos en este gran foro, y llevo tiempo con un problema que no he podido solucionar, así que aqui esta mi primer tema:
  
Estoy tratando de realizar una comunicación entre el PIC 18f2550 y MATLAB por USB.

Tengo el circuito montado y programo el PIC mediante ICD3 desde MPLAB con el compilador CCS ya que con el de MAPLAB tenia problemas con las librerías usb_cdc y usb_desc_cdc.

El código del pic es el siguiente:

#include <18F2550.h> // Definición de registros internos.

#fuses HSPLL,NOMCLR,NOWDT,NOPROTECT,NOLVP,NODEBUG,USBDIV,PLL5,CPUDIV1,VREGEN,NOPBADEN


#use delay(clock=48000000) // Frecuencia máxima de trabajo.
#include "usb_cdc.h" // Descripción de funciones del USB.
#include "usb_desc_cdc.h" // Descriptores del dispositivo USB.


void main() {
int cont=1;
char c;
// Un retardo de espera
   delay_ms(1500);
//configuración USB
   usb_cdc_init(); // Configuramos al puerto virtual.
   usb_init(); // Inicializamos el stack USB.

//Parpadeo LED  ROJO ANTES DE DETECTAR CONEXIÓN
  
do{
while(!usb_cdc_connected()) {
   delay_ms(500);
   output_high( PIN_B1 );
      delay_ms(1000);
   output_low( PIN_B1 );
   delay_ms(1000);     
   }
      usb_task();

      if (usb_enumerated()){  // Espera a que el dispositivo sea enumerado por el                                    host.
         // PRIMERA CONEXIÓN MUESTRA "Dispositivo enumerado"
       if (cont <2){
         cont =2;
         printf(usb_cdc_putc, "Dispositivo enumerado\n\r");
      }
       if ( usb_cdc_kbhit() ) {
         printf(usb_cdc_putc, "recibiendo\n\r");
         delay_ms(1000);
         c = usb_cdc_getc();
         printf(usb_cdc_putc, c);  
        }
      }
   } while (TRUE);
}

El pc (win 7 x64) me reconoce el PIC como un puerto COM (en este caso COM6) utilizando el driver mchpdc, cuyo .inf es el siguiente:

; Windows USB CDC ACM Setup File
; Copyright (c) 2000 Microsoft Corporation
; Copyright (C) 2007 Microchip Technology Inc.

[Version]
Signature = "$Windows NT$"
Class = Ports
ClassGuid={4D36E978-E325-11CE-BFC1-08002BE10318}
Provider=%MFGNAME%
LayoutFile = layout.inf
CatalogFile=%MFGFILENAME%.cat
DriverVer=22/11/2008,1.0.0.0

[Manufacturer]
%MFGNAME%=DeviceList, NTamd64

[DestinationDirs]
DefaultDestDir = 12

;------------------------------------------------------------------------------
;   Windows 2000/XP/Vista-32bit Sections
;------------------------------------------------------------------------------

[DriverInstall.nt]
include=mdmcpq.inf
CopyFiles=DriverCopyFiles.nt
AddReg=DriverInstall.nt.AddReg

[DriverCopyFiles.nt]
usbser.sys,,,0x20

[DriverInstall.nt.AddReg]
HKR,,DevLoader,,*ntkern
HKR,,NTMPDriver,,%DRIVERFILENAME%.sys
HKR,,EnumPropPages32,,"MsPorts.dll,SerialPortPropPageProvider"

[DriverInstall.nt.Services]
AddService=usbser, 0x00000002, DriverService.nt

[DriverService.nt]
DisplayName=%SERVICE%
ServiceType=1
StartType=3
ErrorControl=1
ServiceBinary=%12%\%DRIVERFILENAME%.sys

;------------------------------------------------------------------------------
;  Vista-64bit Sections
;------------------------------------------------------------------------------

[DriverInstall.NTamd64]
include=mdmcpq.inf
CopyFiles=DriverCopyFiles.NTamd64
AddReg=DriverInstall.NTamd64.AddReg

[DriverCopyFiles.NTamd64]
%DRIVERFILENAME%.sys,,,0x20

[DriverInstall.NTamd64.AddReg]
HKR,,DevLoader,,*ntkern
HKR,,NTMPDriver,,%DRIVERFILENAME%.sys
HKR,,EnumPropPages32,,"MsPorts.dll,SerialPortPropPageProvider"

[DriverInstall.NTamd64.Services]
AddService=usbser, 0x00000002, DriverService.NTamd64

[DriverService.NTamd64]
DisplayName=%SERVICE%
ServiceType=1
StartType=3
ErrorControl=1
ServiceBinary=%12%\%DRIVERFILENAME%.sys


;------------------------------------------------------------------------------
;  Vendor and Product ID Definitions
;------------------------------------------------------------------------------
; When developing your USB device, the VID and PID used in the PC side
; application program and the firmware on the microcontroller must match.
; Modify the below line to use your VID and PID.  Use the format as shown below.
; Note: One INF file can be used for multiple devices with different VID and PIDs.
; For each supported device, append ",USB\VID_xxxx&PID_yyyy" to the end of the line.
;------------------------------------------------------------------------------
[SourceDisksFiles]
[SourceDisksNames]
[DeviceList]
%DESCRIPTION%=DriverInstall, USB\VID_04D8&PID_000B

[DeviceList.NTamd64]
%DESCRIPTION%=DriverInstall, USB\VID_04D8&PID_000B


;------------------------------------------------------------------------------
;  String Definitions
;------------------------------------------------------------------------------
;Modify these strings to customize your device
;------------------------------------------------------------------------------
[Strings]
MFGFILENAME="mchpcdc"
DRIVERFILENAME ="usbser"
MFGNAME="EdgarPIC_USB"
INSTDISK="Microchip Technology, Inc. Installation Disc"
DESCRIPTION="EDGARPIC_USB28_CDC"
SERVICE="USB RS-232 Emulation Driver"

El PIC ejecuta correctamente el código, es decir:

1- Al enchufar el USB el led parpadea
2- Al generar la comunicación desde MATLAB(7.10.0(R2010a)) el led deja de parpadear y el PIC envía "dispositivo enumerado"

            Las instrucciones de MATLAB:
            >> s = serial( 'COM6')

                    Serial Port Object : Serial-COM6

                    Communication Settings
                    Port:               COM6
                    BaudRate:           9600
                    Terminator:         'LF'

                    Communication State
                    Status:             closed
                    RecordStatus:       off

                    Read/Write State  
                    TransferStatus:     idle
                    BytesAvailable:     0
                    ValuesReceived:     0
                    ValuesSent:         0
  
             >> fopen( s )
             >> fscanf( s )

                   ans =

                   Dispositivo enumerado

3- Al intentar enviar un carácter y esperar su eco sucede lo siguiente:
             >> fprintf( s,'a' )
             >> fscanf( s )

                   ans =


                   recibiendo


             >> fscanf( s )
                  Warning: The input buffer was filled before the Terminator was reached.

                  ans =
                  þ˜‚Ô À1 tdScÓu»Çc>#™ž@5PµÄcËPþÚb\ >ï6Ñ(ט]Ö÷tƒJ±áFò<çÎv ö@"¶£å$                                                                            (                Ñõ²UnI²…ÿb’ù΢’†™.5!"Þn™TÚÊ
                 gzô)t GzYuÿàˆÏƒ‚€~§‘[±´P.W# Њ$[;_H›>³IArWe¾ç:n¤éBqÐÑY‰¸^€Ù!                úXüqïMNéÐWo4ºQ7ÀCEɸÍÚP¾ïiI j7_üÑr8Dà&Ûc¦¨§Jdã½W¨è‡÷í5:4:pÍI=ß5û=K…~;Xe9nM¿%Ý,”*³      ‰Ÿ   ;êz‰uYf—Š\‘£o\XöÛÙ6[lF6&÷C3FÇÁCQ¾Zq­p»º§Ubx©ô8#u1_ÄNޝò¥õ]åöÚ='ªã{£ê(üÃIyð²’ÉWÖIÌ•»@p¹§E¢grŽ–‡´ð&O­o\ö~ç>Z>5¤S”ýÜñÔœ±Ž=ÿô‘m±†¡N«µ=/Í+8!¾”ydùwíúÚ€é*zLÚ/^hÌÆºeL1hÄø蛸AµB«dóIJn’¼…±eêõÑl×òq÷Ýãá5ü[)fv¡»Õâßú…üŽY„,wË$Mæuñ+à‚Üa



Como se puede ver la respuesta del PIC (a cualquier carácter enviado) no es la que se espera :?, ya que se espera de vuelta eses mismo caráter.
Pero el PIC es capaz a enviar mensajes a MATLAB durante este proceso como "Dispositivo enumerado" y "recibiendo". lo que me hace pensar que el proceso de envío del MATLAB al PIC no es correcto o hay algún problema que desconozco.

Alguien sabe que es lo que sucede, y como solucionarlo?

El objetivo final es poder enviar un dato entre 0 y 256 desde MATLAB al PIC.

Espero vuestra ayuda

Muchas gracias
              
« Última modificación: 03 de Julio de 2012, 08:04:15 por Edsmind »
"No entiendes realmente algo a menos que seas capaz de explicárselo a tu abuela." Albert Einstein

Desconectado Edsmind

  • PIC10
  • *
  • Mensajes: 6
Re: [AYUDA]Comunicacion serie entre pic 18f2550 USB_CDC y MATLAB
« Respuesta #1 en: 03 de Julio de 2012, 08:06:41 »
Alguien me puede echar una mano por favor.

Gracias
"No entiendes realmente algo a menos que seas capaz de explicárselo a tu abuela." Albert Einstein

Desconectado Edsmind

  • PIC10
  • *
  • Mensajes: 6
Re: [AYUDA]Comunicacion serie entre pic 18f2550 USB_CDC y MATLAB
« Respuesta #2 en: 04 de Julio de 2012, 18:40:25 »
Nadie se ha encontrado con este problema?

Llevo unos cuantos días dándole vueltas al tema pero no consigo sacar nada claro.

Necesito ayuda por favor

Gracias. 
"No entiendes realmente algo a menos que seas capaz de explicárselo a tu abuela." Albert Einstein

Desconectado jhozate

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 1698
Re: [AYUDA]Comunicacion serie entre pic 18f2550 USB_CDC y MATLAB
« Respuesta #3 en: 04 de Julio de 2012, 19:39:33 »
hola, intenta darle un tiempo de espera antes de leer de nuevo el puerto
Código: Matlab M
  1. fprintf( s,'a' );
  2. pause(0.2);
  3. fscanf( s )
Ser Colombiano es un Premio, Saludos desde CALI-COLOMBIA

Desconectado Edsmind

  • PIC10
  • *
  • Mensajes: 6
Re: [AYUDA]Comunicacion serie entre pic 18f2550 USB_CDC y MATLAB
« Respuesta #4 en: 05 de Julio de 2012, 04:04:16 »
Hola Jhozate,

Ya le doy tiempo, las instrucciones de Matlab las ejecuto una a una, no es un .m que lo hace todo seguido.

Gracias igualmente.

A ver si alguien se encontró con el mismo problema.
"No entiendes realmente algo a menos que seas capaz de explicárselo a tu abuela." Albert Einstein

Desconectado PCCM

  • PIC16
  • ***
  • Mensajes: 109
Re: [AYUDA]Comunicacion serie entre pic 18f2550 USB_CDC y MATLAB
« Respuesta #5 en: 09 de Julio de 2012, 16:05:45 »
Hace tiempo hice una comunicación USB con matlab de forma exitosa con la misma documentacion de Matlab:

http://www.mathworks.com/matlabcentral/fileexchange/24417-comunicacion-entre-matlab-y-pic-de-microchip-usando-puerto-usb

Además recuerda que es muy importante que por cada leída debes cerrar el puerto USB.


 

anything