Here is a rapid fire project I made for my son. It has four states, 1) off, 2) 20 shot/sec, 3) 10shots/sec and 4) 5 shots/sec. You control the speed by tapping on the SYNC switch on the 360 controller. I used a 12F683. This will only work for the newer (CG or common ground) controllers.
The x-box trigger is a pot. when the trigger is pulled the wiper voltage goes from near zero to 3 volts. This circuit changes the pin (GP0) from input (tri-state) to a output with zero volts. There may be a little overkill, I was playing with Darrel's Instant Interrupts 
Code:
@ __CONFIG _FCMEN_OFF & _IESO_OFF & _CP_OFF & _CPD_OFF & _BOD_OFF & _MCLRE_OFF & _WDT_OFF & _PWRTE_ON & _INTOSCIO
ANSEL = %00000000 'Make sure Analog functions are turned OFF (should not be needed)
CMCON0 = 7 'comparators off
OPTION_REG.7 = 0 'enable weak pullups
TRISIO = %00100101
WPU = %00000100 'weak pullup
OPTION_REG.6 = 0 'falling edge trigger
;***** VARIABLE DEFINITIONS******************
STATE Var byte ;programmed state
'';************************************************************************
' _______
' VDD -|1 8|- VSS
' GP5 -|2 7|- GP0 TriggerR out ->
' GP4 -|3 6|- GP1
' GP3 -|4_____5|- GP2 <- sync
'
'
'
'
'*********GPIO pin names**************************************************
LED var GPIO.5 'led output useing player 4 led
Sync var GPIO.2 'sync switch input
TRIGGERR var GPIO.0 'rapid trigger output
'**********************************************************************
INCLUDE "DT_INTS-14.bas" ; Base Interrupt System
INCLUDE "ReEnterPBP.bas" ; Include if using PBP interrupts
ASM
INT_LIST macro ; IntSource, Label, Type, ResetFlag?
INT_Handler TMR1_INT, ReloadTMR1, ASM, no ; MUST be first
INT_Handler TMR1_INT, _TriggerOut, PBP, yes
INT_Handler INT_INT, _ChangeState, PBP, yes
endm
INT_CREATE ; Creates the interrupt processor
ENDASM
TMR1H = $A0 ' load timer1 with $00FF
TMR1L = $B3
T1CON = $00
@ INT_ENABLE TMR1_INT ; enable Timer 1 interrupts
@ INT_ENABLE INT_INT ; enable external (INT) interrupts
;--- Change these to match the desired interrupt frequency -------------------
;--- See http://DarrelTaylor.com/DT_INTS-14/TimerTemplate.html for more Info.
@Freq = 20 ; Frequency of Interrupts in Hz
@Prescaler = 1 ; Timers Prescaler setting
T1CON = $00 ; $30 = Prescaler 1:8, TMR1 OFF
; $00=1:1, $10=1:2, $20=1:4, $30=1:8 -- Must match @Prescaler value
State = 0
goto Main
'***************************************************************************
ChangeState: ' Three states rapid fire 20 SPS 10 SPS and off
pause 10
if sync = 0 then ' Switch debounce
if state = 3 then state = 0
select case state
case 0 'twenty shots per sec
gosub starttimer
case 1 'ten shots per sec
T1CON = $11
case 2 ' five shots per second
T1CON = $21
case 3 'off
T1CON = $00 'timer off
TRISIO = %00100101
end select
state = state + 1
endif
@ INT_RETURN
'***************************************************************************
TriggerOut:
TRIGGERR = 0 'Trigger 0
TRISIO.0 = 0 ' Trigger output the 0
low LED 'turn on led
TRISIO.5 = 0 'make led a output
pause 25 'pause 25 ms
high led 'turn off led
TRISIO.0 = 1 'put trigger in tristate mode (float)
input LED 'put led in tristate mode (PCP method)
@ INT_RETURN
'***************************************************************************
Main:
'nothing happening here yet just using interupts for this project
goto main
;---[TMR1 reload - interrupt handler]-----------------------------------------
ASM ; Calculate Timer Reload Constant
ReloadInst = 8 ; # of Intructions used to reload timer
if ((Prescaler == 1)||(Prescaler == 2)||(Prescaler == 4)||(Prescaler == 8))
MaxCount = 65536 + (ReloadInst / Prescaler)
TimerReload = MaxCount - (OSC*1000000/4/Prescaler/Freq)
if ((TimerReload < 0) || (TimerReload > (65535-ReloadInst)))
error Invalid Timer Values - check "OSC", "Freq" and "Prescaler"
endif
else
error Invalid Prescaler
endif
ENDASM
@Timer1 = TMR1L ; map timer registers to a word variable
Timer1 VAR WORD EXT
TimerReload CON EXT ; Get the External Constant
TMR1ON VAR T1CON.0 ; Alias the Timers ON/OFF bit
;---Reload Timer1------
ASM
ReloadTMR1
MOVE?CT 0, T1CON, TMR1ON ; 1 stop timer
MOVLW LOW(TimerReload) ; 1 Add TimerReload to the
ADDWF TMR1L,F ; 1 value in Timer1
BTFSC STATUS,C ; 1/2
INCF TMR1H,F ; 1
MOVLW HIGH(TimerReload) ; 1
ADDWF TMR1H,F ; 1
MOVE?CT 1, T1CON, TMR1ON ; 1 start timer
INT_RETURN
ENDASM
;---Start/Stop controls -----
StartTimer:
Timer1 = TimerReload ; Load Timer
TMR1ON = 1 ; start timer
RETURN
StopTimer:
TMR1ON = 0 ; stop timer
RETURN
Hope it helps a little
Dave
Bookmarks