Lo acabo de ver , está muy buena la idea de usar una placa de red ........nos ahorramos todo el hardware necesario para ETHERNET.
Follow along with the video below to see how to install our site as a web app on your home screen.
Nota: This feature currently requires accessing the site using the built-in Safari browser.
#include <18F4550.h>
#DEVICE ADC=8 // CAD con 8 bits de resolución , justificación a la derecha.
#fuses HSPLL,NOWDT,NOPROTECT,NOLVP,NODEBUG,USBDIV,PLL12,CPUDIV1,VREGEN
#use delay(clock=48000000)
#define USB_HID_DEVICE FALSE //deshabilitamos el uso de las directivas 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 4 //size to allocate for the tx endpoint 1 buffer
#define USB_EP1_RX_SIZE 3 //size to allocate for the rx endpoint 1 buffer
#include <pic18_usb.h> //Microchip PIC18Fxx5x Hardware layer for CCS's PIC USB driver
#include <PicUSB.h> //Configuración del USB y los descriptores para este dispositivo
#include <usb.c> //handles usb setup tokens and get descriptor reports
#define LEDV PIN_B6
#define LEDR PIN_B7
#define SERVO1 PIN_D7
#define SERVO2 PIN_D6
#define LED_ON output_high
#define LED_OFF output_low
#define SERVO_ON output_high
#define SERVO_OFF output_low
#define modo recibe[0]
#define param1 recibe[1]
#define param2 recibe[2]
#define resultado0 envia[0]
#define resultado1 envia[1]
#define resultado2 envia[2]
#define resultado3 envia[3]
void main(void) {
int8 recibe[3]; //declaramos variables
int8 envia[4];
int8 valorleidorom;
int8 valor1; //aqui se almacena el resultado del conversor A/D
int8 valor2;
int8 valor3;
int8 valor4;
int8 panel1;
int8 panel2;
int8 posmemw; //posicion de la memoria eeprom para escribir
//LED_OFF(LEDV); //encendemos led rojo (en el de alberto)
//LED_OFF(LEDR); (en el de alberto)
LED_ON(LEDV);
LED_ON(LEDR);
delay_ms(1000);
usb_init(); //inicializamos el USB
usb_task(); //habilita periferico usb e interrupciones
while (usb_enumerated()== 0);
//usb_wait_for_enumeration(); //esperamos hasta que el PicUSB sea configurado por el host
//LED_ON(LEDV); //encendemos led rojo (en el de alberto)
//LED_ON(LEDR); (en el de alberto)
LED_OFF(LEDV);
LED_OFF(LEDR);
delay_ms(1000);
//setup_adc_ports(AN0 || VSS_VDD);
setup_adc_ports( AN0_TO_AN11 ); //ponemos estas entradas analogicas
setup_adc(ADC_CLOCK_INTERNAL);
//set_adc_channel(0); // Selecciono el canal de conversión.
// configuro adcon2
#asm
movlw 0b00111110 ;justificacion_izquierda,20Tad,Fosc/64
iorwf 0xFC0,1 ; direccion de ADCON2
movlw 0b00111110 ;tensiones de referencia vref- y vrefmas (para leer del conversor valores de hasta 12v) y an0 es analogico
iorwf 0XFC1,1 ;
#endasm
while (TRUE)
{
LED_ON(LEDR);
LED_OFF(LEDV);
delay_ms(1000);
if(usb_enumerated()) //si el PicUSB está configurado
{
if (usb_kbhit(1)) //si el endpoint de salida contiene datos del host
{
usb_get_packet(1, recibe, 3); //cojemos el paquete de tamaño 3bytes del EP1 y almacenamos en recibe
if (modo == 0) // El ordenador me manda capturar datos y almacenarlos
{
LED_OFF(LEDV);
LED_OFF(LEDR);
delay_ms(1000);
set_adc_channel(0); // Selecciono el canal de conversión 0
delay_ms( 100 );
valor1 = read_adc(); // El resultado de la conversión lo guarda en la variable valor.
delay_us(2000);
valor1 = read_adc(); // El resultado de la conversión lo guarda en la variable valor.
delay_us(2000);
set_adc_channel(1); // Selecciono el canal de conversión 1
delay_ms( 100 );
valor2 = read_adc(); // El resultado de la conversión lo guarda en la variable valor.
delay_us(2000);
valor2 = read_adc(); // El resultado de la conversión lo guarda en la variable valor.
delay_us(2000);
set_adc_channel(4); // Selecciono el canal de conversión 4
delay_ms( 100 );
valor3 = read_adc(); // El resultado de la conversión lo guarda en la variable valor.
delay_us(2000);
valor3 = read_adc(); // El resultado de la conversión lo guarda en la variable valor.
delay_us(2000);
set_adc_channel(11); // Selecciono el canal de conversión 5
delay_ms( 100 );
valor4 = read_adc(); // El resultado de la conversión lo guarda en la variable valor.
delay_us(2000);
valor4 = read_adc(); // El resultado de la conversión lo guarda en la variable valor.
delay_us(2000);
set_adc_channel(5); // Selecciono el canal de conversión 5
delay_ms( 100 );
panel1 = read_adc(); // El resultado de la conversión lo guarda en la variable panel1.
delay_us(2000);
panel1 = read_adc(); // El resultado de la conversión lo guarda en la variable panel1.
delay_us(2000);
set_adc_channel(6); // Selecciono el canal de conversión 6
delay_ms( 100 );
panel2 = read_adc(); // El resultado de la conversión lo guarda en la variable panel2.
delay_us(2000);
panel2 = read_adc(); // El resultado de la conversión lo guarda en la variable panel2.
delay_us(2000);
write_eeprom(posmemw, panel1);
posmemw++; //siguiente campo en la eeprom para no sobreescribir datos
write_eeprom(posmemw, panel2);
posmemw++; //siguiente campo en la eeprom para no sobreescribir datos
write_eeprom(posmemw, valor1);
posmemw++; //siguiente campo en la eeprom para no sobreescribir datos
write_eeprom(posmemw, valor2);
posmemw++; //siguiente campo en la eeprom para no sobreescribir datos
write_eeprom(posmemw, valor3);
posmemw++; //siguiente campo en la eeprom para no sobreescribir datos
write_eeprom(posmemw, valor4);
posmemw++; //siguiente campo en la eeprom para no sobreescribir datos
}
if (modo == 1) //led verde on y movemos servo
{
LED_ON(LEDV);
LED_OFF(LEDR);
SERVO_ON(SERVO1);
delay_us(2000);
SERVO_OFF(SERVO1);
delay_us(18000);
SERVO_ON(SERVO2);
delay_us(4000);
SERVO_OFF(SERVO2);
delay_us(16000);
} //encendemos led verde y movemos el servo
if (modo == 2)
{
LED_OFF(LEDV); LED_ON(LEDR);
SERVO_ON(SERVO2);
delay_us(2000);
SERVO_OFF(SERVO2);
delay_us(18000);
SERVO_ON(SERVO1);
delay_us(4000);
SERVO_OFF(SERVO1);
delay_us(16000);
} //encendemos led rojo,movemos servo y leemos eeprom
if (modo == 3) //leemos de la rom y le pasamos los 4 primeros valores al ordenador
{
LED_OFF(LEDV);
LED_OFF(LEDR);
valorleidorom = read_eeprom (0);
resultado0 = valorleidorom;
valorleidorom = read_eeprom (1);
resultado1 = valorleidorom;
valorleidorom = read_eeprom (2);
resultado2 = valorleidorom;
valorleidorom = read_eeprom (3);
resultado3 = valorleidorom;
usb_put_packet(1, envia, 4, USB_DTS_TOGGLE); //enviamos el paquete de tamaño 4byte del EP1 al PC
}
}
}
}
}
Toda la información que necesitas está en el hilo del foro...lee y se te van a aclarar todas las dudas.Jonatan ya te escribi una vez un amensaje privado y me contaste que publicara mis dudas aqui .
aqui tengo varias dudas
1- No se como configurar el pic 18f44550 para hace transferencias por el puerto USB
2- A la SIE del PIC segun el datasheet le entra una senal de reloj , no se como configurar el pic para que esa senal de reloj este activa
3- yo tengo el proteus 7.2 sp6 pero no si el conector USB que trae me funciona Bien , porque el proteus que tengo esta crakeado , necesito por favor un segmento de codigo que me permita comprobar su funcionamiento. si pudieras publicar un codigo en lenguaje ensamblador porque es lo que se , ya que aunque he programado en C no tengo conocimiento de algunas funciones que se utilizan para manejar el puerto usb
MUCHAS GRACIAS por todo
Hola a todos, los felicito por su foro, está muy bueno. Yo soy algo nuevo en esto del USB, pero programo en CCS, PBP y se algo de Visual Basic. Bueno, la cuestión es que estuve probando uno de sus primeros ejemplos simulando con el proteus... va bien el primer tiro, pero luego me saca un error y me deja el socket abierto y no puedo volverlo a correr... me toca reiniciar el equipo y nuevamente lo mismo.
Bueno, yo sé que en el foro hay muchos aportes, pero no escontré o tal vez no entendí lo que decían, algo acerca de lo que pretendo... pero bueno, estoy en camino de iniciar un proyecto en el que recibo unos 250 Bytes desde un programa VB y debo verificar que haya llegado bien, luego desconecto el USB y me debe pasar a realizar otra tarea distinta al USB. AH! me parecería muy interesante hacerlo directamente sobre USB, no VIRTUAL COM, ojalá PnP .... ya tengo algunas ideas, basándome en lo leido en el foro así:
Utilizaré un ejemplo que hay en HOBBYPIC, sólo que con PIN SENSE para poder hacer otras cosas cuando el USB no esté conectado, pienso que debería iniciar USB con usb_init_cs y además el usb_task (debo hacerle una pasada periódicamente para que esté alerta cuando conecten el USB)........ en fin, si alguno de ustedes me puede echar una manito le agradecería y publicaría los resultados a medida que vaya avanzando para que nos nutramos.
NUEVAMENTE FELICIATACIONES
Espero poder aportar algo de mis conocimientos a este gran foro
Regards,
RASAAM