CCS C Software and Maintenance Offers
FAQFAQ   FAQForum Help   FAQOfficial CCS Support   SearchSearch  RegisterRegister 

ProfileProfile   Log in to check your private messagesLog in to check your private messages   Log inLog in 

CCS does not monitor this forum on a regular basis.

Please do not post bug reports on this forum. Send them to support@ccsinfo.com

LCD entirely on PORTA
Goto page 1, 2  Next
 
Post new topic   Reply to topic    CCS Forum Index -> General CCS C Discussion
View previous topic :: View next topic  
Author Message
Bryan



Joined: 23 Apr 2005
Posts: 73

View user's profile Send private message Send e-mail AIM Address

LCD entirely on PORTA
PostPosted: Wed May 18, 2005 11:15 am     Reply with quote

I tried to modify the driver to run my LCD solely on porta, but it doesn't initialize correctly. I remember looking up RA5 and noting that it can never be an output (unless I am reading it incorrectly), so that is most likely my problem - Is there any way to make it an output so the LCD can use it as a data pin? You can see from the struct in my code below that I am using

A1 enable
A2 rs
A3 rw
A4 D4
A5 D5
A6 D6
A7 D7

I didn't forget the pullup resistor from RA4 to Vdd, since I know this can be a problem. Here is the code:

Code:

///////////////////////////////////////////////////////////////////////////
////                             LCDD.C                                ////
////                 Driver for common LCD modules                     ////
////                                                                   ////
////  lcd_init()   Must be called before any other function.           ////
////                                                                   ////
////  lcd_putc(c)  Will display c on the next position of the LCD.     ////
////                     The following have special meaning:           ////
////                      \f  Clear display                            ////
////                      \n  Go to start of second line               ////
////                      \b  Move back one position                   ////
////                                                                   ////
////  lcd_gotoxy(x,y) Set write position on LCD (upper left is 1,1)    ////
////                                                                   ////
////  lcd_getc(x,y)   Returns character at position x,y on LCD         ////
////                                                                   ////
///////////////////////////////////////////////////////////////////////////
////        (C) Copyright 1996,2003 Custom Computer Services           ////
//// This source code may only be used by licensed users of the CCS C  ////
//// compiler.  This source code may only be distributed to other      ////
//// licensed users of the CCS C compiler.  No other use, reproduction ////
//// or distribution is permitted without written permission.          ////
//// Derivative programs created using this software in object code    ////
//// form are not restricted in any way.                               ////
///////////////////////////////////////////////////////////////////////////

// As defined in the following structure the pin connection is as follows:
//     A1  enable
//     A2  rs
//     A3  rw
//     A4  D4
//     A5  D5
//     A6  D6
//     A7  D7
//
//   LCD pins D0-D3 are not used and PIC A0 is not used.

#define use_porta_lcd TRUE

struct lcd_pin_map {
           BOOLEAN enable;
           BOOLEAN rs;
           BOOLEAN rw;
           int     data : 4;
        } lcd;


#if defined(__PCH__)
#if defined use_porta_lcd
   #byte lcd = 0xF80                   // This puts the entire structure
#else
   #byte lcd = 0xF83                   // This puts the entire structure
#endif
#else
#if defined use_porta_lcd
   #byte lcd = 5                  // on to port A (at address 5)
#else
   #byte lcd = 8                 // on to port D (at address 8)
#endif
#endif

#if defined use_porta_lcd
   #define set_tris_lcd(x) set_tris_a(x)
#else
   #define set_tris_lcd(x) set_tris_a(x)
#endif


#define lcd_type 2           // 0=5x7, 1=5x10, 2=2 lines
#define lcd_line_two 0x40    // LCD RAM address for the second line


BYTE const LCD_INIT_STRING[4] = {0x20 | (lcd_type << 2), 0xc, 1, 6};
                             // These bytes need to be sent to the LCD
                             // to start it up.


                             // The following are used for setting
                             // the I/O port direction register.

struct lcd_pin_map const LCD_WRITE = {0,0,0,0,0}; // For write mode all pins are out
struct lcd_pin_map const LCD_READ = {0,0,0,0,15}; // For read mode data pins are in



