Control de dispositivos a través del módulo USB del PIC18F45/2550

Enhorabuena.
Llevo siguiendo este hilo hace meses y les aplaudo.
Moyano, enhorabuena por este último pequeño gran paso.

Moyano, aprovecho para pedirle un consejo. Estoy realizando un proyecto en el que un sensor toma unos datos y los almacena el pic en su memoria eeprom. Hasta aqui todo funciona correcto.
Ahora quiero descargar esos datos(64K) via USB. Me gustaría hacerlo lo mas facil posible desde el punto de vista del usuario, por tanto, no quiero tener que instalar driver en windows ni nada de eso,solo ejecutar un pequeño programa en VB. Por tanto e pensado que el modo HID es lo ideal para eso,me equivoco?
Desde el punto de vista del software del PC para el modo HID estoy perdido,¿ es muy diferente al modo bulk?(esto si lo he probado y mas o menos funcionaba)

Gracias y enhorabuena de nuevo


Hola tengo un ejemplo de Moyano de HID en visual basic 6.0, modificado para mandar 64bytes desde el micro a la pc, estos bytes son los resultados del conversor.
 

Adjuntos

  • Ejercicio N°6.zip
    517.3 KB · Visitas: 187
Muy buenas, a principios de año cuando empecé con esto de los pic's y en asm, hice una aplicación de matriz de leds 8x8 utilizando para el almacenamiento de datos una memoria eeprom I2C. Bueno, el caso es que para generar el codigo para la eeprom con las frases que uno quisiera hice una pequeña aplicación que generaba el archivo .hex, para posteriormente ser programado con nuestro programador (en mi caso TE20 con Winpic800).

El programa esta en este hilo:
http://www.todopic.com.ar/foros/index.php?topic=24712.80

Ahí se quedó con la versión 1.3, y (antes) actualizable a la 2.1. (digo antes pq ya no tengo el servidor ftp desde donde se descargaba la actualización)

Si te puede ser de alguna utilidad te puedo pasar los fuentes del programa (que tendría que comentar un poco, que soy algo descuidado yo con esto) o necesitas alguna colaboracón avisa.

Pd. si descargais el programa deciros que para poder escribir algo antes teneis que editar los caracteres en herramientas/libreria de caracteres.

Un saludo
 
Estaría bueno que postearas el código fuente para estudiarlo , ahora estoy viendo de usar en vez de la ventana de texto un datagridview para mostrar los datos como en el PICKIT2 pero de a poco se va logrando...

espaciodesobra.jpg


como verán todavía tengo un pequeño error en la gráfica y hay que correjir el código fuente para hacer más rápida la ejecución del programa..

Con respecto al PIC me falta añadir el código de las entradas digitales y salidas digitales y termino con la primera versión del firmware hasta que pueda seguir con el control de la memoria.
 
Si que te lo haz currado.

iamghen.jpg

¿Es lo que buscas?

Saludo.

Edito:

Perdón, deja la propiedad ScrollBars en Vertical. Vete probando lo que hace cada opción para que te quedes con el funcionamiento.
 
Última edición:
hola moyano y meta, los felicito por sus aportes que han dado sobre el tema de USB muy bueno el aporte que han hecho en todo lo que se refiere a este tema y admiro todo el tiempo que le han dedicado, he estado leyendo sus posts hasta la pagina 15 de ahi salte a la ultima para ver en lo que trabajan ahora ultimo, mi pregunta es si en todo este tiempo hubo o hay alguien que ha desarrollado alguna conexion entre el pic y matlab? agradeceria tu ayuda o los datos que me pudieran dar o talvez se abrio un nuevo tema, de ante mano gracias.
 
una pregunta como hago en visual basic 2008 para hacer la conexion y desconexion en caliente del pueto serie lo he intentado y no me sale

muchas gracias por compartir sus conocimientos
apenas boy por la primera parte de controlar 8 reles por cdc
miren esto es lo q hice lo simule en proteus y funciona perfecto


#include <18f2550.h>
#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.

int d;

void noconectado(){
output_high(PIN_B0); // Función USB no detectada. (Enciende LED rojo)
output_low(PIN_B1); // (Apaga LED verde)

}
void conectado(){
output_high(PIN_B1); // Función USB detectada. (Enciende LED verde)
output_low(PIN_B0); // (Apaga LED rojo)
}


