Forum Menu




 


Log in Problems?
New User? Sign Up!
AVR Freaks Forum Index

Post new topic   Reply to topic
View previous topic Printable version Log in to check your private messages View next topic
Author Message
clawson
PostPosted: Mar 01, 2012 - 04:06 PM
10k+ Postman


Joined: Jul 18, 2005
Posts: 62298
Location: (using avr-gcc in) Finchingfield, Essex, England

Nope this is where you need to start debugging - with something this complex I often find a storage scope or a logic analyzer help a LOT!

As an alternative have you tried the code from Fabian Maximilian Thiele? That is actually the most often used KS0108 code I believe and, for example, forms the basis of the KS0108 support in Arduino:

http://www.arduino.cc/playground/Code/GLCDks0108

As that page says there's a copy of the original Thiele code at: http://www.scienceprog.com/wp-content/u ... ks0108.zip - within that you edit ks0108.h to set the PORTs and bit numbers.

(Somewhere I have a JE-AN 1286404 display which uses a KS0108 - I must look it out and see if I can make it work!)

Actually searching for 1286404 on this site leads to some other KS0108 threads and one of them mentions this:

http://www.mikrocontroller.net/attachme ... KS0108.zip

That appears to be yet another "driver" for the KS0108.

_________________
 
 View user's profile Send private message  
Reply with quote Back to top
jan_dc
PostPosted: Mar 01, 2012 - 05:54 PM
Hangaround


Joined: Feb 09, 2011
Posts: 322
Location: Turnhout, Belgium

How is the negative voltage (contrast) connected and what voltage has it?
 
 View user's profile Send private message Visit poster's website 
Reply with quote Back to top
js
PostPosted: Mar 01, 2012 - 10:02 PM
10k+ Postman


Joined: Mar 28, 2001
Posts: 20363
Location: Sydney, Australia (Gum trees, Koalas and Kangaroos, No Edelweiss)

Quote:
other ideas what could be wrong?
I hate repeating myself but http://www.avrfreaks.net/index.php?name ... 45c#930085

_________________
John Samperi
Ampertronics Pty. Ltd.
www.ampertronics.com.au
* Electronic Design * Custom Products * Contract Assembly
 
 View user's profile Send private message Visit poster's website 
Reply with quote Back to top
tankar
PostPosted: Mar 02, 2012 - 10:15 AM
Rookie


Joined: Feb 22, 2012
Posts: 28


js wrote:
Quote:
other ideas what could be wrong?
I hate repeating myself but http://www.avrfreaks.net/index.php?name ... 45c#930085


I've never used a jtag so I think its already disabled. I have something called "JTAGEN" in fuses, is that it?

jan_dc wrote:
How is the negative voltage (contrast) connected and what voltage has it?


Its connected like the datasheet recommended,
https://www.distrelec.ch/ishop/Datasheets/07540902.pdf
The voltage is around 4.3 V, I can adjust it with the potentiometer and I think the contrast is good at that voltage.
 
 View user's profile Send private message  
Reply with quote Back to top
jan_dc
PostPosted: Mar 02, 2012 - 10:56 AM
Hangaround


Joined: Feb 09, 2011
Posts: 322
Location: Turnhout, Belgium

tankar wrote:

jan_dc wrote:
How is the negative voltage (contrast) connected and what voltage has it?


Its connected like the datasheet recommended,
https://www.distrelec.ch/ishop/Datasheets/07540902.pdf
The voltage is around 4.3 V, I can adjust it with the potentiometer and I think the contrast is good at that voltage.


Please do a proper measurement! VEE must be negative. So either it is wrong or you are measuring with the red lead on GND and black on pin 3.

If it's -4.3V your screen would be really dark. The VEE on our displays is typically -3.3V. Though this can depend on the module. Anyway, if VEE is correct you must be able to see the contrast differences when you turn the potentiometer. If not: wrong contrast and you won't see a thing.
 
 View user's profile Send private message Visit poster's website 
Reply with quote Back to top
tankar
PostPosted: Mar 02, 2012 - 11:05 AM
Rookie


Joined: Feb 22, 2012
Posts: 28


I tried those drivers u linked to clawson but when i ran the test code it said that most of the functions were undefined referenced to like ks0108Init and ks0108GotoXY.

