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 primera pregunta, (perdonarme si me excedo):
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:
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:
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 =
þ˜‚ÔÀ1tdScÓu»Çc>#™ž@5PµÄcËPþÚb\ >ï6Ñ(ט]Ö÷tƒJ±áFò<çÎvö@"¶£å$ ( Ñõ²UnI²…ÿb’ù΢’†™.5!"Þn™TÚÊ
gzô)tGzYuÿàˆÏƒ‚€~§‘[±´P.W#Њ$[;_H›>³IArWe¾ç:n¤éBqÐÑY‰¸^€Ù! úXüqïMNéÐWo4ºQ7ÀCEɸÍÚP¾ïiIj7_üÑr8Dà&Ûc¦¨§Jdã½W¨è‡÷í5:4
Í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
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 primera pregunta, (perdonarme si me excedo):
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:
Código:
#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:
Código:
; 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"[/I]
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 =
þ˜‚ÔÀ1tdScÓu»Çc>#™ž@5PµÄcËPþÚb\ >ï6Ñ(ט]Ö÷tƒJ±áFò<çÎvö@"¶£å$ ( Ñõ²UnI²…ÿb’ù΢’†™.5!"Þn™TÚÊ
gzô)tGzYuÿàˆÏƒ‚€~§‘[±´P.W#Њ$[;_H›>³IArWe¾ç:n¤éBqÐÑY‰¸^€Ù! úXüqïMNéÐWo4ºQ7ÀCEɸÍÚP¾ïiIj7_üÑr8Dà&Ûc¦¨§Jdã½W¨è‡÷í5:4
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 edición por un moderador: