BasicMicro - Forums

www.basicmicro.com
It is currently Sun May 20, 2012 10:50 pm

All times are UTC - 8 hours [ DST ]




Post new topic Reply to topic  [ 15 posts ] 
Author Message
 Post subject: Atom to SD
PostPosted: Thu Jul 30, 2009 8:42 am 
Offline
Master

Joined: Sun Oct 05, 2008 9:40 am
Posts: 111
I have connected a Rogue Robotics sd moduel to the uart of the Atom 24.
http://www.roguerobotics.com/products/electronics/ummc.

The following code will create a text flie called Flight and then write "12345678". If there is an error sent from the sd this will be read and displayed on the terminal window.

I run into a problem when the error for no card is sent. This error is sent right at power up. The uart misses it and the program gets stuck in the commandprompt loop.

I would like to evaluate the two byte error responce using a lookdown table to asign an index value. The index value in this case will be based on order of importance. This will determin action taken or no action. I am not sure on the best way to do this.

Code:
'uses the hardware uart on pins 14() and 15()

stuff var byte(2)
check var byte

enablehserial         'Enable hardware uart

sethserial h9600      'Set baud to 9600

hserstat 0            'Clear input buffer (have commented out to try and catch no card error
                                                                                                'this did not work)
commandprompt:

serout S_out, i9600, ["Checking Buffer0", 13]

hserstat 4, commandprompt            'Check uart if no data loop until data

serout S_out, i9600, ["Read in", 13]

hserin [check]                          'Read first byte from uart

serout S_out, i9600, ["compare", 13]

if check <> ">" then                     'Evaluate first byte if not command prompt
                                  'Then error
serout S_out, i9600, ["error", 13]

hserin [str stuff2]                 'Read in remaning two bytes of error message

serout S_out, i9600, [str stuff2, 13]   'Send error message to terminal window

endif

serout S_out, i9600, ["create file", 13]

hserout ["O 1 W /FLIGHT.TXT", 13]         'Send command to sd to create FLIGHT in write mode

commandprompt1:

serout S_out, i9600, ["Checking Buffer1", 13]

hserstat 4, commandprompt1               'Check uart for data if no data loop until data

serout S_out, i9600, ["Read in", 13]

hserin [check]                        'Read first byte from uart

serout S_out, i9600, ["compare", 13]

if check <> ">" then                     'Evaluate first byte if not command prompt

serout S_out, i9600, ["error", 13]                'Then error

hserin [str stuff2]                     'Read in remaning two bytes of error message

serout S_out, i9600, [str stuff2, 13]         'Send error message to terminal window

endif

serout S_out, i9600, ["set to write", 13]
hserout ["W 1 8", 13]                     'Send command to sd to write 8 bytes to file 1

serout S_out, i9600, ["write data", 13]
hserout ["12345678", 13]                  'Eight bytes to be wrote to sd

commandpromt2:

serout S_out, i9600, ["Checking Buffer2", 13]

hserstat 4, commandpromt2:                  'Check uart for data if no data loop until data

serout S_out, i9600, ["Read in", 13]

hserin [check]                           'Read first byte from uart

serout S_out, i9600, ["compare", 13]

if check <> ">" then                     'Evaluate first byte if not command prompt

serout S_out, i9600, ["error", 13]                 'Then error

hserin [str stuff2]                     'Read in remaning two bytes of error message

serout S_out, i9600, [str stuff2, 13]         'Send error message to terminal window

endif

serout S_out, i9600, ["close file", 13]

hserout ["C 1", 13]                        'Command for sd to close file 1

end


Top
 Profile  
 
 Post subject: Re: Atom to SD
PostPosted: Thu Jul 30, 2009 11:09 pm 
Offline
Master

Joined: Sun Aug 17, 2008 5:26 pm
Posts: 798
Location: CA bay Area
Hello Mike. Nice find. We started SD support on the EXP Board some time back. Than the PTB decided to convert the board to Atom-Only, so all work stopped till the new board comes out. But it was Verrrry Twitchy Stuff. SD cards are Black Magic.

Checking out their site, I found a reference to this synch code to use with a Stamp. I should think after both devices have powered up, that doing a synch to their device should see things working. Pay close attention to the note about a pause at the start. If you can't convert from one code to the other, give us a shout back here.

