desktop

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

Buen trabajo, te está qudando de maravilla con tantos gráficos. muy ilustrativo y fácil de entender.
 
Me parece genial su trabajo, me gusta mucho este foro, veo que en serio no hay intención de no compartir la información entre ustedes.

Les voy a postear el avance que tengo de mi programa con lo que es la transmisión bulk que aún no manejo bien. debido a que tengo errores de unos cuantos bytes cada cierta cantidad de transmisiones exitosas.
Estoy implementando un acknowlegement entre el PC y el PIC para verificar los datos con una suma de todo el paquete y que envio en los últimos 2 bytes de cada transmisión. El PC verifica la suma y si todo esta bien guarda el paquete y si no lo pide de nuevo. Esta es la solución más pronta que se me ocurrio!

Estoy muy ocupado pero espero tenerles un avance el lunes!
 
Si es un esfuerzo pero lo vale. Lo más laborioso es la traducción de definiciones y comentarios de cosas en inglés. Yo algo entiendo pero es básico, aunque me estoy ayudando con el traductor de google.

Otra cosa es que hay que desarrollar punto por punto, para que se entienda en la totalidad.

Y eso que todavía no empiezo ni con el primer ejemplo de USB.................
 
Hola otra vez.

Tengo problemas con la transmision del PIC hacia la PC, no se a que se deba...
Para recibir datos desde la PC no hay problema y todo funciona bien.