BYTE lcd_read_byte() {
      BYTE low,high;
      set_tris_lcd(LCD_READ);
      lcd.rw = 1;
      delay_cycles(1);
      lcd.enable = 1;
      delay_cycles(1);
      high = lcd.data;
      lcd.enable = 0;
      delay_cycles(1);
      lcd.enable = 1;
      delay_us(1);
      low = lcd.data;
      lcd.enable = 0;
      set_tris_lcd(LCD_WRITE);
      return( (high<<4) | low);
}


void lcd_send_nibble( BYTE n ) {
      lcd.data = n;
      delay_cycles(1);
      lcd.enable = 1;
      delay_us(2);
      lcd.enable = 0;
}


void lcd_send_byte( BYTE address, BYTE n ) {

      lcd.rs = 0;
      while ( bit_test(lcd_read_byte(),7) ) ;
      lcd.rs = address;
      delay_cycles(1);
      lcd.rw = 0;
      delay_cycles(1);
      lcd.enable = 0;
      lcd_send_nibble(n >> 4);
      lcd_send_nibble(n & 0xf);
}


void lcd_init() {
    BYTE i;
    set_tris_lcd(LCD_WRITE);
    lcd.rs = 0;
    lcd.rw = 0;
    lcd.enable = 0;
    delay_ms(15);
    for(i=1;i<=3;++i) {
       lcd_send_nibble(3);
       delay_ms(5);
    }
    lcd_send_nibble(2);
    for(i=0;i<=3;++i)
       lcd_send_byte(0,LCD_INIT_STRING[i]);
}


void lcd_gotoxy( BYTE x, BYTE y) {
   BYTE address;

   if(y!=1)
     address=lcd_line_two;
   else
     address=0;
   address+=x-1;
   lcd_send_byte(0,0x80|address);
}

void lcd_putc( char c) {
   switch (c) {
     case '\f'   : lcd_send_byte(0,1);
                   delay_ms(2);
                                           break;
     case '\n'   : lcd_gotoxy(1,2);        break;
     case '\b'   : lcd_send_byte(0,0x10);  break;
     default     : lcd_send_byte(1,c);     break;
   }
}

char lcd_getc( BYTE x, BYTE y) {
   char value;

    lcd_gotoxy(x,y);
    while ( bit_test(lcd_read_byte(),7) ); // wait until busy flag is low
    lcd.rs=1;
    value = lcd_read_byte();
    lcd.rs=0;
    return(value);
}


I am using code that I already know works to test the output, so that won't be the problem. Any ideas?
newguy



Joined: 24 Jun 2004
Posts: 1903

View user's profile Send private message

PostPosted: Wed May 18, 2005 11:56 am     Reply with quote

Which pic are you using?

Also post the main code in its entirety.

I've previously wired an lcd to port A on an 18F252. No problems, it works well, but I used write-only mode. That is, I tied the lcd's R/W line to ground, and then omitted all the reads from the lcd. If memory serves, a delay of 350 us suffices in place of the read.
Bryan



Joined: 23 Apr 2005
Posts: 73

View user's profile Send private message Send e-mail AIM Address

PostPosted: Wed May 18, 2005 12:02 pm     Reply with quote

Here is my code:

Code:

#include <18F1220.h>
#fuses NOWDT,NOPROTECT,NOLVP,NOMCLR,INTRC_IO// CCPB0
#use delay(clock=8000000)
#include <lcdporta.c>

void main()
{
   output_a(0x00);
   lcd_init();

   while(true)
   {
      lcd_putc("\fHello");
   }
}


I think the PIC you were using is set up differently than mine. The PIC18F1220 that I use has MCLR set on pin RA5 and it says in the data sheet that this pin can never be used as an output (I have no clue why they would do this), so I am pretty sure this is the problem. I am currently in the process of putting the data lines on A0-A3 and skipping A5 to put RS on A4, RW on A6 and enable on A7. Hopefully this will work!
newguy



Joined: 24 Jun 2004
Posts: 1903

View user's profile Send private message

PostPosted: Wed May 18, 2005 12:10 pm     Reply with quote

It sounds like you have it figured out. It should work just fine once you rearrange the connections.
Ttelmah
Guest







PostPosted: Wed May 18, 2005 12:11 pm     Reply with quote