Starts here:
This routine will synchronize the Basic Stamp to the uMMC. The routine sends an ASCII ESC (27 decimal, 0x1b hex) to the uMMC, which will clear its buffer and return the command prompt.

uMMC_SYNC:
loopvar1 = 0
uMMC_SYNC_AGAIN:
SEROUT UMMCR, uMMCBaud, [27] ' Send an ESC to clear the buffer
SERIN UMMCT, uMMCBaud, uMMCStartUpTimeOut, uMMC_SYNC_Error, [STR buffer1]
IF buffer(0) = ">" THEN GOTO uMMC_SYNC_Complete
uMMC_SYNC_Error:
loopvar1 = loopvar1 + 1
DEBUG "uMMC Sync Error: Bad/No response - check ST R (minimum 5)", CR
IF loopvar1 > 3 THEN GOTO uMMC_SYNC_Error_2
GOTO uMMC_SYNC_AGAIN
uMMC_SYNC_Error_2:
DEBUG "uMMC Sync Error: Too many retries - check ST R, or ST D (Baud)", CR
GOTO uMMC_SYNC_End
uMMC_SYNC_Complete:
DEBUG "uMMC Synchronized", CR
uMMC_SYNC_End:
RETURN


uMMCStartUpTimeOut is the amount of time (in milliseconds) that the Basic Stamp (or Atom24M) should wait before assuming there is no response. You should ensure that this time takes into consideration the amount of start up time that the uMMC may require depending on the card you use, the file system format, and the amount of files you have on the card. The amount of time can vary widely. Just watch to see how long the Activity LED on the uMMC stays on when you apply power to the uMMC.

_________________
kenjj
http://blog.basicmicro.com/
http://kjennejohn.wordpress.com/


Top
 Profile  
 
 Post subject: Re: Atom to SD
PostPosted: Fri Jul 31, 2009 8:31 pm 
Offline
Master

Joined: Sun Oct 05, 2008 9:40 am
Posts: 111
I have converted the code to use pins 14 and 15 with serin/serout like the example.

Code:
UMMCR           con     p14               ' uMMC Receive Pin (going to uMMC)
UMMCT           con     p15               ' uMMC Transmit Pin (coming from uMMC)


uMMCStartUpTimeOut  CON     1000

uMMCBaud            CON     i9600

buffer              VAR     Byte(1)

loopvar1            VAR     Byte

uMMC_SYNC:

  loopvar1 = 0
 
 
uMMC_SYNC_AGAIN:

  SEROUT UMMCR, uMMCBaud,  [27]     ' Send an ESC to clear the buffer
 
  SERIN UMMCT, uMMCBaud, uMMCStartUpTimeOut, uMMC_SYNC_Error, [str buffer1]
 
   serout S_out, i9600,  [str buffer1, 13]
 
  IF buffer(0) = ">" THEN GOTO uMMC_SYNC_Complete
 
 
uMMC_SYNC_Error:

  loopvar1 = loopvar1 + 1
 
  serout S_out, i9600, ["uMMC Sync Error: Bad/No response - check ST R (minimum 5)", 13]
 
  IF loopvar1 > 3 THEN GOTO uMMC_SYNC_Error_2
 
  GOTO uMMC_SYNC_AGAIN
 
 
uMMC_SYNC_Error_2:

  serout S_out, i9600, ["uMMC Sync Error: Too many retries - check ST R, or ST D (Baud)", 13]
 
  GOTO uMMC_SYNC_End
 
 
uMMC_SYNC_Complete:

  serout S_out, i9600, ["uMMC Synchronized", 13]
 
 
uMMC_SYNC_End:

  RETURN


Here is the output I get



Code:
uMMC Sync Error: Bad/No response - check ST R (minimum 5)
Ï
uMMC Sync Error: Bad/No response - check ST R (minimum 5)
Ï
uMMC Sync Error: Bad/No response - check ST R (minimum 5)
Ï
uMMC Sync Error: Bad/No response - check ST R (minimum 5)
uMMC Sync Error: Too many retries - check ST R, or ST D (Baud)


Once again I run into a problem with the serin command. I can see that the ">" is being sent but this is not what the Atom is seeing. I have ordered another Atom to see if that changes anything. :?:

Tomorrow I plan on working this into my previous code using the UART.


Top
 Profile  
 
 Post subject: Re: Atom to SD
