Uso del modulo USB en aplicacion hardware-software
Para este laboratorio se implementara un circuito que enviara y recivira información entre el microprocesador y un computador utilizando como medio de comunicación el modulo USB, para poder desarrollar el laboratorio fue necesario instalar un driver para poder utilizar dispositivos HID, con este software ya se puede realizar la comunicacion entre el computador y el microprocesador.
- Tarjeta de propósito general para PIC 18F2550.
- Resistencia variable 1KΩ (Potenciómetro)..
- Bloque X 8 led´s.
- Resistencias 330Ω X 8.
Desarrollo del laboratorio:
Para este caso se realiza la captura de la variación de voltaje ocasionada por el movimiento de un potenciometro, esta variación se toma por el ADC del microprocesador almacenadose en una variable que después se envía por el modulo USB hacia el computador en el cual se visualiza en una aplicación desarrollada en Visual Studio. Net 2010, adicional mente en la aplicación se realiza una trackbar cuya variación se envía por el modulo USB hacia el microprocesador, esta información se visualiza en los led´s conectados en el puerto B del microprocesador.
a continuación se muestra el código del fireware.
#include <18F2550.h>
#device adc=8
#fuses HS,NOWDT,NOPROTECT,NOLVP,NODEBUG,USBDIV,PLL3,CPUDIV1,VREGEN
#use delay (clock=12000000)//12Mhz
#USE STANDARD_IO(A)
#USE STANDARD_IO(B)
// CCS Library dynamic defines
#DEFINE USB_HID_DEVICE TRUE
#define USB_EP1_TX_ENABLE USB_ENABLE_INTERRUPT
#define USB_EP1_TX_SIZE 64
#define USB_EP1_RX_ENABLE USB_ENABLE_INTERRUPT
#define USB_EP1_RX_SIZE 64
// CCS USB Libraries
#include <pic18_usb.h>
#include <usb_desc_hid 8-byte.h>
#include <usb.c>
void usb_debug_task(VOID)
{
STATIC int8 last_connected;
STATIC int8 last_enumerated;
INT8 new_connected;
INT8 new_enumerated;
new_connected = usb_attached ();
new_enumerated = usb_enumerated ();
last_connected = new_connected;
last_enumerated = new_enumerated;
}
// ----------------------------------Declaración de variables----------------------------------
int dato4; //variable
int dato1; //variable
//Variables USB-----------------------------------
int16 tx;
#byte txl=43
#byte txh=44
#byte tx1l=45
#byte tx1h=46
int8 in_data[8];
int8 out_data[8];
// ----------------------------------Declaración de los prototipos de las funciones---------------------------------
#INT_TIMER1
void int_TMR1() //retardo programado a un segundo
{
}
void main(){
enable_interrupts(INT_RDA);
enable_interrupts(GLOBAL);
setup_adc_ports(AN0);
setup_adc(ADC_CLOCK_INTERNAL);
usb_init();
for (;;) {
SET_ADC_CHANNEL(0);
DELAY_US(20);
dato4=READ_ADC();
usb_task ();
usb_debug_task ();
usb_get_packet (1, in_data, 8);
txh=(in_data[1]);
txl=(in_data[2]);
tx1h=(in_data[3]);
dato1=(in_data[4]);
output_b(dato1);
out_data[0]=30 ;
out_data[3]=dato4;
usb_put_packet (1, out_data, 8, USB_DTS_TOGGLE);
ENABLE_INTERRUPTS(int_timer0);
set_timer0(tx);
}
}
y esta es la simulación:
Y por ultimo se muestra el montaje real
a continuación se muestra el código del fireware.
#include <18F2550.h>
#device adc=8
#fuses HS,NOWDT,NOPROTECT,NOLVP,NODEBUG,USBDIV,PLL3,CPUDIV1,VREGEN
#use delay (clock=12000000)//12Mhz
#USE STANDARD_IO(A)
#USE STANDARD_IO(B)
// CCS Library dynamic defines
#DEFINE USB_HID_DEVICE TRUE
#define USB_EP1_TX_ENABLE USB_ENABLE_INTERRUPT
#define USB_EP1_TX_SIZE 64
#define USB_EP1_RX_ENABLE USB_ENABLE_INTERRUPT
#define USB_EP1_RX_SIZE 64
// CCS USB Libraries
#include <pic18_usb.h>
#include <usb_desc_hid 8-byte.h>
#include <usb.c>
void usb_debug_task(VOID)
{
STATIC int8 last_connected;
STATIC int8 last_enumerated;
INT8 new_connected;
INT8 new_enumerated;
new_connected = usb_attached ();
new_enumerated = usb_enumerated ();
last_connected = new_connected;
last_enumerated = new_enumerated;
}
// ----------------------------------Declaración de variables----------------------------------
int dato4; //variable
int dato1; //variable
//Variables USB-----------------------------------
int16 tx;
#byte txl=43
#byte txh=44
#byte tx1l=45
#byte tx1h=46
int8 in_data[8];
int8 out_data[8];
// ----------------------------------Declaración de los prototipos de las funciones---------------------------------
#INT_TIMER1
void int_TMR1() //retardo programado a un segundo
{
}
void main(){
enable_interrupts(INT_RDA);
enable_interrupts(GLOBAL);
setup_adc_ports(AN0);
setup_adc(ADC_CLOCK_INTERNAL);
usb_init();
for (;;) {
SET_ADC_CHANNEL(0);
DELAY_US(20);
dato4=READ_ADC();
usb_task ();
usb_debug_task ();
usb_get_packet (1, in_data, 8);
txh=(in_data[1]);
txl=(in_data[2]);
tx1h=(in_data[3]);
dato1=(in_data[4]);
output_b(dato1);
out_data[0]=30 ;
out_data[3]=dato4;
usb_put_packet (1, out_data, 8, USB_DTS_TOGGLE);
ENABLE_INTERRUPTS(int_timer0);
set_timer0(tx);
}
}
y esta es la simulación:
Y por ultimo se muestra el montaje real


No hay comentarios:
Publicar un comentario