void main (){
output_a(0);
output_b(0);
output_c(0);

usb_cdc_init(); // Funciones necesarias para iniciar el módulo USB.
usb_init(); // Funciones necesarias para iniciar el módulo USB.


while(!usb_cdc_connected()) té c{ // Mientras el USB no esonectado.
noconectado(); //llamo a funcion noconectado
}
conectado(); //si ya conecto llamo funcion conectado

if (usb_enumerated()){ // Si el puerto ya fue enumerado por el host :
output_high(PIN_B2); // Enciende led de enumeración_OK.
}

do{
if(usb_cdc_kbhit()){ // en espera de nuevo(s) caracter(es) en el buffer.
d=usb_cdc_getc();

if(d==1){ // ¿lo que llegó fué el NUEMRO 1?
output_toggle(pin_b3); // bascula T implementada con la función output_toggle()
d=0;
}
if(d==2){
output_toggle(pin_A0); // bascula T implementada con la función output_toggle()
d=0;
}
if(d==3){
output_toggle(pin_A1); // bascula T implementada con la función output_toggle()
d=0;
}
if(d==4){
output_toggle(pin_A2); // bascula T implementada con la función output_toggle()
d=0;
}
if(d==5){
output_toggle(pin_A3); // bascula T implementada con la función output_toggle()
d=0;
}
if(d==6){
output_toggle(pin_B4); // bascula T implementada con la función output_toggle()
d=0;
}
if(d==7){
output_toggle(pin_A5); // bascula T implementada con la función output_toggle()
d=0;
}
if(d==8){
output_toggle(pin_B5); // bascula T implementada con la función output_toggle()
d=0;

}
}
}while (TRUE); // bucle eterno
}
 
Hola, un saludo y agradeserles el gran aporte que realizan.
Estoy intentando comunicar el pic 4550 de la serie 18, con el puerto usb de una pc, pero me temo que mis intentos no han sido suicientes, me gustaria que me pudieran ayudar, creo que no se mucho pero tengo muchas ganas de aprender.
Espero me ayuden y de antemano muchas gracias.
 
Aqui les dejo la libreria que hice para calcular el cheksum para los archivos .hex. Si abris un archivo .hex con el blok de notas vereis todas las filas de datos, el checksum es el ultimo Byte de cada fila (los dos ultimos caracteres en hexadecimal)

Pd. Viendolo de nuevo veo que se puede optimizar mucho mas. Un saludo
 

Adjuntos

  • Checksum.rar
    19 KB · Visitas: 94
Última edición:
Aqui les dejo el codigo fuente del programa que les dije antes. Esta muy "desordenado" y casi sin comentar, un mal vicio que tenia, luego me di cuenta que cuando necesitaba revisar un programa antiguo te tirabas un buen rato para recordar que hacía.

Si necesitas que explique algo de este o que te pase algun fragmento de codigo ordenado o alguna función especifica que necesites dilo. Ya que me he dado cuenta que para ordenar esto ahora mismo me puedo tirar unos dias ya que tampoco como casi todos dispongo de mucho tiempo.

Bueno un saludo.
 

Adjuntos

  • I2cMatrizLeds.rar
    604.8 KB · Visitas: 184
Luego de mucho batallar con las funciones para leer/grabar EEPROM en Visual C# a partir de un archivo .hex...ya se me han aclarado muchas dudas...pronto le vendré con más actualizaciones del programa principal para que lo vean trabajando...y en cuanto termine del "pulir" el firmware lo subo todo completo con fotos y videos...

Tannke muchas gracias por tu aporte...tu programa me va a servir para unos de mis proyectos del año 2010 - 2011 que es manejar una matriz completamente por USB.
 
Hola Moyano:

¿En el manual pondrás esquemas eléctricos de como conectar un PIC por USB? Lo pregunto por curiosidad. Con las ganas que tengo de controlar un PIc por USB.

Un cordial saludo.
 