They are included so I dont know why it's whining.
This is pissing me off. It is defiened in KS0S0108.c but thats not included in the test file.
If i include that i still get errors but that ks0108enable and ks0108readdata is undefined...


Code:

#include <inttypes.h>
#include <avr/io.h>
#include <avr/pgmspace.h>

#include "C:/Documents and Settings/jonaste/Desktop/KS0108/KS0108.h"
#include "C:/Documents and Settings/jonaste/Desktop/KS0108/arial_bold_14.h"
#include "C:/Documents and Settings/jonaste/Desktop/KS0108/corsiva_12.h"

int main(void) {
   
   // Wait a little while the display starts up
   for(volatile uint16_t i=0; i<15000; i++);
   
   // Initialize the LCD
   ks0108Init(0);
   
   // Select a font
   ks0108SelectFont(Arial_Bold_14, ks0108ReadFontData, BLACK);
   // Set a position
   ks0108GotoXY(15,10);
   // Print some text
   ks0108Puts_P(PSTR("KS0108-Treiber"));
   // a nice little round rect
   ks0108DrawRoundRect(5, 5, 117, 20, 8, BLACK);

   // Once again :)
   // Select a font
   ks0108SelectFont(Corsiva_12, ks0108ReadFontData, BLACK);
   // Set a position
   ks0108GotoXY(5,30);
   // Print some text
   ks0108Puts_P(PSTR("http://www.apetech.de\nmailto:me@apetech.de"));

   while(1);
}


Last edited by tankar on Mar 02, 2012 - 12:14 PM; edited 2 times in total
 
 View user's profile Send private message  
Reply with quote Back to top
tankar
PostPosted: Mar 02, 2012 - 11:10 AM
Rookie


Joined: Feb 22, 2012
Posts: 28


jan_dc wrote:
tankar wrote:

jan_dc wrote:
How is the negative voltage (contrast) connected and what voltage has it?


Its connected like the datasheet recommended,
https://www.distrelec.ch/ishop/Datasheets/07540902.pdf
The voltage is around 4.3 V, I can adjust it with the potentiometer and I think the contrast is good at that voltage.


Please do a proper measurement! VEE must be negative. So either it is wrong or you are measuring with the red lead on GND and black on pin 3.

If it's -4.3V your screen would be really dark. The VEE on our displays is typically -3.3V. Though this can depend on the module. Anyway, if VEE is correct you must be able to see the contrast differences when you turn the potentiometer. If not: wrong contrast and you won't see a thing.


I can see the contrast changing when i turn the potentiometer. I'm measuring with the black lead on GND and the red lead on pin 3.
 
 View user's profile Send private message  
Reply with quote Back to top
jan_dc
PostPosted: Mar 02, 2012 - 12:29 PM
Hangaround


Joined: Feb 09, 2011
Posts: 322
Location: Turnhout, Belgium

tankar wrote:
jan_dc wrote:
tankar wrote:

jan_dc wrote:
How is the negative voltage (contrast) connected and what voltage has it?


Its connected like the datasheet recommended,
https://www.distrelec.ch/ishop/Datasheets/07540902.pdf
The voltage is around 4.3 V, I can adjust it with the potentiometer and I think the contrast is good at that voltage.


Please do a proper measurement! VEE must be negative. So either it is wrong or you are measuring with the red lead on GND and black on pin 3.

If it's -4.3V your screen would be really dark. The VEE on our displays is typically -3.3V. Though this can depend on the module. Anyway, if VEE is correct you must be able to see the contrast differences when you turn the potentiometer. If not: wrong contrast and you won't see a thing.


I can see the contrast changing when i turn the potentiometer. I'm measuring with the black lead on GND and the red lead on pin 3.


If you are very sure you are entering a positive voltage on the contrast pin then you will never be able to see anything. The contrast pin must be fed with a negative voltage.

If it's done properly you must be able to have the display almost black when turning the potentiometer.

So again: either your contrast is wrong or you're handling your measurement device wrong. Both are bad...
 
 View user's profile Send private message Visit poster's website 
Reply with quote Back to top
tankar
PostPosted: Mar 02, 2012 - 12:33 PM
Rookie


Joined: Feb 22, 2012
Posts: 28


sorry, I meant -4.3V in my first reply.
 
 View user's profile Send private message  
Reply with quote Back to top
tankar
PostPosted: Mar 02, 2012 - 12:39 PM
Rookie


