You are on page 1of 12

http://www.ddrservice.net/f0z/Integrated-circuits/F/fi1216.

pdf

;
;
;
;
;
;
;
;
;
;
;
;
;
;

FI1216 control, ADC and LED bar driver


V0.0 141130 Initial draft
V0.1 141201 Done ADC, LED bar
V0.2 141202 Subroutines, TMR0
V0.3 141203 Tetra 4s, MAX HOLD function
V0.4 141204 Fixed AD, lose controls, enter buttons
V0.5 141206 I2C
V0.6 141207 Fixed I2C
V0.7 141228 BRT Button
V0.8 141231 THR Button
V0.9 150118 Cal levels FI1216, f(LO)
V0.10 150119 THR setting
V0.11 150119 EEPROM R/W
V1.0 150119 Release
LIST
P=16F818, F=INHX8M
#include <p16f818.inc>

__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

; Timer0 Interrupt Handler


BCF
INTCON,TMR0IF
BCF
INTCON,GIE
MOVWF
TEMPW
SWAPF
STATUS,W
MOVWF
TEMPSTATUS
CALL
BARBRITE
CALL
THRSET
MOVLW
B'00000001'
XORWF
FLAGS,1
BTFSC
BLANKBAR
GOTO
BLANKLEDS
MOVFW
SUBLW
MOVWF
MOVFW
MOVWF
GOTO
BLANKLEDS
MOVFW
MOVWF
CLRF

; Address of RESET Vector


; Internal Oscillator Frequency is 8 MHz

;
;
;
;
;
;
;
;
;
;
;
;
;

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

;
;
;
;
;

8 LED bar RB0-3 GRN, RB4,5 ORG RB6,7 RED


A/D input from AD8307
Threshold Alarm Output
Alarm threshhold button input
LED brightness button input

;
;
;
;
;
;
;

I2C bus outputs


1: blanked (BRT)
1: BRT Button Pressed
1: lowest brightness
1: low brightness
1: mid brightness
1: max brightness

;
;
;
;
;
;
;

Clear TMR0 interrupt


Disable global interrupts
Copy W to a Temporary Register (all banks)
Swap STATUS nibbles and place into W register
Save STATUS to a Temporary register (DS31008a)
BRT Button test
Threshold Setting Routine

; XOR BLANKBAR
; Test if clear
; Set, blank leds

BRITE
0xFF
TMR0
TEMPBAR
LEDS
ENDINT

;
;
;
;
;

Fetch LED brightness


Subtract BRITE from 0xFF
And load Timer0
Fetch LED pattern
Write to LEDs

BRITE
TMR0
LEDS

; Fetch LED brightness


; And load Timer0
; Switch off LEDs

CALL

TETRA4S

; Check if 4s have elapsed, if so write pattern to TEMPBAR.

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

; Do initialization, Select bank 0


; Enable GIE
; Enable Timer0 Interrupt
; Keep in lower 2KByte

; RA7,6 Outputs, 5-0 Inputs


; RB7-0 Outputs
; Timer0, prescaler 1:128
; 8 MHz clock
; AN0 Analog input, AN1-4 Digital IO, ADRESH only (ADRESL discarded)
; AD conv ON, AN0 Selected, Fosc/8 (T(AD)=1us)

; Make all PORT B outputs low


; Reset Timer 0
; Startup Brightness ("dim")

; Select Bank of EEADR


;
;
;
;
;
;

Data Memory Address to read (0x00)


Select Bank of EECON1
Point to Data memory
EE Read
Select Bank of EEDATA
W = EEDATA

; Restored Threshold
; I2C idle
; Set Prescaler second byte (stealth mode)
; Clock Stabilization delay 16 ms
; Set tuner frequency

MAIN
BSF

ADCON0,GO

; Start A/D (RSSI)

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

Move 8 bit A/D result to W


Subtract W from MAXH
result larger than MAXH?
No

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

; Destroy Max Hold value

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

; Check threshold, beep if reached

; LEVEL > -40 dBm

; 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

; LEVEL at noise floor -108 dBm

of tuner
INTCON,GIE
I2CSTART
0xC0
I2CBYTE
0x34
I2CBYTE
DB2
I2CBYTE
0xCA

; Disable global interrupts


; Address
; Prescaler first byte
; Get Prescaler second byte
; Control Byte

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

; Port Byte (Mid Band)

; Clear TMR0 interrupt just in case


; Enable global interrupts

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

; switch off LEDs


; 0.2 s delay
; FF?

; yes, exit INC

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

; Yes, exit and restore THR


; switch off LEDs
; Restore THR

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

RA7,6,1 Outputs, 5-2,0 Inputs (ALARM output)


64 ms outer delay

0.39 ms inner delay

Toggle ALARM

RA7,6 Outputs, 5-0 Inputs (ALARM Hi Z to minimize pop)


Select bank 0

You might also like