hi, I'm new and I'm really into modding controllers and i play lots of games, and need more than just 4 modes, if you could help thank you. i was looking into hazers gameplay RF and looks like what i like, i don't like sleepers as i just there a bit clumsy and really like hazers and been trying to look around and find out for my self if this work, as my programmer hasn't come yet i just thought that if some one looked through this and could give me tips, thank you lots here is the code; (i want this for my own personal use BTW just to let you know and i don't mind switching trough modes that's why i want th
list p=12F683 ; list directive to define processor
#include <p12F683.inc> ; processor specific variable definitions
errorlevel -302 ; suppress message 302 from list file
__CONFIG _FCMEN_OFF & _IESO_OFF & _CP_OFF & _CPD_OFF & _BOD_OFF & _MCLRE_OFF & _WDT_OFF & _PWRTE_ON & _INTOSCIO
;***** VARIABLE DEFINITIONS******************
w_temp EQU 0x70 ; variable used for context saving
status_temp EQU 0x71 ; variable used for context saving
FLAGS EQU 0x20 ;software state register
PULSER EQU 0x21 ;pulse on counter
DWELLTIMER EQU 0x22 ;pulse off counter
STATE EQU 0x23 ;programmed state
BUTTONHOLD EQU 0x24
FREQR EQU 0x25 ;frequency value
TEMP1 EQU 0x26
TEMP2 EQU 0x27
PULSEL EQU 0x28
DWELLTIMEL EQU 0x29
TEMP5 EQU 0x2A
LEDBLINK EQU 0x2B
TEMP3 EQU 0x2C
;*******bits in FLAGS register***********
PULSEONR equ 0
PULSEONL equ 1
TRIGOUT equ 2
LEDHI equ 3
STATECHANGE equ 4
;*******bits in STATE register***********
RIGHTACTIVE equ 0
LEFTACTIVE equ 1
;*********GPIO pin names*****************
LEDL equ 5
LEDR equ 4
BUTTONR equ 2
BUTTONL equ 3
TRIGGERR equ 0
TRIGGERL equ 1
;**********Speed settings: change these to change speed (0x05-0xFF)
FIRERATE1 equ 0x47 ;call of duty waw
FIRERATE2 equ 0x32 ; 10 sps
FIRERATE3 equ 0x21 ; 15.15 sps
FIRERATE4 equ 0x19 ; 20 sps
FIRERATE5 equ 0x77 ; 4.20 sps
FIRERATE6 equ 0x0 ;test
FIRERATE7 equ 0x0 ;test
FIRERATE8 equ 0x0 ;test
;**********************************************************************
ORG 0x000 ; processor reset vector
goto main ; go to beginning of program
ORG 0x004 ; interrupt vector location
movwf w_temp ; save off current W register contents
movf STATUS,w ; move status register into W register
movwf status_temp ; save off contents of STATUS register
;Take a good note here. OSC is left at default 4MHz.
; We are running at 1MHz instruction cycle, or 1 micro second
;Timer 2 is prescaled 1:4 and compared (PR2) to 250.
; we now have hardware interupt that falls every 1ms exactly
;within limitation of osctune. Main code is inconsequential.
;PULSE and DWELL values control the signals precisely.
;All pulse logic is switched within the few microseconds to
;service the interupt routine. DO NOT modify the ISR
;with any kind of 'wait' or 'loop'. If you want to trigger
; timed events do so by setting an open FLAG bit and have the
;event done in the main loop.
btfss PIR1, TMR2IF ;timer 2 int happened
retfie
;**************** LED blinking *********************************************
;Our main routine will turn the flag bit
;LEDON on or off. The 10ms pulse is a duty cycle
;for the code to work with both CG and
;matrix controllers.
BlinkLed
btfss FLAGS, LEDHI
goto LedLow
decfsz LEDBLINK, f ;if pulse is active, count down 10ms
goto RightLED
movlw 0x0A
movwf LEDBLINK
bcf FLAGS, LEDHI ;10ms done, turn off LEDHI bit
goto RightLED
LedLow
decfsz LEDBLINK, f ;LEDLO time, count down 10ms
goto RightLED
movlw 0x0A
movwf LEDBLINK
bsf FLAGS, LEDHI ;10ms done, turn LEDHI bit on
RightLED
btfsc STATE, RIGHTACTIVE ;is RF on?
goto OutputRightLED
bsf STATUS, RP0 ;bank 1
bsf TRISIO, LEDR ;tristate LED
bcf STATUS, RP0 ;bank 0
goto LeftLED
OutputRightLED
btfsc FLAGS, LEDHI ;if ledhi true,
bsf GPIO, LEDR ;turn output hi
btfss FLAGS, LEDHI ;if ledhi flase,
bcf GPIO, LEDR ;turn led output lo
bsf STATUS, RP0 ;bank 1
bcf TRISIO, LEDR ;turn output on
bcf STATUS, RP0 ;bank 0
LeftLED
btfsc STATE, LEFTACTIVE ;is RF on?
goto OutputleftLED
bsf STATUS, RP0 ;bank 1
bsf TRISIO, LEDL ;tristate LED
bcf STATUS, RP0 ;bank 0
goto RightTrigger
OutputleftLED
btfsc FLAGS, LEDHI ;if ledhi true,
bsf GPIO, LEDL ;turn output hi
btfss FLAGS, LEDHI ;if ledhi flase,
bcf GPIO, LEDL ;turn led output lo
bsf STATUS, RP0 ;bank 1
bcf TRISIO, LEDL ;turn output on
bcf STATUS, RP0 ;bank 0
;**************** Right trigger logic***************************************
RightTrigger
btfsc STATE, RIGHTACTIVE ;is RF on?
goto ActiveR
bsf STATUS, RP0 ;bank 1
bsf TRISIO, TRIGGERR ;output off
bcf STATUS, RP0 ;bank 0
goto LeftTrigger
ActiveR
btfss FLAGS, TRIGOUT ;controllertype
bcf GPIO, TRIGGERR ;determines
btfsc FLAGS, TRIGOUT ;output state
bsf GPIO, TRIGGERR
btfss FLAGS, PULSEONR ;is pulse active?
goto OffstateR
decfsz PULSER, f ;if pulse is active, count down 10ms
goto LeftTrigger
bcf FLAGS, PULSEONR ;10ms is over, clear flags and
bsf STATUS, RP0 ;bank 1
bsf TRISIO, TRIGGERR ;tristate output
bcf STATUS, RP0 ;bank 0
movf FREQR, w ;and reset pulse time.
movwf PULSER
goto LeftTrigger
OffstateR
decfsz DWELLTIMER, f ;count down dwell time to next pulse
goto LeftTrigger
bsf FLAGS, PULSEONR ;if dwell is done turn on outputs
bsf STATUS, RP0 ;bank 1
bcf TRISIO, TRIGGERR ;and reset pulse time
bcf STATUS, RP0 ;bank 0
movf FREQR, w ;from frequency value
movwf DWELLTIMER
LeftTrigger
btfsc STATE, LEFTACTIVE ;is RF on?
goto ActiveL
bsf STATUS, RP0 ;bank 1
bsf TRISIO, TRIGGERL ;output off
bcf STATUS, RP0 ;bank 0
goto EndInterupt
ActiveL
btfss FLAGS, TRIGOUT ;controllertype
bcf GPIO, TRIGGERL ;determines
btfsc FLAGS, TRIGOUT ;output state
bsf GPIO, TRIGGERL
btfss FLAGS, PULSEONL ;is pulse active?
goto OffstateL
decfsz PULSEL, f ;if pulse is active, count down 10ms
goto EndInterupt
bcf FLAGS, PULSEONL ;10ms is over, clear flags and
bsf STATUS, RP0 ;bank 1
bsf TRISIO, TRIGGERL ;tristate output
bcf STATUS, RP0 ;bank 0
movf FREQR, w ;and reset pulse time.
movwf PULSEL
goto EndInterupt
OffstateL
decfsz DWELLTIMEL, f ;count down dwell time to next pulse
goto EndInterupt
bsf FLAGS, PULSEONL ;if dwell is done turn on outputs
bsf STATUS, RP0 ;bank 1
bcf TRISIO, TRIGGERL ;and reset pulse time
bcf STATUS, RP0 ;bank 0
movf FREQR, w ;from frequency value
movwf DWELLTIMEL
EndInterupt
bcf PIR1, TMR2IF
movf status_temp,w ; retrieve copy of STATUS register
movwf STATUS ; restore pre-isr STATUS register contents
swapf w_temp,f
swapf w_temp,w ; restore pre-isr W register contents
retfie ; return from interrupt
;*************************************SUBROUTINES**********************************
Wait10ms
clrf TEMP2
movlw 0x0D
movwf TEMP1 ;rough 10ms timer for button debounce.
Loop1
decfsz TEMP2, f ;count down 256*3=768 cycles
goto Loop1
decfsz TEMP1, f ;count down 768*13=9986 cycles
goto Loop1
return
;*************************************************************
ReadEE
bsf STATUS , RP0 ;Bank1
movlw 0x02
movwf EEADR
bsf EECON1 , RD ;start read
movf EEDAT , W
bcf STATUS , RP0 ;Bank0
return
;*************************************************************
WriteEE
bsf STATUS , RP0
movwf EEDAT
movlw 0x02
movwf EEADR
bsf EECON1,WREN ;Enable write
bcf INTCON, GIE ;Disable INTs
btfsc INTCON, GIE ;See AN576
goto $-2
movlw 0x55 ;Unlock write
movwf EECON2
movlw 0xAA
movwf EECON2
bsf EECON1, WR ;Start the write
WaitForEEWrite
btfsc EECON1, WR ;wait for hardware to clear (done writing)
goto WaitForEEWrite
bcf STATUS , RP0 ;Bank0
bsf INTCON, GIE ;Enable INTS
return
;**********************************************************************************
;**********************************************************************************
;**********************************************************************************
main
clrf GPIO
clrf FLAGS ;clear outputs and code status register
movlw 0x07
movwf CMCON0 ;comparators off
bsf STATUS, RP0 ;bank 1
movlw 0x0F ;start with 0-3 inputs (ADC read)
movwf TRISIO ;pin 0 & 1 & 5 out, all other inputs
movlw 0x51 ;Fosc/16, pin 0 analog
movwf ANSEL ;Right trigger is analog input
movlw 0x04
movwf WPU ;enable week pullups
bcf OPTION_REG, 7 ;enable all week pullups
bcf STATUS, RP0 ;bank 0
movlw 0x01 ;Left just, Vdd, channel 0
movwf ADCON0 ;module on.
movlw 0x10
movwf TEMP1
Wait4ADC
decfsz TEMP1, f
goto Wait4ADC ;acquisition time
bsf ADCON0, 1 ;start ADC
btfsc ADCON0, 1
goto $-1 ;wait for conversion to be done
movlw 0x40 ;about 0.5V from 2V ref
subwf ADRESH, w ;if f > W, C=1
btfsc STATUS, C ;ie- if trigger > 0.5V, then matrix
bsf FLAGS, TRIGOUT ;matrix config sources (output high)
bsf STATUS, RP0 ;bank 1
movlw 0x0C ;restore pin IO
movwf TRISIO
clrf ANSEL ;all digital now
bcf STATUS, RP0 ;bank 0
movlw 0x0A ;start with 10ms pulse width
movwf LEDBLINK ;for the LEDs
movlw FIRERATE1 ;this will get overwritten,
movwf PULSER ; but start with a default value
movwf PULSEL
movwf DWELLTIMER
movwf DWELLTIMEL
call ReadEE ;get state value
movwf STATE
movlw 0x01
movwf T2CON ;timer 2, prescale 1:4, no postscale
bsf STATUS, RP0 ;bank 1
movlw 0xFA
movwf PR2 ;setup 1ms hardware interupt
bsf PIE1, TMR2IE ;enable timer2 interupt
bcf STATUS, RP0 ;bank 0
bsf T2CON, TMR2ON ;turn on timer2
movlw 0xC0
movwf INTCON ;turn on interupts globally
goto InitState ;get first firerate value
;******MAIN LOOP***************
Start
TestLeft
btfsc GPIO, BUTTONL
goto TestRight ;Test for left button press
call Wait10ms
btfsc GPIO, BUTTONL ;button is down for 10ms
goto TestRight
ReleaseLeft
btfss GPIO, BUTTONL ;wait for button release
goto ReleaseLeft
call Wait10ms
btfss GPIO, BUTTONL ;wait for button release
goto ReleaseLeft
movlw 0x02
xorwf STATE, f ;toggle left trigger
call WriteEE ;store state
TestRight
btfsc GPIO, BUTTONR
goto Start
; goto DisplayState ;Test for right button press
call Wait10ms
btfsc GPIO, BUTTONR ;button is down for min 10ms
goto Start
; goto DisplayState
movlw 0xC8
movwf BUTTONHOLD ;setup for 2 second hold
First2seconds
call Wait10ms
btfsc GPIO, BUTTONR ;button is down for more than 10ms
goto ReleaseRight
decfsz BUTTONHOLD, f
goto First2seconds
movlw 0xC8
movwf BUTTONHOLD ;setup for 2 second hold
Second2seconds
call Wait10ms
btfsc GPIO, BUTTONR
goto ReleaseRight
decfsz BUTTONHOLD, f
goto Second2seconds ;button down for 4 seconds, change firerate
NextState
movlw 0x40
addwf STATE, f ;change firerate state
InitState ;begin test for
btfsc STATE, 7 ;state 1 or 2
goto State3
btfsc STATE, 6
goto State2
State1
movlw FIRERATE1 ;state 1
movwf FREQR
bcf STATE, RIGHTACTIVE ;led off
movlw 0x0A
movwf TEMP3
Loop01
call Wait10ms ;100 ms
decfsz TEMP3, f
goto Loop01
bsf STATE, RIGHTACTIVE ;led on
bsf FLAGS, STATECHANGE ;notify a state change
goto ReleaseRight
State2
movlw FIRERATE2 ;state 2
movwf FREQR
bcf STATE, RIGHTACTIVE ;blink twice, led off
movlw 0x0A
movwf TEMP3
Loop02
call Wait10ms ;100 ms
decfsz TEMP3, f
goto Loop02
bsf STATE, RIGHTACTIVE ;led on
movlw 0x0A
movwf TEMP3
Loop03
call Wait10ms ;100 ms
decfsz TEMP3, f
goto Loop03
bcf STATE, RIGHTACTIVE ;led off
movlw 0x0A
movwf TEMP3
Loop04
call Wait10ms ;100 ms
decfsz TEMP3, f
goto Loop04
bsf STATE, RIGHTACTIVE ;led on
bsf FLAGS, STATECHANGE ;notify a state change
goto ReleaseRight
State3
btfsc STATE, 6
goto State4
movlw FIRERATE3 ;state 3
movwf FREQR
bcf STATE, RIGHTACTIVE ;blink 3 times, led off
movlw 0x0A
movwf TEMP3
Loop05
call Wait10ms ;100 ms
decfsz TEMP3, f
goto Loop05
bsf STATE, RIGHTACTIVE ;led on
movlw 0x0A
movwf TEMP3
Loop06
call Wait10ms ;100 ms
decfsz TEMP3, f
goto Loop06
bcf STATE, RIGHTACTIVE ;led off
movlw 0x0A
movwf TEMP3
Loop07
call Wait10ms ;100 ms
decfsz TEMP3, f
goto Loop07
bsf STATE, RIGHTACTIVE ;led on
movlw 0x0A
movwf TEMP3
Loop08
call Wait10ms ;100 ms
decfsz TEMP3, f
goto Loop08
bcf STATE, RIGHTACTIVE ;led off
movlw 0x0A
movwf TEMP3
Loop09
call Wait10ms ;100 ms
decfsz TEMP3, f
goto Loop09
bsf STATE, RIGHTACTIVE ;led on
bsf FLAGS, STATECHANGE ;notify a state change
goto ReleaseRight
State4
movlw FIRERATE4 ;state 4, 22ms cycle
movwf FREQR
bcf STATE, RIGHTACTIVE ;blink 4 times, led off
movlw 0x0A
movwf TEMP3
Loop10
call Wait10ms ;100 ms
decfsz TEMP3, f
goto Loop10
bsf STATE, RIGHTACTIVE ;led on
movlw 0x0A
movwf TEMP3
Loop11
call Wait10ms ;100 ms
decfsz TEMP3, f
goto Loop11
bcf STATE, RIGHTACTIVE ;led off
movlw 0x0A
movwf TEMP3
Loop12
call Wait10ms ;100 ms
decfsz TEMP3, f
goto Loop12
bsf STATE, RIGHTACTIVE ;led on
movlw 0x0A
movwf TEMP3
Loop13
call Wait10ms ;100 ms
decfsz TEMP3, f
goto Loop13
bcf STATE, RIGHTACTIVE ;led off
movlw 0x0A
movwf TEMP3
Loop14
call Wait10ms ;100 ms
decfsz TEMP3, f
goto Loop14
bsf STATE, RIGHTACTIVE ;led on
movlw 0x0A
movwf TEMP3
Loop15
call Wait10ms ;100 ms
decfsz TEMP3, f
goto Loop15
bcf STATE, RIGHTACTIVE ;led off
movlw 0x0A
movwf TEMP3
Loop16
call Wait10ms ;100 ms
decfsz TEMP3, f
goto Loop16
bsf STATE, RIGHTACTIVE ;led on
bsf FLAGS, STATECHANGE ;notify a state change
state5
movlw FIRERATE4 ;state 4, 22ms cycle
movwf FREQR
bcf STATE, RIGHTACTIVE ;blink 5 times, led off
movlw 0x0A
movwf TEMP3
Loop17
call Wait10ms ;100 ms
decfsz TEMP3, f
goto Loop17
bsf STATE, RIGHTACTIVE ;led on
movlw 0x0A
movwf TEMP3
Loop18
call Wait10ms ;100 ms
decfsz TEMP3, f
goto Loop18
bcf STATE, RIGHTACTIVE ;led off
movlw 0x0A
movwf TEMP3
Loop19
call Wait10ms ;100 ms
decfsz TEMP3, f
goto Loop19
bsf STATE, RIGHTACTIVE ;led on
movlw 0x0A
movwf TEMP3
Loop20
call Wait10ms ;100 ms
decfsz TEMP3, f
goto Loop20
bcf STATE, RIGHTACTIVE ;led off
movlw 0x0A
movwf TEMP3
Loop21
call Wait10ms ;100 ms
decfsz TEMP3, f
goto Loop21
bsf STATE, RIGHTACTIVE ;led on
movlw 0x0A
movwf TEMP3
Loop22
call Wait10ms ;100 ms
decfsz TEMP3, f
goto Loop22
bcf STATE, RIGHTACTIVE ;led off
movlw 0x0A
movwf TEMP3
Loop23
call Wait10ms ;100 ms
decfsz TEMP3, f
goto Loop23
bsf STATE, RIGHTACTIVE ;led on
movlw 0x0A
movwf TEMP3
Loop24
call Wait10ms ;100 ms
decfsz TEMP3, f
goto Loop24
bsf STATE, RIGHTACTIVE ;led on
bsf FLAGS, STATECHANGE ;notify a state change
goto ReleaseRight
ReleaseRight
btfss GPIO, BUTTONR ;wait for button release
goto ReleaseRight
call Wait10ms
btfss GPIO, BUTTONL ;wait for button release
goto ReleaseRight
btfsc FLAGS, STATECHANGE ;test for button tap or state change
goto Continue01
movlw 0x01
xorwf STATE, f ;toggle left trigger if button tap
Continue01
bcf FLAGS, STATECHANGE
call WriteEE ;store state
goto Start
; initialize eeprom locations
ORG 0x2100
DE 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x07
END ; directive 'end of program'
its the modes that i am most concerned about, thanks again