+ Reply to Thread
Page 1 of 6 12345 ... LastLast
Results 1 to 40 of 233

Thread: LCD BARgraphs

  1. #1
    Join Date
    Jul 2003
    Location
    Colorado Springs
    Posts
    4,959

    Default LCD BARgraphs

    LCD BARgraphs
    LCDbar_INC.bas
    is an Include file that makes it easy to create BARgraphs on your LCD display.

    Features:
    • Can be placed anywhere on the screen.
    • Can be any width (whole characters)
    • Can be scaled anywhere between 0 and 32768.
    • Three styles to choose from.  {lines, boxed, blocks}
    • Just 1 Command does it all. (Well, sort of)
    Click here for Larger Video (225kbps)


    Code:
    @   BARgraph   Value, Row, Col, Width, Range, Style  
      
    Value: The Value of the BARgraph  (0 to Range).If Range = 100 and Value is 50, then            
              half of the BARgraph will be filled in.   Value MUST be a WORD sized variable¹  
    
    Row: LCD Row to place the BARgraph (1 to 4)   can be either a constant or a  
              variable¹.  
    
    Col: LCD Column to place the BARgraph (0 to LCDsize² - 1)   can be either a constant  
              or a variable¹. 
    
    Width: Width of the BARgraph in charaters. (1 to LCDsize²)   can be either a constant  
              or a variable¹. 
    
    Range: The "full-scale" range of the BARgraph  (0 to 32768) MUST be a constant.  
              Variables will not work here. 
    
    Style: Selects which Style will be used for the BARgraph  (lines, boxed, blocks)   can  
              be either a constant or a variable¹.  
    
    Note ¹ - Variables must be preceeded with a 
                 underscore.   ie.  _Temperature    
    Note ² - LCDsize is the number of Chars in 1 line of 
                 the LCD, for "4x16" it's 16
    Added 10/18/05 - If using a 4x20 display, you can use this define to let the program know the addressing is different.   Thanks, CocaColaKid!
    Code:
    DEFINE  LCD4X20  1
    Attached Files Attached Files
    Last edited by mackrackit; - 15th September 2011 at 09:08.

  2. #2
    Join Date
    Jul 2003
    Location
    Colorado Springs
    Posts
    4,959

    Default How to use LCDbar_INC.bas

    This is so simple to use.

    Here's an example of a BARgraph that follows an A/D input.




    Code:
    ; Initialize your hardware and LCD first.
    
    DEFINE ADC_BITS 8               ' Number of bits in ADCIN result
    ADCON1.7 = 1                    ' Right Justify AD result
    
    INCLUDE "LCDbar_INC.bas"        ' Include the BARgraph routines
    
    Value  VAR  WORD                ' Must be a WORD even though AD is 8bit
    
    LCDOUT $FE, 1  ' Clear Screen
    
    Loop1:
        ADCIN  0, Value
        LCDOUT $FE,2,"Value=",DEC Value,"   "
        ; syntax- BARgraph   Value, Row, Col, Width, Range, Style
        @         BARgraph  _Value,   2,   0,    16,   255,  lines
    GOTO Loop1
    
    Attached Files Attached Files
    Last edited by mackrackit; - 15th September 2011 at 09:16.
    DT

  3. #3
    Join Date
    Jul 2003
    Location
    Colorado Springs
    Posts
    4,959

    Default Another example

    This is just like the previous example except that it places both the Value and the BAR on the same line.


    Code:
    ; Initialize your hardware and LCD first.
    
    DEFINE ADC_BITS 8               ' Number of bits in ADCIN result
    ADCON1.7 = 1                    ' Right Justify AD result
    
    INCLUDE "LCDbar_INC.bas"        ' Include the BARgraph routines
    
    Value  VAR  WORD                ' Must be a WORD even though AD is 8bit
    
    LCDOUT $FE, 1  ' Clear Screen
    
    Loop1:
        ADCIN  0, Value
        LCDOUT $FE,2,DEC Value," "
        ; syntax- BARgraph   Value, Row, Col, Width, Range, Style
        @         BARgraph  _Value,   1,   4,    12,   255,  lines
    GOTO Loop1
    
    Last edited by mackrackit; - 15th September 2011 at 09:25.
    DT

  4. #4
    Join Date
    May 2004
    Posts
    30

    Default

    Very good job, Darrel ! I like very much ! But you forget the "vertical bargraph" !

    Don Mario

  5. #5
    Join Date
    May 2004
    Location
    NW France
    Posts
    3,541

    Talking

    Quote Originally Posted by Don Mario
    Very good job, Darrel ! I like very much ! But you forget the "vertical bargraph" !

    Don Mario
    Hi, DON

    Just turn your LCD 90° cckw !!!

    hi,hi,hi ...

    Alain
    ************************************************** ***********************
    Why insist on using 32 Bits when you're not even able to deal with the first 8 ones ??? ehhhhhh ...
    ************************************************** ***********************
    IF there is the word "Problem" in your question ...
    certainly the answer is " RTFM " or " RTFDataSheet " !!!
    *****************************************

  6. #6
    Join Date
    May 2004
    Posts
    30

    Default

    Thanks ! It's a very good advice ! But I'm seriuos ! Don't forget the vertical bar !

    Don Mario

  7. #7
    Join Date
    May 2004
    Location
    NW France
    Posts
    3,541

    Wink Seriously ...

    Here, a Graphic LCD might be necessary ... ( I've tried a 4x20 : result is not so good due to space between the lines )

    And do not forget the processor to drive the graphic LCD, to have a simple handling like LINE x1,y1,x2,y2 ... BOX x1,y1,x2,y2 CIRCLE x,y,r .... etc,etc

    not so easy ... even with 8k memory , 20 Mhz and Assembler !!!

    Alain
    ************************************************** ***********************
    Why insist on using 32 Bits when you're not even able to deal with the first 8 ones ??? ehhhhhh ...
    ************************************************** ***********************
    IF there is the word "Problem" in your question ...
    certainly the answer is " RTFM " or " RTFDataSheet " !!!
    *****************************************

  8. #8
    ta1dr's Avatar
    ta1dr Guest

    Default convert code to PDS (proton development suit)

    hi Darrel
    thanks for very nice projects
    I want to use but I use Proton Suit (crownhill I am registered user) I can convert it but I didn't understand this row how can I convert PDS

    BARtemp = BAR_value * BAR_width is ok
    BARtemp = DIV32 BAR_range is ok
    '*************************************************
    Remainder = R2 but not ok how can I calculate
    remender from div32 command

    regards
    ahmet/TURKEY

  9. #9
    Join Date
    Jul 2003
    Location
    Colorado Springs
    Posts
    4,959

    Default

    ta1dr

    Read this thread.
    http://www.picbasic.co.uk/forum/showthread.php?p=13214

    Don Mario

    Attaboys followed by wantittodo's cancel each other out.
    And, this is the Code Examples forum. Not the Please make your program do what I want forum.

    I hate being rude, but come on, use the brain a little. I've given everything you need to be able to easily create your own vertical bargraph's. All you need to do is think and apply.
    <br>
    DT

  10. #10
    Join Date
    May 2004
    Posts
    30

    Default

    DARREL TAYLOR,

    I don't say "Make me a program" !
    I say "You forget vertical bargraph" for a coplete "demo software"
    That's my opinion. I don't need your software ! I make my own !


    Don Mario

  11. #11
    Join Date
    Jul 2003
    Location
    Colorado Springs
    Posts
    4,959

    Default

    I make my own !
    Perfect!

    That's what we do here. Offer examples and assistance, so that others can write thier own programs. But the real question is, What will you do with your program when you're finished.

    Will you look at it and say, Hey that's pretty good, I'm not giving it out to anyone for free. Or, will you post it here for others to look at and say it's not good enough.

    I guess time will tell.
    <br>
    DT

  12. #12

    Default

    Darrel,

    I just modified you include file by replacing the word "LCDOut" with "debug" and it almost appears to work. The problem though is that I'm using a 4x20 LCD and it appears the program thinks there is a 16 character LCD pluggeding in because it starts line 2 at postion 17 and starts line 4 at position 17 on line 2. Any thoughts one this?

  13. #13
    Join Date
    Jul 2003
    Location
    Colorado Springs
    Posts
    4,959

    Default

    I knew that was going to come back and bite me in the assparagus.

    With 4x20 displays, line 3 and 4 start at $94 and $D4. I was going to add an option that made the change for you, but forgot about it.

    In the ShowBAR: routine, you can change this line ...
    <pre><b> LOOKUP BAR_row,[$80,$80,$C0,$90,$D0],BARtemp</b></pre>to this ...
    <pre><b> LOOKUP BAR_row,[$80,$80,$C0,$94,$D4],BARtemp</b></pre>and it should work better. Sorry!
    <br>
    DT

  14. #14
    Join Date
    Jul 2003
    Location
    Colorado Springs
    Posts
    4,959

    Default

    Or, better yet ... there's this
    Code:
    @ ifdef LCD4X20    
        LOOKUP BAR_row,[$80,$80,$C0,$94,$D4],BARtemp
    @ else
        LOOKUP BAR_row,[$80,$80,$C0,$90,$D0],BARtemp
    @ endif
    Then in your main program you can just do this when using a 4x20 LCD
    Code:
    DEFINE  LCD4X20  1
    I've also made the change to the original attachment above.

    Thanks for pointing it out CocaColaKid!
    <br>
    DT

  15. #15

    Default

    Glad I could be of service since you've done such a nice job with the code the least I could do was help debug it

  16. #16
    Join Date
    Jul 2005
    Posts
    65

    Smile

    Hi Darrel

    Can you please make Vertical_LCDBar.INC like that Horizontal_LCDBar.INC.


    Thanks in advance

  17. #17
    Join Date
    Jul 2003
    Location
    Colorado Springs
    Posts
    4,959

    Default

    Like Alain said way up there.

    Due to the spaces between the characters landing on an Odd number, vertical bargraphs on LCD displays don't work very well.

    Bummer!
    <br>
    DT

  18. #18
    Join Date
    May 2004
    Location
    NW France
    Posts
    3,541

    Question ????????????????????????????

    Hi, Darrel

    Could you explain those lines to me :

    ASM
    lines = 0x10000001 ; Define the Styles
    boxed = 0x10000002
    blocks = 0x10000003
    ENDASM

    (From LCD_Bar.inc ) ...

    My MPLAB 7.30 seems not to understand it ( comes in red ) ... nor me !!!

    Alain
    ************************************************** ***********************
    Why insist on using 32 Bits when you're not even able to deal with the first 8 ones ??? ehhhhhh ...
    ************************************************** ***********************
    IF there is the word "Problem" in your question ...
    certainly the answer is " RTFM " or " RTFDataSheet " !!!
    *****************************************

  19. #19
    Join Date
    Jul 2003
    Location
    Colorado Springs
    Posts
    4,959

    Default

    Hi Alain,

    Those just assign some unique ID's to the words lines, boxed and blocks.

    I used numbers outside the 16-bit range of PBP just to minimize confusion for myself. Then when PBP uses the number, all it sees is 1, 2 or 3.

    I haven't bothered downloading the latest MPLAB so I hadn't seen any problem yet. But it should be ok to just make them 1, 2 and 3
    Code:
    ASM
    lines  = 1                            ; Define the Styles
    boxed  = 2
    blocks = 3
    ENDASM
    <br>
    DT

  20. #20
    Join Date
    Jul 2005
    Posts
    65

    Smile

    Hi Acetronics

    I had the same problem, when you use the macro, be careful about the letters upper and lower case thingy, I mean Blocks and blocks are different when you use MPASM. Darrel wrote blocks in LCDbar_INC file in the difintions, so you have to use blocks, not Blocks in the macro, the same applies for lines and boxed. This worked fine for me.

    For example:

    Code:
    ' In LCDbar_INC file you will find the following definitions that darrel wrote:
    ASM
    lines = 0x10000001                            ; Define the Styles
    boxed = 0x10000002
    blocks = 0x10000003
    ENDASM
    ' No need to change them nay way...
    
    In your code, you will use this macro:
    ;  BARgraph   Value, Row, Col, Width, Range, Style
    @ BARgraph  _VOL_L,   2,   0,    20,   255, Blocks    ' Doesn't work
    
    ;  BARgraph   Value, Row, Col, Width, Range, Style
    @ BARgraph  _VOL_L,   2,   0,    20,   255, blocks    ' Works fine
    In order to change to Blocks, Lines, and Boxed. Instead of block, lines, and boxed, you have to change the following in LCDBar_INC file:
    Code:
    ASM
    Lines = 0x10000001                            ; Define the Styles
    Boxed = 0x10000002
    Blocks = 0x10000003
    ENDASM
    And this too:
    Code:
        if ((Style >= Lines) & (Style <= Blocks)) ; Is Style a valid constant ?
            MOVE?CB    Style, _BAR_style
        else                                      ; NO, treat it like a variable
            MOVE?BB    Style, _BAR_style
        endif
    After that you can use Blocks, Lines, and Boxed in your code macro.
    Last edited by crematory; - 14th January 2006 at 17:38.

  21. #21
    Join Date
    Jul 2003
    Location
    Colorado Springs
    Posts
    4,959

    Default

    Seems like a lot of work to rewrite a program to use a different Case, when you can just turn off case sensitivity for MPASM, and use any case.

    For MicroCode Studio Plus:
    From View | Picbasic Options... | Assembler Tab and Options tab
    uncheck the "Case sensitive" Checkbox
    Press OK
    The Microchip MPASM checkbox must be checked to see the Case option.

    For other editors, or dos:
    Add -c to the MPASM command line.
    <br>
    DT

  22. #22
    Join Date
    Jul 2005
    Posts
    65

    Default

    Hi darrel

    I could have said that, as a matter of fact, being careful about letter cases while writing a code, prevented me of throwing that note about "uncheck the Case sensitive Checkbox", thats all darrel,

  23. #23
    Join Date
    Oct 2005
    Location
    New Jersey
    Posts
    425

    Default

    I have never used an include file other than the ones provided with PBP. I am getting an error trying to load the include file from Darrel. The only thing I can think of is that I have it in the wrong place. Can someone tell me where I have to put it?

    Thanks,

    Chris

  24. #24
    Join Date
    Jul 2003
    Location
    Colorado Springs
    Posts
    4,959

    Default

    What does the error say?
    <br>
    DT

  25. #25
    Join Date
    Oct 2005
    Location
    New Jersey
    Posts
    425

    Default

    The message says:

    "WARNING: Unable to open INCLUDE file LCDBAR_INC.BAS."

  26. #26
    Join Date
    Jul 2003
    Location
    Colorado Springs
    Posts
    4,959

    Default

    The file above is renamed with an extension of .txt, because the forum won't let you upload .bas files. So make sure you rename it to just LCDBAR_INC.BAS

    Place the file in the same folder as the main program, and you should be good to go.
    <br>
    DT

  27. #27
    Join Date
    Oct 2005
    Location
    New Jersey
    Posts
    425

    Default

    I tried everything and it still doesn't work. I have it in the same folder as the main program. I'm stumped.

  28. #28
    Join Date
    Sep 2004
    Location
    montreal, canada
    Posts
    6,898

    Default

    can you post a whole screenshot?

    It's working for me.

    EDIT: i don't know if it's revelant but be sure your program path is short I.e C:\PBPprog\Project1
    Last edited by mister_e; - 10th July 2006 at 04:46.
    Steve

    It's not a bug, it's a random feature.
    There's no problem, only learning opportunities.

  29. #29
    Join Date
    Jul 2003
    Posts
    2,358

    Default

    I thought PBP (especially when run through a DOS window) couldn't handle filenames greater than 8 characters...

    Example 1...

    PBP -p16F628 12345678 -v

    The above WILL comple, the example below will NOT...

    PBP -p16F628 a12345678 -v

    Further... here's a gotcha...

    Example 2.

    PBP -p16F628 12345678 -v

    Will compile the file 12345678.bas happilly...

    Example 3.

    PBP -p16F628 123456789 -v

    Will NOT compile the expected file 123456789.bas but instead will access the file at Example 2 and compile that instead!

  30. #30
    Join Date
    Jul 2003
    Location
    Colorado Springs
    Posts
    4,959

    Default

    Then you would use...

    <pre>PBPW -p16F628 123456789AndAFewMore.bas -v</pre>or use MCSP, it does it automatically.

    But since you bring up the command line option, there's a few things that could be a possible problem. Path settings, current directory ...

    Christopher,
    Are you compiling by command line, or an IDE?
    <br>
    DT

  31. #31
    Join Date
    Oct 2005
    Location
    New Jersey
    Posts
    425

    Default

    Here is a screenshot of my error. I took out the LCD stuff just to make sure that wasn't causing the problem.

    Darrel,

    I'm not sure how to answer your question as I still new to PBP. In the screenshot is how I complie programs.

    Chris
    Attached Images Attached Images  

  32. #32
    Join Date
    Jul 2003
    Location
    Colorado Springs
    Posts
    4,959

    Default

    If you click on the Include file in the Code Explorer on the left side of the screen, does it pull up the file? Or does it create a new file?

    If it creates a new file, then the Include file is in the wrong folder.

    It should be in the same folder as "Bar Graph.bas".
    <br>
    DT

  33. #33
    Join Date
    Oct 2005
    Location
    New Jersey
    Posts
    425

    Default

    Darrel,

    I got it, thanks for the help. The problem was that both files were saved as .pbp files. All of my programs are saved the same way and I have never had an issue.....until now. So, that part works but now I have another problem.

    I have a 2X16 LCD set up on a development board. I have one simple LCD program and that works fine. I put the same LCD commands into the bargraph program and it doesn't work. I can see weird charecters displayed on the first line but nothing on the second line. Within those charecters I do see numbers every now and again and when I turn the pot, I can see the value change so I know it's functional but just not displaying correctly. Here is the program:

    ; Initialize your hardware and LCD first.
    define osc 20

    ' Set LCD Data port
    DEFINE LCD_DREG PORTB
    ' Set starting Data bit (0 or 4) if 4-bit bus
    DEFINE LCD_DBIT 4
    ' Set LCD Register Select port
    DEFINE LCD_RSREG PORTB
    ' Set LCD Register Select bit
    DEFINE LCD_RSBIT 2
    ' Set LCD Enable port
    DEFINE LCD_EREG PORTB
    ' Set LCD Enable bit
    DEFINE LCD_EBIT 3
    ' Set LCD bus size (4 or 8 bits)
    DEFINE LCD_BITS 4
    ' Set number of lines on LCD
    DEFINE LCD_LINES 2
    ' Set command delay time in us
    DEFINE LCD_COMMANDUS 2000
    ' Set data delay time in us
    DEFINE LCD_DATAUS 100
    'This setup will tell PBP a 2-line LCD is connected in 4-bit mode with the data bus on the
    'top 4 bits of PORTB, Register Select on PORTB.1, and Enable on PORTB.0.





    DEFINE ADC_BITS 8 ' Number of bits in ADCIN result
    ADCON1.7 = 1 ' Right Justify AD result

    INCLUDE "LCDbar_INC.bas" ' Include the BARgraph routines

    Value VAR WORD ' Must be a WORD even though AD is 8bit

    LCDOUT $FE, 1 ' Clear Screen
    pause 500

    Loop1:
    ADCIN 2, Value
    LCDOUT $FE,2,"Value = ",DEC Value," "

    ; syntax- BARgraph Value, Row, Col, Width, Range, Style
    @ BARgraph _Value, 2, 0, 16, 255, lines



    GOTO Loop1


    Like I said, these LCD commands were copied word for word from another known program. Any ideas?

    Thanks again for the help.

    Chris

  34. #34
    Join Date
    Jul 2003
    Location
    Colorado Springs
    Posts
    4,959

    Default

    The DEFINEs don't match the comments. Might be the prob.

    Defines show RS on PORTB.2, and Enable on PORTB.3

    But, your comment says...
    <pre>'This setup will tell PBP a 2-line LCD is connected in 4-bit mode with the data bus on the<br>'top 4 bits of PORTB, Register Select on PORTB.1, and Enable on PORTB.0.</pre>
    DT

  35. #35
    Join Date
    Oct 2005
    Location
    New Jersey
    Posts
    425

    Default

    Now, I am really confused. How come this program worked but the other one didn't?

    DEFINE OSC 20
    INCLUDE "LCDbar_INC.bas" ' Include the BARgraph routines
    ' Set LCD Data port
    DEFINE LCD_DREG PORTB
    ' Set starting Data bit (0 or 4) if 4-bit bus
    DEFINE LCD_DBIT 4
    ' Set LCD Register Select port
    DEFINE LCD_RSREG PORTB
    ' Set LCD Register Select bit
    DEFINE LCD_RSBIT 2
    ' Set LCD Enable port
    DEFINE LCD_EREG PORTB
    ' Set LCD Enable bit
    DEFINE LCD_EBIT 3
    ' Set LCD bus size (4 or 8 bits)
    DEFINE LCD_BITS 4
    ' Set number of lines on LCD
    DEFINE LCD_LINES 2
    ' Set command delay time in us
    DEFINE LCD_COMMANDUS 2000
    ' Set data delay time in us
    DEFINE LCD_DATAUS 100.

    DEFINE ADC_BITS 8 ' Number of bits in ADCIN result
    ADCON1.7 = 1 ' Right Justify AD result

    Value VAR WORD ' Must be a WORD even though AD is 8bit
    pause 1000
    LCDOUT $FE, 1, " "
    loop1:

    adcin 2,value

    LCDOUT $FE,2,"Value = ",DEC Value," "

    ; syntax- BARgraph Value, Row, Col, Width, Range, Style
    @ BARgraph _Value, 2, 0, 16, 255, lines

    goto loop1


    The only thing I adjusted was the pause commands and I moved the include file to the top of the program. I'm happy that it's working but I'd like to know for future reference incase it happens again. Thanks for the help Darrel.

  36. #36
    Join Date
    Jul 2003
    Location
    Colorado Springs
    Posts
    4,959

    Default

    You probably have an LCD that is very slow starting up and requires more than 500 ms before receiving it's first command.

    Being that you also have DEFINE LCD_DATAUS 100, it's seems reasonable.
    Most LCD's are happy with LCD_DATAUS 50, and only 250 ms power-up delay. But there are some that aren't.

    Try leaving the INCLUDE where it was, with the longer pauses. Just to see what happens.
    <br>
    DT

  37. #37
    Join Date
    Oct 2005
    Location
    New Jersey
    Posts
    425

    Default Found the problem!

    Well, after searching for a while, I found the problem and it's strange. At the tops of both programs, look at the OSC commands. One is in CAPS and the other isn't. I guess it has to be in CAPS or PBP won't know what it is. I wonder why it doesn't give you an error when compling?

  38. #38
    Join Date
    Sep 2004
    Location
    montreal, canada
    Posts
    6,898

    Default

    It's been already mentioned a lot of time since the Forum birth.

    DEFINEs must be WRITTEN AS STATED in the manual. Case not, they will never be considered by the compiler
    http://www.picbasic.co.uk/forum/show...light=spelling
    Steve

    It's not a bug, it's a random feature.
    There's no problem, only learning opportunities.

  39. #39
    Join Date
    Jul 2003
    Location
    Colorado Springs
    Posts
    4,959

    Default

    Ha, that's funny. Didn't even see it.

    >> I wonder why it doesn't give you an error when compling? <<

    You can DEFINE almost anything you want

    <pre>DEFINE GreatGoogly Moogly</pre>But it only has an effect if it matches up with something the program is expecting to see.
    And, when using MPASM the case has to match too.

    Well, now that you've got things going, I hope the BarGraphs work out for you.
    <br>
    Last edited by Darrel Taylor; - 11th July 2006 at 03:46. Reason: oops, ya beat me Steve.
    DT

  40. #40
    Join Date
    Sep 2004
    Location
    montreal, canada
    Posts
    6,898

    Default

    Yup, i guess the MPASM AND PM IFDEF can't be bypassed like Variable and Labels.
    Steve

    It's not a bug, it's a random feature.
    There's no problem, only learning opportunities.

Similar Threads

  1. Is this code not initialising the LCD properly?
    By Platypus in forum mel PIC BASIC Pro
    Replies: 8
    Last Post: - 30th January 2010, 19:14
  2. 16f688 LCD what have I done wrong
    By spitfiredriver in forum mel PIC BASIC Pro
    Replies: 6
    Last Post: - 8th August 2009, 19:54
  3. Play with LCD on PICDEM
    By The IceMan in forum mel PIC BASIC
    Replies: 5
    Last Post: - 22nd August 2008, 16:56
  4. Need help with LCD number display.
    By Steve Matson in forum mel PIC BASIC
    Replies: 8
    Last Post: - 26th June 2007, 23:07
  5. LCD will not start
    By btaylor in forum mel PIC BASIC Pro
    Replies: 49
    Last Post: - 24th May 2007, 02:30

Members who have read this thread : 4

You do not have permission to view the list of names.

Posting Permissions

  • You may not post new threads
  • You may not post replies
  • You may not post attachments
  • You may not edit your posts