The key is to remember that 'MCLR', is also the Vpp programming pin. As such, it has to be pulled up to a much higher voltage than Vdd, and cannot have a power FET pull-up attached, or the inherent 'diode' effect in the FET, will result in shorting out the Vpp supply. Normally MCLR is not available as a general purpose pin, but to give one extra _input_, on the 18F1220, and a couple of other chips, it is made available as an input only.
Re-wiring without using this pin should solve the problem.

Best Wishes
Bryan



Joined: 23 Apr 2005
Posts: 73

View user's profile Send private message Send e-mail AIM Address

PostPosted: Wed May 18, 2005 12:35 pm     Reply with quote

Grrr, still didn't work Mad . Here is the code I used, there must be something about the pins I used that is conflicting with the LCD. Like you had said in a previous post newguy, there was an obscure case you discovered about the enable pin not working correctly if connected to RA4 - maybe the connection I used has a similar problem. I am about to just scrap this and buy a bigger pic so I can just set the LCD on port c or d to avoid all this. The whole reason I'm going through this is to keep portB available because it has 3 external interrupt pins which I need for buttons...

Code:

///////////////////////////////////////////////////////////////////////////
////                             LCDD.C                                ////
////                 Driver for common LCD modules                     ////
////                                                                   ////
////  lcd_init()   Must be called before any other function.           ////
////                                                                   ////
////  lcd_putc(c)  Will display c on the next position of the LCD.     ////
////                     The following have special meaning:           ////
////                      \f  Clear display                            ////
////                      \n  Go to start of second line               ////
////                      \b  Move back one position                   ////
////                                                                   ////
////  lcd_gotoxy(x,y) Set write position on LCD (upper left is 1,1)    ////
////                                                                   ////
////  lcd_getc(x,y)   Returns character at position x,y on LCD         ////
////                                                                   ////
///////////////////////////////////////////////////////////////////////////
////        (C) Copyright 1996,2003 Custom Computer Services           ////
//// This source code may only be used by licensed users of the CCS C  ////
//// compiler.  This source code may only be distributed to other      ////
//// licensed users of the CCS C compiler.  No other use, reproduction ////
//// or distribution is permitted without written permission.          ////
//// Derivative programs created using this software in object code    ////
//// form are not restricted in any way.                               ////
///////////////////////////////////////////////////////////////////////////

// As defined in the following structure the pin connection is as follows:
//     A0  D4
//     A1  D5
//     A2  D6
//     A3  D7
//     A4  RW
//     A6  RS
//     A7  E
//
//   LCD pins D0-D3 are not used and PIC D3 is not used.

// Un-comment the following define to use port B
#define use_porta_lcd TRUE

struct lcd_pin_map {
           int     data : 4;        //Pins A0-A3         
           BOOLEAN rw;              //Pin A4
           BOOLEAN DUMMY;           //Pin A5
           BOOLEAN rs;              //Pin A6
           BOOLEAN enable;          //Pin A7
           int unusedB;             //Port B isn't used                         
        } lcd;


#if defined(__PCH__)
#if defined use_porta_lcd
   #byte lcd = 0xF80                   // This puts the entire structure
#else
   #byte lcd = 0xF83                   // This puts the entire structure
#endif
#else
#if defined use_porta_lcd
   #byte lcd = 5                  // on to port A (at address 5)
#else
   #byte lcd = 8                 // on to port D (at address 8)
#endif
#endif

#if defined use_porta_lcd
   #define set_tris_lcd(x) set_tris_a(x)
#else
   #define set_tris_lcd(x) set_tris_d(x)
#endif


#define lcd_type 2           // 0=5x7, 1=5x10, 2=2 lines
#define lcd_line_two 0x40    // LCD RAM address for the second line


BYTE const LCD_INIT_STRING[4] = {0x20 | (lcd_type << 2), 0xc, 1, 6};
                             // These bytes need to be sent to the LCD
                             // to start it up.


                             // The following are used for setting
                             // the I/O port direction register.

struct lcd_pin_map const LCD_WRITE = {0,0,0,0,0}; // For write mode all pins are out
struct lcd_pin_map const LCD_READ = {0,0,0,0,15}; // For read mode data pins are in



BYTE lcd_read_byte() {
      BYTE low,high;
      set_tris_lcd(LCD_READ);
      lcd.rw = 1;
      delay_cycles(1);
      lcd.enable = 1;
      delay_cycles(1);
      high = lcd.data;
      lcd.enable = 0;
      delay_cycles(1);
      lcd.enable = 1;
      delay_us(1);
      low = lcd.data;
      lcd.enable = 0;
      set_tris_lcd(LCD_WRITE);
      return( (high<<4) | low);
}


