Anda di halaman 1dari 4

;27NOV07

;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.2 MHz.
;TODO: Detector to lock onto offending portable and a lightshow.
LIST
P=16F628a, F=INHX8M
#include <p16f628a.inc>
__CONFIG 0x2001
; XT OSC, RA5-MCLR
; Equates
RESET_V
OSC_FREQ

EQU
EQU

0x00
D'4000000'

; Registers
PLLHI
EQU
0x20
PLLLO
EQU
0x21
Word. Max value 0x07. Must be
GPCTR
EQU
0x22
DATABYTE
EQU
0x23
(gets destroyed)
#define
PLL_DATA
#define
PLL_CLK
#define
PLL_LE

; Address of RESET Vector


; Oscillator Frequency is 4 MHz

; MSB of PLL N-Divider Word


; LSB (Swallow Counter) of PLL N-Divider
left-shifted before outputting.
; General Purpose Counter
; Databyte to be output on the dataline
PORTB,5
PORTB,6
PORTB,4

;**************************************************************
; Begin Program
;**************************************************************
RESET

GOTO

ORG
START
ORG

RESET_V

; RESET vector location

; INT vector

;**************************************************************
; Initialization Routine
;**************************************************************
START

;
;
;
;

POWER_ON Reset (Beginning of program)


Do initialization, Select bank 0
Clear int-flags, Disable interrupts
Keep in lower 2KByte

CLRF
CLRF
CLRF

STATUS
INTCON
PCLATH

BSF
MOVLW
MOVWF
CLRF
BCF

STATUS, RP0
0xFF
TRISA
TRISB
STATUS, RP0

; Select bank 1

CLRF
CLRF
GOTO

PORTB
PORTA
MAIN

; Make all PORT B outputs low

; RA7-0 Inputs (Except RA6-CLKOUT)


; RB7-0 Outputs
; Select bank 0

;**************************************************************
; Subroutines
;**************************************************************
PLL_INIT

; Initialization Word: 00000000001001010

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

; Latch Data. This may be unnecessary


; Output Ten Zeroes F19:F10
; Output 10010100
;
;
;
;
;

F9:F2
F1
C2
C1
Latch Data

; Output 13 Zeroes, Reference Divider Wo


; yields divide by 40 giving a PLL frequ
; Output 10100000
; C2 & C1 are both zero
; Latch Data

PLL_LOAD
CALL
MOVLW
MOVWF
CALL
MOVFW
MOVWF
CALL
CALL
CALL
MOVFW

OUT_ZERO
0x05
GPCTR
OUT_ZEROES
PLLHI
DATABYTE
OUT_BYTE
OUT_ZERO
OUT_ZERO
PLLLO

; Clear GO bit
; Output Five Zeroes N18:N14

MOVWF
CALL
CALL
CALL
BSF
BCF
RETURN

DATABYTE
OUT_PLLLO
OUT_ZERO
OUT_ONE
PLL_LE
PLL_LE

; Load into DATABYTE

; Get the N-Counter N13:N6 bits


; Load into DATABYTE
; N5
; N4
; Get the swallow counter: N3:1 (Note: o

ffset by 1!)
; C2
; C1
; Latch Data

OUT_ZERO
BCF
PLL_DATA
BSF
PLL_CLK
BCF
PLL_CLK
RETURN
OUT_ZEROES
th the number

; Output string of zeroes, load GPCTR wi


CALL
OUT_ZERO
DECFSZ GPCTR,1
GOTO
OUT_ZEROES
RETURN

OUT_ONE

; Test if all zeroes have been output


; No, still one or more to go
; Yes, done

BSF
PLL_DATA
BSF
PLL_CLK
BCF
PLL_CLK
RETURN
OUT_BYTE

; Output a byte, which sits in DATABYTE


MOVLW
MOVWF

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

;
;
;
;
;
;

Leftrotate into Carry


Test Carry
Carry was set, output a 1
Test Carry Again
Carry was cleared, output a 0
Test if eight bits have been output

; Only used to output the three bits for


DATABYTE,1

; Compensate for zero test in MAIN (ugly

DATABYTE,1
DATABYTE,1
0x03
GPCTR
OUT_BYTE1

; Prepare DATABYTE for output


; Shift five bits to the left

; Bad programming. Redundant RETURN just

;**************************************************************
; Main Routine
;**************************************************************
MAIN
CALL

PLL_INIT

MOVLW
MOVWF
MOVLW
MOVWF

0x86
PLLHI
0x08
PLLLO

CALL
MOVLW
MOVWF

PLL_LOAD
0xFF
GPCTR

FREQSTART
; Divider set to 1079

FREQSET

LOOP

; Settle PLL
NOP
MOVWF

DATABYTE

; Unauthorized use of DATABYTE as a coun

ter...
LOOP1
NOP
NOP
DECFSZ
GOTO
NOP
NOP
DECFSZ
GOTO
DECFSZ
GOTO

DATABYTE,1
LOOP1
GPCTR,1
LOOP
PLLLO,1
FREQSET

; Not yet zero, continue scanning down

MOVLW
MOVWF
DECF
MOVLW
SUBWF

0x08
PLLLO
PLLHI,1
0x6D
PLLHI,0

BTFSC
GOTO
GOTO

STATUS,Z
FREQSTART
FREQSET

; Reset swallow counter to 7+1


; Divider set to 872
; Test value of PLLHI, result goes to WR

EG

END

; Test for Zero bit in STATUS


; Start new scan
; Continue scanning down

Anda mungkin juga menyukai