| 
	
	|  |  |  
	
		| View previous topic :: View next topic |  
		| Author | Message |  
		| J1M 
 
 
 Joined: 15 Feb 2005
 Posts: 21
 
 
 
			      
 
 | 
			
				| USB sample code PicUSB |  
				|  Posted: Fri Aug 26, 2005 4:54 pm |   |  
				| 
 |  
				| Antes de comenzar querría agradecer a Mat Clayton el valiosísimo aporte de su API para C#, sin la cual estaría aun dándome cabezazos intentando entender porqué no me leía la DLL!! Gracias Mat! Dedico este proyectillo a todos los usuarios del foro TodoPIC, ese pedazo punto de encuentro para todos los PicManíacos!
 
 PicUSB se ha hecho con la intención de proporcionar un primer empujón para todos aquellos que quieren arrancar con los diseños por USB y que como supongo que a muchos nos ha pasado, no saben por donde engancharlo!
 
 El proyecto en sí es bastante sencillito, pretende mostrar como enviar/recibir datos por USB desde el PIC al PC, he intentado que el programa fuera entendible, por lo que realmente no tiene ninguna utilidad mas que como digo, servir de introducción al mundo del USB.
 
 Está pensado para ser usado sobre la misma plaquita del programador GTP USB (en cualquiera de sus versiones), puesto que el funcionamiento del PicUSB se limita a encender/apagar cada uno de los colores del led bicolor, y a realizar una suma de dos operandos, y no tenía ganas de montarlo todo en una protoboard!, los que aún no tengáis el GTP USB, podréis encontrar el GTP USB Lite aquí:
 http://perso.wanadoo.es/j1m/index.htm
 
 
   
 El proyecto consta de tres partes:
 - Programación de la aplicación para el PIC
 - Programación de la aplicación para PC
 - Edición del Driver suministrado por Microchip
 
 Para la programación de la aplicación para el PIC se optó por usar el extendido compilador CCS, he utilizado para ello la versión 3.227, el cuál podréis encontrar por los medios habituales ;)
 El código de la aplicación lo podéis encontrar en el PicUSB_CCS.zip, así como el .hex para ser programado en el PIC. Tanto el PicUSB.c, como el PicUSB.h está mas o menos documentado en un perfecto Spanglish, ya que el proyecto está basado en el ex_usb_scope.c suministrado por CCS, lo siento por quien no se lleve muy bien con el Inglés, pero hay cosas que no se como traducirlas al Español y me estreso!! Jeje.
 Decidí usar el 18F2550 ya que era el que tenía por aquí disponible, pero puede usarse cualquiera de la serie 18Fxx5x que incorporan el USB 2.0.
 
 Para la programación de la aplicación para PC se optó por usar el Visual C# Express 2005, actualmente va por la beta 2 y puede ser descargado gratuitamente de la página de Microsoft, aqui os pongo el link:
 http://lab.msdn.microsoft.com/express/vcsharp/default.aspx
 He decidido usar este lenguaje ya que no conocía ningún lenguaje y bueno, ya que había que empezar con alguno, pues me decidí a hacerlo con el más nuevo, además de que Microsoft lo suministra gratuitamente y eso no pasa todos los dias! Es un lenguaje con muchísimas posibilidades y es relativamente fácil empezar a hacer alguna cosilla con él.Los que no os descargueis esta version del Visual C#, necesitareis tener instalada la última version del .NET Framework, para poder ejecutar el PicUSB.exe, aquí lo podeis descargar:
 http://www.microsoft.com/downloads/details.aspx?displaylang=es&FamilyID=7abd8c8f-287e-4c7e-9a4a-a4ecff40fc8e
 Podéis encontrar el código fuente en PicUSB_VisualC#.zip, donde también veréis funciones_dll.txt en el que se detalla el uso de las funciones contenidas en la mpusbapi.dll proporcionada por Microchip, el código no está demasiado comentado, ya que he usado la API suministrada por Mat Clayton un poco a ojos cerrados, pero vamos creo que no hay problema para entender el uso de las funciones mas habituales.
 
 El último paso ha sido la edición del Driver suministrado por Microchip para ser usado junto con la DLL, no tiene mucha historia, encontraréis un leeme.txt dentro de PicUSB_Driver.zip donde se explica como editar el PicUSB.inf, a continuación os explico como instalar el driver para los que no lo tengáis muy claro.
 
 Al conectar el PicUSB por primera vez, nos saldrá el asistente para la instalación de nuevo hardware, marcamos la opción de "instalar desde una lista o ubicación específica", le damos a siguiente, en la siguiente pantalla marcamos la opción de "Buscar el controlador más adecuado en estas ubicaciones", pinchamos sobre "Incluir esta ubicación en la búsqueda", le damos a Examinar, y seleccionamos la carpeta PicUSB_Driver, le damos a Aceptar, y a Siguiente, nos saldrá una pantalla de advertencia, le damos a aceptar, y la instalación del Driver estará terminada y el led del GTP USB Lite habrá pasado de estar rojo a verde y estará listo para ser usado.
 
 Dentro del PicUSB_APP.zip podréis encontrar la aplicación PicUSB.exe así como la dll necesaria suministrada por Microchip. El funcionamiento es sencillo
 
 
   
 En la parte superior podemos encontrar el sumador, introducimos dos números del 00 hasta el 99 en cada uno de los sumandos, pinchamos sobre PIC Suma! Y estos dos operandos serán enviados al PIC, donde se procesará la suma, devolviendo entonces el resultado que se mostrará en la tercera casilla.
 Por otro lado tenemos los botones, Leds Off, Led Verde On y Led Rojo On, que envían el código correspondiente para cada uno de los casos.
 Al hacer click sobre la imagen se abrirá vuestro explorador web por defecto para llevaos a mi página J1MWeB :p
 
 Para programar el PIC os recomiendo usar el WinPIC800 creado por Sisco, podéis descargarlo de aquí:
 http://perso.wanadoo.es/siscobf/winpic800.htm
 
 Os dejo a continuación el link para descargar el proyecto:
 http://perso.wanadoo.es/j1m/index.htm
 http://perso.wanadoo.es/j1m/proyectos/picusb/picusb.zip
 
 Para cualquier duda podéis encontrarme en: jim2k2@hotmail.com
 
 Jaime Fernández-Caro Belmonte
 |  |  
		|  |  
		| Rocket 
 
 
 Joined: 29 Aug 2005
 Posts: 27
 
 
 
			    
 
 | 
			
				|  |  
				|  Posted: Mon Aug 29, 2005 10:37 am |   |  
				| 
 |  
				| Hi J1M. For those who only speak english, could you please translate when you have time?
 
 Thanks.
 
 Kind regards.
 _________________
 J.I.L.
 |  |  
		|  |  
		| PCM programmer 
 
 
 Joined: 06 Sep 2003
 Posts: 21708
 
 
 
			    
 
 | 
			
				|  |  
				|  Posted: Mon Aug 29, 2005 11:34 am |   |  
				| 
 |  
				| You can use this online translator: http://babelfish.altavista.com/
 Go down to the bottom of that page, and just copy in the whole URL
 of this page into the box "for Translate a Web page".   Then select
 "Spanish to English", click the Translate button and wait a short time.
 The translation is basically readable.
 |  |  
		|  |  
		| yolanda1 
 
 
 Joined: 06 Sep 2005
 Posts: 0
 
 
 
			    
 
 | 
			
				|  |  
				|  Posted: Fri Sep 09, 2005 2:12 am |   |  
				| 
 |  
				| Hi 
 All in this example work Ok, but is posible change parameters in picusb.h by change icon "??" in control panel ?
 
 Windows assign "??" to PicUsb
 
 This is picusb.h
 
 Thanks for help
 
 
 /////////////////////////////////////////////////////////////////////////
 ////                            PicUSB.h                             ////
 ////                                                                 ////
 //// Este ejemplo muestra como configurar el dispositivo USB y sus   ////
 //// descriptores. Los únicos cambios con respecto a su verión       ////
 //// original (usb_desc_scope.h) han sido realizados en el apartado  ////
 //// start device descriptors, concretamente el vendor y product id  ////
 //// y en apartado de start string descriptors, para definir el      ////
 //// nombre del dispositivo y la compañia.                           ////
 ////                                                                 ////
 //// Realizado con el compilador CCS PCWH 3.227                      ////
 ////                                                                 ////
 //// Por: Jaime Fernández-Caro Belmonte          jim2k2@hotmail.com  ////
 ////                                                                 ////
 //// http://perso.wanadoo.es/j1m/index.htm                           ////
 /////////////////////////////////////////////////////////////////////////
 
 #IFNDEF __USB_DESCRIPTORS__
 #DEFINE __USB_DESCRIPTORS__
 
 #include <usb.h>
 
 //////////////////////////////////////////////////////////////////
 ///
 ///   start config descriptor
 ///   right now we only support one configuration descriptor.
 ///   the config, interface, class, and endpoint goes into this array.
 ///
 //////////////////////////////////////////////////////////////////
 
 #DEFINE USB_TOTAL_CONFIG_LEN      32 //config+interface+class+endpoint
 
 //configuration descriptor
 char const USB_CONFIG_DESC[] = {
 //config_descriptor for config index 1
 USB_DESC_CONFIG_LEN,     //length of descriptor size
 USB_DESC_CONFIG_TYPE,         //constant CONFIGURATION (0x02)
 USB_TOTAL_CONFIG_LEN,0,  //size of all data returned for this config
 1,      //number of interfaces this device supports
 0x01,                //identifier for this configuration.  (IF we had more than one configurations)
 0x00,                //index of string descriptor for this configuration
 0xC0,                //bit 6=1 if self powered, bit 5=1 if supports remote wakeup (we don't), bits 0-4 reserved and bit7=1
 0x32,                //maximum bus power required (maximum milliamperes/2)  (0x32 = 100mA)
 
 //interface descriptor 0 alt 0
 USB_DESC_INTERFACE_LEN,  //length of descriptor
 USB_DESC_INTERFACE_TYPE,      //constant INTERFACE (0x04)
 0x00,                //number defining this interface (IF we had more than one interface)
 0x00,                //alternate setting
 2,       //number of endpoints, not counting endpoint 0.
 0xFF,                //class code, FF = vendor defined
 0xFF,                //subclass code, FF = vendor
 0xFF,                //protocol code, FF = vendor
 0x00,                //index of string descriptor for interface
 
 //endpoint descriptor
 USB_DESC_ENDPOINT_LEN, //length of descriptor
 USB_DESC_ENDPOINT_TYPE,     //constant ENDPOINT (0x05)
 0x81,              //endpoint number and direction (0x81 = EP1 IN)
 0x02,              //transfer type supported (0 is control, 1 is iso, 2 is bulk, 3 is interrupt)
 USB_EP1_TX_SIZE,0x00,         //maximum packet size supported
 0x01,              //polling interval in ms. (for interrupt transfers ONLY)
 
 //endpoint descriptor
 USB_DESC_ENDPOINT_LEN, //length of descriptor
 USB_DESC_ENDPOINT_TYPE,     //constant ENDPOINT (0x05)
 0x01,              //endpoint number and direction (0x01 = EP1 OUT)
 0x02,              //transfer type supported (0 is control, 1 is iso, 2 is bulk, 3 is interrupt)
 USB_EP1_RX_SIZE,0x00,         //maximum packet size supported
 0x01,              //polling interval in ms. (for interrupt transfers ONLY)
 
 };
 
 //****** BEGIN CONFIG DESCRIPTOR LOOKUP TABLES ********
 //since we can't make pointers to constants in certain pic16s, this is an offset table to find
 //  a specific descriptor in the above table.
 
 //NOTE: DO TO A LIMITATION OF THE CCS CODE, ALL HID INTERFACES MUST START AT 0 AND BE SEQUENTIAL
 //      FOR EXAMPLE, IF YOU HAVE 2 HID INTERFACES THEY MUST BE INTERFACE 0 AND INTERFACE 1
 #define USB_NUM_HID_INTERFACES   0
 
 //the maximum number of interfaces seen on any config
 //for example, if config 1 has 1 interface and config 2 has 2 interfaces you must define this as 2
 #define USB_MAX_NUM_INTERFACES   1
 
 //define how many interfaces there are per config.  [0] is the first config, etc.
 const char USB_NUM_INTERFACES[USB_NUM_CONFIGURATIONS]={1};
 
 #if (sizeof(USB_CONFIG_DESC) != USB_TOTAL_CONFIG_LEN)
 #error USB_TOTAL_CONFIG_LEN not defined correctly
 #endif
 
 
 //////////////////////////////////////////////////////////////////
 ///
 ///   start device descriptors
 ///
 //////////////////////////////////////////////////////////////////
 
 //device descriptor
 char const USB_DEVICE_DESC[] ={
 USB_DESC_DEVICE_LEN,          //the length of this report
 0x01,                //constant DEVICE (0x01)
 0x10,0x01,           //usb version in bcd
 0x00,                //class code (if 0, interface defines class.  FF is vendor defined)
 0x00,                //subclass code
 0x00,                //protocol code
 USB_MAX_EP0_PACKET_LENGTH,   //max packet size for endpoint 0. (SLOW SPEED SPECIFIES 8)
 0xD8,0x04,           //vendor id (0x04D8 is Microchip)
 0x11,0x00,           //product id, me gusta el 11 ;)
 0x01,0x00,           //device release number
 0x01,                //index of string description of manufacturer. therefore we point to string_1 array (see below)
 0x02,                //index of string descriptor of the product
 0x00,                //index of string descriptor of serial number
 USB_NUM_CONFIGURATIONS   //number of possible configurations
 };
 
 
 //////////////////////////////////////////////////////////////////
 ///
 ///   start string descriptors
 ///   String 0 is a special language string, and must be defined.  People in U.S.A. can leave this alone.
 ///
 ///   You must define the length else get_next_string_character() will not see the string
 ///   Current code only supports 10 strings (0 thru 9)
 ///
 //////////////////////////////////////////////////////////////////
 
 //the offset of the starting location of each string.
 //offset[0] is the start of string 0, offset[1] is the start of string 1, etc.
 const char USB_STRING_DESC_OFFSET[]={0,4,12};
 
 #define USB_STRING_DESC_COUNT sizeof(USB_STRING_DESC_OFFSET)
 
 char const USB_STRING_DESC[]={
 //string 0
 4, //length of string index
 USB_DESC_STRING_TYPE, //descriptor type 0x03 (STRING)
 0x09,0x04,   //Microsoft Defined for US-English
 //string 1 --> la compañia del producto ???
 8, //length of string index
 USB_DESC_STRING_TYPE, //descriptor type 0x03 (STRING)
 'J',0,
 '1',0,
 'M',0,
 //string 2 --> nombre del dispositivo
 22, //length of string index
 USB_DESC_STRING_TYPE, //descriptor type 0x03 (STRING)
 'J',0,
 '1',0,
 'M',0,
 ' ',0,
 'P',0,
 'i',0,
 'c',0,
 'U',0,
 'S',0,
 'B',0
 };
 
 
 #ENDIF
 |  |  
		|  |  
		| ymoona 
 
 
 Joined: 20 Mar 2005
 Posts: 32
 Location: Heiloo, the Netherlands
 
 
			      
 
 | 
			
				|  |  
				|  Posted: Mon May 22, 2006 1:33 pm |   |  
				| 
 |  
				| is it possible to make is work with a 6, 16 or 20MHz crystal. 
 Im confused how to set up the crystal
 _________________
 checkout my site: www.ymoona.com/wiki
 |  |  
		|  |  
		| Mark 
 
 
 Joined: 07 Sep 2003
 Posts: 2838
 Location: Atlanta, GA
 
 
			      
 
 | 
			
				|  |  
				|  Posted: Mon May 22, 2006 1:40 pm |   |  
				| 
 |  
				| The datasheet for the PIC.  It is in there. |  |  
		|  |  
		| ymoona 
 
 
 Joined: 20 Mar 2005
 Posts: 32
 Location: Heiloo, the Netherlands
 
 
			      
 
 | 
			
				|  |  
				|  Posted: Mon May 22, 2006 2:10 pm |   |  
				| 
 |  
				|  	  | Mark wrote: |  	  | The the datasheet for the PIC.  It is in there. | 
 
 what I get from the data sheet on page 30 (32 of 430)
 I should only change the pll prescaler from PLL3 to PLL4
 
 but that doesn't work, am I forgetting something?
 _________________
 checkout my site: www.ymoona.com/wiki
 |  |  
		|  |  
		| ymoona 
 
 
 Joined: 20 Mar 2005
 Posts: 32
 Location: Heiloo, the Netherlands
 
 
			      
 
 |  |  
		|  |  
		| Mark 
 
 
 Joined: 07 Sep 2003
 Posts: 2838
 Location: Atlanta, GA
 
 
			      
 
 | 
			
				|  |  
				|  Posted: Wed May 24, 2006 7:11 am |   |  
				| 
 |  
				| Post your setup code and the frequency of your xtal.  Also whether you are trying to do low or full speed. |  |  
		|  |  
		| ymoona 
 
 
 Joined: 20 Mar 2005
 Posts: 32
 Location: Heiloo, the Netherlands
 
 
			      
 
 | 
			
				|  |  
				|  Posted: Wed May 24, 2006 11:21 am |   |  
				| 
 |  
				| this is my code so far. 
 
  	  | Code: |  	  | #include <18F2550.h>
 #fuses HSPLL,NOWDT,NOPROTECT,NOLVP,NODEBUG,USBDIV,PLL4,VREGEN,CPUDIV1
 #use delay(clock=48000000)
 
 
 // hardware pin defines
 #define LED1 PIN_B0
 #define LED2 PIN_B1
 #define LED3 PIN_B2
 #define LED4 PIN_B3
 #define LED5 PIN_B4
 #define LED6 PIN_B5
 
 #define SW1 input(PIN_A4)
 #define SW2 input(PIN_A5)
 #define SW3 input(PIN_C0)
 #define SW4 input(PIN_C6)
 #define SW5 input(PIN_C7)
 
 /////////////////////////////////////////////////////////////////////////////
 //
 // CCS Library dynamic defines.  For dynamic configuration of the CCS Library
 // for your application several defines need to be made.  See the comments
 // at usb.h for more information
 //
 /////////////////////////////////////////////////////////////////////////////
 #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    1                 //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 modo      recibe[0]
 #define param1    recibe[1]
 #define param2    recibe[2]
 #define resultado envia[0]
 
 void main(void) {
 
 int8 recibe[3];                  //declaramos variables
 int8 envia[1];
 
 output_low(LED1);                   //encendemos led rojo
 output_high(LED2);
 
 usb_init();                      //inicializamos el USB
 
 usb_task();                      //habilita periferico usb e interrupciones
 usb_wait_for_enumeration();      //esperamos hasta que el PicUSB sea configurado por el host
 
 output_low(LED2);
 output_high(LED1);                    //encendemos led verde
 
 while (TRUE)
 {
 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) // Modo_Suma
 {
 resultado = param1 + param2;  //hacemos la suma
 
 usb_put_packet(1, envia, 1, USB_DTS_TOGGLE); //enviamos el paquete de tamaño 1byte del EP1 al PC
 }
 
 if (modo == 1) // Modo_Led
 {
 if (param1 == 0) {output_low(LED1); output_low(LED2);} //apagamos los leds
 if (param1 == 1) {output_high(LED1); output_low(LED2);} //encendemos led verde
 if (param1 == 2) {output_low(LED1); output_high(LED2);} //encendemos led rojo
 }
 }
 }
 }
 }
 
 | 
 
 right now I use a 16MHz xtal.
 I'm trying to use full speed USB (12Mb/s)
 
 when plug in the USB cable led1 is off and led2 is on. but my laptop doesn't show any new hardware
 
 the hardware I use is
 http://www.velleman.be/nl/en/product/view/?id=351346
 _________________
 checkout my site: www.ymoona.com/wiki
 |  |  
		|  |  
		| Mark 
 
 
 Joined: 07 Sep 2003
 Posts: 2838
 Location: Atlanta, GA
 
 
			      
 
 | 
			
				|  |  
				|  Posted: Wed May 24, 2006 12:09 pm |   |  
				| 
 |  
				| The schematic for that board show a 6MHz xtal.  Did you change this?  Did you use the right capacitors?  The schematic also shows a pullup on D- which is for low speed.  If you want full speed, the pullup should be on D+. |  |  
		|  |  
		| ymoona 
 
 
 Joined: 20 Mar 2005
 Posts: 32
 Location: Heiloo, the Netherlands
 
 
			      
 
 | 
			
				|  |  
				|  Posted: Wed May 24, 2006 12:35 pm |   |  
				| 
 |  
				|  	  | Mark wrote: |  	  | The schematic for that board show a 6MHz xtal.  Did you change this?  Did you use the right capacitors?  The schematic also shows a pullup on D- which is for low speed.  If you want full speed, the pullup should be on D+. | 
 
 I did change the xtal because i tought 6MHz was a problem, I didn't change the caps (I will do it now). low speed isnt a problem, shoult I change the software, to make it lowspeed?
 
 the caps are now 22pf so that should be fine now for a 16Mhz xtal.
 _________________
 checkout my site: www.ymoona.com/wiki
 |  |  
		|  |  
		| Mark 
 
 
 Joined: 07 Sep 2003
 Posts: 2838
 Location: Atlanta, GA
 
 
			      
 
 | 
			
				|  |  
				|  Posted: Wed May 24, 2006 2:02 pm |   |  
				| 
 |  
				| For low speed the osc configuration is not as flexible.  Reread the section in the datasheet.  For a 16MHz operation, you'll need full speed.  You can either move the pullup to the other pin (D+) or remove it and use the internal pullup. |  |  
		|  |  
		| ymoona 
 
 
 Joined: 20 Mar 2005
 Posts: 32
 Location: Heiloo, the Netherlands
 
 
			      
 
 | 
			
				|  |  
				|  Posted: Wed May 24, 2006 3:32 pm |   |  
				| 
 |  
				|  	  | Mark wrote: |  	  | For low speed the osc configuration is not as flexible.  Reread the section in the datasheet.  For a 16MHz operation, you'll need full speed.  You can either move the pullup to the other pin (D+) or remove it and use the internal pullup. | 
 
 I've adjusted the restor.
 looking on the data sheet on page 24
 I configure an
 HSPLL
 I put the PLL prescaler on PPL4 so the output is 4MHz, so USB freq should 96/2= 48MHz
 I turn on the CPUDIV1 so the working frequency of the PIC is 96/2 = 48MHz
 
 this is the config so far
 
 #include <18F2550.h>
 #fuses HSPLL,NOWDT,NOPROTECT,NOLVP,NODEBUG,USBDIV,PLL4,CPUDIV1,VREGEN
 #use delay(clock=48000000)
 
 
 some times when I connect the device windows tells me "unkows device"
 so I think I'm making some progress....
 
 but do you see thing why it shouldn'y work?
 _________________
 checkout my site: www.ymoona.com/wiki
 |  |  
		|  |  
		| ymoona 
 
 
 Joined: 20 Mar 2005
 Posts: 32
 Location: Heiloo, the Netherlands
 
 
			      
 
 | 
			
				|  |  
				|  Posted: Fri May 26, 2006 6:43 am |   |  
				| 
 |  
				| Ive now remode r35, the resistor on D+. and now the hardware works fine and in recogniced and installed by windows.
 
 but I face another problem, the PC software...
 every time I start it up. It craches, no error codes.
 
 Is this a familliar problem?
 
 btv Ive installed .NET framework 2.0
 
 edit:
 Ive recompiled the source and now it working just fine!!
 _________________
 checkout my site: www.ymoona.com/wiki
 |  |  
		|  |  
		|  |  
  
	| 
 
 | You cannot post new topics in this forum You cannot reply to topics in this forum
 You cannot edit your posts in this forum
 You cannot delete your posts in this forum
 You cannot vote in polls in this forum
 
 |  
 Powered by phpBB © 2001, 2005 phpBB Group
 
 |