Lo que quiero enviar a la PC es lo que recibo...lo que hago es esto:
Código:
                     if (usb_kbhit(1))                            // Si hay un paquete de datos en el buffer lo tomamos y guardamos en la variable recibido
                     {
                        usb_get_packet(1,recibido, 8);
                        
                        switch(recibido[0])
                        {
                         case '0':
                         alternar(LED_VERDE);
                         break;
                         case '1':
                         alternar(LED_ROJO);
                         break;
                         case '2':
                         alternar(LED_ROJO);
                         alternar(LED_VERDE);
                         break;
                         default:
                         apagar(LED_ROJO);
                         apagar(LED_VERDE);
                         break;
                        }
                     
                        enviado[0]=recibido[0];
                        usb_put_packet(1,enviado,8,USB_DTS_TOGGLE);

segun yo esta bien, pero no se porque no muestra nada la PC...
 
estas copiando solo la posición cero [0] de recibido. -> enviado[0]=recibido[0];
Cuando envias eliges enviar 8 bytes-> usb_put_packet(1,enviado,***8***,USB_DTS_TOGGLE);
trata de resolver el problema inicializando enviado en cero o copiando todo recibido en enviado-> enviado=recibido;

Adem'as recuerda que tienes que hacer definiciones previas:

#define USB_HID_DEVICE FALSE //disable HID
#define USB_EP1_TX_ENABLE USB_ENABLE_BULK //turn on EP1(EndPoint1) for IN bulk/interrupt transfers
#define USB_EP1_RX_ENABLE USB_ENABLE_BULK //turn on EP1(EndPoint1) for OUT bulk/interrupt transfers
#define USB_EP1_TX_SIZE 64 //size to allocate for the tx endpoint 1 buffer
#define USB_EP1_RX_SIZE 8 //size to allocate for the rx endpoint 1 buffer

*****estas definiciones deben estar hechas, si tienes un tama'no de transferencia o de recepcion menor al n'umero de paquetes que envias no te funciona usando usb_put_packet sin iterar


#include <pic18_usb.h> //Microchip PIC18Fxx5x Hardware layer for CCS's PIC USB driver
#include <PicUSB.h> //USB configuration and device description
#include <usb.c> //handles usb setup tokens and get descriptor reports
 
OK, lo de las definiciones y todo eso ya está, solo que no lo puse porque es mucho rollo.

Pero probaré copiando todo lo que tiene "recibido" en "enviado" y veré que pasa...

Gracias...
 
Hola gente, quería consultarles sobre alimentación desde el puerto USB.

Estuve buscando información y en ningún lado ví que enchufaron algo directamente algo al +5V y al GND del puerto USB.
Es decir, siempre había un esclavo USB con capacidad de manejar el protocolo USB que le indicaba al host USB cuanta corriente consume el circuito del esclavo. Después claro, de ahí se va a un regulador y se alimenta el circuito.

Leyendo un poco vi que los distintos consumos pueden ir de 0 a 500 mA máximo para todo el puerto. Y que el puerto maneja cargas en "unidades" de 100 mA. Es decir, el host le puede reservar un consumo de 100, 200, 300, 400 o 500 mA a un esclavo. Por defecto se asigna 1 unidad de carga USB = 100 mA. Entonces al enchufar un dispositivo se asignan por default 100mA, y luego el esclavo en la etapa de enumeración puede indicarle al host cuanta corriente consume, y en base a eso el host reasigna la cuota.

La pregunta es: ¿se puede usar energía del puerto USB sin usar dispositivos que manejen el protocolo USB?, ¿sin poner un dispositivo que implemente un esclavo?.
Como dije antes, no ví circuitos donde se usara eso directamente, pero tampoco ví ningún lugar donde diga "NO se puede alimentar en forma directa".

Gracias de antemano.
 
Si si se puede , igual haciendo averiguaciones la cantidad de corriente está un poco más limitada que 500mA, algo así como 300mA y un poco más aunque en algunos mother's eso se agrande hasta los 500mA. Igual es cuestion de probar...
 
Hola, quería saber si alguien esta trabajando en estos momentos con Bulk trasfers...

Les había comentado que uno de cada cuatro paquetes me llegaba con unos bytes de error... pensando en eso me di cuenta que así fuera solo uno de cada 10 paquetes no me sirve transmitir con ese nivel de error así que implementé un código en el pic que hace una suma de todos los bytes a enviar y pone el resultado en los últimos 2 bytes del paquete a enviar. Así mismo en el PC hago la misma suma con el paquete recibido y la comparo con los dos ultimos bytes, si ambos son iguales tengo un dato bueno y le indico al Pic que puede continuar, si esta malo le mando un pedido para que envie de nuevo, eso puede pasar hasta cuatro o cinco veces (en mi sistema) antes de tener un dato correcto. Sin embargo y gracias a Dios era lo que necesitaba para asegurarme una transmisión exitosa!

Codigo o ayuda solo es de pedirlo!

Con la transmisión bajo control es hora de empezar a leer la tarjeta SD.

Bendiciones!
 
Moyano Jonathan dijo:
Si si se puede , igual haciendo averiguaciones la cantidad de corriente está un poco más limitada que 500mA, algo así como 300mA y un poco más aunque en algunos mother's eso se agrande hasta los 500mA. Igual es cuestion de probar...

Gracias por tu respuesta. Yo precisaba 200 mA.
El tema es que no quiero probar hasta estar seguro, una vez metí el tester para medir si había tensión en el puerto y chau puerto USB de la PC (levantaba temperatura, despues desenchufé directamente la CPU porque no se cerraba nunca el Windows, nunca más volvió a funcionar). No estoy en condiciones de sacrificar otro puerto USB por experimentar, ya que es el de una notebook y ahí sí puede ser grave la cosa.

Saludos
 
Mirá yo una vez hice lo mismo que vos pero no metí directamente el teste en el puerto , sino que conecté un cable y del otro lado saqué los 2 cables de alimentación rojo y negro del USB y medí la señal de alimentación y me dió algo de 4.75v , luego le pones un capacitor de 100uF para filtrado y tenés los 5.1v necesarios para trabajar.

Es muy raro que se te haya jodido el puerto en una de esas causaste un corto por descuido.
 
hola que tal
Tambien funcionan los programas en windowss vista, bueno los drivers, esque quiero hacer la conexión usb con un pic 18f4550. creo que nadamas cambiando el numero del pic del progama funciona no?' (#include <18F4550.h>)
pero al momento de que cambio el numero del pic y lo quiero compilar me sale un error

creo que el error es en la libreria, el programa que quiero hacer es el del control de 8 reles.

espero y me ayuden

saludos
 
Atrás
Arriba