PostPosted: Fri Jul 31, 2009 11:55 pm 
Offline
Master

Joined: Sun Aug 17, 2008 5:26 pm
Posts: 798
Location: CA bay Area
Hello again. I need to know which compiler you are using with the Atom24. Also, try skipping the "CON" stuff and enter P14, P15, 1000 and i9600 directly.

_________________
kenjj
http://blog.basicmicro.com/
http://kjennejohn.wordpress.com/


Top
 Profile  
 
 Post subject: Re: Atom to SD
PostPosted: Sat Aug 01, 2009 5:44 pm 
Hi Mike,

one thing I noticed is that in your P14/15 converted code, your CON statement

uMMCBaud CON i9600

is using inverted logic. I believe it should be normal N9600 since a voltage level converter between the uMMC and the Atom is not required. The uMMC manual states that the signals to it can be a max of +5 volts.

You would use i9600 if communicating with a PC through a RS232 chip.

I hope this helps.

- Bob -


Top
  
 
 Post subject: Re: Atom to SD
PostPosted: Sat Aug 01, 2009 7:15 pm 
Offline
Master

Joined: Sun Oct 05, 2008 9:40 am
Posts: 111
This is what I don't understand about this and the differance between the two moduels.

For the stamp 84 = true 16468 = inverted for the Atom I = inverted N = normal. But this dose not seem to hold true. I started with n9600 and the sd would not respond. Change to i9600 I get a responce from the sd. This is usually the first thing I look at if I have a problem.

For serout on the S_out pin on the Atom its serout S_out, i9600. On the Stamp its serout 16, 84. :?:

I did get the program to work using the uart.


Code:
stuff var byte(2)
check var byte
value1  var byte

enablehserial

sethserial h9600

'hserstat 0

serout S_out, i9600, ["Waiting for SD to initiliez", 13]

pause 1000

startinit:

pause 500

value1 = value1 + 1
serout S_out, i9600, [dec value1, 13]

if value1 > 10 then goto startuperror

hserstat 4, startinit

hserin [check]         'Sd sends > after valid command
serout S_out, i9600, [check, "   init", 13]

if check = ">" then      'If > no error
goto startsync

elseif check = "E"                  
hserin [str stuff2]               
serout S_out, i9600, ["Error", 13]
goto errormessage

endif

startsync:

serout S_out, i9600, ["startsync", 13]

hserout [27]
value1 = 0

waitcommand:

  value1 = value1 + 1
 
  if value1 > 5 then goto startsync
 
  hserstat 4, waitcommand

  hserin [check]         'Sd sends > after valid command
  serout S_out, i9600, [check, "   stsync", 13]
if check = ">" then      'If > no error
goto synccomplet

elseif check = "E"                  
hserin [str stuff2]               
serout S_out, i9600, ["Error", 13]
goto errormessage

endif

startuperror:

serout S_out, i9600, ["Startup Error", 13]   

hserout [27]
value1 = 0
goto startinit
     
errormessage:

serout S_out, i9600, [str stuff2, 13]
serout S_out, i9600, ["Try Again", 13]
value1 = 0
goto startinit

synccomplet:

serout S_out, i9600, ["Sync complete", 13]

end


Any suggestions on how I can evaluate the two charicter error code "str stuff2" in a lookdown table. I have looked at using highbyte/lowbyte but have not been able to get it to work.

Tonight I think I will add a 2 axis accel and try to log to the SD.


Top
 Profile  
 
 Post subject: Re: Atom to SD
PostPosted: Sat Aug 01, 2009 8:16 pm 
Offline
Master

Joined: Sun Aug 17, 2008 5:26 pm
Posts: 798
Location: CA bay Area
Hi again.
A small excerpt from their manual for the uMMC:

Communications
TTL Serial Port: (my emphasis)
· 9600, 19200, 38400, 57600, or 115200 bps (9600 bps default)
· 8 bits
· no parity
· 1 stop bit
· no echo
MMC/SD interface:
· SPI Mode operation

It's all TTL levels, both for standard serial or SPI, it does both. No level translator IC needed, so toss the MAX232. As always, what they mean by inverted/non-inverted is always a toss up, so try both i9600 and n9600. Just for grins, try the higher speeds, the hardware serial easily supports 115200 Baud. Life's short, why wait?
As for the Stamp, they specify the divider value to arrive at the final Baud rate. The Atom just let's you use plain English. You could use a complicated "pick your bit setting for the feature you want" value if you're into that sort of stuff. It's in the manual. Me, I'm into Q&S.