Joined: Feb 22, 2012
Posts: 28


I don't know what to do. I've tried the drivers clawson recommended but they didn't work couldnt even run them without getting errors. I have also tried other drivers that I was able to program the atmega with but nothing happens on the display.
 
 View user's profile Send private message  
Reply with quote Back to top
clawson
PostPosted: Mar 02, 2012 - 12:51 PM
10k+ Postman


Joined: Jul 18, 2005
Posts: 62298
Location: (using avr-gcc in) Finchingfield, Essex, England

Quote:

couldnt even run them without getting errors

So fix those errors?

_________________
 
 View user's profile Send private message  
Reply with quote Back to top
tankar
PostPosted: Mar 02, 2012 - 01:01 PM
Rookie


Joined: Feb 22, 2012
Posts: 28


clawson wrote:
Quote:

couldnt even run them without getting errors

So fix those errors?


I explained the errors in a post above.
Im just copying the test code (that should work) and changing the directory when "including", so that works, but it still says the functions are undefined.

EDIT:
okey now all of a sudden I did the exact same thing i did before but now it magically works... (the code nothing else)

EDIT2: Okey it only worked as a standalone c file. when I try to use it in a project in avrstudio it get all those unexplained errors.

EDIT3: ok I made a misstake, it doesnt work att all. Same error as before.
 
 View user's profile Send private message  
Reply with quote Back to top
JohanEkdahl
PostPosted: Mar 02, 2012 - 01:31 PM
10k+ Postman


Joined: Mar 27, 2002
Posts: 18555
Location: Lund, Sweden

Quote:
I explained the errors in a post above.

Quote:
all those unexplained errors.

