Tetra Detector PDF
Tetra Detector PDF
Tetra Detector PDF
;
;
;
;
;
;
;
;
;
;
;
;
;
;
__CONFIG _WDT_OFF & _PWRTE_OFF & _INTRC_IO & _MCLR_ON & _BODEN_OFF & _LVP_OFF & _CPD_OFF &
_WRT_ENABLE_OFF & _DEBUG_OFF & _CCP1_RB2 & _CP_OFF
; Equates
RESET_V
OSC_FREQ
EQU
EQU
; Registers
FLAGS
EQU
THRLVL EQU
MAXH
EQU
TEMPBAR EQU
TEMPTHR EQU
BRITE
EQU
T4S
EQU
I2CDELAY
I2CBUF EQU
I2CCNT EQU
DB2
EQU
TEMPW
EQU
TEMPSTATUS
0x20
0x21
0x22
0x23
0x24
0x25
0x26
EQU
0x28
0x29
0x30
0x40
EQU
0x00
D'8000000'
0x27
0x41
; Defines
#define LEDS
PORTB
#define RSSI
PORTA,0
#define ALARM
PORTA,1
#define THR
PORTA,3
#define BRT
PORTA,4
#define SCL
PORTA,6
#define SDA
PORTA,7
#define BLANKBAR FLAGS,0
#define BRTBTN FLAGS,1
#define NITE
FLAGS,3
#define DIM
FLAGS,4
#define DAY
FLAGS,5
#define FULL
FLAGS,6
ORG
GOTO
START
ORG
;
;
;
;
;
;
;
;
;
;
;
;
;
Various flags
Threshold level set via UI
LEVEL MAX HOLD value to be shown on LED bar
Pattern on LED bar if it's blanked (BRT)
Used in threshold set routine
LED Brightness
Tetra 4s timing
Used for I2C timing
Used for I2C data
Used for I2C bitbanger
Stealth byte for prescaler (0x50-0x5F)
Context saving for interrupts
in all banks
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
; XOR BLANKBAR
; Test if clear
; Set, blank leds
BRITE
0xFF
TMR0
TEMPBAR
LEDS
ENDINT
;
;
;
;
;
BRITE
TMR0
LEDS
CALL
TETRA4S
SWAPF
MOVWF
SWAPF
SWAPF
BSF
RETFIE
TEMPSTATUS,W
STATUS
TEMPW,F
TEMPW,W
INTCON,GIE
;
;
;
;
;
ENDINT
Swap original STATUS register value
Restore STATUS register from W
Swap W_Temp nibbles and return value to W_Temp
Swap W_Temp to W to restore original W (DS31008a)
Re-enable global interrupts
START
; Init stuff
CLRF
STATUS
CLRF
INTCON
BSF
INTCON,GIE
BSF
INTCON,TMR0IE
CLRF
PCLATH
CLRF
CCP1CON
MOVLW
B'00111111'
BANKSEL TRISA
MOVWF
TRISA
CLRF
TRISB
MOVLW
B'00000110'
MOVWF
OPTION_REG
MOVLW
B'01110000'
MOVWF
OSCCON
MOVLW
B'00001110'
MOVWF
ADCON1
MOVLW
B'01000001'
BANKSEL ADCON0
MOVWF
ADCON0
CLRF
PORTB
CLRF
TMR0
MOVLW
0x04
MOVWF
BRITE
BSF
DIM
; Restore Threshold from EEPROM
BANKSEL EEADR
MOVLW
0x00
MOVWF
EEADR
BANKSEL EECON1
BCF
EECON1, EEPGD
BSF
EECON1, RD
BANKSEL EEDATA
MOVF
EEDATA, W
BANKSEL THRLVL
MOVWF
THRLVL
BSF
SDA
BSF
SCL
MOVLW
0x60
MOVWF
DB2
CALL
DEBOUNCE
CALL
TUNE
; Restored Threshold
; I2C idle
; Set Prescaler second byte (stealth mode)
; Clock Stabilization delay 16 ms
; Set tuner frequency
MAIN
BSF
ADCON0,GO
NOP
BTFSC
GOTO
ADCON0,GO
CONV0
; Test if done
MOVFW
SUBWF
BTFSC
GOTO
ADRESH
MAXH,0
STATUS,C
MAIN
;
;
;
;
MOVFW
MOVWF
GOTO
ADRESH
MAXH
MAIN
; New MAXH
CONV0
TETRA4S
; Subroutine
; Tests if 4 seconds have elapsed
; Converts MAXH to LED bar
DECFSZ T4S,1
RETURN
MOVLW
MOVWF
CALL
MOVWF
CLRF
0xF2
T4S
LEDBAR
TEMPBAR
MAXH
; 0xF2 for 4s
CALL
RETURN
CHECKTHR
LEDBAR
; MAXH contains RSSI max value
; LED bar pattern is in W
MOVFW
MAXH
ADDLW
0x9A
BTFSS
STATUS,C
GOTO
LEDS7F
MOVLW
RETURN
0xFF
MOVFW
ADDLW
BTFSS
GOTO
MAXH
0xA5
STATUS,C
LEDS3F
MOVLW
RETURN
0x7F
MOVFW
ADDLW
BTFSS
GOTO
MAXH
0xAF
STATUS,C
LEDS1F
MOVLW
RETURN
0x3F
MOVFW
ADDLW
BTFSS
GOTO
MAXH
0xBA
STATUS,C
LEDS0F
MOVLW
RETURN
0x1F
MOVFW
ADDLW
BTFSS
GOTO
MAXH
0xC5
STATUS,C
LEDS07
MOVLW
RETURN
0x0F
MOVFW
ADDLW
BTFSS
GOTO
MAXH
0xD0
STATUS,C
LEDS03
MOVLW
RETURN
0x07
MOVFW
ADDLW
BTFSS
GOTO
MAXH
0xDA
STATUS,C
LEDS01
MOVLW
RETURN
0x03
MOVFW
ADDLW
BTFSS
GOTO
MAXH
0xE3
STATUS,C
LEDS00
MOVLW
RETURN
0x01
MOVLW
RETURN
0x00
; Fullscale
LEDS7F
; LEVEL > -48 dBm
LEDS3F
; LEVEL > -56 dBm
LEDS1F
; LEVEL > -64 dBm
LEDS0F
; LEVEL > -72 dBm
LEDS07
; LEVEL > -80 dBm
LEDS03
; LEVEL > -88 dBm
LEDS01
; LEVEL > -96 dBm
LEDS00
; Set frequency
TUNE
BCF
CALL
MOVLW
CALL
MOVLW
CALL
MOVFW
CALL
MOVLW
of tuner
INTCON,GIE
I2CSTART
0xC0
I2CBYTE
0x34
I2CBYTE
DB2
I2CBYTE
0xCA
CALL
MOVLW
CALL
CALL
BCF
BSF
RETURN
I2CBYTE
0x90
I2CBYTE
I2CSTOP
INTCON,TMR0IF
INTCON,GIE
BCF
CALL
BCF
CALL
RETURN
SDA
DELAY10US
SCL
DELAY10US
MOVWF
MOVLW
MOVWF
I2CBUF
0x08
I2CCNT
BCF
BCF
RLF
BTFSC
BSF
CALL
BSF
CALL
BCF
CALL
DECFSZ
GOTO
BCF
CALL
BSF
CALL
BCF
CALL
RETURN
STATUS,C
SDA
I2CBUF,1
STATUS,C
SDA
DELAY10US
SCL
DELAY10US
SCL
DELAY10US
I2CCNT,1
NEXTBIT
SDA
DELAY10US
SCL
DELAY10US
SCL
DELAY10US
BCF
CALL
BSF
CALL
BSF
RETURN
SDA
DELAY10US
SCL
DELAY10US
SDA
I2CSTART
I2CBYTE
NEXTBIT
; Clear carry
; Glitch if next bit is 1 again UGLY!
; Send clock
; Done clock
; Fake ACK
I2CSTOP
DELAY10US
MOVLW
MOVWF
LOOP0
DECFSZ
GOTO
RETURN
0x14
I2CDELAY
; 33 us delay
I2CDELAY,1
LOOP0
DEBOUNCE
; Subroutine, used in THR setting and INIT
MOVLW
0xFF
; 96 ms outer delay
MOVWF
I2CCNT
LOOP1
MOVLW
0xFF
; 0.39 ms inner delay
MOVWF
I2CDELAY
LOOP2
DECFSZ I2CDELAY,1
GOTO
LOOP2
DECFSZ I2CCNT,1
GOTO
LOOP1
RETURN
BARBRITE
; Subroutine (called from within INT handler)
; Modifies BAR brightness after BRT is pressed
; Debounce (every 16 ms)
BTFSC
BRT
; Test BRT Button
GOTO
NOBRT
BTFSC
BRTBTN
; BRT Button still pressed?
RETURN
BSF
BRTBTN
BTFSC
NITE
GOTO
DIMBRT
BTFSC
GOTO
BTFSC
GOTO
BCF
BSF
MOVLW
MOVWF
RETURN
DIM
DAYBRT
DAY
FULLBRT
FULL
NITE
0x01
BRITE
BCF
BSF
MOVLW
MOVWF
RETURN
NITE
DIM
0x04
BRITE
BCF
BSF
MOVLW
MOVWF
RETURN
DIM
DAY
0x20
BRITE
BCF
BSF
MOVLW
MOVWF
RETURN
DAY
FULL
0xF0
BRITE
BCF
RETURN
BRTBTN
DIMBRT
DAYBRT
FULLBRT
NOBRT
THRSET
; Subroutine (called from within INT handler)
; User interface to change threshold for alarm
; All LEDs are full on because the PWM brightness control uses the interrupt
BTFSC
THR
; Test THR Button
GOTO
NOTHR
THR1
CLRF
LEDS
; switch off LEDs
CALL
DEBOUNCE
; 0.1 s delay
BTFSS
THR
; THR Button still pressed?
GOTO
THR1
THR2
MOVFW
THRLVL
MOVWF
LEDS
; Show threshold
MOVWF
TEMPTHR
THR3
BTFSS
THR
; THR button?
GOTO
DECTHR
BTFSS
BRT
; BRT button?
GOTO
INCTHR
GOTO
THR3
; INC threshold
INCTHR
CLRF
CALL
CALL
MOVFW
SUBLW
BTFSS
GOTO
GOTO
INC7F
MOVFW
SUBLW
BTFSS
GOTO
MOVLW
MOVWF
GOTO
INC3F
MOVFW
SUBLW
BTFSS
GOTO
MOVLW
MOVWF
GOTO
INC1F
MOVFW
SUBLW
BTFSS
GOTO
LEDS
DEBOUNCE
DEBOUNCE
THRLVL
0xFF
STATUS,Z
INC7F
DONETHR
THRLVL
0x7F
STATUS,Z
INC3F
0xFF
THRLVL
DONETHR
THRLVL
0x3F
STATUS,Z
INC1F
0x7F
THRLVL
DONETHR
THRLVL
0x1F
STATUS,Z
INC0F
MOVLW
MOVWF
GOTO
0x3F
THRLVL
DONETHR
MOVFW
SUBLW
BTFSS
GOTO
MOVLW
MOVWF
GOTO
THRLVL
0x0F
STATUS,Z
INC07
0x1F
THRLVL
DONETHR
MOVFW
SUBLW
BTFSS
GOTO
MOVLW
MOVWF
GOTO
THRLVL
0x07
STATUS,Z
INC03
0x0F
THRLVL
DONETHR
MOVLW
MOVWF
GOTO
0x07
THRLVL
DONETHR
INC0F
INC07
INC03
; DEC threshold
DECTHR
CLRF
LEDS
; switch off LEDs
CALL
DEBOUNCE
CALL
DEBOUNCE
; 0.2 s delay
MOVFW
THRLVL
SUBLW
0xFF
; FF?
BTFSS
STATUS,Z
GOTO
DEC7F
MOVLW
0x7F
MOVWF
THRLVL
GOTO
DONETHR
DEC7F
MOVFW
THRLVL
SUBLW
0x7F
; 7F?
BTFSS
STATUS,Z
GOTO
DEC3F
MOVLW
0x3F
MOVWF
THRLVL
GOTO
DONETHR
DEC3F
MOVFW
THRLVL
SUBLW
0x3F
BTFSS
STATUS,Z
GOTO
DEC1F
MOVLW
0x1F
MOVWF
THRLVL
GOTO
DONETHR
DEC1F
MOVFW
THRLVL
SUBLW
0x1F
BTFSS
STATUS,Z
GOTO
DEC0F
MOVLW
0x0F
MOVWF
THRLVL
GOTO
DONETHR
DEC0F
MOVFW
THRLVL
SUBLW
0x0F
BTFSS
STATUS,Z
GOTO
DEC07
MOVLW
0x07
MOVWF
THRLVL
GOTO
DONETHR
DEC07
MOVFW
THRLVL
SUBLW
0x07
BTFSS
STATUS,Z
GOTO
DONETHR
MOVLW
0x03
MOVWF
THRLVL
; There's no lower threshold, that'd be silly
; Done manipulating threshold
DONETHR
BTFSC
THR
GOTO
THR2
MOVFW
THRLVL
CALL
DEBOUNCE
BTFSC
THR
; THR button?
; No
; 0.1 s delay
; Still THR button?
GOTO
CLRF
MOVFW
MOVWF
THR2
LEDS
TEMPTHR
THRLVL
THR4
CALL
DEBOUNCE
; to enable releasing THR button
BTFSS
THR
GOTO
THR4
CALL
DEBOUNCE
; Store THRLVL into EEPROM (copied from datasheet)
BANKSEL EECON1
; Select Bank of EECON1
BTFSC
EECON1, WR
; Wait for write
GOTO
$-1
; to complete
BANKSEL EEADR
; Select Bank of EEADR
MOVLW
0x00
MOVWF
EEADR
; Data Memory Address to write
BANKSEL THRLVL
MOVFW
THRLVL
BANKSEL EEDATA
MOVWF
EEDATA
; Data Memory Value to write
BANKSEL EECON1
; Select Bank of EECON1
BCF
EECON1, EEPGD
; Point to DATA memory
BSF
EECON1, WREN
; Enable writes
MOVLW
0x55
MOVWF
EECON2
; Write 55h
MOVLW
0xAA
MOVWF
EECON2
; Write AAh
BSF
EECON1, WR
; Set WR bit to begin write
BCF
EECON1, WREN
; Disable writes
BANKSEL PORTB
; Select BANK0
NOTHR
RETURN
CHECKTHR
; Subroutine called from TETRA4S
; Checks if threshold is reached
MOVFW
TEMPBAR
SUBWF
THRLVL,0
BTFSC
STATUS,Z
GOTO
PIP
RETURN
; Creates "pip"
PIP
MOVLW
B'00111101'
BANKSEL TRISA
MOVWF
TRISA
;
MOVLW
0xAA
;
BANKSEL I2CCNT
MOVWF
I2CCNT
LOOP3
MOVLW
0xFF
;
MOVWF
I2CDELAY
LOOP4
DECFSZ I2CDELAY,1
GOTO
LOOP4
MOVLW
B'00000010'
XORWF
PORTA,1
;
DECFSZ I2CCNT,1
GOTO
LOOP3
MOVLW
B'00111111'
BANKSEL TRISA
MOVWF
TRISA
;
BCF
STATUS,RP0
;
RETURN
END
Toggle ALARM