Change On Interrupt, PIC16F884


Closed Thread
Results 1 to 18 of 18

Hybrid View

  1. #1
    Join Date
    Apr 2005
    Location
    Virginia
    Posts
    65


    Did you find this post helpful? Yes | No

    Default Detecting Multiple Switches with Interrupt-On-Change

    One more question: How about detecting multiple switches with interrupt-on-change? I've tried the modified code below as well as the commented out code on its own. This works, but not reliably. I'm using those momentary red square switches from RadioShack and the LEDs only change about half the time, i.e., the program isn't detecting the button press. I've tried pressing the switches hard (fully down) quickly, but with the same hit rate of half. If I press and hold each button for a second or two, it works fine, but I don't want to force the user to press and hold a switch to do something. I tried playing with the debounce times and even adding a ceramic capacitor, 0.1uF and 0.01uF across the switch contacts with no luck. I tried searching the forum, but the only interrupt examples I've come across are for single button applications. Any suggestions?

    INCLUDE "modedefs.bas"
    PORTA = $00 ' Set all port a pins to low
    PORTB = $00 ' Set all port b pins to low
    PORTC = $00 ' Set all port c pins to low
    PORTD = $00 ' Set all port d pins to low
    PORTE = $00 ' Set all port e pins to low

    asm ; The following code is assembly, not Basic
    __CONFIG _CONFIG1, _INTOSCIO & _WDT_OFF & _PWRTE_ON & _CP_OFF & _BOR_OFF & _IESO_OFF & _FCMEN_OFF & _LVP_OFF
    ; Use internal oscillator & make both, OSC pins I/Os, turn off watchdog timer, enable Power-up timer,
    ; code protection off, brown-out off, disable switch over mode, turn off failsafe monitor,
    ; low voltage programming off
    endasm ' End assembly code

    ADCON0.0 = 0 ; Make all analog pins digital I/Os
    CM1CON0.7 = 0 ; Disable comparator C1
    CM2CON0.7 = 0 ; Disable comparator C2
    OSCCON.6 = 1 ; Set the internal oscillator to 8MHz
    OSCCON.5 = 1 ; Set the internal oscillator to 8MHz
    OSCCON.4 = 1 ; Set the internal oscillator to 8MHz
    WDTCON.0 = 0 ; Disable the watchdog timer
    ANSEL = %00000000 ; Set all analog pins on port a to digital I/O
    ANSELH = %00000000 ; Set all analog pins on port b to digital I/O

    define OSC 8 ' Tell the program the oscillator is running at 8 MHz
    TRISA = %00000000 ' Make all port a pins outputs
    TRISB = %00001111 ' Make port b pins 0-3 inputs and the rest as outputs
    TRISC = %00000000 ' Make all port c pins outputs
    TRISD = %00000000 ' Make all port d pins outputs
    TRISE = %00000000 ' Make all port e pins outputs
    PORTA = $00 ' Set all port a pins to low
    PORTB = $00 ' Set all port b pins to low
    PORTC = $00 ' Set all port c pins to low
    PORTD = $00 ' Set all port d pins to low
    PORTE = $00 ' Set all port e pins to low
    'Variables**************************************** ************************************************** *
    b0 VAR byte ' Required byte variable for toggle button
    '************************************************* ************************************************** *
    INITIALIZE: ' Initialize Routine
    INTCON.0 = 0 ' Clear the interrupt-on-change flag
    On Interrupt goto Halt ' Once an active interrupt port is enabled, go to the Halt routine
    INTCON = %10001000 ' Enable global interrupts, Enable interrupt-on-change on Port b
    IOCB = %00000011 ' Enable interrupt-on-change on RB0-RB3
    PORTE.1 = 0 ' Make sure LED on PORTE.1 is off
    PORTE.2 = 0 ' Make sure LED on PORTE.2 is off
    GOTO MAIN ' Go to Main routine
    '************************************************* ************************************************** *
    MAIN:
    HIGH PORTE.0
    PAUSE 500
    LOW PORTE.0
    PAUSE 500
    GOTO MAIN
    '*************************************************
    DISABLE ' do NOT place interrupt checking code below
    Halt: ' Halt Routine
    IF PORTB.0 = 0 THEN
    WHILE PORTB.0=0 ' wait for button release & end mismatch condition on portb
    WEND
    PAUSE 20 ' Debounce delay
    HIGH PORTE.1
    LOW PORTE.2
    ENDIF
    IF PORTB.1 = 0 THEN
    WHILE PORTB.1=0 ' wait for button release & end mismatch condition on portb
    WEND
    PAUSE 20 ' Debounce delay
    LOW PORTE.1
    HIGH PORTE.2
    ENDIF

    ' IF PORTB.0 = 0 THEN
    ' ' PAUSE 20
    ' ' IF PORTB.0 = 0 THEN
    ' HIGH PORTE.1
    ' LOW PORTE.2
    ' ' ENDIF
    ' ENDIF
    '
    ' IF PORTB.1 = 0 THEN
    ' ' PAUSE 20
    ' ' IF PORTB.1 = 0 THEN
    ' LOW PORTE.1
    ' HIGH PORTE.2
    ' ' ENDIF
    ' ENDIF

    INTCON.0 = 0 ' Clear the interrupt-on-change flag
    RESUME ' Go to Main routine
    ENABLE ' Enable all active interrupts

  2. #2
    Join Date
    Apr 2006
    Location
    New Hampshire USA
    Posts
    298


    Did you find this post helpful? Yes | No

    Smile Just an idea...

    Hi elec_mech,
    Posting code directly into the text portion of the forum makes it difficult to follow.
    Quote Originally Posted by Mister_e
    [code] paste your code here [/code]
    One step better but a lot more work:
    Quote Originally Posted by Darrel Taylor View Post
    Show us your Colors.
    Quote Originally Posted by elec_mech View Post
    define osc 8 ' tell the program the oscillator is running at 8 mhz
    Quote Originally Posted by PBP 2.50 manual
    4.16. DEFINE may be used to change the predefined oscillator value...
    These definitions must be in all upper case, exactly as shown.
    If not, the compiler may not recognize them.
    No error message will be produced for defines the compiler does not recognize.
    Code:
    DEFINE OSC 8
    -Adam-
    Last edited by Pic_User; - 13th November 2008 at 18:20. Reason: Changing formatting
    Ohm it's not just a good idea... it's the LAW !

  3. #3
    Join Date
    Apr 2005
    Location
    Virginia
    Posts
    65


    Did you find this post helpful? Yes | No

    Default

    Adam,

    I see what you mean with the DEFINE, oops! Thanks for the catch. I see what you mean with colors. Is this better?
    INCLUDE "modedefs.bas"
    PORTA = $00 ' Set all port a pins to low
    PORTB = $00 ' Set all port b pins to low
    PORTC = $00 ' Set all port c pins to low
    PORTD = $00 ' Set all port d pins to low
    PORTE = $00 ' Set all port e pins to low

    asm ; The following code is assembly, not Basic
    __CONFIG _CONFIG1, _INTOSCIO & _WDT_OFF & _PWRTE_ON & _CP_OFF & _BOR_OFF & _IESO_OFF & _FCMEN_OFF & _LVP_OFF
    ; Use internal oscillator & make both, OSC pins I/Os, turn off watchdog timer, enable Power-up timer,
    ; code protection off, brown-out off, disable switch over mode, turn off failsafe monitor,
    ; low voltage programming off
    endasm ' End assembly code

    ADCON0.0 = 0 ; Make all analog pins digital I/Os
    CM1CON0.7 = 0 ; Disable comparator C1
    CM2CON0.7 = 0 ; Disable comparator C2
    OSCCON.6 = 1 ; Set the internal oscillator to 8MHz
    OSCCON.5 = 1 ; Set the internal oscillator to 8MHz
    OSCCON.4 = 1 ; Set the internal oscillator to 8MHz
    WDTCON.0 = 0 ; Disable the watchdog timer
    ANSEL = %00000000 ; Set all analog pins on port a to digital I/O
    ANSELH = %00000000 ; Set all analog pins on port b to digital I/O

    DEFINE OSC 8 ' Tell the program the oscillator is running at 8 MHz
    TRISA = %00000000 ' Make all port a pins outputs
    TRISB = %00001111 ' Make port b pins 0-3 inputs and the rest as outputs
    TRISC = %00000000 ' Make all port c pins outputs
    TRISD = %00000000 ' Make all port d pins outputs
    TRISE = %00000000 ' Make all port e pins outputs
    PORTA = $00 ' Set all port a pins to low
    PORTB = $00 ' Set all port b pins to low
    PORTC = $00 ' Set all port c pins to low
    PORTD = $00 ' Set all port d pins to low
    PORTE = $00 ' Set all port e pins to low
    'Variables**************************************** ************************************************** *
    b0 VAR byte ' Required byte variable for toggle button
    '************************************************* ************************************************** *
    INITIALIZE: ' Initialize Routine
    INTCON.0 = 0 ' Clear the interrupt-on-change flag
    On Interrupt goto Halt ' Once an active interrupt port is enabled, go to the Halt routine
    INTCON = %10001000 ' Enable global interrupts, Enable interrupt-on-change on Port b
    IOCB = %00000011 ' Enable interrupt-on-change on RB0-RB3
    PORTE.1 = 0 ' Make sure LED on PORTE.1 is off
    PORTE.2 = 0 ' Make sure LED on PORTE.2 is off
    GOTO MAIN ' Go to Main routine
    '************************************************* ************************************************** *
    MAIN:
    HIGH PORTE.0
    PAUSE 500
    LOW PORTE.0
    PAUSE 500
    GOTO MAIN
    '*************************************************
    DISABLE ' do NOT place interrupt checking code below
    Halt: ' Halt Routine
    IF PORTB.0 = 0 THEN
    WHILE PORTB.0=0 ' wait for button release & end mismatch condition on portb
    WEND
    PAUSE 20 ' Debounce delay
    HIGH PORTE.1
    LOW PORTE.2
    ENDIF
    IF PORTB.1 = 0 THEN
    WHILE PORTB.1=0 ' wait for button release & end mismatch condition on portb
    WEND
    PAUSE 20 ' Debounce delay
    LOW PORTE.1
    HIGH PORTE.2
    ENDIF


    ' IF PORTB.0 = 0 THEN
    ' ' PAUSE 20
    ' ' IF PORTB.0 = 0 THEN
    ' HIGH PORTE.1
    ' LOW PORTE.2
    ' ' ENDIF
    ' ENDIF
    '
    ' IF PORTB.1 = 0 THEN
    ' ' PAUSE 20
    ' ' IF PORTB.1 = 0 THEN
    ' LOW PORTE.1
    ' HIGH PORTE.2
    ' ' ENDIF
    ' ENDIF

    INTCON.0 = 0 ' Clear the interrupt-on-change flag
    RESUME ' Go to Main routine
    ENABLE ' Enable all active interrupts

  4. #4
    Join Date
    Apr 2006
    Location
    New Hampshire USA
    Posts
    298


    Did you find this post helpful? Yes | No

    Thumbs up the real question

    Quote Originally Posted by elec_mech View Post
    Adam,
    I see what you mean with the DEFINE, oops! Thanks for the catch. I see what you mean with colors. Is this better?
    It is better! But the idea is to copy from your editor, paste into a code box. So the indents and formatting look more like the original. Sometimes the forum changes the formatting. I was not sure the lowercase define was in your original or being changed by the forum. It changes a lot of things “for you” I wish I knew more about PBP to really help you on your real question.
    -Adam-
    Ohm it's not just a good idea... it's the LAW !

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


    Did you find this post helpful? Yes | No

    Default

    with code bracket
    I type
    [code]
    i now paste my code here
    then i type [/code]

    we got
    Code:
            asm ; The following code is assembly, not Basic
                    __CONFIG _CONFIG1, _INTOSCIO & _WDT_OFF & _PWRTE_ON & _CP_OFF & _BOR_OFF & _IESO_OFF & _FCMEN_OFF & _LVP_OFF
                    ; Use internal oscillator & make both, OSC pins I/Os, turn off watchdog timer, enable Power-up timer,
                    ; code protection off, brown-out off, disable switch over mode, turn off failsafe monitor,
                    ; low voltage programming off
            endasm ' End assembly code
    
            define OSC 8        ' Tell the program the oscillator is running at 8 MHz
            OSCCON.6 = 1        ; Set the internal oscillator to 8MHz
            OSCCON.5 = 1        ; Set the internal oscillator to 8MHz
            OSCCON.4 = 1        ; Set the internal oscillator to 8MHz
    
            PORTA = $00         ' Set all port a pins to low
            PORTB = $00         ' Set all port b pins to low
            PORTC = $00         ' Set all port c pins to low
            PORTD = $00         ' Set all port d pins to low
            PORTE = $00         ' Set all port e pins to low
    
            TRISA = %00000000   ' Make all port a pins outputs
            TRISB = %00001111   ' Make port b pins 0-3 inputs and the rest as outputs
            TRISC = %00000000   ' Make all port c pins outputs
            TRISD = %00000000   ' Make all port d pins outputs
            TRISE = %00000000   ' Make all port e pins outputs
            
            ADCON0.0 = 0        ; Make all analog pins digital I/Os
            CM1CON0.7 = 0       ; Disable comparator C1
            CM2CON0.7 = 0       ; Disable comparator C2
            WDTCON.0 = 0        ; Disable the watchdog timer
            ANSEL = %00000000   ; Set all analog pins on port a to digital I/O
            ANSELH = %00000000  ; Set all analog pins on port b to digital I/O
            
            INCLUDE "modedefs.bas"
    
    'Variables*****************************************************************************************
            b0 VAR byte         ' Required byte variable for toggle button
    
    
    '**************************************************************************************************
    INITIALIZE:                 ' Initialize Routine
            INTCON.0 = 0        ' Clear the interrupt-on-change flag
            On Interrupt goto Halt ' Once an active interrupt port is enabled, go to the Halt routine
            INTCON = %10001000  ' Enable global interrupts, Enable interrupt-on-change on Port b
            IOCB = %00000011    ' Enable interrupt-on-change on RB0-RB3
            PORTE.1 = 0         ' Make sure LED on PORTE.1 is off
            PORTE.2 = 0         ' Make sure LED on PORTE.2 is off
    
    
    '*************************************************************************************************** *
    MAIN:
            HIGH PORTE.0
            PAUSE 500
            LOW PORTE.0
            PAUSE 500
            GOTO MAIN
    
    
    '*************************************************
            DISABLE         ' do NOT place interrupt checking code below
            
    Halt:   ' Halt Routine
            IF PORTB.0 = 0 THEN
                    WHILE PORTB.0=0 ' wait for button release & end mismatch condition on portb
                    WEND
                    PAUSE 20        ' Debounce delay
                    HIGH PORTE.1
                    LOW PORTE.2
                    ENDIF
                    
            IF PORTB.1 = 0 THEN
                    WHILE PORTB.1=0 ' wait for button release & end mismatch condition on portb
                    WEND            
                    PAUSE 20        ' Debounce delay
                    LOW PORTE.1
                    HIGH PORTE.2
                    ENDIF
           
            INTCON.0 = 0            ' Clear the interrupt-on-change flag
            RESUME                  ' Go to Main routine
            ENABLE                  ' Enable all active interrupts
    with colors, following the following thread
    http://www.picbasic.co.uk/forum/show...ht=show+colors

    we got
    Code:
    <font color="#000000">        <font color="#000080">ASM </font><font color="#008000">; The following code is assembly, not Basic
                    </font><font color="#000080">__CONFIG _CONFIG1, _INTOSCIO &amp; _WDT_OFF &amp; _PWRTE_ON &amp; _CP_OFF &amp; _BOR_OFF &amp; _IESO_OFF &amp; _FCMEN_OFF &amp; _LVP_OFF
                    </font><font color="#008000">; Use internal oscillator &amp; make both, OSC pins I/Os, turn off watchdog timer, enable Power-up timer,
                    ; code protection off, brown-out off, disable switch over mode, turn off failsafe monitor,
                    ; low voltage programming off
            </font><font color="#000080">ENDASM </font><font color="#008000">' End assembly code
    
            </font><font color="#000080">DEFINE </font>OSC 8        <font color="#008000">' Tell the program the oscillator is running at 8 MHz
            </font>OSCCON.6 = 1        <font color="#008000">; Set the internal oscillator to 8MHz
            </font>OSCCON.5 = 1        <font color="#008000">; Set the internal oscillator to 8MHz
            </font>OSCCON.4 = 1        <font color="#008000">; Set the internal oscillator to 8MHz
    
            </font>PORTA = $00         <font color="#008000">' Set all port a pins to low
            </font>PORTB = $00         <font color="#008000">' Set all port b pins to low
            </font>PORTC = $00         <font color="#008000">' Set all port c pins to low
            </font>PORTD = $00         <font color="#008000">' Set all port d pins to low
            </font>PORTE = $00         <font color="#008000">' Set all port e pins to low
    
            </font>TRISA = %00000000   <font color="#008000">' Make all port a pins outputs
            </font>TRISB = %00001111   <font color="#008000">' Make port b pins 0-3 inputs and the rest as outputs
            </font>TRISC = %00000000   <font color="#008000">' Make all port c pins outputs
            </font>TRISD = %00000000   <font color="#008000">' Make all port d pins outputs
            </font>TRISE = %00000000   <font color="#008000">' Make all port e pins outputs
            
            </font>ADCON0.0 = 0        <font color="#008000">; Make all analog pins digital I/Os
            </font>CM1CON0.7 = 0       <font color="#008000">; Disable comparator C1
            </font>CM2CON0.7 = 0       <font color="#008000">; Disable comparator C2
            </font>WDTCON.0 = 0        <font color="#008000">; Disable the watchdog timer
            </font>ANSEL = %00000000   <font color="#008000">; Set all analog pins on port a to digital I/O
            </font>ANSELH = %00000000  <font color="#008000">; Set all analog pins on port b to digital I/O
            
            </font><font color="#000080">INCLUDE </font>&quot;modedefs.bas&quot;
    
    <font color="#008000">'Variables*****************************************************************************************
            </font>b0 <font color="#000080">VAR BYTE         </font><font color="#008000">' Required byte variable for toggle button
    
    
    '**************************************************************************************************
    </font>INITIALIZE:                 <font color="#008000">' Initialize Routine
            </font>INTCON.0 = 0        <font color="#008000">' Clear the interrupt-on-change flag
            </font><font color="#000080">ON INTERRUPT GOTO </font>Halt <font color="#008000">' Once an active interrupt port is enabled, go to the Halt routine
            </font>INTCON = %10001000  <font color="#008000">' Enable global interrupts, Enable interrupt-on-change on Port b
            </font>IOCB = %00000011    <font color="#008000">' Enable interrupt-on-change on RB0-RB3
            </font>PORTE.1 = 0         <font color="#008000">' Make sure LED on PORTE.1 is off
            </font>PORTE.2 = 0         <font color="#008000">' Make sure LED on PORTE.2 is off
    
    
    '*************************************************************************************************** *
    </font>MAIN:
            <font color="#000080">HIGH </font>PORTE.0
            <font color="#000080">PAUSE </font>500
            <font color="#000080">LOW </font>PORTE.0
            <font color="#000080">PAUSE </font>500
            <font color="#000080">GOTO </font>MAIN
    
    
    <font color="#008000">'*************************************************
            </font><font color="#000080">DISABLE         </font><font color="#008000">' do NOT place interrupt checking code below
            
    </font>Halt:   <font color="#008000">' Halt Routine
            </font><font color="#000080">IF </font>PORTB.0 = 0 <font color="#000080">THEN
                    WHILE </font>PORTB.0=0 <font color="#008000">' wait for button release &amp; end mismatch condition on portb
                    </font><font color="#000080">WEND
                    PAUSE </font>20        <font color="#008000">' Debounce delay
                    </font><font color="#000080">HIGH </font>PORTE.1
                    <font color="#000080">LOW </font>PORTE.2
                    <font color="#000080">ENDIF
                    
            IF </font>PORTB.1 = 0 <font color="#000080">THEN
                    WHILE </font>PORTB.1=0 <font color="#008000">' wait for button release &amp; end mismatch condition on portb
                    </font><font color="#000080">WEND            
                    PAUSE </font>20        <font color="#008000">' Debounce delay
                    </font><font color="#000080">LOW </font>PORTE.1
                    <font color="#000080">HIGH </font>PORTE.2
                    <font color="#000080">ENDIF
           
            </font>INTCON.0 = 0            <font color="#008000">' Clear the interrupt-on-change flag
            </font><font color="#000080">RESUME                  </font><font color="#008000">' Go to Main routine
            </font><font color="#000080">ENABLE                  </font><font color="#008000">' Enable all active interrupts
    </font>
    Read your datasheet about Interrupt on change. I haven't done myself, but I bet you should read the whole, save it to a variable, then play with this variable.

    Probably not a bad idea, to do the same thing before ON INTERRUPT.. read the whole port, save it to a dummy variable, etc.

    HTH
    Last edited by mister_e; - 13th November 2008 at 20:54.
    Steve

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

  6. #6
    Join Date
    Apr 2005
    Location
    Virginia
    Posts
    65


    Did you find this post helpful? Yes | No

    Default Closer . . .

    Alright, I got smart and have an LED coming on whenever the interrupt routine is entered and guess what? The program always goes into the interrupt routine whenever I press a button. The bad news is that the program doesn't seem to be able to determine which switch is pressed fast enough. Again, if I hold the switch down for a second or more, it knows which switch is pressed. But more often than not, I just press the button as anyone would and I see the LED come on indicating the interrupt routine was entered, but the other LEDs don't toggle most of the time. I suspect that the program is dragging somewhere, but I don't know why the program can pick up a change on PORTB but doesn't have the time to determine which input was tripped. Any suggestions? Modified code below.

    '************************************************* ************************************************** *
    MAIN:
    ' HIGH PORTE.0
    PAUSE 500
    LOW PORTE.0
    ' PAUSE 500
    GOTO MAIN
    '*************************************************
    DISABLE ' do NOT place interrupt checking code below
    Halt: ' Halt Routine
    HIGH PORTE.0
    IF PORTB.0 = 0 THEN
    WHILE PORTB.0=0 ' wait for button release & end mismatch condition on portb
    WEND
    PAUSE 20 ' Debounce delay
    HIGH PORTE.1
    LOW PORTE.2
    ENDIF
    IF PORTB.1 = 0 THEN
    WHILE PORTB.1=0 ' wait for button release & end mismatch condition on portb
    WEND
    PAUSE 20 ' Debounce delay
    LOW PORTE.1
    HIGH PORTE.2
    ENDIF

    INTCON.0 = 0 ' Clear the interrupt-on-change flag
    RESUME Main ' Go to Main routine
    ENABLE ' Enable all active interrupts

  7. #7
    Join Date
    Jul 2003
    Posts
    2,405


    Did you find this post helpful? Yes | No

    Default

    You have 500mS delays before your interrupt can even be processed. Unless someone
    presses & holds a button, it may be quite a long time before you enter your interrupt
    handler.

    Reduce your pause times by using a loop with PAUSEUS until your 500mS delay period
    expires. Then you only have a few uS before PBP will jump to your int handler, and you
    can read the whole port in the first line, save it to a variable, then make a decision on
    which switch was pressed.
    Regards,

    -Bruce
    tech at rentron.com
    http://www.rentron.com

  8. #8
    Join Date
    Sep 2005
    Location
    Campbell, CA
    Posts
    1,107


    Did you find this post helpful? Yes | No

    Default

    Just a suggestion - use Darrel Taylor's Instant Interrupts. If you use that, you don't have to worry about PAUSE. The interrupt routine will be entered whenever the button is pushed - even in the middle of a PAUSE routine. In the end, it is a much cleaner solution than ON INTERRUPT GOTO - believe me.
    Charles Linquist

Similar Threads

  1. A Simple IOC Routine (Interrupt On Change)
    By lugo.p in forum mel PIC BASIC Pro
    Replies: 6
    Last Post: - 8th March 2010, 20:53
  2. Won't go back to SLEEP after 1st Interrupt
    By jellis00 in forum mel PIC BASIC Pro
    Replies: 32
    Last Post: - 29th June 2009, 10:00
  3. Can't ID interrupt source with this IntHandler??
    By jellis00 in forum mel PIC BASIC Pro
    Replies: 7
    Last Post: - 3rd June 2009, 03:35
  4. NEWBIE: Some basic questions using interrupts
    By JackPollack in forum mel PIC BASIC Pro
    Replies: 5
    Last Post: - 8th March 2006, 03:59
  5. USART interrupt not interrupting right
    By Morpheus in forum mel PIC BASIC Pro
    Replies: 12
    Last Post: - 6th March 2005, 02:07

Members who have read this thread : 0

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