You mumbled some half baked description about something being undefined. If you want help with errors then be absolutely clear about what code you are using (i.e. post links to what you didn't write yourself, attach code that you wrote yourself, and last but not least quote error messages verbatim. If your project is small enough and not a business secret then you could ZIP up the whole project and attach it here so that we can have a look at exactly what you have.

The quality of the answers you get is highly correlated with the quality of the question you ask.

Quote:
This is pissing me off.

Not a good approach to solving a problem. Being pissed off kind of turns off the part of the brain that works while doing systematic and structured fault-seeking. Take a break, take a walk. Let the steam off. Then come back fresh to your problem.
 
 View user's profile Send private message Visit poster's website 
Reply with quote Back to top
tankar
PostPosted: Mar 02, 2012 - 02:21 PM
Rookie


Joined: Feb 22, 2012
Posts: 28


My anger helped me solve at least one problem! Now I manged to send something to the display. What I wanted to send was a text string but what showed up on the screen was just strange patterns.

I checked all the data pins from the disp to the atmega16 pins and does seem to be in the right position. But I don't know in what order the driver maker had with his data bus lines so that might be the problem?

I used the library from this site at the bottom of the page:
http://en.radzio.dxp.pl/ks0108/

I changed the file KS0108-AVR in that library so now it looks like this(I made some comments where I made a changes.):

Code:

//-------------------------------------------------------------------------------------------------
// Universal KS0108 driver library
// Atmel AVR MCU low-level driver.
// (c) Rados³aw Kwiecieñ, radek@dxp.pl
//-------------------------------------------------------------------------------------------------
#include <avr/io.h>
#include <avr/pgmspace.h>

#define KS0108_DATA_PORT   PORTC   //CHANGED THESE
#define KS0108_DATA_DIR      DDRC      
#define KS0108_DATA_PIN      PINC

#define KS0108_CTRL_PORT   PORTD   //CHANGED THESE
#define KS0108_CTRL_DIR      DDRD

#define KS0108_RS         (1 << 0) //RS Is D/I //CHANGED THESE
#define KS0108_RW         (1 << 1) // RW is RW
#define KS0108_EN         (1 << 2) // EN is E

#define KS0108_CS1         (1 << 3) //CHANGED THESE
#define KS0108_CS2         (1 << 4)


extern unsigned char screen_x;
extern unsigned char screen_y;

#define DISPLAY_STATUS_BUSY   0x80

//-------------------------------------------------------------------------------------------------
// Delay function
//-------------------------------------------------------------------------------------------------
void GLCD_Delay(void)
{
asm("nop");
}
//-------------------------------------------------------------------------------------------------
// Enalbe Controller (0-2)
//-------------------------------------------------------------------------------------------------
void GLCD_EnableController(unsigned char controller) //CHANGED THIS
{
   controller %= 2;
   switch(controller){
      case 0 : KS0108_CTRL_PORT &= ~KS0108_CS1; break;
      case 1 : KS0108_CTRL_PORT &= ~KS0108_CS2; break;
   
   }
}
//-------------------------------------------------------------------------------------------------
// Disable Controller (0-2)
//-------------------------------------------------------------------------------------------------
void GLCD_DisableController(unsigned char controller) //CHANGED THIS
{
   controller %= 2;
   switch(controller){
      case 0 : KS0108_CTRL_PORT |= KS0108_CS1; break;
      case 1 : KS0108_CTRL_PORT |= KS0108_CS2; break;
   
   }
}
//-------------------------------------------------------------------------------------------------
// Read Status from specified controller (0-2)
//-------------------------------------------------------------------------------------------------
unsigned char GLCD_ReadStatus(unsigned char controller)
{
unsigned char status;
KS0108_DATA_DIR = 0x00;
KS0108_CTRL_PORT |= KS0108_RW;
KS0108_CTRL_PORT &= ~KS0108_RS;
GLCD_EnableController(controller);
KS0108_CTRL_PORT |= KS0108_EN;
GLCD_Delay();
status = KS0108_DATA_PIN;
KS0108_CTRL_PORT &= ~KS0108_EN;
GLCD_DisableController(controller);
return status;
}
//-------------------------------------------------------------------------------------------------
// Write command to specified controller
//-------------------------------------------------------------------------------------------------
void GLCD_WriteCommand(unsigned char commandToWrite, unsigned char controller)
{
while(GLCD_ReadStatus(controller)&DISPLAY_STATUS_BUSY);
KS0108_DATA_DIR = 0xFF;
KS0108_CTRL_PORT &= ~(KS0108_RW | KS0108_RS);
GLCD_EnableController(controller);
KS0108_DATA_PORT = commandToWrite;
KS0108_CTRL_PORT |= KS0108_EN;
GLCD_Delay();
KS0108_CTRL_PORT &= ~KS0108_EN;
GLCD_DisableController(controller);
}
//-------------------------------------------------------------------------------------------------
// Read data from current position
//-------------------------------------------------------------------------------------------------
unsigned char GLCD_ReadData(void)
{
unsigned char data;
while(GLCD_ReadStatus(screen_x / 64)&DISPLAY_STATUS_BUSY);
KS0108_DATA_DIR = 0x00;
KS0108_CTRL_PORT |= (KS0108_RW | KS0108_RS);
GLCD_EnableController(screen_x / 64);
//GLCD_Delay();
KS0108_CTRL_PORT |= KS0108_EN;
GLCD_Delay();
data = KS0108_DATA_PIN;
KS0108_CTRL_PORT &= ~KS0108_EN;
GLCD_DisableController(screen_x / 64);
screen_x++;
return data;
}
//-------------------------------------------------------------------------------------------------
// Write data to current position
//-------------------------------------------------------------------------------------------------
void GLCD_WriteData(unsigned char dataToWrite)
{
while(GLCD_ReadStatus(screen_x / 64)&DISPLAY_STATUS_BUSY);
KS0108_DATA_DIR = 0xFF;
KS0108_CTRL_PORT &= ~KS0108_RW;
KS0108_CTRL_PORT |= KS0108_RS;
KS0108_DATA_PORT = dataToWrite;
GLCD_EnableController(screen_x / 64);
KS0108_CTRL_PORT |= KS0108_EN;
GLCD_Delay();
KS0108_CTRL_PORT &= ~KS0108_EN;
GLCD_DisableController(screen_x / 64);
screen_x++;
}
//-------------------------------------------------------------------------------------------------
//
//-------------------------------------------------------------------------------------------------
void GLCD_InitalizePorts(void) //CHANGED THIS
{
KS0108_CTRL_DIR |= (KS0108_CS1 | KS0108_CS2 | KS0108_RS | KS0108_RW | KS0108_EN);
KS0108_CTRL_PORT |= (KS0108_CS1 | KS0108_CS2);
}
//-------------------------------------------------------------------------------------------------
//
//-------------------------------------------------------------------------------------------------
unsigned char GLCD_ReadByteFromROMMemory(char * ptr)
{
return pgm_read_byte(ptr);
}
//-------------------------------------------------------------------------------------------------
//
//-------------------------------------------------------------------------------------------------


My main code looks like this:

Code:

/*
 * test222.c
 *
 * Created: 2012-02-27 11:39:45
 *  Author: mikro
 */

#include <avr/io.h>
#include "C:/Documents and Settings/jonaste/Desktop/KS0108G/KS0108.h"
#include "C:/Documents and Settings/jonaste/Desktop/KS0108G/KS0108.c"
#include "C:/Documents and Settings/jonaste/Desktop/KS0108G/KS0108-AVR.c"
//#include "C:/Documents and Settings/mikro/Desktop/KS0108/graphic.c"
//#include "C:/Documents and Settings/mikro/Desktop/KS0108/graphic.h"


int main(void)
{

   

   //DDRC=0xff;
   //DDRD=0xff;
   //PORTD=0x04;
   //DDRC=0xff;
   //PORTC=0b00111110;
   GLCD_Initalize();
   GLCD_ClearScreen();
   //GLCD_Rectangle(20,20,20,20);
   //GLCD_Line(2,3,5,7);
   //GLCD_WriteString("hej");

   GLCD_GoTo(0,0);
   GLCD_WriteString("+-------------------+");
   GLCD_GoTo(0,1);
   GLCD_WriteString("|     Universal     |");
   GLCD_GoTo(0,2);
   GLCD_WriteString("|   KS0108 library  |");
   GLCD_GoTo(0,3);
   GLCD_WriteString("|                   |");
   GLCD_GoTo(0,4);
   GLCD_WriteString("|  en.radzio.dxp.pl |");
   GLCD_GoTo(0,5);
   GLCD_WriteString("|  STM32 Cortex-M3  |");
   GLCD_GoTo(0,6);
   GLCD_WriteString("|  microcontrollers |");
   GLCD_GoTo(0,7);
   GLCD_WriteString("+-------------------+");

for( ; ; );
return 0;
    //while(1)
    //{
        ////TODO:: Please write your application code
    //}
}
 
 View user's profile Send private message  
Reply with quote Back to top
JohanEkdahl
PostPosted: Mar 02, 2012 - 03:32 PM
10k+ Postman


Joined: Mar 27, 2002
Posts: 18555
Location: Lund, Sweden

Quote:

What I wanted to send was a text string but what showed up on the screen was just strange patterns.

Since this is a graphics display, does it at all support you sending characters and it will generate the character patterns? For some graphical displays it will be up to your code to generate the bit pattern constituting a character. (I.e. there is no character generator on the display module.)

Put another way: For some displays you will be good with doing something like
Code:
DisplaySend('A');

but on others you must do something like
Code:
DisplaySend(0x3F);  // 00111111
DisplaySend(0x48);  // 01001000
DisplaySend(0x88);  // 10001000
DisplaySend(0x48);  // 01001000
DisplaySend(0x3F);  // 00111111

i.e. sending the individual pixels constituting the character 'A'. Do you spot it in there? No? Tilt your head to the left as I just assumed a display where every byte sent forms an 8 pixels high column, and successive columns are "stacked towards the right".

The datasheet for the KS0108 and the specific display module you have will tell you all the gory details.


Last edited by JohanEkdahl on Mar 02, 2012 - 03:57 PM; edited 1 time in total
 
 View user's profile Send private message Visit poster's website 
Reply with quote Back to top
tankar
PostPosted: Mar 02, 2012 - 03:59 PM
Rookie


Joined: Feb 22, 2012
Posts: 28


JohanEkdahl wrote:
Quote:

What I wanted to send was a text string but what showed up on the screen was just strange patterns.

Since this is a graphics display, does it at all support you sending characters and it will generate the character patterns? For some graphical displays it will be up to your code to generate the bit pattern constituting a character. (I.e. there is no character generator on the display module.)

Put another way: For some displays you will be good with doing something like
Code:
DisplaySend('A');

but on others you must do something like
Code:
DisplaySend(0x3F);  // 00111111
DisplaySend(0x48);  // 01001000
DisplaySend(0x88);  // 10001000
DisplaySend(0x48);  // 01001000
DisplaySend(0x3F);  // 00111111

i.e. sending the individual pixels constituting the character 'A'. Do you spot it in there? No? Tilt your head to the left as I just assumed a display where every byte sent forms an 8 pixels high column, and successive columns are "stacked towards the right".

The datasheet for the KS0108 and the specific display module you have will tell you all the gory details.


I thought the drivers were suppose to fix that for me?
 
 View user's profile Send private message  
Reply with quote Back to top
JohanEkdahl
PostPosted: Mar 02, 2012 - 04:02 PM
10k+ Postman


Joined: Mar 27, 2002
Posts: 18555
Location: Lund, Sweden

Quote:

I thought the drivers would take care of that?

Yes, thay might, but don't think - find out. Is there some documentation coming with the code you're using? Else you need to read the code and compare with the KS0108 data sheet etc. (There seldom is such a thing like a free lunch).
 
 View user's profile Send private message Visit poster's website 
Reply with quote Back to top
tankar
PostPosted: Mar 02, 2012 - 04:06 PM
Rookie


Joined: Feb 22, 2012
Posts: 28


JohanEkdahl wrote:
Quote:

I thought the drivers would take care of that?

Yes, thay might, but don't think - find out. Is there some documentation coming with the code you're using? Else you need to read the code and compare with the KS0108 data sheet etc. (There seldom is such a thing like a free lunch).


when I use the command GLCD_WriteData() I can print an A on the screen with the bytes you gave me.

That should be proof that the drivers & Data pin order is correct etc?
Strange that the command GLCD_WriteString() to write strings doesn't work...
 
 View user's profile Send private message  
Reply with quote Back to top
clawson
PostPosted: Mar 02, 2012 - 04:48 PM
10k+ Postman


Joined: Jul 18, 2005
Posts: 62298
Location: (using avr-gcc in) Finchingfield, Essex, England

Quote:

Yes, thay might, but don't think - find out. Is there some documentation coming with the code you're using?

Johan he's using the code from my first link (the Polish one). As the demo program shows:
Code:
...
   GLCD_GoTo(0,1);
   GLCD_WriteString("|     Universal     |");
   GLCD_GoTo(0,2);
   GLCD_WriteString("|   KS0108 library  |");
...

therefore I think it's pretty safe to assume it has a font and text support (in fact I can see from the source that it does). The font is located in font5x8.h which provides font5x8[]. That font is then referenced in ks0108.c::GLCD_WriteChar() which is used by GLCD_WriteString() in the same file.

One thing I would query is that GLCD_ReadByteFromROMMemory() is used yet the font5x8.h has "PROGMEM" commented out yet it uses:
Code:
unsigned char GLCD_ReadByteFromROMMemory(char * ptr)
{
return pgm_read_byte(ptr);
}

So I'd suggest the copy of font5x8.h is edited so the first few lines are:
Code:
#include <avr/pgmspace.h>
static const char PROGMEM  font5x8[] = {

with the #include and the use of PROGMEM uncommented.

This likely explains why garbage was being seen instead of text.

As I said above, something as complex as a ks0108 sorts the men from the boys, you need to apply a bit of debugging to get things working. In this case the ks0108-8051.c, ks0108-avr.c, ks0108-pic16.c show that this code is targetted at a lot of processors yet only the AVR has "PROGMEM" which is presumably why it's commented by default in font5x8.h

It is a bit of a shame that there is not more documentation that might of explained how to use it - which is why the other link I gave to the famous Thiele code might have made a better starting point!

In fact the GLCD_ReadByteFromROMMemory() rout9ine could have just returned *ptr by default with a comment saying how to switch it to using pgm_read)byte() and what to do in font5x8.h

If this is proven to work I will probably use it for my own 128x64 - Tankar, thanks for taking the pain on this!

_________________
 
 View user's profile Send private message  
Reply with quote Back to top
bobgardner
PostPosted: Mar 02, 2012 - 07:14 PM
10k+ Postman


Joined: Sep 04, 2002
Posts: 21258
Location: Orlando Florida

That example code used three chip selects, but his display just has two. Think those controller %=2 tests should be changed? How does that mod equal 2 equation work anyway?

_________________
Imagecraft compiler user
 
 View user's profile Send private message Send e-mail Visit poster's website 
Reply with quote Back to top
Display posts from previous:     
Jump to:  
All times are GMT + 1 Hour
Post new topic   Reply to topic
View previous topic Printable version Log in to check your private messages View next topic
Powered by PNphpBB2 © 2003-2006 The PNphpBB Group
Credits