_________________
kenjj
http://blog.basicmicro.com/
http://kjennejohn.wordpress.com/


Top
 Profile  
 
 Post subject: Re: Atom to SD
PostPosted: Sat Aug 01, 2009 9:02 pm 
Offline
Master

Joined: Sun Oct 05, 2008 9:40 am
Posts: 111
Here is a pic of the setup. Bottom left is the 2 axis accel. Bottom right SD moduel. And notice the molex connector soldered to the bottom of the Atom to acces the ADC.

Here is the code to read each channel of the adc and write to sd.


Code:
stuff var byte(2)
check var byte
value1  var byte

volts   var   word
voltsa   var   word

enablehserial

sethserial h9600

hserstat 0

serout S_out, i9600, ["Waiting for SD to initiliez", 13]

pause 1000

startinit:

pause 500

value1 = value1 + 1
serout S_out, i9600, [dec value1, 13]

if value1 > 10 then goto startuperror

hserstat 4, startinit

hserin [check]         'Sd sends > after valid command
serout S_out, i9600, [check, "   init", 13]

if check = ">" then      'If > no error
   goto startsync

elseif check = "E"                  
   hserin [str stuff2]               
   serout S_out, i9600, ["Error", 13]
   goto errormessage

endif

startsync:

serout S_out, i9600, ["startsync", 13]

hserout [27]
value1 = 0

waitcommand:

  value1 = value1 + 1
 
  if value1 > 5 then goto startsync
 
  hserstat 4, waitcommand

  hserin [check]         'Sd sends > after valid command
  serout S_out, i9600, [check, "   stsync", 13]
 
  if check = ">" then      'If > no error
    goto synccomplet

  elseif check = "E"                  
    hserin [str stuff2]               
    serout S_out, i9600, ["Error", 13]
    goto errormessage

  endif

startuperror:

serout S_out, i9600, ["Startup Error", 13]   

hserout [27]
value1 = 0
goto startinit
     
errormessage:

serout S_out, i9600, [str stuff2, 13]
serout S_out, i9600, ["Try Again", 13]
value1 = 0
goto startinit

synccomplet:

serout S_out, i9600, ["Sync complete", 13]

serout S_out, i9600, ["create file", 13]

hserout ["O 1 W /FLIGHT.TXT", 13]         'Send command to sd to create FLIGHT in write mode

commandprompt1:

serout S_out, i9600, ["Checking Buffer1", 13]

hserstat 4, commandprompt1               'Check uart for data if no data loop until data

serout S_out, i9600, ["Read in", 13]

hserin [check]                        'Read first byte from uart

serout S_out, i9600, ["compare", 13]

if check <> ">" then                     'Evaluate first byte if not command prompt

serout S_out, i9600, ["error", 13]                'Then error

hserin [str stuff2]                     'Read in remaning two bytes of error message

serout S_out, i9600, [str stuff2, 13]         'Send error message to terminal window

endif

logging:

serout S_out, i9600, ["Ready to log", 13]
value1 = 0

logstart:

if value1 = 200 then goto done



adin ax1, volts              'Sample adc, fast oscollator, Right justified, 6 MSB set to 0
adin ax0, voltsa         'Sample adc fast oscollator, Right justified, 6 MSB set to 0

serout S_out, i9600, [dec voltsa,"   ", dec volts, "   ", dec value1, 13]      'Send out serial port

hserout ["W 1 8", 13]
pause 10
hserout [dec volts, ",", dec voltsa, ",", 13]

  commandpromt2:

   serout S_out, i9600, ["Checking Buffer2", 13]

   hserstat 4, commandpromt2:                  'Check uart for data if no data loop until data

   serout S_out, i9600, ["Read in", 13]

  hserin [check]                           'Read first byte from uart

  serout S_out, i9600, ["compare", 13]

  if check <> ">" then                     'Evaluate first byte if not command prompt

   serout S_out, i9600, ["error", 13]                 'Then error

   hserin [str stuff2]                     'Read in remaning two bytes of error message

   serout S_out, i9600, [str stuff2, 13]         'Send error message to terminal window

  endif
 
  value1 = value1 + 1
  goto logstart
 
done:
 
