Documentos de Académico
Documentos de Profesional
Documentos de Cultura
1 MEMORIA DESCRIPTIVA............................................................ 4
1.1
Objetivo ............................................................................................................ 5
1.2
1.3
1.4
Antecedentes .................................................................................................... 6
2 MEMORIA DE CLCULO........................................................... 25
2.1 Clculos software........................................................................................... 26
2.1.1 Timer 0 ........................................................................................................ 26
2.2 Clculos Hardware ........................................................................................ 26
2.2.1 Comprobar la salida de los sensores............................................................ 26
3 PLANOS ........................................................................................... 28
3.1
3.2
Diagrama de conexiones................................................................................ 30
3.3
4 PRESUPUESTO .............................................................................. 32
2
4.1
Introduccin ................................................................................................... 33
Bibliografa..................................................................................................... 37
5.2
Referencias ..................................................................................................... 37
6 ANEXOS........................................................................................... 39
6.1
Memoria descriptiva
1.1
Objetivo
1.2
1.3
Especificaciones previas
-El sistema deber ser capaz de calcular el tiempo con una resolucin y precisin de
dcimas de segundo.
1.4
Antecedentes
1.5
De los sensores expuestos arriba, se eligieron los pticos, por ser ms econmicos
que el resto, ya que requieren de menos componentes y ms baratos, y porque son ms
fciles usar.
El dispositivo IS471F ofrece las caractersticas que se buscan, es un sensor ptico de
uso fcil y de bajo coste.
Figura 2. IS471F
Consta de 4 pines:
Pin1: Vcc, aqu es donde conectaremos la alimentacin a 5 V.
Pin2: Vo es la salida, si el receptor de luz que se encuentra en el dispositivo la recibe,
este pin pasar automticamente a 5 V. Por el contrario si no la recibe, estar a 0 V. Este
ser el pin que se conectar a una de las entradas del microcontrolador.
Pin3: GND, se conecta este pin a tierra.
Pin4: Glout, este pin es donde se debe conectar el LED IR, para que la luz que
produzca est modulada y el receptor la reciba correctamente.
Un diagrama aproximado de los componentes que forman el sensor y las distancias
entre ellos:
Condensadores electrolticos
Se deben colocar dos:
-Un condensador de 47 uf, en el pin VUSB, este valor est recomendado por el
fabricante.
-Un condensador de 100uf, entre alimentacin y massa para prevenir caidas de
tensin por parte de la alimentacin.
1.6
12
CCS
La velocidad de ejecucin es uno de sus puntos flacos, si necesitamos que esta sea
muy alta y precisa difcilmente lo conseguiremos.
Una vez vistos los pros y los contras de usar un lenguaje de programacin u otro, se
eligi usar CSS. Los tiempos de ejecucin no son cruciales en este proyecto ya que la
potencia de clculo elevada del microcontrolador elegido, frente la resolucin que se
demanda, es ms que suficiente. Adems, ste dispone de suficiente memoria para
almacenar todo el cdigo.
13
Figura 7. ICD2
14
PIC C Compiler
Es el compilador que se usa en este proyecto, convierte las lneas de cdigo escritas
en lenguaje CCS, en un archivo con extensin .hex, el cual ser grabado al PIC.
Proteus 7 Professional
Es un simulador de circuitos, PICs incluidos, muy potente, donde se depura y
comprueba el buen funcionamiento de todo el sistema. El programa se us durante el
diseo del firmware para depurar todo lo relacionado con la comunicacin entre PIC y PC.
15
1.6.3 Programacin
Internamente el PIC deber hacer 3 funciones esenciales:
-Comprobar el estado de los sensores
-Calcular el tiempo que tarda el robot en realizar el recorrido
-Enviar y recibir datos del PC mediante el bus USB
1.6.3.1 Timer
Es un temporizador que provoca una interrupcin cada cierto tiempo. Este tiempo no
es aleatorio, sino que depende de los valores de unos parmetros asignados en el cdigo del
firmware.
Se programa el Timer 0 para provocar una interrupcin cada 50 milisegundos. La
atencin a esta interrupcin incrementar en una unidad la variable tics y volver a cargar
16
el Timer 0. De esta manera para saber el valor del tiempo transcurrido se multiplicar el
valor de la variable tics por 50 y se obtendr como resultado el tiempo en milisegundos.
Este proceso no se pone en marcha hasta que no se habilita el Timer 0. En el caso de
este proyecto, se debe habilitar cuando el microcontrolador recibe la seal de deteccin del
primer sensor del circuito, el cual se encuentra al inicio.
Las instrucciones para habilitar el Timer0 son las siguientes:
Setup_timer_0(RTCC_INTERAL|RTCC_DIV_8)
Esta instruccin funciona como un interruptor general, en este caso se abre paso a las
interrupciones habilitadas.
Con el objetivo de comprobar el estado de las salidas de los sensores, estas estn
conectadas a cinco pines diferentes del puerto B. De manera que se podr analizar la salida
de cada sensor por separado.
Para ello se deben programar estos cinco pines como entradas. Para hacerlo, se debe
modificar el registro TRISB, ya que los pines forman parte del PUERTOB. Como se ve a
continuacin, este registro se encuentra en la posicin de memoria 0x93.
17
1.7
19
Todos ellos cuentan con un compilador con versin gratuita descargable desde
internet, aunque tienen algunas restricciones, cualquiera de ellos es vlido para realizar las
funciones necesarias.
El lenguaje utilizado finalmente fue Visual C#.
El factor clave, que decidi cul de ellos usar, fue el conocimiento adquirido en la
universidad de este lenguaje. C# se ensea en diferentes asignaturas a lo largo de la carrera
y ste no difiere mucho de Visual C#.
20
Para comunicarse con el microcontrolador Microchip facilita una librera con las
funciones ms importantes. MPUSBAPI.DLL [8]
Esta dll debe adjuntarse al proyecto creado en Visual C# para poder usar estas
funciones:
MPUSBGETDEVICECOUNT(PVID_PID) Devuelve el nmero de dispositivo
con VID_PID asignado.
pVID_PID: Input: cadena de caracteres del nmero de identificacin asignado.
MPUSBGETDLLVERSION(VOID) Lee el nivel de revisin del MPUSAPI.dll. Es
un nivel de revisin de 32bits.
Esta funcin no devuelve la versin del cdigo, no realiza nada con el USB.
Devuelve la versin de la dll en formato hexadecimal de 32bits.
MPUSBOPEN(INSTANCE, PVID_PID, PEP, DWDIR, DWRESERVED)
Devuelve el acceso al pipe del Endpoint con el VID_PID asignado.
instance: Input: Un nmero de dispositivo para abrir. Normalmente, se utiliza
primero la llamada de MPUSBGetDeviceCount para saber cuantos dispositivos hay.
Es importante entender que el driver lo comparten distintos dispositivos. El nmero
devuelto por el MPUSBGetDeviceCount tiene que ser igual o menor que el nmero de
todos los dispositivos actualmente conectados y usando el driver genrico.
pVID_PID: Input: String que contiene el PID&VID del dispositivo objetivo.
El PID y VID son las siglas en ingls de Product IDentifier y Vendor Product
IDentifier respectivamente.
El formato es vid_xxxx&pid_yyyy. Donde xxxx es el valor del VID y el yyyy el
del PID, los dos en hexadecimal.
Ejemplo:
Si un dispositivo tiene un VID=0x04d8 y un PID=0x000b, el string de entrada es:
vid_0x04d8&pid_0x000b.
pEP: Input: String con el nmero del Endpoint que se va a abrir. El formato es
\\MCHP_EPz o \MCHP_EPz dependiendo del lenguaje de programacin. Donde z es
el nmero del Endpoint en decimal.
Ejemplo:
\\MCHP_EP1 o \MCHP_EP1
21
Este argumento puede ser NULL (nulo) para crear lazos con Endpoints de funciones
no especficas.
dwDir: Especifica la direccin del Endpoint:
dwReserved: por ahora nada.
MPUSBREAD(HANDLE,
DWMILLISECONDS)
PDATA,
DWLEN,
PLENGTH,
PDATA,
DWLEN,
PLENGTH,
handle: Input: Identifica la pipe del Endpoint que se va a escribir. La pipe unida
tiene que crearse con el atributo de acceso MP_WRITE.
pData: Output: Puntero al buffer que contiene los datos que se van a escribir en la
pipe.
dwLen: Input: Especifica el nmero de bytes que se van a escribir en la pipe.
pLenght: Output: Puntero al nmero de bytes que se escriben al llamar esta funcin.
MPUSBWrite pone este valor a cero antes de cualquier lectura o de chequear un error.
dwMilliseconds: Input: Especifica el intervalo de time-out en milisegundos. La
funcin vuelve si transcurre el intervalo aunque no se complete la operacin. Si
dwMilliseconds=0, la funcin comprueba los datos de la pipe y vuelve inmediatamente. Si
dwMilliseconds es infinito, el intervalo de time-out nunca termina.
1.7.3 Drivers
Para que el ordenador pueda reconocer y comunicarse con el PIC necesita instalar un
determinado driver que tambin proporciona Microchip MCHPUSB.SYS. Al conectar el
PIC al PC mediante el cable USB, Windows pedir que se seale la direccin donde se
encuentra ste driver, una vez sealada la ruta ste se instalar, si todo ha ido
22
23
24
Memoria de Clculo
25
2.1
Clculos software
2.1.1 Timer 0
En este proyecto, se usa para cronometrar el tiempo que tardan los robots en realizar
un tramo o todo el circuito.
Para producir una interrupcin cada 50 ms es necesario configurar el Timer. El
tiempo entre interrupciones sigue esta ecuacin:
(2)
(3)
Esta es la forma correcta de hacer la configuracin del Timer0. Pero debido a algun fallo,
el Timer 0 no interrumpe cuando se quiere. Aunque se desconoce la causa, se ha consegido
que el timer interrrumpa cada 44 ms. Con esto se sigue cumpliendo el objetivo del
proyecto y todas las restricciones que se han pedido.
2.2
Clculos Hardware
(4)
Resulta que:
V = 750 / 10 = 75 cm/s
(5)
Por ltimo, suponiendo que la parte lateral de un robot como mnimo medir 5 cm,
un caso extremo ya que hasta ahora todos miden ms, el sensor detectar al robot durante:
T=E/V
(6)
T = 5 / 75 = 66,6 ms
(7)
27
Planos
28
3.1
29
3.2
Diagrama de conexiones
30
3.3
31
Presupuesto
32
4.1
Introduccin
En este apartado se mostrar el coste real que ha supuesto la realizacin del proyecto.
Para esquematizar mejor este tema, se divide el presupuesto en dos partes:
- Componentes
- Mano de obra
4.2
Precios unitarios
4.2.1 Componentes
U
DESCRIPCION
Resistencia220
Resistencia12
DiodoLEDrojo
DiodoLEDverde
Condensador33uF
Condensadorde47uF
Condensadormica22pF
Condensador100uF
Cristal20MHZ
ConectorUSBhembraTipoA
CableUSBMM
PIC18F2550
PRECIO()
0,05
CINCOCNTIMO
0,05
CINCOCNTIMO
0,32
TRENTAYDOSCNTIMO
0,32
TRENTAYDOSCNTIMO
0,12
DOCECNTIMO
0,22
VEINTECNTIMO
0,15
QUINCECNTIMO
0,22
VEINTICINTOCNTIMO
OCHENTE
Y
NUEVE
0,89 CNTIMO
1,23
UNEUROconVEINTITRES
CNTIMO
4,40
CUATROEUROSCON
CUARENTACNTIMO
YUNCNTIMOS
33
ZcaloDIP20
ZcaloDIP8
SensorIS471F
0,45
0,15
4,46
CUARENTA
Y
CINCO
CNTIMO
QUINCECNTIMO
CUATROEUROSCON
CUARENTA
Y
SEIS
CNTIMO
h
h
4.3
DESCRIPCION
IngenieroTcnicoIndustrial
TcnicoMontador
PRECIO
16,00
9,00
()
DIECISEISEUROS
NUEVEEUROS
Precios descompuestos
4.3.1 Componentes
U
DESCRIPCION
Resistencia220
Resistencia12
DiodoLEDrojo
DiodoLEDverde
Condensador33uF
Condensadorde47uF
Condensadormica22pF
Condensador100uF
Cristal20MHZ
PRECIO()
0,05
0,05
0,32
0,32
0,12
0,22
0,15
0,22
0,89
34
UNIDADES
2,00
5,00
1,00
1,00
5,00
1,00
2,00
1,00
1,00
SUBTOTAL()
0,10
0,25
0,32
0,32
0,60
0,22
0,30
0,22
0,89
CableUSBMM
4,40
PIC18F2550
4,81
ZcaloDIP20
0,45
ZcaloDIP8
0,15
SensorIS471F
4,46
1,00
1,00
1,00
1,00
1,00
5,00
1,23
4,40
4,81
0,45
0,15
22,30
4.4
DESCRIPCION
IngenieroTcnicoIndustrial
TcnicoMontador
PRECIO()
16,00
9,00
35
UNIDADES
300
SUBTOTAL()
4800
27
Bibliografa y referencias
36
5.1
Bibliografa
5.2
Referencias
[1] DatasheetCatalog http://www.datasheetcatalog.org/datasheet/Sharp/mXvrzty.pdf
[30/6/10]
[2] DatasheetCatalog
http://www.datasheetcatalog.org/datasheet/microchip/39617a.pdf [30/6/10]
[3] Microchip
http://ww1.microchip.com/downloads/en/DeviceDoc/MPLAB_IDE_8_50.zip
[30/6/10]
[4] Microchip http://ww1.microchip.com/downloads/en/devicedoc/51331b.pdf
[30/6/10]
[5] Ccsinfo http://www.ccsinfo.com/ccsfreedemo.php [30/6/10]
37
38
Anexos
39
6.1
#include <18f2550.h>
#fuses NOMCLR,HSPLL,NOWDT,NOPROTECT,NOLVP,NODEBUG,USBDIV,
PLL5,CPUDIV1,VREGEN,NOPBADEN
#use delay(clock=4000000)
#define USB_HID_DEVICE
HID
//habilitar EP1(EndPoint1)
//habilitar EP1(EndPoint1)
#define USB_EP1_TX_SIZE
11
//almacenar en el tx del endpoint 1
//tamaano que se va
#define USB_EP1_RX_SIZE
11
//almacenar en el rx del endpoint 1
//tamaano que se va
#include <pic18_usb.h>
//Microchip PIC18Fxx5x Hardware layer para
para usar el driver USB del pic en CCS
#include <USB_DESC_SCOPE.h>
//Configuracin del USB y los
//descriptores para este dispositivo
#include <usb.c>
//informes descriptivos
#define led_rojo
PIN_A1
#define led_verde
PIN_A0
#define LED_ON
output_high
#define LED_OFF
output_low
#BYTE TRISB=0x93
#BYTE PORTB=0x81
#BYTE TRISC=0x94
#BYTE PORTC=0x82
#BYTE ITCON2=0XF1
40
//fin, como su nombre indica, esta variable confirma el fin del recorrido
/************************************************************************
**/
//********************************************************************
41
empieza=0;
sensor=0;
sentido=2;
setup_timer_0(RTCC_INTERNAL|RTCC_DIV_8);
enable_interrupts(INT_TIMER0);
enable_interrupts(global);
set_timer0(61);
}
//*********************************************************************
//*********************************************************************
void main()
int confirmacion[1];
int array[11]; //enviaremos el valor de esta variable,
//que contendr los tics, al PC
LED_OFF(led_verde);
//apagamos el verde
usb_init();
//inicializamos usb
usb_task();
interrupciones
42
usb_wait_for_enumeration();
//esperamos hasta que el PicUSB sea
//configurado por el host si no hay se queda
LED_OFF(led_rojo);
delay_ms(350);
LED_ON(led_rojo);
delay_ms(100);
LED_OFF(led_rojo);
delay_ms(100);
LED_ON(led_rojo);
delay_ms(100);
LED_OFF(led_rojo);
delay_ms(100);
LED_ON(led_rojo);
delay_ms(100);
LED_OFF(led_rojo);//encendemos led verde cuando ya es reconocido por
//el pc
LED_ON(led_verde);
confirmacion[0]=0x31;
noinput[0]=0x32;
inicializaciones();
if(usb_enumerated())
{
while(true)
{
if (usb_kbhit(1)) //si el endpoint de salida contiene datos
{
43
if(input(PIN_B7)==TRUE)
{
detect=1;
fallo_sensor[0]=0x07;
}
if((input(PIN_B6)==TRUE)&&(detect==0))
{
fallo_sensor[0]=0x06;
detect=1;
}
if((input(PIN_B5)==TRUE)&&(detect==0))
{
fallo_sensor[0]=0x05;
detect=1;
}
if((input(PIN_B4)==TRUE)&&(detect==0))
{
fallo_sensor[0]=0x04;
detect=1;
}
if((input(PIN_B3)==TRUE)&&(detect==0))
{
fallo_sensor[0]=0x03;
44
cuenta1=1;
sensor=0;
end_int();
}
buffer=1;
while(total_tics>0)//guardamos en array el valor de
{
//total_tics
array[buffer]=array[buffer]+1;
if(array[buffer]==255)//si est al mximo
{
45
buffer++;
}
total_tics=total_tics-1;
}
array[1]=(tics2/2)+0.5;//copiamos la variable
//tics2
array[2]=tics2-array[1];
tics2=0;
}
46
}
}
}
}
}
//********************************************************************
47
if(input(PIN_B6)==true)//sentido 0
{
sensor=2;//comprobaremos el siguiente sensor
entrada=1;//hay que enviar los tics contados
sentido=0;//definimos el sentido de la vuelta
}
if(input(PIN_B3)==true)// sentido 1
{
sensor=2;//comprobaremos el siguiente sensor
entrada=1;//hay que enviar los tics contados
sentido=1;//definimos el sentido de la vuelta
}
if(sentido==0)
{
if(sensor==2)//si toca comprobar este sensor
{
if(input(PIN_B5)==true)//comprobamos el sensor
{
sensor=3;//pasamos a comprobar el siguiente sensor
entrada=1;// hay que enviar los tics contados
}
}
if(sensor==3)
{
if(input(PIN_B4)==true)
{
sensor=4;
entrada=1;
}
}
if(sensor==4)
{
48
if(input(PIN_B3)==true)
{
sensor=5;
entrada=1;
}
}
if(sensor==5)
{
if(input(PIN_B7)==true)//si llegamos al ltimo sensor
{
fin=1;
entrada=1;
sensor=0;//inicializamos para sigiuente vuelta
end_int();//deshabilitamos las interrupciones
}
}
}
if(sentido==1)
{
if(sensor==2)
{
if(input(PIN_B4)==true)
{
sensor=3;
entrada=1;
}
}
if(sensor==3)
{
if(input(PIN_B5)==true)
{
sensor=4;
entrada=1;
}
}
49
if(sensor==4)
{
if(input(PIN_B3)==true)
{
sensor=5;
entrada=1;
}
}
if(sensor==5)
{
if(input(PIN_B6)==true)
{
entrada=1;
sensor=0;
fin=1;
end_int();
}
}
}
50
6.2
6.2.1 Form1.cs
using
using
using
using
using
using
using
using
System;
System.Collections.Generic;
System.ComponentModel;
System.Data;
System.Drawing;
System.Linq;
System.Text;
System.Windows.Forms;
namespace WindowsFormsApplication1
{
public partial class Form1 : Form
{
PicUSBAPI usbapi = new PicUSBAPI();
public Form1()
{
InitializeComponent();
}
// Variables globales//
int
int
int
int
int
51
double flag;
flag = usbapi.entrada();// esta funcin nos devuelve
//un 0 si hay error de comunicacin, un 2 si el micro no
//ha detectada an el paso del robot, o nos devuelve el
//nmero de tics que el micro ha calculado en un parcial
if ((flag != 2)&&(flag!=0))
{
flag = flag * (0.044);// 44 ms por interrupcion
string var2 = flag.ToString();//var2 contendr
//el valor de flag en STRING para poder
//visualizarlo en un textbox o un label.
if (parcial == 1)//Si estamos en el parcial 1
{
texto2.Text = var2;//Escribelo en su
//lugar correspondiente para visualizarlo
escribir(var2);//Funcin que escribe el dato
//enviado(var2) en un bloc de notas
}
if (parcial == 2)
{
escribir(var2);
texto3.Text = var2;
}
if (parcial == 3)
{
escribir(var2);
texto4.Text = var2;
}
if (parcial == 4)
{
escribir(var2);
texto5.Text = var2;
}
if (parcial == 5)//Ultimo parcial
{
escribir(var2);
ultimo_parcial.Text = var2;
}
if (parcial == 6)//Tiempo total
{
//El tiempo total no se calcula mediante la
//suma de los parciales, sino que el pic envia
//ste dato, de esta forma es ms exacto.
timer1.Enabled = false;//ya hemos acabado
parcial = 0;//inicializamos para la siguiente
escribir(var2);
tiempo_total[actual] = flag;//El tiempo total
//de este equipo ser igual flag
texto6.Text = tiempo_total[actual].ToString();
//mostramos su tiempo total
}
52
parcial++;//Siguiente parcial
}
if (flag == 0)
{
timer1.Enabled = false;
}
53
p9.Visible = false;
noveno.Visible = false;
tiempo9.Visible = false;
p10.Visible = false;
decimo.Visible = false;
tiempo10.Visible = false;
p11.Visible = false;
undecimo.Visible = false;
tiempo11.Visible = false;
p12.Visible = false;
duodecimo.Visible = false;
tiempo12.Visible = false;
p13.Visible = false;
decimotercero.Visible = false;
tiempo13.Visible = false;
}
escribir(nombre_jugador[actual]);//Escribimos en
//el txt el nombre del equipo actual
parcial = 1;//Inicializacin
timer1.Enabled = true;//Activmos el timer
button4.Visible = false;//Desactivamos este botn
}
private void button5_Click(object sender, EventArgs e)
{
//Botn de siguiente jugador
timer1.Enabled = false;//deshabilitamos el timer
escribir("\r\n");
//Escribimos un salto de linea
//txt para diferenciarse del otro jugador
parcial = 1;//Inicializamos
usbapi.apagar();//Esta funcin hace que el PIC
//Inicialice algunas variables suyas.
clasifica();//Esta funcin ordena los equipos segn
//los tiempos, de menor a mayor y los muestra.
actual++;//Pasamos al siguiente jugador
if (actual > num_equipos)//Si todos los equipos
//han terminado
{
ronda++;//Pasamos a la siguiente rondo
label18.Text = ronda.ToString();//Mostramos
//en que ronda estamos
actual = 1;//Volvemos al primer equipo
ini_var = 1;//Con esta variable a 1 se
//inicializarn variables
}
string equipo_actual=nombre_jugador[actual].ToString();
label6.Text=equipo_actual;//Mostramos por pantalla el
//nombre del equipo al que le toca correr.
//Borramos los tiempos parciales del equipo anterior
texto2.Text = "";
texto3.Text = "";
54
texto4.Text = "";
texto5.Text = "";
ultimo_parcial.Text = "";
texto6.Text = "";
button4.Visible = true;//Volvemos a poner visible
//el botn de Iniciar!
}
private void button6_Click(object sender, EventArgs e)
{
//Botn de introducir equipo
if (textBox1.Text != "")
{
num_equipos++;
nombre_jugador[num_equipos] = textBox1.Text;
textBox1.Text = "";
if (num_equipos == 13)
{
button6.Visible = false;
}
}
}
private void button7_Click(object sender, EventArgs e)
{
//Botn de todos los equipos introducidos
//Hacemos visibles algunos elementos
label1.Visible = true;
label2.Visible = true;
label3.Visible = true;
label4.Visible = true;
label5.Visible = true;
label6.Visible = true;
label7.Visible = true;
label9.Visible = true;
label16.Visible = true;
label18.Visible=true;
texto2.Visible = true;
texto3.Visible = true;
texto4.Visible = true;
texto5.Visible = true;
texto6.Visible = true;
ultimo_parcial.Visible = true;
button4.Visible = true;
button5.Visible = true;
button6.Visible = false;
button7.Visible = false;
string equipo_actual = nombre_jugador[actual].ToString();
label6.Text = equipo_actual;
//Inicializamos variables
int ini_clas = 0;
while (ini_clas <= 14)
{
55
clas[ini_clas] = 9999;
equipo_posicion[ini_clas] = "";
tiempo_total[ini_clas] = 9999;
ini_clas++;
}
56
}
if (actual >= 3)
{
p3.Visible = true;
tercero.Visible = true;
tiempo3.Visible = true;
tercero.Text = equipo_posicion[3];
tiempo3.Text = clas[3].ToString();
}
if (actual >= 4)
{
p4.Visible = true;
cuarto.Visible = true;
tiempo4.Visible = true;
cuarto.Text = equipo_posicion[4];
tiempo4.Text = clas[4].ToString();
}
if (actual >= 5)
{
p5.Visible = true;
quinto.Visible = true;
tiempo5.Visible = true;
quinto.Text = equipo_posicion[5];
tiempo5.Text = clas[5].ToString();
}
if (actual >= 6)
{
p6.Visible = true;
sexto.Visible = true;
tiempo6.Visible = true;
sexto.Text = equipo_posicion[6];
tiempo6.Text = clas[6].ToString();
}
if (actual >= 7)
{
p7.Visible = true;
septimo.Visible = true;
tiempo7.Visible = true;
septimo.Text = equipo_posicion[7];
tiempo7.Text = clas[7].ToString();
}
if (actual >= 8)
{
p8.Visible = true;
octavo.Visible = true;
tiempo8.Visible = true;
octavo.Text = equipo_posicion[8];
tiempo8.Text = clas[8].ToString();
}
if (actual >= 9)
{
p9.Visible = true;
noveno.Visible = true;
tiempo9.Visible = true;
57
noveno.Text = equipo_posicion[9];
tiempo9.Text = clas[9].ToString();
}
if (actual >= 10)
{
p10.Visible = true;
decimo.Visible = true;
tiempo10.Visible = true;
decimo.Text = equipo_posicion[10];
tiempo10.Text = clas[10].ToString();
}
if (actual >= 11)
{
p11.Visible = true;
undecimo.Visible = true;
tiempo11.Visible = true;
undecimo.Text = equipo_posicion[11];
tiempo11.Text = clas[11].ToString();
}
if (actual >= 12)
{
p12.Visible = true;
duodecimo.Visible = true;
tiempo12.Visible = true;
duodecimo.Text = equipo_posicion[12];
tiempo12.Text = clas[12].ToString();
}
if (actual >= 13)
{
p13.Visible = true;
decimotercero.Visible = true;
tiempo13.Visible = true;
decimotercero.Text = equipo_posicion[13];
tiempo13.Text = clas[13].ToString();
}
}
private void Form1_Load(object sender, EventArgs e)
{
}
private void button8_Click(object sender, EventArgs e)
{
int fallo;
fallo=usbapi.sensores();
if ((fallo != 10)&&(fallo!=0))
{
label8.Text = fallo.ToString();
}
if (fallo == 0)
{
label8.Text = "Fallo de comunicacin";
}
if (fallo == 10)
58
{
label8.Text = "Sensores OK";
}
}
}
}
59
6.2.2 PICUSBAPI.CS
using
using
using
using
System;
System.Collections.Generic;
System.Windows.Forms;
System.Runtime.InteropServices; // Clase para importar DLL
void* myOutPipe;
void* myInPipe;
//***************************************************************
public void OpenPipes()
{
//Abrimos las "pipes" para realiar la comunicacion
DWORD selection = 0;
60
61
if (receive_buf[0] == 0x17)
{
//Si en el primer byte tenemos un 0x17,
//significa que hemos recibido un tiempo
//parcial. receive_buf[1]y receive_buf[2]
//contienen los tics que el micro a calculado
total = (receive_buf[1] + receive_buf[2]);
return (total);
}
if (receive_buf[0] == 0x18)
{
//Un 0x18 significa que hemos recibido
//el tiempo total de la vuelta
//Los bytes del 1 al 10 contienen los tics
//totales
int llenar_buf=1;
total = 0;
//Sumamos todos los tics
while (llenar_buf <= 10)
{
total = total + receive_buf[llenar_buf];
llenar_buf++;
}
return (total);
}
if (receive_buf[0] == 0x32)
{
//Si recibimos un 0x32 significa que no
//hay datos para coger
return (2);
}
return (0);
}
//***************************************************************
62
//***************************************************************
63
}
}
64