void lcd_send_nibble( BYTE n ) {
      lcd.data = n;
      delay_cycles(1);
      lcd.enable = 1;
      delay_us(2);
      lcd.enable = 0;
}


void lcd_send_byte( BYTE address, BYTE n ) {

      lcd.rs = 0;
      while ( bit_test(lcd_read_byte(),7) ) ;
      lcd.rs = address;
      delay_cycles(1);
      lcd.rw = 0;
      delay_cycles(1);
      lcd.enable = 0;
      lcd_send_nibble(n >> 4);
      lcd_send_nibble(n & 0xf);
}


void lcd_init() {
    BYTE i;
    set_tris_lcd(LCD_WRITE);
    lcd.rs = 0;
    lcd.rw = 0;
    lcd.enable = 0;
    delay_ms(15);
    for(i=1;i<=3;++i) {
       lcd_send_nibble(3);
       delay_ms(5);
    }
    lcd_send_nibble(2);
    for(i=0;i<=3;++i)
       lcd_send_byte(0,LCD_INIT_STRING[i]);
}


void lcd_gotoxy( BYTE x, BYTE y) {
   BYTE address;

   if(y!=1)
     address=lcd_line_two;
   else
     address=0;
   address+=x-1;
   lcd_send_byte(0,0x80|address);
}

void lcd_putc( char c) {
   switch (c) {
     case '\f'   : lcd_send_byte(0,1);
                   delay_ms(2);
                                           break;
     case '\n'   : lcd_gotoxy(1,2);        break;
     case '\b'   : lcd_send_byte(0,0x10);  break;
     default     : lcd_send_byte(1,c);     break;
   }
}

char lcd_getc( BYTE x, BYTE y) {
   char value;

    lcd_gotoxy(x,y);
    while ( bit_test(lcd_read_byte(),7) ); // wait until busy flag is low
    lcd.rs=1;
    value = lcd_read_byte();
    lcd.rs=0;
    return(value);
}


Last edited by Bryan on Wed May 18, 2005 2:02 pm; edited 2 times in total
treitmey



Joined: 23 Jan 2004
Posts: 1094
Location: Appleton,WI USA

View user's profile Send private message Visit poster's website

PostPosted: Wed May 18, 2005 12:43 pm     Reply with quote

When ever I hear PORT A I think that the problem is a open collector output. Perhaps you need a pull-up resister(4.7k) on those lines. I didn't look up you pic's data sheet, or anything, I don't even know if it has open collector. This is just a shot in the dark.
Ttelmah
Guest







PostPosted: Wed May 18, 2005 12:57 pm     Reply with quote

RA4, is open collector, and will require a pull-up resistor.

Best Wishes
Bryan



Joined: 23 Apr 2005
Posts: 73

View user's profile Send private message Send e-mail AIM Address

PostPosted: Wed May 18, 2005 1:58 pm     Reply with quote

I did use a pullup resistor on RA4 (4k should suffice), but I still get the same result unfortunately. I pulled it out just to see if it made any difference and no change, so there must be something else wrong Confused .
Ttelmah
Guest







PostPosted: Wed May 18, 2005 2:08 pm     Reply with quote

So what does the display actually 'do'?. Is there any change at all?. How is the contrast control pin wired?.

Best Wishes
PCM programmer



Joined: 06 Sep 2003
Posts: 21708

View user's profile Send private message

PostPosted: Wed May 18, 2005 2:35 pm     Reply with quote

You have modified this structure from the original CCS driver code.
You have moved the position of the data bits.
Code:
struct lcd_pin_map {
           int     data : 4;        //Pins A0-A3         
           BOOLEAN rw;              //Pin A4
           BOOLEAN DUMMY;           //Pin A5
           BOOLEAN rs;              //Pin A6
           BOOLEAN enable;          //Pin A7
           int unusedB;             //Port B isn't used                         
        } lcd;


But here, in your code, you have the TRIS settings for the pins
defined in the structure above. But you haven't modified this
structure. It's still the same as the original CCS driver.
Code:
struct lcd_pin_map const LCD_READ = {0,0,0,0,15}; // For read mode data pins are in
newguy



