Professional Documents
Culture Documents
asm
;DEVICE = 16F628A
;Jammerdan - aka Silencer. Control a LMX2306 PLL and VCO to jam FM broadcasts. T
unes to 107.9 MHz then steps down to 87.5 MHz.
;3DEC07 Interrupts (TIMER0)
;6DEC07 Step Downto 87.5, Blinkenlichten, accurate step length (100 ms),
;9DEC07 Fixed PORTA Init (CMCON)
;9DEC07 Pilot Freq -> 3.4 kHz
;This version tests the IN3KC detector, stays on 107.9
LIST
P=16F628a, F=INHX8M
#include <p16f628a.inc>
__CONFIG 0x2021
; XT OSC, RA5-MCLR
; Equates
RESET_V
OSC_FREQ
EQU
EQU
; Registers
PLLHI
EQU
PLLLO
EQU
Word. Max value 0x07.
GPCTR
EQU
DATABYTE
EQU
(gets destroyed)
TEMPW
EQU
TEMPST
EQU
BITBCKT
EQU
LSTNCNT
EQU
#define
#2)
#define
#define
#define
#define
#define
#define
#define
#define
#define
0x00
D'4000000'
0x20
; MSB of PLL N-Divider Word
0x21
; LSB (Swallow Counter) of PLL N-Divider
Must be left-shifted before outputting.
0x22
; General Purpose Counter
0x23
; Databyte to be output on the dataline
0x24
0x25
0x26
0x27
;
;
;
;
IN3KC
PORTA,3
OUT3KC
PLL_CLK
PLL_DATA
PLL_LE
RUN3
RUN2
RUN1
LOCK
LSTNBIT
PORTB,7
PORTB,6
PORTB,5
PORTB,4
PORTB,3
PORTB,2
PORTB,1
PORTB,0
BITBCKT,3
;
;
;
;
;
;
;
;
;
;**************************************************************
; Begin Program
;**************************************************************
RESET
INT
ORG
RESET_V
GOTO
ORG
GOTO
START
4
INT_HANDLER
; INT vector
;**************************************************************
; Initialization Routine
;**************************************************************
START
CLRF
STATUS
CLRF
BSF
CLRF
INTCON
INTCON,GIE
PCLATH
MOVLW
MOVWF
BSF
MOVLW
MOVWF
CLRF
MOVLW
MOVWF
BCF
0x07
CMCON
STATUS,RP0
0xFF
TRISA
TRISB
0x88
OPTION_REG
STATUS,RP0
CLRF
BSF
GOTO
PORTB
OUT3KC
MAIN
; Enable GIE
; Keep in lower 2KByte
;
;
;
;
;
RA7-0 Inputs
RB7-0 Outputs
PSA -> WDT hence prescaler 1:1
Select bank 0
;**************************************************************
; Subroutines
;**************************************************************
PLL_INIT
0011
BSF
PLL_LE
BCF
PLL_LE
MOVLW 0x0A
MOVWF GPCTR
CALL
OUT_ZEROES
MOVLW 0x94
MOVWF DATABYTE
CALL
OUT_BYTE
CALL
OUT_ZERO
CALL
OUT_ONE
CALL
OUT_ONE
BSF
PLL_LE
BCF
PLL_LE
MOVLW 0x0D
rd: 000000000000010100000
MOVWF GPCTR
ency of 100 kHz
CALL
OUT_ZEROES
MOVLW 0xA0
MOVWF DATABYTE
CALL
OUT_BYTE
BSF
PLL_LE
BCF
PLL_LE
RETURN
PLL_TUNE
nd PLLLO
F9:F2
F1
C2
C1
Latch Data
OUT_ZERO
0x05
GPCTR
OUT_ZEROES
PLLHI
DATABYTE
OUT_BYTE
; Clear GO bit
; Output Five Zeroes N18:N14
; Get the N-Counter N13:N6 bits
; Load into DATABYTE
CALL
CALL
MOVFW
OUT_ZERO
OUT_ZERO
PLLLO
; N5
; N4
; Get the swallow counter: N3:1 (Note: o
MOVWF
CALL
CALL
CALL
BSF
BCF
RETURN
DATABYTE
OUT_PLLLO
OUT_ZERO
OUT_ONE
PLL_LE
PLL_LE
ffset by 1!)
; C2
; C1
; Latch Data
OUT_ZERO
BCF
PLL_DATA
BSF
PLL_CLK
BCF
PLL_CLK
RETURN
OUT_ZEROES
th the number
OUT_ONE
BSF
PLL_DATA
BSF
PLL_CLK
BCF
PLL_CLK
RETURN
OUT_BYTE
0x08
GPCTR
RLF
BTFSC
CALL
BTFSS
CALL
DECFSZ
GOTO
RETURN
DATABYTE,1
STATUS,C
OUT_ONE
STATUS,C
OUT_ZERO
GPCTR,1
OUT_BYTE1
OUT_BYTE1
OUT_PLLLO
the swallow counter
DECF
)
SWAPF
RLF
MOVLW
MOVWF
GOTO
RETURN
in case
;
;
;
;
;
;
DATABYTE,1
DATABYTE,1
0x03
GPCTR
OUT_BYTE1
SCREAM
tshow and detector (LISTEN)
BSF
INTCON,T0IE
MOVLW 0x35
MOVWF
GPCTR
MOVLW
MOVWF
0xFF
DATABYTE
DECFSZ
GOTO
DECFSZ
GOTO
BTFSC
GOTO
BTFSC
GOTO
BCF
BSF
GOTO
DATABYTE,1
LOOP1
GPCTR,1
LOOP
RUN1
RUN_2
RUN2
RUN_3
RUN3
RUN1
LISTEN
;
;
;
;
;
;
;
;
;
BCF
BSF
GOTO
RUN1
RUN2
LISTEN
; RUN1 Must Be On
; Turn RUN2 On
; Exit
BCF
BSF
RUN2
RUN3
BCF
BSF
CLRF
MOVLW
MOVWF
INTCON,T0IE
OUT3KC
LSTNCNT
0x1F
DATABYTE
;
;
;
;
;
BCF
MOVFW
ANDLW
BSF
XORWF
GOTO
LOCK
PORTA
B'00001000'
LSTNBIT
BITBCKT,1
LISTEN2
;
;
;
;
Read IN3KC
Mask IN3KC (PORTA,3)
Set Listen Bit
Store in Listen Bit, Inverted!
MOVFW
ANDLW
PORTA
B'00001000'
XORWF
ANDLW
BTFSS
INCF
BITBCKT,0
B'00001000'
STATUS,Z
LSTNCNT,1
;
;
;
;
MOVLW
XORWF
MOVLW
XORWF
MOVLW
MOVWF
B'00001000'
BITBCKT,1
B'10000000'
PORTB,1
0x2C
GPCTR
DECFSZ
GOTO
DECFSZ
GOTO
MOVLW
SUBWF
BTFSC
GPCTR,1
LOOP3
DATABYTE,1
LISTEN1
0x11
LSTNCNT,0
STATUS,C
LOOP
; Unauthorized use of DATABYTE as an Inn
er Counter...
LOOP1
Inner Counter Zero?
No
Main Counter Zero?
No
Is RUN1 On?
Yes
Is RUN2 On?
Yes
No, RUN3 Must Be On
; Exit
RUN_2
RUN_3
LISTEN
s a Counter...
LISTEN1
LISTEN2
s_ a change
; Toggle LSTNBIT
; Toggle PORTB,7 (OUT3KC)
; Use the GP Counter for...
LOOP3
; 147 us delay
BSF
LOCK
RETURN
;**************************************************************
; Interrupt Routines
;**************************************************************
INT_HANDLER
MOVWF TEMPW
; Copy W to a Temporary Register
; regardless of current bank
SWAPF STATUS,W
; Swap STATUS nibbles and place
; into W register
MOVWF TEMPST
; Save STATUS to a Temporary register
; in Bank0
; Push Complete
MOVLW 0x79
; Load TMR0, preset for 3.4 kHz (147 us
period)
MOVWF TMR0
BTFSS INTCON,T0IF
; Timer0 Flag Set?
GOTO
OTHER_INT
; No
BCF
INTCON,T0IF
; Clear Source of Interrupt
MOVLW B'10000000'
XORWF PORTB,1
; Toggle OUT3KC
OTHER_INT
SWAPF
TEMPST,W
MOVWF
STATUS
SWAPF
TEMPW,F
SWAPF
TEMPW,W
BSF
INTCON,GIE
RETFIE
;
;
;
;
;
;
;
;
;
;
;**************************************************************
; Main Routine
;**************************************************************
MAIN
CALL
PLL_INIT
MOVLW
MOVWF
MOVLW
MOVWF
CALL
CALL
GOTO
0x86
PLLHI
0x08
PLLLO
PLL_TUNE
SCREAM
FREQSTART
CALL
CALL
BCF
DECFSZ
GOTO
MOVLW
MOVWF
PLL_TUNE
SCREAM
INTCON,T0IE
PLLLO,1
FREQSET
0x08
PLLLO
FREQSTART
; Divider set to 1079
; Ensure PLL is tuned properly
;TEST Stay on 107.9 MHz
FREQSET
; Disable Timer0 Interrupt
; Not yet zero, continue scanning down
; Reset swallow counter to 7+1
DECF
MOVLW
SUBWF
PLLHI,1
0x6D
PLLHI,0
BTFSS
GOTO
CALL
CALL
DECF
CALL
CALL
DECF
CALL
CALL
DECF
CALL
CALL
DECF
CALL
CALL
GOTO
STATUS,Z
FREQSET
PLL_TUNE
SCREAM
PLLLO,1
PLL_TUNE
SCREAM
PLLLO,1
PLL_TUNE
SCREAM
PLLLO,1
PLL_TUNE
SCREAM
PLLLO,1
PLL_TUNE
SCREAM
FREQSTART
NOP
GOTO
STOP
; Loop Forever
EG
; 87.8 MHz
; 87.7 MHz
; 87.6 MHz
; 87.5 MHz
; Start new scan
STOP
END