Si estará todo explicado con el mayor detalle posible...lo que me está retrasando por el momento es la grabación/lectura de la EEPROM por USB....tratar el archivo .hex no es tan facil como parece asi que me va a llevar un tiempo....igual lo básico lo voy a subir antes cosa de que vallan practicando...luego cuando tenga la aplicación terminada subo todo.
 
Me lo imaginaba. Por ahora puedes centrarte en activar los 8 entradas/salidas y entradas analógicas.

A partir de que sepa manejar estas cosas o lo tengo clara, me encargaré de adaptarlo a C++ y VB.
 
Última edición:
Moyano Jonathan:
Hola buen día, mi nombre es Gaby soy estudiante de ingenieria en electrononica.

Oye solo que tenemos muchas dudas yo y mi compañera de proyecto, acerca de la comunicación serial por medio de Labview y un pic 18f2550

Mira tenemos un programa que realizamos en MikroC para la comunicación utilizando un cable serial. La comunicación fue un éxito utilizando la herramienta UART que nos ofrece el MikroC, el problema aquí es que el profesor nos pidió que hiciramos el mismo programa pero ahora implementando Labview.

No somos muy buenas utilizando el Labview pero lo intentamos. Hicimos una interfaz en labview 8.6, sabemos que si envia y recibe el datos ya que conectamos el cable serial e hicimos un puente en los pines 2 y 3, con esto observamos que la comunicacion serial con los Visa si funciono, pero, al conectar nuestra placa con el pic no hace lo que queremos, se supone que tenemos programado el pic para que encienda un led medio segundo cuando haya comunicacion serial. Sabemos que si le llega algo por que enciende el led pero no sigue con el proceso que queremos que haga.

No sabemos si el problema esta en el codigo de mikroc o en la
interfaz del labview.
Estamos mas inclinadas al hecho de que sea el código en mikroc, debido a que no estamos muy seguras de la comparación que se hace con la ventana de mikroc donde antes realizábamos las practicas y que hemos cambiado por la interfaz creada por nosotras en labview, que en caso del serial seria en mikroc TOOLS/USART Terminal y con eso ya aparece esta ventana que reemplazamos, he de ahí donde sale la parte del código que creemos que reemplazar porque en el archivo de .h , nosotros lo llamamos UART1_Read() o en UART1_Write(), entonces para utilizar la interfaz del labview ¿cual seria?

Crees que podrias ayudarnos, te paso el código que tengo en mikroc , para que lo revises y nos digas si puedes ayudarnos.

De antemano muchisimas gracias por tu tiempo. :cry:

Codigo MikroC
char uart_rd;

void main() {

ADCON1 |= 0x0F; //Configura AN pins as digital
CMCON |= 7; // Disable comparators
TRISB=0;
TRISC=0;
UART1_Init(9600); // Initialize UART module at 19200 bps
Delay_ms(100); // Wait for UART module to stabilize

UART1_Write_Text("GRACIAS");
PORTC.B0=0;
PORTC.B1=0;
PORTC.B2=0;

while (1) { // Endless loop
if (UART1_Data_Ready()) { // If data is received,
uart_rd = UART1_Read(); // read the received data,

PORTB.B1=1;
Delay_ms(500);
PORTB.B1=0;



while (uart_rd == 'E' ) {
if (uart_rd =='E')
{
PORTC.B0=1;
PORTC.B1=0;
PORTC.B2=0;
Delay_ms(750);

PORTC.B0=0;
PORTC.B1=0;
PORTC.B2=0;
Delay_ms(750);

PORTC.B0=1;
PORTC.B1=0;
PORTC.B2=0;
Delay_ms(750);

PORTC.B0=1;
PORTC.B1=1;
PORTC.B2=0;
Delay_ms(2000);

PORTC.B0=1;
PORTC.B1=0;
PORTC.B2=0;
Delay_ms(750);

PORTC.B0=1;
PORTC.B1=0;
PORTC.B2=1;
Delay_ms(1000);



UART1_Write(uart_rd);

uart_rd = UART1_Read();

if (uart_rd =='M') {

PORTC.B0=0;
PORTC.B1=0;
PORTC.B2=0;

break;
}

}
}
UART1_Write(uart_rd); // and send data via UART
}
}
}

:
 
Atrás
Arriba