Joined: 24 Jun 2004
Posts: 1903

View user's profile Send private message

PostPosted: Wed May 18, 2005 2:51 pm     Reply with quote

PCM programmer wrote:
You have modified this structure from the original CCS driver code.
You have moved the position of the data bits.
Code:
struct lcd_pin_map {
           int     data : 4;        //Pins A0-A3         
           BOOLEAN rw;              //Pin A4
           BOOLEAN DUMMY;           //Pin A5
           BOOLEAN rs;              //Pin A6
           BOOLEAN enable;          //Pin A7
           int unusedB;             //Port B isn't used                         
        } lcd;


But here, in your code, you have the TRIS settings for the pins
defined in the structure above. But you haven't modified this
structure. It's still the same as the original CCS driver.
Code:
struct lcd_pin_map const LCD_READ = {0,0,0,0,15}; // For read mode data pins are in


That's not all of his problems. He has the lcd's enable wired to A7 on the pic, which is an input only.

Bryan, you can't use pin A7 for that. An input tied to another input. Doesn't work. Switch it around again - take the DUMMY out and move the rs and enable lines down one bit each. As PCM already pointed out, you must change the tris pin map too.
Ttelmah
Guest







PostPosted: Wed May 18, 2005 3:07 pm     Reply with quote

A7, is not an input only pin. It supports normal I/O (provided it is set up as an I/O pin). he has not posted the setup part of the code, but there could obviously be a problem if the oscillator mode is not setup to use this as I/O. The 'dummy' is there to avoid using A5, which is an input only pin.

Best Wishes
PCM programmer



Joined: 06 Sep 2003
Posts: 21708

View user's profile Send private message

PostPosted: Wed May 18, 2005 3:08 pm     Reply with quote

He's using 18F1220. Table 1-2 shows RA7 as i/o.
Bryan



Joined: 23 Apr 2005
Posts: 73

View user's profile Send private message Send e-mail AIM Address

PostPosted: Wed May 18, 2005 4:40 pm     Reply with quote

Thank you for the help everyone! PCM programmer, thank you for calling my attention to that! I totally overlooked it and when I updated that line it worked perfectly. Surprising thing here is that once I saw that it worked, I pulled out the pullup resistor that I was using for RA4 since it is open drain just to see what would happen and it still worked fine! Maybe the output signal from that port is just high enough to be detected by the LCD? Here is my working main code and driver (changes bolded):

Code:

#include <18F1220.h>
#fuses NOWDT,NOPROTECT,NOLVP,NOMCLR,INTRC_IO// CCPB0
#use delay(clock=8000000)
#include "lcdporta.c"

void main()
{
   output_a(0x00);
   setup_adc(NO_ANALOGS);
   lcd_init();
   lcd_putc("\fHello");
}


Driver code:

Code:

///////////////////////////////////////////////////////////////////////////
////                             LCDD.C                                ////
////                 Driver for common LCD modules                     ////
////                                                                   ////
////  lcd_init()   Must be called before any other function.           ////
////                                                                   ////
////  lcd_putc(c)  Will display c on the next position of the LCD.     ////
////                     The following have special meaning:           ////
////                      \f  Clear display                            ////
////                      \n  Go to start of second line               ////
////                      \b  Move back one position                   ////
////                                                                   ////
////  lcd_gotoxy(x,y) Set write position on LCD (upper left is 1,1)    ////
////                                                                   ////
////  lcd_getc(x,y)   Returns character at position x,y on LCD         ////
////                                                                   ////
///////////////////////////////////////////////////////////////////////////
////        (C) Copyright 1996,2003 Custom Computer Services           ////
//// This source code may only be used by licensed users of the CCS C  ////
//// compiler.  This source code may only be distributed to other      ////
//// licensed users of the CCS C compiler.  No other use, reproduction ////
//// or distribution is permitted without written permission.          ////
//// Derivative programs created using this software in object code    ////
//// form are not restricted in any way.                               ////
///////////////////////////////////////////////////////////////////////////

// As defined in the following structure the pin connection is as follows:
//     A0  D4
//     A1  D5
//     A2  D6
//     A3  D7
//     A4  RW
//     A6  RS
//     A7  E
//
//   LCD pins D0-D3 are not used and PIC D3 is not used.