serout S_out, i9600, ["Done logging", 13]

hserout ["C 1", 13]                        'Command for sd to close file 1

commandpromt3:

   serout S_out, i9600, ["Checking Buffer3", 13]

   hserstat 4, commandpromt2:                  'Check uart for data if no data loop until data

   serout S_out, i9600, ["Read in", 13]

  hserin [check]                           'Read first byte from uart

  serout S_out, i9600, ["compare", 13]

  if check <> ">" then                     'Evaluate first byte if not command prompt

   serout S_out, i9600, ["error", 13]                 'Then error

   hserin [str stuff2]                     'Read in remaning two bytes of error message

   serout S_out, i9600, [str stuff2, 13]         'Send error message to terminal window

  endif
 
serout S_out, i9600, ["File Closed", 13]
 
end


Attachments:
000_0001.jpg
000_0001.jpg [ 49.07 KiB | Viewed 871 times ]
Top
 Profile  
 
 Post subject: Re: Atom to SD
PostPosted: Mon Aug 03, 2009 12:24 pm 
Offline
Master

Joined: Sun Aug 17, 2008 5:26 pm
Posts: 798
Location: CA bay Area
Hmmm. A lookup table of error values.
Well, since it is 2 bytes, create a word to store them in:
Wstuff var word.
After you get the two bytes for "stuff" in, merge then using:
Wstuff.lowbyte = stuff(0)
Wstuff.highbyte = stuff(1)
You now have both error bytes in one value. Compare this to a table of words representing possible errors.
Just a thought.

_________________
kenjj
http://blog.basicmicro.com/
http://kjennejohn.wordpress.com/


Top
 Profile  
 
 Post subject: Re: Atom to SD
PostPosted: Tue Aug 04, 2009 1:19 pm 
Offline
Master

Joined: Sun Oct 05, 2008 9:40 am
Posts: 111
Here is the lookup code:

Code:
E02      con      12338   'Buffer overrun
E03      con      12339   'No free files
E04      con      12340   'Unrecognized command
E06      con      12342   'Command formatting error
E07      con      12343   'End of file
E08      con      12344   'Card not inserted
E09      con      12345   'MMC/SD reset
E0A      con      12353   'Card write protected
EE6      con      17718   'Read only file
EE7      con      17719   'Not a file
EE8      con      17720   'Write falure
EEA      con      17729   'No freespace
EEB      con      17730   'File not open
EEC      con      17731   'Improper mode
EED      con      17732   'Invalid Open mode
EF1      con     17969   'Handle in use
EF2      con      17970   'File does not exist
EF4      con      17972   'File already exists   
EF5      con      17973   'Path invalid
EF6      con      17974   'Invalid handle
EFB      con      17986   'Bad FSINFO sector
EFC      con      17987   'Unsupported FAT version
EFD      con      17988   'Unsupported partition type
EFE      con      17989   'Bad partition information
EFF      con      17990   'Unknown error

please    var word
combined  var word
stuff     var byte(2)
index     var byte
                     'First E is dropped
stuff(0) = "F"            'Set to replicate error code from UART
stuff(1) = "7"            'Set to replicate error code from UART
                      
index = 30

combined.lowbyte =  stuff(1)
combined.highbyte =  stuff(0)
   
lookdown combined, =, [EEA, E08, E0A, E09, E03, EE6, EE7, EEB, EEC, EED, EF1, EF2, EF4, EF5, EF6, E02, E04, E06, E07, EE8, EFB, EFC, EFD, EFE, EFF ], index

serout S_out, i9600, [dec index,  "index", 13]

if index <= 3 then
  goto bad
 
elseif index <= 14
  goto file
 
elseif index <= 17 
  goto command
 
elseif index <= 19 
  goto syntax
 
elseif index <= 24 
  goto format
 
elseif index = 30 
  goto nomatch
 
endif

bad:

serout S_out, i9600, ["Main Error", 13]

end

file:

serout S_out, i9600, ["File Error", 13]

end

command:

serout S_out, i9600, ["Command Error", 13]

end

syntax:

serout S_out, i9600, ["Write Error", 13]

end

format:

serout S_out, i9600, ["Format Error", 13]

end

nomatch:

serout S_out, i9600, ["No match", 13]

end


Top
 Profile  
 
 Post subject: Re: Atom to SD