// Un-comment the following define to use port B
#define use_porta_lcd TRUE

struct lcd_pin_map {
           int     data : 4;        //Pins A0-A3
           BOOLEAN rw;              //Pin A4
           BOOLEAN DUMMY;           //Pin A5
           BOOLEAN rs;              //Pin A6
           BOOLEAN enable;          //Pin A7
        } lcd;


#if defined(__PCH__)
#if defined use_porta_lcd
   #byte lcd = 0xF80                   // This puts the entire structure
#else
   #byte lcd = 0xF83                   // This puts the entire structure
#endif
#else
#if defined use_porta_lcd
   #byte lcd = 5                  // on to port B (at address 6)
#else
   #byte lcd = 8                 // on to port D (at address 8)
#endif
#endif

#if defined use_porta_lcd
   #define set_tris_lcd(x) set_tris_a(x)
#else
   #define set_tris_lcd(x) set_tris_d(x)
#endif


#define lcd_type 2           // 0=5x7, 1=5x10, 2=2 lines
#define lcd_line_two 0x40    // LCD RAM address for the second line


BYTE const LCD_INIT_STRING[4] = {0x20 | (lcd_type << 2), 0xc, 1, 6};
                             // These bytes need to be sent to the LCD
                             // to start it up.


                             // The following are used for setting
                             // the I/O port direction register.

struct lcd_pin_map const LCD_WRITE = {0,0,0,0,0}; // For write mode all pins are out
[b]struct lcd_pin_map const LCD_READ = {15,0,0,0,0}; // For read mode data pins are in[/b]



BYTE lcd_read_byte() {
      BYTE low,high;
      set_tris_lcd(LCD_READ);
      lcd.rw = 1;
      delay_cycles(1);
      lcd.enable = 1;
      delay_cycles(1);
      high = lcd.data;
      lcd.enable = 0;
      delay_cycles(1);
      lcd.enable = 1;
      delay_us(1);
      low = lcd.data;
      lcd.enable = 0;
      set_tris_lcd(LCD_WRITE);
      return( (high<<4) | low);
}


void lcd_send_nibble( BYTE n ) {
      lcd.data = n;
      delay_cycles(1);
      lcd.enable = 1;
      delay_us(2);
      lcd.enable = 0;
}


void lcd_send_byte( BYTE address, BYTE n ) {

      lcd.rs = 0;
      while ( bit_test(lcd_read_byte(),7) ) ;
      lcd.rs = address;
      delay_cycles(1);
      lcd.rw = 0;
      delay_cycles(1);
      lcd.enable = 0;
      lcd_send_nibble(n >> 4);
      lcd_send_nibble(n & 0xf);
}


void lcd_init() {
    BYTE i;
    set_tris_lcd(LCD_WRITE);
    lcd.rs = 0;
    lcd.rw = 0;
    lcd.enable = 0;
    delay_ms(15);
    for(i=1;i<=3;++i) {
       lcd_send_nibble(3);
       delay_ms(5);
    }
    lcd_send_nibble(2);
    for(i=0;i<=3;++i)
       lcd_send_byte(0,LCD_INIT_STRING[i]);
}


void lcd_gotoxy( BYTE x, BYTE y) {
   BYTE address;

   if(y!=1)
     address=lcd_line_two;
   else
     address=0;
   address+=x-1;
   lcd_send_byte(0,0x80|address);
}

void lcd_putc( char c) {
   switch (c) {
     case '\f'   : lcd_send_byte(0,1);
                   delay_ms(2);
                                           break;
     case '\n'   : lcd_gotoxy(1,2);        break;
     case '\b'   : lcd_send_byte(0,0x10);  break;
     default     : lcd_send_byte(1,c);     break;
   }
}

char lcd_getc( BYTE x, BYTE y) {
   char value;

    lcd_gotoxy(x,y);
    while ( bit_test(lcd_read_byte(),7) ); // wait until busy flag is low
    lcd.rs=1;
    value = lcd_read_byte();
    lcd.rs=0;
    return(value);
}
Display posts from previous:   
Post new topic   Reply to topic    CCS Forum Index -> General CCS C Discussion All times are GMT - 6 Hours
Goto page 1, 2  Next
Page 1 of 2

 
Jump to:  
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