PostPosted: Tue Aug 04, 2009 1:40 pm 
Offline
Master

Joined: Sun Aug 17, 2008 5:26 pm
Posts: 798
Location: CA bay Area
Nice. Very nice. One thing throws me. You use

combined.lowbyte = stuff(1)
combined.highbyte = stuff(0)

where you put stuff(1) into the low byte of "combined" and put stuff(0) into the high byte of "combined". This is the opposite of what I mentioned above. Is there any reason for this that I missed? Does the data come in "high byte, low byte"? As long as what you present to the table produces realistic, usable results, it's moot.
Take care.

_________________
kenjj
http://blog.basicmicro.com/
http://kjennejohn.wordpress.com/


Top
 Profile  
 
 Post subject: Re: Atom to SD
PostPosted: Tue Aug 04, 2009 2:28 pm 
Offline
Master

Joined: Sun Oct 05, 2008 9:40 am
Posts: 111
AT first I was trying to use hex and when I did this:

combined.lowbyte = stuff(0)
combined.highbyte = stuff(1)

serout S_out, i9600,[hex combined, 13]

E08 for example becomes 08 or 3038 but the output would be 3830.

Another reason is that I do not understand how 08 becomes 12344. So the way I determined the value of the constants was to use

serout S_out, i9600,[dec combined, 13]

When run using the suggested way I got

Code:
E02      con      12848   'Buffer overrun
E03      con      13104   'No free files
E04      con      13360   'Unrecognized command
E06      con      13872   'Command formatting error
E07      con      14128   'End of file



When I run it using

combined.lowbyte = stuff(1)
combined.highbyte = stuff(0)

I get values that increment by one thus making it alot easier to determine the value of each constant.

Code:
E02      con      12338   'Buffer overrun
E03      con      12339   'No free files
E04      con      12340   'Unrecognized command
E06      con      12342   'Command formatting error
E07      con      12343   'End of file


When the two bytes are combined what determins the value stored in combined?


Top
 Profile  
 
 Post subject: Re: Atom to SD
PostPosted: Tue Aug 04, 2009 3:42 pm 
Offline
Master

Joined: Sun Aug 17, 2008 5:26 pm
Posts: 798
Location: CA bay Area
It's the swap of radixes (number systems). Your converting HEX to DEC.
You get ASCII hex values (30, 38) for the "0" and for the "8" you expect. So your value in "combined" is $3038 if the input is lowbyte followed by highbyte and you do

combined.lowbyte = stuff(1) ; the $38 goes low byte
combined.highbyte = stuff(0) ; the $30 goes high byte, so you get $3038

Open your Windows calculator in Scientific mode, set to hex.
Now enter "30*ff + 38", "=" or return. You get the total Hexidecimal value in "combined".
Now select "DEC" from the radix selections. You get a number verrry close to, but not what you report, as the result. Can't say why it is off 30-something.

And where does the "E" in all those numbers come from?
Later.

_________________
kenjj
http://blog.basicmicro.com/
http://kjennejohn.wordpress.com/


Top
 Profile  
 
 Post subject: Re: Atom to SD
PostPosted: Tue Aug 04, 2009 4:59 pm 
Offline
Master

Joined: Sun Oct 05, 2008 9:40 am
Posts: 111
The extra E is not actually extra. this is the error code the the SD sends.

In the sync code the buffer reads in check.

Code:
if check = ">" then      'If > no error
   goto startsync

elseif check = "E"                 
   hserin [str stuff2]               
   serout S_out, i9600, ["Error", 13]
   goto errormessage

endif


If an error code is sent the first E is loaded into check. Because every error code starts with an E I thought it would be easier to lose it.


Top
 Profile  
 
 Post subject: Re: Atom to SD
PostPosted: Tue Aug 04, 2009 7:35 pm 
Offline
Master

Joined: Sun Aug 17, 2008 5:26 pm
Posts: 798
Location: CA bay Area
Hey, your code, your choice! ;)

_________________
kenjj
http://blog.basicmicro.com/
http://kjennejohn.wordpress.com/


Top
 Profile  
 
Display posts from previous:  Sort by  
Post new topic Reply to topic  [ 15 posts ] 

All times are UTC - 8 hours [ DST ]


Who is online

Users browsing this forum: No registered users and 2 guests


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 post attachments in this forum

Jump to:  
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group

phpBB SEO