PDF 用户手册

Software User Guide
UG-005
One Technology Way • P.O. Box 9106 • Norwood, MA 02062-9106, U.S.A. • Tel: 781.329.4700 • Fax: 781.461.3113 • www.analog.com
ADP8860 Software User Guide
INTRODUCTION
light level threshold has been crossed. All interrupt sources are
maskable. Refer to Figure 1 for a typical application diagram.
Figure 2 shows a schematic with keypad light control.
This user guide describes the functionality of the Analog
Devices, Inc., ADP8860 and provides software development
guidelines. The ADP8860 communicates with an external
processor using an I2C interface and an interrupt line (nINT).
The processor sends initialization and activation commands
to the ADP8860, which acts as a slave device.
The interrupt line is active low; each interrupt source has an
individual masking bit. The processor can reset the ADP8860
anytime by pulling the nRST line low; this operation reinitializes the ADP8860 at the default state and places the device
in standby mode.
The interrupt line, from the ADP8860 to the processor, is used
to indicate a failure condition, such as a thermal shutdown or
an overvoltage and LED/output short circuit, or to indicate a
VALS
OPTIONAL
PHOTOSENSOR
VOUT
PHOTOSENSOR
0.1µF
D1
D3
E3
D3
D4
E4
D5
D4
D7
C4
B4
B3
C3
D6/
CMP_IN2
A3
1µF
1µF
E1
VDDIO
A1
ADP8860
SDA
C1
C2
VDDIO
B1
SCL
E2
B2
VDDIO
nINT
VOUT
A2
VDDIO
nRST
0.1µF
CMP_IN
C1+
C1–
C1
1µF
C2+
C2–
C2
1µF
D2
A4
GND1
D1
GND2
Figure 1. Typical Application Schematic with Optional Second Photo Diode
Rev. 0 | Page 1 of 44
08158-001
VIN
D2
UG-005
Software User Guide
TABLE OF CONTENTS
ADP8860 Software User Guide ...................................................... 1 Controlling Sink Settings .......................................................... 15 Introduction ...................................................................................... 1 Light Sensing Comparator ............................................................ 17 Revision History ............................................................................... 2 Conventions .................................................................................... 19 I C Interface Mode ........................................................................... 4 Functional Flowcharts ................................................................... 20 Interrupts ........................................................................................... 5 Registers Map .................................................................................. 30 Data Flow Diagrams ......................................................................... 6 Pseudocode Implementation ........................................................ 31 Setting the LED Current .................................................................. 8 Listing for ADP8860_Regs.h .................................................... 31 Fade Override Mode .................................................................. 14 Listing for ADP8860 Constants.h ............................................ 36 Setting Backlight and Sink Timings ............................................. 15 Listing for ADP8860 Reset.h .................................................... 38 Controlling Backlight Settings .................................................. 15 Listing for ADP8860 MainProgram.c...................................... 39 2
REVISION HISTORY
7/09—Revision 0: Initial Version
Rev. 0 | Page 2 of 44
Software User Guide
UG-005
KEYPAD LIGHT
UP TO 10 LEDs (6mA EACH)
60mA MAX TOTAL CURRENT
DISPLAY BACKLIGHT
DL1 DL2 DL3 DL4
DL8
DL17
R5
R6
R15
2.8V
ACCESSORY
LIGHTS OR
SUB-DISPLAY BL
PH2
PH1
OPTIONAL
MAIN
PHOTOSENSOR PHOTOSENSOR
DL5 DL6
D3
E3
E4
D4
C4
D1
D2
D3
D4
D5
B4
B3
D6/
D7
CMP_IN2
C3
0.1µF
0.1µF
CMP_IN
A3 VIN
VIN
1µF
VDDIO
R1
nRST
DL7
R2
R3
R4
VOUT A2
A4 GND1
D1 GND2
1µF
ADP8860
C1+ A1
E1 nRST
C1
1µF
C1– C1
C2 SDA
C2+ B1
E2 SCL
C2– B2
nINT
D2 nINT
Figure 2. Schematic with Keypad Light Control
Rev. 0 | Page 3 of 44
C2
1µF
08158-002
I2C
CONTROL
SIGNALS
UG-005
Software User Guide
I2C INTERFACE MODE
The ADP8860 includes an I2C-compatible serial interface for
controlling the LED current, as well as for readback of system
status registers. The I2C device address is 0x54 (0101 0100,
binary) for a write sequence and 0x55 (0101 0101, binary) for
a read sequence. Figure 3 shows the I2C write sequence while
Figure 4 shows a read operation.
0
1
0
B0
B7
REGISTER ADDRESS
B0
ACK
REGISTER VALUE
SELECT ADP8860 REGISTER TO
WRITE IN THE 0x00 TO 0x24 AND
0x2E RANGE
8-BIT VALUE TO WRITE IN THE
ADDRESSED REGISTER
ACK
ST
08158-003
DEVICE ID
0x54 FOR WRITE
OPERATION
B7
R/W ACK
STOP
1
FROM ADP8860
0
WRITE = 0
START
1
FROM ADP8860
B0
0
FROM ADP8860
B7
ST
The ADP8860 sends data from the register denoted by the
register address. The lowest bit number (0) represents the least
significant bit, and the highest bit number (7) represents the
most significant bit. The register address content selects which
of the ADP8860 registers data is written to or read from.
SLAVE TO MASTER
MASTER TO SLAVE
Figure 3. I2C Write Operation
ACK RS 0
SELECT ADP8860 REGISTER TO
WRITE IN THE 0x00 TO 0x24 AND
0x2E RANGE
B0
1
0
1
0
1
DEVICE ID
0x55 FOR READ
OPERATION
SLAVE TO MASTER
MASTER TO SLAVE
Figure 4. I2C Read Operation
Rev. 0 | Page 4 of 44
0 R/W ACK
B7
B0
REGISTER VALUE
8-BIT VALUE TO WRITE IN THE
ADDRESSED REGISTER
ACK ST
STOP
B7
B0
REGISTER ADDRESS
08158-004
DEVICE ID
0x54 FOR WRITE
OPERATION
B7
0 R/W ACK
FROM MASTER
1
READ = 1
0
REPEATED START
1
FROM ADP8860
0
FROM ADP8860
START
B0
1
WRITE = 0
B7
ST 0
Software User Guide
UG-005
INTERRUPTS
There are up to five interrupt sources available on the ADP8860
as follows:
•
•
•
•
•
CMP_INT is from the main light sensor comparator.
CMP2_INT is from sensor Comparator 2.
OVP_INT is from the overvoltage protection comparator.
TSD_INT is from the thermal shutdown circuit.
SHORT_INT is from the short-circuit detection
comparator.
Each interrupt has individual masking/enable bits mapped in
Register INTR_EN. If the respective bit in the masking register
is 0, an interrupt is not generated to the external processor,
however the interrupt pending bit (on the MDCR2 register) can
be set in case the monitored condition occurs. This can be used
by the processor to periodically poll the interrupt pending
register (Register MDCR2) looking for an event to be true. If
the masking register bit is 1 an interrupt is generated (the nINT
line goes low) to the external processor in case an interrupt
pending bit is set.
CMP_INT is set every time the main light sensor comparator
detects a threshold transition (rising or falling condition). This
comparator has two programmable thresholds (L2 and L3)
defining the transition level from dark to office (L3) and from
office to outdoor (L2).
The CMP2_INT interrupt works the same way as CMP_INT
except that the sensing input comes from the second light
sensor. The programmable threshold is the same as the main
light sensor comparator.
The OVP_INT interrupt is generated when the charge pump
output voltage rises above a safety limit. In the event of an over-
voltage condition, the charge-pump is disabled until the output
voltage decreases to a recovery working level. An overvoltage
event can be generated when the load is removed from the
circuit and the input voltage, multiplied by the charge pump
gain (can be 1.5× or 2×), is above the OVP limit. In this condition, the interrupt to the external processor is generated
periodically. Therefore, the software should handle a case of
this sort by turning off the ADP8860 or disabling the OVP
interrupt mask.
The TSD_INT interrupt is generated when the die temperature in
the ADP8860 rises above a safety limit, typically 150°. When this
condition occurs, the charge pump and the LED drivers are turned
off waiting for the die to cool down. When the die temperature
decreases below ~130° the circuit is activated again automatically.
No interrupt is generated when the device turns on again, however
if the software clears the pending interrupt and the temperature
remains above 130° another interrupt is generated.
The SHORT_INT interrupt is generated if the output of the
charge-pump VOUT is shorted to ground or an LED connected
to the sink output is shorted. In a short-circuit event, the charge
pump and drivers are turned off immediately and the shortcircuit pending flag is set. The processor may then retry new
activations or issue a diagnostic message. Interrupts are cleared
by writing a 1 in the pending register bit. If Bit INT_CFG in
Register MDCR is set to 1, this forces the nINT line deassertion
(Logic High) for 50 μs after the processor clears the interrupt
pending, and the interrupt condition persists. If INT_CFG is 0,
the nINT line remains asserted (Logic Low) after the processor
clears the interrupt pending and the interrupt condition
persists.
INTR_EN (0x03) – INTERRUPT MASKS
MDCR (0x01)
BIT 6
BIT 4
BIT 3
BIT 2
BIT 1
BIT 0
SHORT_IEN
TSD_IEN
OVP_IEN
CMP2_IEN
CMP_IEN
SHORT_INT
TSD_INT
OVP_INT
CMP2_INT
CMP_INT
BIT 4
BIT 3
BIT 2
BIT 1
BIT 0
INT_CFG
50µs
INTERRUPT
DE-ASSERTION
INT_CLEAR
(ASSERTED WHEN WRITING
THE INTERRUPT PENDING
FLAGS IN MDCR2)
MCDR2 (0x02) – INTERRUPT PENDING
Figure 5. Interrupt Logic
Rev. 0 | Page 5 of 44
08158-005
INT
UG-005
Software User Guide
DATA FLOW DIAGRAMS
Figure 6 and Figure 7 show the backlight data flow and the individual data flow, respectively.
NSTBY = 0
OR VIN < UVLO
TURN OFF
BACKLIGHT
AND ISINKS
STANDBY
BLEN = 0
OR TSD_INT = 1
OR SHORT_INT = 1
NSTBY = 0
NSTBY = 1
NO COMMAND
BACKLIGHT
FADE IN
TO MAX
BLEN = 1
BACKLIGHT
OFF
WAITING
COMMAND
BL_FO TIMEOUT
DIM_EN AND
BLEN = 1
BL_FI TIMEOUT
DIM_EN = 0
AND DIMT = DISABLED
DIMT = DISABLED
BACKLIGHT
FADE OUT
TO OFF
BACKLIGHT
ACTIVATION
TIME (DIMT)
DIM_EN = 1
AND DIMT TIMEOUT
BACKLIGHT
FADE IN
TO DIM
OFFT TIMEOUT
AND DIM_EN = 0
BACKLIGHT
DIM STATE
(OFFT)
BL_FO TIMEOUT
DIM_EN = 1 OR
OFFT = DISABLED
NOTES
1. DASHED LINE INDICATES AN INTERRUPT OR AN EVENT THAT CAN HAPPEN ANYTIME DURING THE DEVICE OPERATION.
2. COMMANDS FROM I2C ARE ALWAYS MONITORED AND EXECUTED. THE FLOW SHOWS A COMMON BUBBLE FOR
COMMANDS TO MAKE THE FLOW REPRESENTATION CLEARER.
Figure 6. Backlight Data Flow
Rev. 0 | Page 6 of 44
08158-006
BLEN AND
FOVR = 1
Software User Guide
UG-005
NSTBY = 0
OR VIN < UVLO
TURN OFF
BACKLIGHT
AND ISINKS
SCx_EN = 0
OR TSD_INT = 1
OR SHORT_INT = 1
STANDBY
NSTBY = 0
NSTBY = 1
xSINK
OFF
NO COMMAND
xSINK
FADE-IN
SCx_EN = 1
WAITING
COMMAND
SCFO = 0
OR TIMEOUT
SCFI = 0
OR TIMEOUT
SIS_EN = 1
AND ISCC = 0
SCx OFF
TIMEOUT
SCx OFF = 0
(ALWAYS ON)
SCx_EN = 0
SCx_EN = 0
ENABLED
SINKS
FADE-OUT
ENABLED
SINKS
FADE-IN
SIS_EN = 0
OR ISCC ≠ 0
ACTIVATION
INDIVIDUAL
xSINK
SCFI = 0
OR TIMEOUT
xSINK
FADE-OUT
ACTIVATE
ENABLED
SINKS
SCFO = 0
OR TIMEOUT
NOTES
1. DASHED LINE INDICATES AN INTERRUPT OR AN EVENT THAT CAN HAPPEN ANYTIME DURING THE DEVICE OPERATION.
Figure 7. Individual Sinks Data Flow
Rev. 0 | Page 7 of 44
SIS_EN = 1
AND ISCC = 0
08158-007
TURN OFF
INDIVIDUAL
SINK
SCON
TIMEOUT
UG-005
Software User Guide
SETTING THE LED CURRENT
The ADP8860 contains seven current sink outputs that can be
software configured to operate as part of the LED backlight or
as individual sinks, such as funlights or keypad lights. All
outputs can drive up to 30 mA with the exception of the seventh
sink (D1B/LED7) that can drive up to 60 mA, which is ideal for
keypad light applications where up to 10 LEDs can be driven in
parallel with shunt resistors (see Figure 2).
The application software must program which output to use as
part of the backlight and which to use for the individual sinks.
Register BLSEN is used for this purpose. If the selection bit
associated with the LED sink (Bit 0 controls LED1, Bit 1
controls LED2, and so on) is set to 0, it is part of the LED
backlight; otherwise, if set to 1, it is an independent sink. In
this case, Register ISCC controls the individual sink turn-on
and turn-off activations. For example, if BLSEN is programmed
with 0x70, LED1 to LED4 are used for the backlight while LED5
to LED7 are individual sinks. Bit 7 in BLSEN is not used.
In backlight operation, there are three distinct selectable brightness levels: dark, office, and daylight. Each brightness level has
two programmable settings:
•
•
The MAX brightness defined in Register BLMX1 (daylight), Register BLMX2 (office), and Register BLMX3
(dark) can range from 0 mA to 30 mA.
The DIM brightness level defined in Register BLDM1 for
daylight, Register BLDM2 for office, and Register BLDM3
for dark can range from 0 mA to 30 mA.
The backlight LED current depends on the backlight transfer
law, linear or square, programmed in the CFGR register Bit 2
and Bit 1. Table 2 shows all the current values available
according to the control law selected.
The transfer function for the linear law is
FULL _ SCALE _ I ⎞
BACKLIGHT _ I = RegValue × ⎛⎜
⎟
127
⎠
⎝
RegValue =
BACKLIGHT _ I × 127
FULL _ SCALE _ I
(1)
(2)
where:
BACKLIGHT_I is the desired LED current in mA.
RegValue is the digital 7-bit value programmed in the backlight
current registers.
FULL_SCALE_I is the maximum backlight current value, which
is 30 mA.
The transfer function for the square law is
⎛ Re gValue × FULL _ SCALE _ I
BACKLIGHT _ I = ⎜⎜
127
⎝
RegValue =
⎞
⎟
⎟
⎠
2
127 × BACKLIGHT _ I
FULL _ SCALE _ I
(3)
(4)
Table 1. Backlight Transfer Laws—CFGR Register Bits[2:1]
Bits[2:1]
00
01
10
11
Fading Law
Linear Law DAC
Square Law DAC
Square Law DAC
(Cubic 1)
Square Law DAC
(Cubic 2)
Fading Time Change
Linear time steps
Linear time steps
Nonlinear time steps
(Type 1)
Nonlinear time steps
(Type 2)
The complete set of square law current values are given in
Table 2.
Rev. 0 | Page 8 of 44
Software User Guide
UG-005
Table 2. Linear and Square Law Current Values
DAC Code
0x00
0x01
0x02
0x03
0x04
0x05
0x06
0x07
0x08
0x09
0x0A
0x0B
0x0C
0x0D
0x0E
0x0F
0x10
0x11
0x12
0x13
0x14
0x15
0x16
0x17
0x18
0x19
0x1A
0x1B
0x1C
0x1D
0x1E
0x1F
0x20
0x21
0x22
0x23
0x24
0x25
0x26
0x27
0x28
0x29
0x2A
0x2B
0x2C
0x2D
0x2E
0x2F
Linear Law (mA)
0
0.236
0.472
0.709
0.945
1.181
1.417
1.654
1.890
2.126
2.362
2.598
2.835
3.071
3.307
3.543
3.780
4.016
4.252
4.488
4.724
4.961
5.197
5.433
5.669
5.906
6.142
6.378
6.614
6.850
7.087
7.323
7.559
7.795
8.031
8.268
8.504
8.740
8.976
9.213
9.449
9.685
9.921
10.157
10.394
10.630
10.866
11.102
Square Law (mA)
0.000
0.002
0.007
0.017
0.030
0.047
0.067
0.091
0.119
0.151
0.186
0.225
0.268
0.314
0.365
0.419
0.476
0.538
0.603
0.671
0.744
0.820
0.900
0.984
1.071
1.163
1.257
1.356
1.458
1.564
1.674
1.787
1.905
2.026
2.150
2.279
2.411
2.546
2.686
2.829
2.976
3.127
3.281
3.439
3.601
3.767
3.936
4.109
DAC Code
0x30
0x31
0x32
0x33
0x34
0x35
0x36
0x37
0x38
0x39
0x3A
0x3B
0x3C
0x3D
0x3E
0x3F
0x40
0x41
0x42
0x43
0x44
0x45
0x46
0x47
0x48
0x49
0x4A
0x4B
0x4C
0x4D
0x4E
0x4F
0x50
0x51
0x52
0x53
0x54
0x55
0x56
0x57
0x58
0x59
0x5A
0x5B
0x5C
0x5D
0x5E
0x5F
Rev. 0 | Page 9 of 44
Linear Law (mA)
11.339
11.575
11.811
12.047
12.283
12.520
12.756
12.992
13.228
13.465
13.701
13.937
14.173
14.409
14.646
14.882
15.118
15.354
15.591
15.827
16.063
16.299
16.535
16.772
17.008
17.244
17.480
17.717
17.953
18.189
18.425
18.661
18.898
19.134
19.370
19.606
19.842
20.079
20.315
20.551
20.787
21.024
21.260
21.496
21.732
21.968
22.205
22.441
Square Law (mA)
4.285
4.466
4.650
4.838
5.029
5.225
5.424
5.627
5.833
6.043
6.257
6.475
6.696
6.921
7.150
7.382
7.619
7.859
8.102
8.350
8.601
8.855
9.114
9.376
9.642
9.912
10.185
10.463
10.743
11.028
11.316
11.608
11.904
12.203
12.507
12.814
13.124
13.439
13.757
14.078
14.404
14.733
15.066
15.403
15.743
16.087
16.435
16.787
UG-005
DAC Code
0x60
0x61
0x62
0x63
0x64
0x65
0x66
0x67
0x68
0x69
0x6A
0x6B
0x6C
0x6D
0x6E
0x6F
Software User Guide
Linear Law (mA)
22.677
22.913
23.150
23.386
23.622
23.858
24.094
24.331
24.567
24.803
25.039
25.276
25.512
25.748
25.984
26.220
Square Law (mA)
17.142
17.501
17.863
18.230
18.600
18.974
19.351
19.733
20.118
20.507
20.899
21.295
21.695
22.099
22.506
22.917
DAC Code
0x70
0x71
0x72
0x73
0x74
0x75
0x76
0x77
0x78
0x79
0x7A
0x7B
0x7C
0x7D
0x7E
0x7F
Rev. 0 | Page 10 of 44
Linear Law (mA)
26.457
26.693
26.929
27.165
27.402
27.638
27.874
28.110
28.346
28.583
28.819
29.055
29.291
29.528
29.764
30.000
Square Law (mA)
23.332
23.750
24.173
24.599
25.028
25.462
25.899
26.340
26.784
27.232
27.684
28.140
28.599
29.063
29.529
30.000
Software User Guide
UG-005
If the automatic light sensing control is enabled (CMP_AUTOEN,
Bit 1, is set to 1 in Register MDCR) the result from the light
sensing comparator controls the backlight brightness in one of
the three levels (dark, office, and daylight).
In this mode, it is not possible to force, by software, a defined
level. Thus, settings on Bits[4:3] (BLV) in the CFGR register are
not considered in automatic light sensing mode. In case the
automatic light sensing mode is disabled (0 is written to
CMP_AUTOEN in the MDCR register), software can force the
backlight brightness in one of the three possible modes (dark,
office, or daylight) by writing Bits[4:3] (BLV) in Register CFGR
(see Table 3).
Table 3. Brightness Level—Bits[4:3] (BLV) in CFGR Register
Bits[4:3]
00
01
10
11
Backlight Brightness Level
Level 1 (daylight)
Level 2 (office)
Level 3 (dark)
Disabled
Each individual sink has a dedicated current register defining
its brightness level. As with the backlight, the current level
depends on the transfer law selected in the ISCFR register
Bits[1:0] (SC_LAW).
The ISC1 register defines the current level for LED1, the ISC2
register defines the level for LED2, and so on until ISC7, which
controls the current for LED7. The maximum current level
programmable is 30 mA. However, LED7 can be set up to
60 mA if Bit 7 in the ISC7 register is set to 1. The possible
current levels for 30 mA are listed in Table 2.
Rev. 0 | Page 11 of 44
UG-005
Software User Guide
Table 4. Complete Set of Square Law Current Values for LED7
—60 mA Range
DAC Code
0x00
0x01
0x02
0x03
0x04
0x05
0x06
0x07
0x08
0x09
0x0A
0x0B
0x0C
0x0D
0x0E
0x0F
0x10
0x11
0x12
0x13
0x14
0x15
0x16
0x17
0x18
0x19
0x1A
0x1B
0x1C
0x1D
0x1E
0x1F
0x20
0x21
0x22
0x23
0x24
0x25
0x26
0x27
0x28
0x29
0x2A
0x2B
0x2C
0x2D
Linear Law (mA)
0.000
0.472
0.945
1.42
1.89
2.36
2.83
3.31
3.78
4.25
4.72
5.20
5.67
6.14
6.61
7.09
7.56
8.03
8.50
8.98
9.45
9.92
10.39
10.87
11.34
11.81
12.28
12.76
13.23
13.70
14.17
14.65
15.12
15.59
16.06
16.54
17.01
17.48
17.95
18.43
18.90
19.37
19.84
20.31
20.79
21.26
Square Law (mA)
0
0.004
0.014
0.034
0.06
0.094
0.134
0.182
0.238
0.302
0.372
0.45
0.536
0.628
0.73
0.838
0.952
1.076
1.206
1.342
1.488
1.64
1.8
1.968
2.142
2.326
2.514
2.712
2.916
3.128
3.348
3.574
3.81
4.052
4.3
4.558
4.822
5.092
5.372
5.658
5.952
6.254
6.562
6.878
7.202
7.534
DAC Code
0x2E
0x2F
0x30
0x31
0x32
0x33
0x34
0x35
0x36
0x37
0x38
0x39
0x3A
0x3B
0x3C
0x3D
0x3E
0x3F
0x40
0x41
0x42
0x43
0x44
0x45
0x46
0x47
0x48
0x49
0x4A
0x4B
0x4C
0x4D
0x4E
0x4F
0x50
0x51
0x52
0x53
0x54
0x55
0x56
0x57
0x58
0x59
0x5A
0x5B
Rev. 0 | Page 12 of 44
Linear Law (mA)
21.73
22.20
22.68
23.15
23.62
24.09
24.57
25.04
25.51
25.98
26.46
26.93
27.40
27.87
28.35
28.82
29.29
29.76
30.24
30.71
31.18
31.65
32.13
32.60
33.07
33.54
34.02
34.49
34.96
35.43
35.91
36.38
36.85
37.32
37.80
38.27
38.74
39.21
39.69
40.16
40.63
41.10
41.57
42.05
42.52
42.99
Square Law (mA)
7.872
8.218
8.57
8.932
9.3
9.676
10.058
10.45
10.848
11.254
11.666
12.086
12.514
12.95
13.392
13.842
14.3
14.764
15.238
15.718
16.204
16.7
17.202
17.71
18.228
18.752
19.284
19.824
20.37
20.926
21.486
22.056
22.632
23.216
23.808
24.406
25.014
25.628
26.248
26.878
27.514
28.156
28.808
29.466
30.132
30.806
Software User Guide
DAC Code
0x5C
0x5D
0x5E
0x5F
0x60
0x61
0x62
0x63
0x64
0x65
0x66
0x67
0x68
0x69
0x6A
0x6B
0x6C
0x6D
Linear Law (mA)
43.46
43.94
44.41
44.88
45.35
45.83
46.30
46.77
47.24
47.72
48.19
48.66
49.13
49.61
50.08
50.55
51.02
51.50
UG-005
Square Law (mA)
31.486
32.174
32.87
33.574
34.284
35.002
35.726
36.46
37.2
37.948
38.702
39.466
40.236
41.014
41.798
42.59
43.39
44.198
DAC Code
0x6E
0x6F
0x70
0x71
0x72
0x73
0x74
0x75
0x76
0x77
0x78
0x79
0x7A
0x7B
0x7C
0x7D
0x7E
0x7F
Rev. 0 | Page 13 of 44
Linear Law (mA)
51.97
52.44
52.91
53.39
53.86
54.33
54.80
55.28
55.75
56.22
56.69
57.17
57.64
58.11
58.58
59.06
59.53
60
Square Law (mA)
45.012
45.834
46.664
47.5
48.346
49.198
50.056
50.924
51.798
52.68
53.568
54.464
55.368
56.28
57.198
58.126
59.058
60
UG-005
Software User Guide
35
LED CURRENT (mA)
30
25
LINEAR LAW
20
15
SQUARE LAW
10
0
0
20
40
60
80
100
DIGITAL VALUE (DAC)
120
08158-008
5
Figure 8. LED Current Transfer Law Curves
Square Cubic Law 1 and Square Cubic Law 2 use the same
square transfer law values with faster increment/decrement
times when fading in and out.
brightness intensity. There remains a 100 ms ramp-up time to
avoid rapid change in current. The fade-in time is not skipped
at the very first activation, after an off condition.
FADE OVERRIDE MODE
This mode is useful is situations where the backlight is fading
out and the user depresses a keypad button. The system
software can intercept this condition, set the FOVR bit, then
write the BLEN bit to 1 again. Fade-out time is not affected by
the FOVR bit.
The fade override mode is enabled when Bit 0 (FOVR) in the
CFGR register is set to 1. In this mode, the backlight skips the
fade-in time when Bit BLEN in the MDCR register is set to 1
and it goes directly to the programmed maximum backlight
Rev. 0 | Page 14 of 44
Software User Guide
UG-005
SETTING BACKLIGHT AND SINK TIMINGS
The LED backlight supports several programmable timing
controls as described in this section.
Note that the following equation is only for linear step control
laws:
CONTROLLING BACKLIGHT SETTINGS
Bits[3:0] of the BLFR register set the backlight fade-in time (see
Table 5). The time specified in Table 5 is from the maximum
allowable current level (30 mA) to zero. Equation 5 gives an
estimated value for the actual fade-in time based on known
conditions. If the value programmed is zero, the fade-in time is
disabled, however a 100 ms fade-in time is used.
Bits[7:4] of the BLFR register set the backlight fade-out time,
(see Table 5). Equation 6 gives an estimated value for the actual
fade-in time based on known conditions. If the value programmed is zero, the fade-out time is disabled, however a 100 ms
fade-in time is used.
Bits[6:0] of the BLDIM register set the time for the backlight
to stay in the MAX brightness state. After this time, the backlight starts to fade out to the DIM or zero level (If the DIM
timeout is disabled). The digital value programmed in this
register corresponds to the time in seconds. For example,
BLDIM = 0x32 corresponds to 50 seconds.
Bits[6:0] of the BLOFF register set the time for the backlight
to stay in the DIM state. After this time, the backlight starts to
fade out to zero current level. The digital value programmed in
this register corresponds to the time in seconds. For example,
BLOFF = 0x10 corresponds to 16 seconds.
Table 5. Backlight Fade-In (Bits[3:0]) and Fade-Out
(Bits[7:4]) Times
BLFR Register Value
0000
0001
0010
0011
0100
0101
0110
0111
1000
1001
1010
1011
1100
1101
1110
1111
Fade-In and Fade-Out Time (Sec)
Disabled
0.3
0.6
0.9
1.2
1.5
1.8
2.1
2.4
2.7
3.0
3.5
4.0
4.5
5.0
5.5
TFADE _ EST =
Fade _ In × ( MaxCurr − ActualCurr )
30
(5)
where:
MaxCurr is the maximum backlight current value programmed
in the BLMXx registers.
ActualCurr is the initial backlight current (0 mA at the first
activation).
TFADE_EST is the calculated fade-in time in seconds.
Note that the following equation is only for linear step
control laws:
TFADE _ EST =
Fade _ Out × ( ActualCurr − MinCurr )
30
(6)
where:
ActualCurr is the backlight current value and can be MaxCurr if
fading out from the MAX brightness state or DimCurr if fading
out from DIM state.
MinCurr is the backlight current value and can be DimCurr if
fading out from the MAX brightness to DIM state or zero if
fading out from DIM state to zero current.
TFADE_EST is the calculated fade-out time in seconds.
CONTROLLING SINK SETTINGS
The enabled individual sinks have dedicated registers to control
the activation timings and fade-in, fade-out times. The activation on time for Sink 1 to Sink 7 is selected by Register ISCT1,
Bits[7:6] and is common for all the individual sinks (see
Table 6).
The off time is selected individually for each individual sink
(Sink 1 to Sink 7) by Register ISCT1, Bits[5:0] and Register
ISCT2, Bits[7:0] (see Table 7). Two bits are used per individual
sink. If the off time, 2-bit register is set to zero, the individual
sink is activated indefinitely.
The off time is controlled on each individual sink as follows:
ISCT1 Bits[5:4] for Sink 7, ISCT1 Bits[3:2] for Sink 6, ISCT1
Bits[1:0] for Sink 5, ISCT2 Bits[7:6] for Sink 4, ISCT2 Bits[5:4]
for Sink 3, ISCT2 Bits[3:2] for Sink 2 and ISCT2 Bits[1:0] for
Sink 1.
Table 6. Individual Sinks On-Time Selection
ISCT1 Bits[7:6]
00
01
10
11
Rev. 0 | Page 15 of 44
Programmed On Time (Sec)
0.2
0.6
0.8
1.2
UG-005
Software User Guide
Table 7. Individual Sinks Off-Time Selection
Table 8. Individual Sinks Fade-In and Fade-Out Times
Two-Bit Register
00
01
10
Programmed Off Time (Sec)
Always on
0.6
1.2
11
1.8
Register Value
0000
0001
0010
0011
0100
0101
0110
0111
1000
1001
1010
1011
1100
1101
1110
1111
Bits[3:0] of the ISCF register set the individual sinks fade-in
time (see Table 8). The time specified in Table 8 is from zero
to the maximum allowable current level (30 mA or 60 mA for
Sink 7). Equation 5 gives an estimated value for the fade-in time
based on the actual programmed LED current. If the value
programmed is zero, the fade-in time is disabled; however, a
100 ms fade-in time is used.
Bits[7:4] of the ISCF register set the individual sinks fade-out
time (see Table 8). The time specified in Table 8 is from the
maximum allowable current (30 mA or 60 mA for Sink 7) to
zero current. Equation 6 gives an estimated value for the fadeout time based on actual programmed LED current. If the value
programmed is zero, the fade-out time is disabled; however, a
100 ms fade-in time is used.
Rev. 0 | Page 16 of 44
Fade-In and Fade-Out Time in Seconds
Disabled
0.3
0.6
0.9
1.2
1.5
1.8
2.1
2.4
2.7
3.0
3.5
4.0
4.5
5.0
5.5
Software User Guide
UG-005
LIGHT SENSING COMPARATOR
The ADP8860 supports two light sensing inputs. The first light
sensing input is always dedicated as input from a phototransistor assessing the ambient light condition. The second light
sensing input is shared with Sink 6. Thus, the software must
carefully select the desired operation (light sensing or Sink 6).
Table 10. Correlation Between Code and Phototransistor Lux
Measurement
Bit 5 (CMP2_SEL) in the CFGR register is used to configure pin
D6 (LED6) operation. If CMP2_SEL is 0, Pin D6 is an output
sink for LED6. If CMP2_SEL is set to 1, Pin D6 is an input from
the second light sensor (phototransistor). An internal analogto-digital converter processes the light information coming
from the light sensors providing a digital value corresponding
to the ambient light detected. The digital value is compared to
two thresholds (L2 and L3) to determine if the ambient light
condition is in one of the following three ranges:
Each threshold has an associated register setting the hysteresis
level to avoid changes due to noise or being too close to the
threshold. Each light sensor has an individual comparator and
control register.
•
•
•
Dark: Ambient light level is below L3 and L2 thresholds.
Office: Ambient light level is above L3, but below L2
thresholds.
Daylight: Ambient light level is above L3 and L2
thresholds.
Software can program the ADP8860 to operate in automatic
mode if Bit 1 (CMP_AUTOEN) in the MDCR register is set
to 1 or in manual mode, if CMP_AUTOEN is 0. When the
device operates in automatic light ambient mode, the backlight
brightness level is set by the current ambient light condition
(dark, office, and daylight).
Bit 0 and Bit 1 in CCFG and CCFG2 allow selection of the level
(L2 and/or L3) used for the automatic brightness control. If
both bits are 0, no automatic control is issued (see Table 9).
Software must program the desired levels for the L2 and L3
thresholds in the L2_TRP and L3_TRP registers, respectively.
Using the default phototransistor, the correlation factor between
programmed value and light level is provided in Table 10.
Table 9. Comparators Auto Level Control
Code
00
01
10
11
Comparator Operation
No automatic brightness control
L2 comparator auto level control
L3 comparator auto level control
L2 and L3 auto level control
Threshold
L2
L3
Registers
L2_TRP, L2_HYS
L3_TRP, L3_HYS
1-Bit Correlation
10 lux or 4 μA
1.25 lux or 0.5 μA
Table 11 shows the filter settings for the comparators. The
comparator filter makes sure that rapid changes in the ambient
light level do not change the backlight brightness.
Table 11. Comparators Filter Settings—Bits[7:5] in CCFG
and CCFG2
Code
000
001
010
011
100
101
110
111
Filter Setting (ms)
80
160
320
640
1280
2560
5120
10240
Every time the L2 or L3 threshold is crossed (rising or falling
conditions), a pending flag is set in the interrupt pending
register (MDCR2). Bit 0 (CMP_INT) is the flag for the first
light sensor while Bit 1 (CMP2_INT) is the flag for the second
light sensor. An interrupt is generated if the respective Interrupt
Enable bit is 1 in the INTR_EN register (or the CMP_IEN
register for light Sensor 1 and the CMP2_IEN register for light
Sensor 2).
The comparator interrupt can be useful in case the manual
backlight brightness level mode of operation is used so that
the software can read the comparator(s) outputs and force the
backlight brightness level through Bit BLV in the CFGR register.
See Table 12 for the complete comparator output decoding.
The PH1LEVL, PH1LEVH, PH2LEVL, and PH2LEVH registers
contain the raw 13-bit conversion result for the first and second
light sensors. These registers can be used for diagnostic or
monitoring purposes. In typical applications, these registers can
be ignored.
Rev. 0 | Page 17 of 44
UG-005
Software User Guide
Table 12. Light Sensor Comparator Levels
L2_OUT(2)
0
1
1
L3_OUT(2)
0
0
1
Ambient Light Level
Ambient light > L2
L3< ambient light < L2
Ambient light < L3
Condition
Daylight
Office
Dark
L2 THRESHOLD
L2 OUT(2)
L3 OUT(2)
L3 THRESHOLD
08158-009
AMBIENT LIGHT LEVEL
Figure 9. Light Sensing Comparators
The ambient light comparators have hysteresis thresholds
(L2_HYS and L3_HYS) added to the respective tripping
registers (L2_TRP and L3_TRP) to avoid the backlight mode
changes because of noise.
Figure 10 shows how the backlight mode of operation is
changed when the ambient light intensity varies.
Note that when the automatic light control mode and the
backlight are activated the first time, the state machine converts
the information coming from the phototransistor immediately
(takes roughly 82 ms to perform the conversion). The comparator result is then used to set the backlight intensity without
waiting for the comparator filter result. This avoids abrupt
brightness changes due to the filter delay calculating a
new value.
When the comparator is programmed to control the backlight
intensity (setting Bit CMP_AUTOEN in the MDCR register),
Bits[4:3] (BLV) in the CFGR register are modified with the
backlight operating state. Table 13 shows the decoding for
CFGR Bits[4:3] and CMP_AUTOEN Bit 1. When using this
table, note that R/W indicates a read/write register and R
indicates a read only register.
AMBIENT LIGHT INTENSITY
(LUX)
L2TRP + L2HYS
L2 HYSTERESIS
(L2HYS)
L3TRP + L3HYS
L3 HYSTERESIS
(L3HYS)
L3TRP
OFFICE
DARK
OFFICE
DAYLIGHT
TIME (sec)
OFFICE
08158-010
L2TRP
Figure 10. Comparator Thresholds
Table 13. Backlight Forced Levels
CFGR[4]
0 (R/W)
0 (R/W)
1 (R/W)
1 (R/W)
0 (R)
0 (R)
1 (R)
1 (R)
CFGR[3]
0 (R/W)
1 (R/W)
0 (R/W)
1 (R/W)
0 (R)
1 (R)
0 (R)
1 (R)
MDCR[1]
0
0
0
0
1
1
1
1
Description
Set daylight brightness level
Set office brightness level
Set dark brightness level
Disabled
Comparator forces daylight level
Comparator forces office level
Comparator forces level
Comparator not enabled (Lx_EN = 0)
Rev. 0 | Page 18 of 44
Software User Guide
UG-005
CONVENTIONS
Bit registers are defined as:
Note the following regarding this code:
register_name.bit_name
•
A colon is used to define a range of bits in one specific
register. For example, BLFR[7:4] specifies the upper four
bits in the BLFR register.
•
In general, variables appear in lowercase while constants
appear in uppercase.
•
Hexadecimal numbers are specified with the 0x prefix. For
example, 0x40 corresponds to 64 in decimal notation.
•
Decimal numbers are the default notation and can also be
specified with a postfix of dec, as in 120dec.
•
Binary numbers are specified with a postfix of b as in
00110101b. This corresponds to the hexadecimal number
0x35.
For example
MDCR.7 = 1
sets Bit 7 in Register MDCR to 1.
In some cases, more than one bit is used to define a subregister
function. For example, two bits define the LAW in the CFGR
register. To present the data structure in a simpler format, the
C language structure has been adopted. For example, the
structure presented in this user guide defines the subregister
field and dimension.
/*****************************************************
#define _CFGR 0x04
/* This is the Configuration Register */
struct reg_0x04 {
unsigned FOVR : 1;
/* This is Bit 0 */c
unsigned LAW : 2;
/* This is Bit 1 and Bit 2 */
unsigned BLV : 2;
/* This is Bit 4 and Bit 3 */
unsigned CMP2_SEL : 1;
/* This is Bit 5 */
unsigned SEL_AB : 1;
/* This is Bit 6 */
};
Now the register can be defined and used as follows:
struct reg_0x04 cfgr;
/* Associate cfgr variable with the specific structure */
cfgr.LAW = 2
/* Write LAW bits only */
Rev. 0 | Page 19 of 44
UG-005
Software User Guide
FUNCTIONAL FLOWCHARTS
SET_BACKLIGHT_TIMING
WRITE BACKLIGHT OFF
TIME-OUT PERIOD IN
BLOFF REGISTER
0 = DISABLED (ALWAYS
IN DIM STATE)
YES
FADE_LOCK?
NO
WRITE ZERO IN
BLDIM REGISTER
WRITE BACKLIGHT DIM
TIME-OUT PERIOD IN
BLDIM REGISTER
WRITE BACKLIGHT FADE-IN
TIME IN BLFR[3:0] REGISTER
SET_LEDS_MODES
(ZERO = FADE-IN DISABLED)
WRITE BACKLIGHT AND
INDIVIDUAL SINK SELECTION
IN BLSEN REGISTER
SELECT WHETHER LED6 IN AN
INDIVIDUAL SINK OR INPUT FOR
THE 2ND PHOTOTRANSISTOR IN
CFGR REGISTER (CMP2_SEL)
EXAMPLE:
BLSEN = 01110000b
LED1 TO LED4 ARE PART OF
THE BACKLIGHT
LED5 TO LED7 ARE INDIVIDUAL
SINKS
WRITE BACKLIGHT FADE-OUT
TIME IN BLFR[7:4] REGISTER
(ZERO = FADE-OUT DISABLED)
EXAMPLE:
cdgr.CMP2_SEL = 0
LED6 IS AN INDIVIDUAL SINK
EXAMPLE:
BLOFF = 5DEC
BACKLIGHT WILL STAY AT THE DIM
LEVEL FOR 5 SECONDS THEN WILL
FADE-OUT TO ZERO.
FADE_LOCK IS A CUSTOMER REQUIREMENT
WHERE THE BACKLIGHT FADE OUT FROM
THE MAX CURRENT LEVEL TO ZERO WITHOUT
RESTING AT THE DIM LEVEL. DIM_EN IN THE
MDCR REGISTER OVERRIDES A
FADE_LOCK CONDITION.
EXAMPLE:
BLDIM = 30DEC
BACKLIGHT WILL BE ACTIVATED FOR
30 SEC THEN WILL FADE-OUT TO
DIM LEVEL.
EXAMPLE:
blfr.BL_FI = 0110b
BACKLIGHT FADE-IN IN 1.8 SEC. THIS
TIME IS FULL-SCALE TO ZERO. IF THE
PROGRAMMED CURRENT IS DIFFERENT
OR GOING FROM MAX TO DIM OR DIM TO
ZERO, THE ACTUAL FADE-IN TIME
IS SHORTER.
EXAMPLE:
blfr.BL_FO = 1100b
BACKLIGHT FADE OUT IN 4 SEC.
THIS TIME IS FULL-SCALE TO ZERO. IF THE
PROGRAMMED CURRENT IS DIFFERENT
OR GOING FROM MAX TO DIM OR DIM
TO ZERO, THE ACTUAL FADE-OUT TIME
IS SHORTER.
END
NOTES
1. IF BOTH BLDIM AND BLOFF ARE SET TO ZERO, THE ACTIVATION IN THE MAX AND DIM STATES
IS CONTROLLED BY THE PROCESSOR BY SETTING THE BLEN AND DIM_EN BITS IN THE MDCR REGISTER.
Figure 11. Set Backlight Timing Flowchart
Rev. 0 | Page 20 of 44
08158-011
END
Software User Guide
UG-005
SET_LEDS_CURRENTS
SET BACKLIGHT CURRENT
LAW IN CFGR REGISTER
(LAW)
SET INDIVIDUAL SINKS
CURRENT LAW IN ISCFR
REGISTER (SC_LAW)
SET BACKLIGHT MAX
CURRENT LEVEL
(DAYLIGHT MODE)
IN BLMX1 REGISTER
SET BACKLIGHT DIM
CURRENT LEVEL
(DAYLIGHT MODE) IN
BLDM1 REGISTER
SET BACKLIGHT MAX
CURRENT LEVEL
(OFFICE MODE) IN
BLMX2 REGISTER
SET BACKLIGHT DIM
CURRENT LEVEL
(OFFICE MODE) IN
BLDM2 REGISTER
SET BACKLIGHT MAX
CURRENT LEVEL (DARK MODE)
IN BLMX3 REGISTER
SET BACKLIGHT DIM
CURRENT LEVEL (DARK MODE)
IN BLDM3 REGISTER
EXAMPLE:
iscfr.SC_LAW = 3
SQUARE LAW CUBIC 2 DAC
USE TABLE 2 TO GET THE CURRENT VALUE
BASED ON THE DIGITAL VALUE
PROGRAMMED IN BLMX1 AND THE
CONTROL LAW SELECTED.
USE TABLE 2 TO GET THE CURRENT VALUE
BASED ON THE DIGITAL VALUE
PROGRAMMED IN BLDM1 AND THE
CONTROL LAW SELECTED.
USE TABLE 2 TO GET THE CURRENT VALUE
BASED ON THE DIGITAL VALUE PROGRAMMED
IN BLMX2 AND THE CONTROL LAW SELECTED.
USE TABLE 2 TO GET THE CURRENT VALUE BASED
ON THE DIGITAL VALUE PROGRAMMED IN BLDM2
AND THE CONTROL LAW SELECTED.
USE TABLE 2 TO GET THE CURRENT VALUE
BASED ON THE DIGITAL VALUE PROGRAMMED
IN BLMX3 AND THE CONTROL LAW SELECTED.
USE TABLE 2 TO GET THE CURRENT VALUE
BASED ON THE DIGITAL VALUE PROGRAMMED
IN BLDM3 AND THE CONTROL LAW SELECTED.
ONLY THE USED INDIVIDUAL SINK CURRENT
REGISTERS MUST BE INITIALIZED. ASSUMING
LED4 TO LED7 ARE SELECTED AS INDIVIDUAL
SINKS THEN REGISTERS ISC4 TO ISC7 NEED TO
BE INITIALIZED. EACH REGISTER CAN BE
PROGRAMMED AT DIFFERENT CURRENT LEVELS.
FOR BIT 7 IN ISC7, SELECT 0mA TO 60mA RANGE
(IF SET) OR 0mA TO 30mA (IF CLEARED).
08158-012
SET INDIVIDUAL SINKx
MAX CURRENT LEVEL IN
ISCx REGISTER
EXAMPLE:
cfgr.LAW = 0
LINEAR LAW DAC
END
Figure 12. Set LEDs Currents Flowchart
Rev. 0 | Page 21 of 44
UG-005
Software User Guide
SET_ISINKS_TIMING
WRITE INDIVIDUAL SINKS
ON-TIME IN ISCT1[7:6]
REGISTER
WRITE INDIVIDUAL SINK1
OFF-TIME IN ISCT2[1:0]
REGISTER
(ZERO = ALWAYS ON)
WRITE INDIVIDUAL SINK2
OFF-TIME IN ISCT2[3:2]
REGISTER
(ZERO = ALWAYS ON)
WRITE INDIVIDUAL SINK3
OFF-TIME IN ISCT3[5:4]
REGISTER
(ZERO = ALWAYS ON)
WRITE INDIVIDUAL SINK4
OFF-TIME IN ISCT2[7:6]
REGISTER
(ZERO = ALWAYS ON)
WRITE INDIVIDUAL SINK5
OFF-TIME IN ISCT1[1:0]
REGISTER
(ZERO = ALWAYS ON)
WRITE INDIVIDUAL SINK6
OFF-TIME IN ISCT1[3:2]
REGISTER
(ZERO = ALWAYS ON)
WRITE INDIVIDUAL SINK7
OFF-TIME IN ISCT1[5:4]
REGISTER
(ZERO = ALWAYS ON)
NOTE: THIS FLOW ASSUMES THAT ALL THE LEDS
ARE USED AS INDIVIDUAL SINKS. DISREGARD
INDIVIDUAL SINK(S) WRITE OPERATION FOR THOSE
LEDS USED AS BACKLIGHT.
EXAMPLE:
isct1.SCON = 11b
INDIVIDUAL SINKS ON-TIME IS 1.2 SEC.
EXAMPLE:
isct2.SC1OFF = 01b
INDIVIDUAL SINK 1 OFF-TIME IS 0.6 SEC.
EXAMPLE:
isct2.SC2OFF = 01b
INDIVIDUAL SINK 2 OFF-TIME IS 0.6 SEC.
EXAMPLE:
isct2.SC3OFF = 01b
INDIVIDUAL SINK 3 OFF-TIME IS 0.6 SEC.
EXAMPLE:
isct2.SC4OFF = 01b
INDIVIDUAL SINK 4 OFF-TIME IS 0.6 SEC.
EXAMPLE:
isct2.SC5OFF = 00b
INDIVIDUAL SINK 5 IS ALWAYS ON.
EXAMPLE:
isct2.SC6OFF = 11b
INDIVIDUAL SINK 6 OFF-TIME IS 1.8 SEC.
EXAMPLE:
isct2.SC7OFF = 11b
INDIVIDUAL SINK 7 OFF-TIME IS 1.8 SEC.
EXAMPLE:
iscf.SCFI = 0011b
INDIVIDUAL SINKS FADE-IN IN 0.9 SEC.
THIS TIME IS FULL-SCALE TO ZERO. IF THE
PROGRAMMED CURRENT IS DIFFERENT, THE
ACTUAL FADE-IN TIME IS SHORTER.
WRITE INDIVIDUAL SINKS
FADE-OUT TIME IN ISCF[7:4]
REGISTER
(ZERO = FADE-OUT DISABLED)
EXAMPLE:
iscf.SCFO = 0111b
INDIVIDUAL SINKS FADE-OUT IN 2.1 SEC.
THIS TIME IS FULL-SCALE TO ZERO. IF THE
PROGRAMMED CURRENT IS DIFFERENT THE
ACTUAL FADE-OUT TIME IS SHORTER.
08158-013
WRITE INDIVIDUAL SINKS
FADE-IN TIME IN ISCF[3:0]
REGISTER
(ZERO = FADE-IN DISABLED)
END
Figure 13. Set ISINKS Timing Flowchart
Rev. 0 | Page 22 of 44
Software User Guide
UG-005
ACTIVATE_BACKLIGHT
AUTOMATIC BACKLIGHT
BRIGHTNESS LEVEL?
NO
YES
DISABLE FORCED BACKLIGHT
BRIGHTNESS LEVEL.
cfgr.BLV = 3
EXAMPLE:
cfgr.BLV = 0 (DAYLIGHT)
0 = DAYLIGHT, 1 = OFFICE, 2 = DARK
SELECT FORCED BACKLIGHT
BRIGHTNESS LEVEL.
BITS BLV[1:0] IN CFGR
BRING DEVICE OUT OF
STANDBY.
mdcr.NSTBY = 1
ENABLE BACKLIGHT
mdcr.BLEN = 1
BACKLIGHT FADE-IN
OVERRIDE?
NO
YES
ENABLE BL OVERRIDE
cfgr.FOVR = 1
NO
DISABLE BL OVERRIDE
cfgr.FOVR = 0
FORCE BACKLIGHT
AT DIM BRIGHTNESS
LEVEL?
YES
FORCE BL DIM
cfgr.DIM_EN = 1
NORMAL BL OPERATION
cfgr.DIM_EN = 0
NO
COMMAND
EXECUTED?
END
Figure 14. Activate Backlight Flowchart
Rev. 0 | Page 23 of 44
08158-014
YES
UG-005
Software User Guide
TURN_OFF_BACKLIGHT
YES
BACKLIGHT FORCED
TO DIM LEVEL ?
NO
mdcr.BLEN = 0
ENTER IN
STANDBY?
NO
YES
END
Figure 15. Turn Off Backlight Flowchart
Rev. 0 | Page 24 of 44
08158-015
mdcr.NSTBY = 0
Software User Guide
UG-005
ACTIVATE_INDIVIDUAL_SINKS
YES
TURN ON
ISINK 1?
NO
iscc.SC1_EN = 1
iscc.SC1_EN = 0
YES
TURN ON
ISINK 2?
NO
iscc.SC2_EN = 1
iscc.SC2_EN = 0
YES
TURN ON
ISINK 3?
NO
iscc.SC3_EN = 1
iscc.SC3_EN = 0
YES
TURN ON
ISINK 4?
NO
iscc.SC4_EN = 1
iscc.SC4_EN = 0
YES
TURN ON
ISINK 5?
NO
iscc.SC5_EN = 1
iscc.SC5_EN = 0
YES
TURN ON
ISINK 6?
IF D6 IS SELECTED AS
SECOND PHOTOTRANSISTOR,
THIS STEP SHOULD BE SKIPPED.
NO
iscc.SC6_EN = 1
iscc.SC6_EN = 0
YES
TURN ON
ISINK 7?
NO
iscc.SC7_EN = 1
iscc.SC7_EN = 0
YES
iscc = 0?
YES
SYNCHRONIZED
INDIVIDUAL SINKS
ACTIVATION?
NO
NO
YES
END
Figure 16. Activate Individual Sinks Flowchart
Rev. 0 | Page 25 of 44
08158-016
mdcr.SIS_EN = 1
UG-005
Software User Guide
TURN_OFF_INDIVIDUAL_SINKS
NO
TURN OFF
ISINK 1?
YES
iscc.SC1_EN = 0
NO
TURN OFF
ISINK 2?
YES
iscc.SC2_EN = 0
NO
TURN OFF
ISINK 3?
YES
iscc.SC3_EN = 0
NO
TURN OFF
ISINK 4?
YES
iscc.SC4_EN = 0
NO
TURN OFF
ISINK 5?
YES
iscc.SC5_EN = 0
NO
IF D6 IS SELECTED AS
SECOND PHOTOTRANSISTOR,
THIS STEP SHOULD BE SKIPPED.
TURN OFF
ISINK 6?
YES
iscc.SC6_EN = 0
TURN OFF
ISINK 7?
YES
iscc.SC7_EN = 0
YES
iscc = 0?
YES
SYNCHRONIZED
INDIVIDUAL SINKS
ACTIVATION?
NO
NO
YES
mdcr.SIS_EN = 0
08158-017
NO
END
Figure 17. Turn Off Individual Sinks Flowchart
Rev. 0 | Page 26 of 44
Software User Guide
UG-005
SETUP_INTERRU PTS
NO
INTERRUPT
MASKED 50µs WHEN
CLEARED
OPTION?
YES
mdcr.INT_CFG = 0
mdcr.INT_CFG = 1
NO
ENABLE LIGHT
SENSING
COMPARATOR 1
INTERRUPT?
YES
intr_en.CMP_IEN = 1
intr_en.CMP_IEN = 0
NO
ENABLE LIGHT
SENSING
COMPARATOR 2
INTERRUPT?
YES
intr_en.CMP2_IEN = 1
intr_en.CMP2_IEN = 0
NO
ENABLE
OVER-VOLTAGE
DETECTION
INTERRUPT?
YES
intr_en.OVP_IEN = 1
intr_en.OVP_IEN = 0
NO
ENABLE THERMAL
SHUTDOWN DETECTION
INTERRUPT?
YES
intr_en.TSD_IEN = 1
intr_en.TSD_IEN = 0
NO
ENABLE
SHORT-CIRCUIT
DETECTION
INTERRUPT?
YES
intr_en.SHORT_IEN = 1
END
Figure 18. Setup Interrupts Flowchart
Rev. 0 | Page 27 of 44
08158-018
intr_en.SHORT_IEN = 0
UG-005
Software User Guide
SERVICE_INTERRUPTS
NOTE: THIS OPERATION GUARANTEES THAT
ONLY THE INTERRUPT(S) ENABLED WILL BE
TESTED IN THE SERVICE INTERRUPT ROUTINE
YES
CMP_LCONTROL: VERIFIES THE
COMPARATOR 1 TRIPPING THRESHOLD
AND ADJUSTS THE BACKLIGHT BRIGHTNESS
LEVEL. THIS IMPLEMENTATION IS NOT
NEEDED IF THE AUTO CONTROL MODE
IS ENABLED. PROCESSOR CAN ALSO TEST
THE COMPARATOR 1 OUTPUTS (L2_OUT
AND L3_OUT) IN ORDER TO DETERMINE
THE CURRENT AMBIENT LIGHT LEVEL.
FORCE_RD BIT IN ccfg REGISTER
MUST BE SET TO 1 TO READ THE
COMPARATOR OUTPUTS.
WRITE BACK
mdcr2.CMP_INT = 1
(CLEAR PENDING INTERRUPT)
WRITE BACK
mdcr2.CMP2_INT = 1
(CLEAR PENDING INTERRUPT)
NO
INTERRUPT FROM
COMPARATOR 2
mdcr2.CMP2_INT = 1?
NO
CMP2_LCONTROL
YES
OVP_CHECK: VERIFIES THAT THE OVP
CONDITION IS REPEATED. IF NEEDED, THE
DEVICE ACTIVATION WILL BE STOPPED
AND PLACED IN STANDBY MODE.
INTERRUPT FROM
COMPARATOR 1
mdcr2.CMP_INT = 1?
CMP_LCONTROL
YES
CMP2_LCONTROL: VERIFIES THE
COMPARATOR 2 TRIPPING THRESHOLD
AND ADJUSTS THE BACKLIGHT BRIGHTNESS
LEVEL. THIS IMPLEMENTATION IS NOT
NEEDED IF THE AUTO CONTROL MODE IS
ENABLED. PROCESSOR CAN ALSO TEST
THE COMPARATOR 2 OUTPUTS (L2_OUT2
AND L3_OUT2) IN ORDER TO DETERMINE
THE CURRENT AMBIENT LIGHT LEVEL.
FORCE_RD2 BIT IN ccfg2 REGISTER
MUST BE SET TO 1 TO READ THE
COMPARATOR OUTPUTS.
INTR_TO CHECK =
INTR_EN AND MDCR2
WRITE BACK
mdcr2.OVP_INT = 1
(CLEAR PENDING INTERRUPT)
INTERRUPT FROM
OVER-VOLTAGE DETECTION
mdcr2.OVP_INT = 1?
NO
OVP_CHECK
SHORT_CHECK: WHEN A
SHORT-CIRCUIT OCCURS THE
DEVICE WILL AUTOMATICALLY
SHUT OFF. THE EXTERNAL
PROCESSOR MAY RETRY THE
ACTIVATION A FEW TIMES BEFORE
TURNING OFF THE DEVICE AND
POSTING AN ERROR MESSAGE.
WRITE BACK
mdcr2.TSD_INT = 1
(CLEAR PENDING INTERRUPT)
NO
TSD_CHECK
INTERRUPT
FROM SHORT-CIRCUIT
DETECTION
mdcr2.OVP_INT = 1?
WRITE BACK
mdcr2.OVP_INT = 1
(CLEAR PENDING INTERRUPT)
NO
SHORT_CHECK
END
Figure 19. Service Interrupts Flowchart
Rev. 0 | Page 28 of 44
08158-019
TSD_CHECK: WHEN THERMAL
SHUTDOWN OCCURS THE DEVICE
WILL AUTOMATICALLY SHUTDOWN.
THE OPERATION AND BE PLACED IN
STANDBY MODE. THE EXTERNAL
PROCESSOR MAY MONITOR THE
TSD_INT TO BE CLEAR (DEVICE
COOLED DOWN) IN ORDER TO
RESTART THE ACTIVATION.
INTERRUPT
FROM THERMAL
SHUTDOWN DETECTION
mdcr2.TSD_INT = 1?
Software User Guide
UG-005
SET_LIGHT_SENSING
WRITE OFFICE TO DARK
(L3) THRESHOLD IN L3TRP
REGISTER
WRITE DARK TO OFFICE
(L3) HYSTERESIS IN L3HYS
REGISTER
WRITE DAYLIGHT TO
OFFICE (L2) THRESHOLD IN
L2TRP REGISTER
WRITE OFFICE TO
DAYLIGHT (L2) HYSTERESIS
IN L2HYS REGISTER
NO
BACKLIGHT
AUTOLEVEL
CONTROL?
EXAMPLE:
l3trp = 8DEC
CORRESPONDS TO 4µA OR 10 LUX
EXAMPLE:
l3hys = 10DEC
CORRESPONDS TO 5µA OR 12.5 LUX
EXAMPLE:
l2trp = 70DEC
CORRESPONDS TO 280µA OR 700 LUX
EXAMPLE:
l2hys = 80DEC
CORRESPONDS TO 320µA OR 800 LUX
ENABLING THE AUTO-LEVEL CONTROL
THE BACKLIGHT LEVEL DEPENDS ON
THE LIGHT SENSING DETECTION. UP
TWO THRESHOLD (THREE ZONES) CAN
BE DEFINED.
YES
BACKLIGHT LEVEL CAN BE
CONTROLLED MANUALLY BY SERVICING
COMPARATOR INTERRUPTS OR POLLING
THE COMPARATOR STATUS BITS IN
MDCR2 REGISTER. SEE
LIGHT_SENSING_MANUAL_CONTROL.
SET TO 1
BITS L2_EN AND/OR L3_EN
IN CCFG REGISTER AND
BIT CMP_AUTOEN in MDCR
REGISTER
NO
EXAMPLE:
ccfg.L2_EN = 1
ccfg.L3_EN = 1
mdcr.CMP_AUTOEN = 1
BOTH LEVELS (DARK TO OFFICE AND
OFFICE TO DAYLIGHT) ARE USED TO
CONTROL AUTOMATICALLY THE BACKLIGHT.
TWO
PHOTOTRANSISTORS
USED?
YES
SELECT D6 AS LED6 SINK
IN CFGR REGISTER (CMP2_SEL)
cfgr.CPM2_SEL = 0
SELECT D6 AS INPUT
FOR THE SECOND
PHOTOTRANSISTOR IN
CFGR REGISTER (CMP2_SEL)
cfgr.CPM2_SEL = 1
YES
BACKLIGHT AUTOLEVEL
ENABLED FOR SECOND
PHOTOTRANSISTOR?
NO
BACKLIGHT LEVEL CAN BE
CONTROLLED MANUALLY BY
SERVICING COMPARATOR
INTERRUPTS OR POLLING THE
COMPARATOR STATUS BITS IN
MDCR2 REGISTER. SEE
LIGHT_SENSING_MANUAL_CONTROL.
YES
SET TO 1
BITS L2_EN2 AND/OR
L3_EN2 IN CCFG2 REGISTER
AND BIT CMP_AUTOEN IN
MDCR REGISTER
EXTERNAL PROCESSOR
SELECTS THE
PHOTOTRANSISTOR
CONTROLLING THE BACKLIGHT.
SEL_AB BIT IN CFGR REGISTER
ALLOWS THE SELECTION
END
Figure 20. Set Light Sensing Flowchart
Rev. 0 | Page 29 of 44
08158-020
cfgr.SEL_AB = 0
PHOTOTRANSISTOR 1
cfgr.SEL_AB = 1
PHOTOTRANSISTOR 2
EXAMPLE:
ccfg.L2_EN2 = 1
ccfg.L3_EN2 = 1
mdcr.CMP_AUTOEN = 1
BOTH LEVELS (DARK TO OFFICE AND
OFFICE TO DAYLIGHT) ARE USED TO
CONTROL AUTOMATICALLY THE BACKLIGHT.
UG-005
Software User Guide
REGISTERS MAP
Table 14.
Addr
0x00
0x01
0x02
0x03
0x04
0x05
0x06
0x07
0x08
0x09
0x0A
0x0B
0x0C
0x0D
0x0E
0x0F
0x10
0x11
0x12
0x13
0x14
0x15
0x16
0x17
0x18
0x19
0x1A
0x1B
0x1C
0x1D
0x1E
0x1F
0x20
0x21
0x22
0x23
0x24
Reg. Name
MFDVID
MDCR
MDCR2
INTR_EN
CFGR
BLSEN
BLOFF
BLDIM
BLFR
BLMX1
BLDM1
BLMX2
BLDM2
BLMX3
BLDM3
ISCFR
ISCC
ISCT1
ISCT2
ISCF
ISC7
ISC6
ISC5
ISC4
ISC3
ISC2
ISC1
CCFG
CCFG2
L2_TRP
L2_HYS
L3_TRP
L3_HYS
PH1LEVL
PH1LEVH
PH2LEVL
PH2LEVH
Bit 7
Reserved
Reserved
Reserved
Reserved
Reserved
Bit 6
Bit 5
Manufacture ID
INT_CFG
NSTBY
Reserved
Reserved
SEL_AB
CMP2_SEL
D7EN
D6EN
Bit 4
Bit 3
Bit 2
DIM_EN
SHORT_INT
SHORT_IEN
Reserved
TSD_INT
TSD_IEN
BLV
D5EN
D4EN
OFFT
DIMT
Bit 1
Device ID
SIS_EN
CMP_AUTOEN
OVP_INT
CMP2_INT
OVP_IEN
CMP2_IEN
Law
D3EN
D2EN
BL_FO
Bit 0
BLEN
CMP_INT
CMP_IEN
FOVR
D1EN
BL_FI
Reserved
Reserved
Reserved
Reserved
Reserved
Reserved
BL1_MC
BL1_DC
BL2_MC
BL2_DC
BL3_MC
BL3_DC
Reserved SC7_EN
SCON
SC4OFF
SC6_EN
Reserved
SC5_EN
SC7OFF
SC3OFF
SC4_EN
SC3_EN
SC6OFF
SC2OFF
SCFO
SCR
Reserved
Reserved
Reserved
Reserved
Reserved
Reserved
FILT
FILT2
SC2_EN
SC_LAW
SC1_EN
SC5OFF
SC1OFF
SCFI
SCD7
SCD6
SCD5
SCD4
SCD3
SCD2
SCD1
FORCE_RD
L3_OUT
FORCE_RD2
L3_OUT2
L2_TRP
L2_HYS
L3_TRP
L3_HYS
PH1LEV_LOW
Reserved
L2_OUT
L2_OUT2
PH1LEV_HIGH
PH2LEV_LOW
Reserved
PH2LEV_HIGH
Refer to the ADP8860 data sheet for a detailed description of each register.
Rev. 0 | Page 30 of 44
L3_EN
L3_EN2
L2_EN
L2_EN2
Software User Guide
UG-005
PSEUDOCODE IMPLEMENTATION
The pseudo language implementation presented in this user guide uses a C-like programming syntax to describe the registers and
functions needed to operate the backlight, individual sinks, and automatic light sensing. The goal is to provide a clear understanding for
the device functionality and this may not be the most optimized approach for the device driver development. For example, the registers
are being implemented as a C structure to better visualize and label the bit mapping of each register; however, in a real application
constants can be used since there is no need to have variables allocated for the ADP8860.
LISTING FOR ADP8860_REGS.H
/*********************************************************************************/
#define _MFDVID 0x00
struct reg_0x00
/* Manufacturing and device ID address */
{
unsigned DEVICE_ID : 4;
unsigned MANUFACTURER_ID : 4;
};
/*********************************************************************************/
#define _MDCR 0x01
struct reg_0x01
/* Device control and status */
{
unsigned BLEN : 1;
unsigned CMP_AUTOEN : 1;
unsigned SIS_EN : 1;
unsigned RESERVED : 1;
unsigned DIM_EN : 1;
unsigned NSTBY : 1;
};
/*********************************************************************************/
#define _MDCR2 0x02
struct reg_0x02
/* Interrupt pending flags */
{
unsigned CMP_INT : 1;
unsigned CMP2_INT : 1;
unsigned OVP_INT : 1;
unsigned TSD_INT : 1;
unsigned SHORT_INT : 1;
};
/*********************************************************************************/
#define _INTR_EN 0x03
struct reg_0x03
/* Interrupt enable bits */
{
unsigned CMP_IEN : 1;
unsigned CMP2_IEN : 1;
unsigned OVP_IEN : 1;
unsigned TSD_IEN : 1;
unsigned SHORT_IEN : 1;
};
Rev. 0 | Page 31 of 44
UG-005
Software User Guide
/*********************************************************************************/
#define _CFGR 0x04
/* Configuration register */
struct reg_0x04 {
unsigned FOVR : 1;
unsigned LAW : 2;
unsigned BLV : 2;
unsigned CMP2_SEL : 1;
unsigned SEL_AB : 1;
};
/*********************************************************************************/
#define _BLSEN 0x05
/* Backlight or individual sink selection */
struct
{
reg_0x05
unsigned D1EN : 1;
unsigned D2EN : 1;
unsigned D3EN : 1;
unsigned D4EN : 1;
unsigned D5EN : 1;
unsigned D6EN : 1;
unsigned D7EN : 1;
};
/*********************************************************************************/
#define _BLOFF 0x06
/* Backlight OFF timeout */
unsigned char offt = 0;
/* 0 = timeout disabled, value range 1 to 127, 1-bit = 1 sec. */
/*********************************************************************************/
#define _BLDIM 0x07
/* Backlight DIM timeout */
unsigned char dimt;
/* 0 = timeout disabled, value range 1 to 127, 1-bit = 1 sec */
/*********************************************************************************/
#define
_BLFR 0x08
struct reg_0x08
/* Backlight fade-in and fade-out times */
{
unsigned BL_FI : 4;
unsigned BL_FO : 4;
};
/*********************************************************************************/
#define _BLMX1 0x09
/* Backlight MAX brightness for daylight condition */
unsigned char blmx1 = 0;
square) */
/* Value range 0 to 127, 1-bit value depends on law used (linear or
/*********************************************************************************/
#define _BLMD1 0x0A
/* Backlight DIM brightness for daylight condition */
unsigned char blmd1 = 0;
square) */
/* Value range 0 to 127, 1-bit value depends on law used (linear or
/*********************************************************************************/
#define _BLMX2 0x0B
/* Backlight MAX brightness for office condition */
unsigned char blmx2 = 0;
square) */
/* Value range 0 to 127, 1-bit value depends on law used (linear or
/*********************************************************************************/
#define _BLMD2 0x0C
/* Backlight DIM brightness for office condition */
unsigned char blmd2 = 0;
square) */
/* Value range 0 to 127, 1-bit value depends on law used (linear or
Rev. 0 | Page 32 of 44
Software User Guide
UG-005
/*********************************************************************************/
#define _BLMX3 0x0D
/* Backlight MAX brightness for dark condition */
unsigned char blmx3 = 0;
square) */
/* Value range 0 to 127, 1-bit value depends on law used (linear or
/*********************************************************************************/
#define _BLMD3 0x0E
/* Backlight DIM brightness for dark condition */
unsigned char blmd3 = 0;
square) */
/* Value range 0 to 127, 1-bit value depends on law used (linear or
/*********************************************************************************/
#define _ISCFR 0x0F
/* Independent sinks current fade law */
unsigned char sc_law = 0; /* Value 0 to 3 (0 = linear law, 1 = square law, 2 = square law Cubic
1, 3 = square law Cubic 2) */
/*********************************************************************************/
#define _ISCC 0x10
/* Independent sinks control register */
struct reg_0x10 {
unsigned SC1_EN : 1;
unsigned SC2_EN : 1;
unsigned SC3_EN : 1;
unsigned SC4_EN : 1;
unsigned SC5_EN : 1;
unsigned SC6_EN : 1;
unsigned SC7_EN : 1;
};
/*********************************************************************************/
#define
_ISCT1 0x11
struct reg_0x11
/* Independent sinks on time and LED7 to LED5 off-time control */
{
unsigned SC5OFF :2;
unsigned SC6OFF : 2;
unsigned SC7OFF : 2;
unsigned SCON : 2;
};
/*********************************************************************************/
#define _ISCT2 0x12
struct reg_0x12
/* Independent sinks LED4 to LED1 off-time control */
{
unsigned SC1OFF : 2;
unsigned SC2OFF : 2;
unsigned SC3OFF : 2;
unsigned SC4OFF : 2;
};
/*********************************************************************************/
#define _ISCF 0x13
struct reg_0x13
/* Independent sinks fade control */
{
unsigned SCFI : 4;
unsigned SCFO : 4;
};
Rev. 0 | Page 33 of 44
UG-005
Software User Guide
/*********************************************************************************/
#define _ISC7 0x14
struct reg_0x14
/* Independent sink current for LED7 */
{
unsigned SCD7 : 7;
/* Value range 0 to 127, 1-bit value depends on use */
unsigned SCR : 1;
};
/*********************************************************************************/
#define _ISC6 0x15
/* Independent sink current for LED6 */
unsigned char isc6 = 0;
/* Value range 0 to 127, 1-bit value depends on use */
/*********************************************************************************/
#define _ISC5 0x16
/* Independent sink current for LED5 */
unsigned char isc5 = 0;
/* Value range 0 to 127, 1-bit value depends on use */
/*********************************************************************************/
#define _ISC4 0x17
/* Independent sink current for LED4 */
unsigned char isc4 = 0;
/* Value range 0 to 127, 1-bit value depends on use */
/*********************************************************************************/
#define _ISC3 0x18
/* Independent sink current for LED3 */
unsigned char isc3 = 0;
/* Value range 0 to 127, 1-bit value depends on use */
/*********************************************************************************/
#define _ISC2 0x19
/* Independent sink current for LED2 */
unsigned char isc2 = 0;
/* Value range 0 to 127, 1-bit value depends on use */
/*********************************************************************************/
#define _ISC1 0x1A
/* Independent sink current for LED1 */
unsigned char isc1 = 0;
/* Value range 0 to 127, 1-bit value depends on use */
/*********************************************************************************/
#define _CCFG 0x1B
/* Light sensing Comparator 1 configuration register */
struct reg_0x1B {
unsigned L2_EN : 1;
unsigned L3_EN : 1;
unsigned L2_OUT : 1;
unsigned L3_OUT :1;
unsigned FORCE_RD : 1;
unsigned FILT : 3;
};
/*********************************************************************************/
#define _CCFG2 0x1C
/* Light sensing Comparator 2 configuration register */
struct reg_0x1C {
unsigned L2_EN2 : 1;
unsigned L3_EN2 : 1;
unsigned L2_OUT2 : 1;
unsigned L3_OUT2 :1;
unsigned FORCE_RD2 : 1;
unsigned FILT2 : 1;
};
Rev. 0 | Page 34 of 44
Software User Guide
UG-005
/*********************************************************************************/
#define _L2TRP 0x1D
/* L2 brightness comparator reference for both phototransistors */
unsigned char l2trp = 0;
/*********************************************************************************/
#define _L2HYS 0x1E
/* L2 comparator hysteresis for both phototransistors */
unsigned char l2hys = 0;
/*********************************************************************************/
#define _L3TRP 0x1F
/* L3 brightness comparator reference for both phototransistors */
unsigned char l3trp = 0;
/*********************************************************************************/
#define _L3HYS 0x20
/* L3 comparator hysteresis for both phototransistors */
unsigned char l3hys = 0;
/*********************************************************************************/
#define _PH1LEVL 0x21
/* First phototransistor ambient light level-lower byte */
unsigned char ph1levl = 0;
/*********************************************************************************/
#define _PH1LEVH 0x22
/* First phototransistor ambient light level-upper byte */
unsigned char ph1levh = 0;
/*********************************************************************************/
#define _PH2LEVL 0x23
/* Second phototransistor ambient light level-lower byte */
unsigned char ph2levl = 0;
/*********************************************************************************/
#define _PH2LEVH 0x24
/* Second phototransistor ambient light level-upper byte */
unsigned char ph2levh = 0;
/*********************************************************************************/
Rev. 0 | Page 35 of 44
UG-005
Software User Guide
LISTING FOR ADP8860 CONSTANTS.H
const unsigned char ENABLE_BACKLIGHT = 1;
const unsigned char DISABLE_BACKLIGHT = 0;
const unsigned char LIGHT_SENSOR_AUTO = 1;
const unsigned char LIGHT_SENSOR_MANUAL = 0;
const unsigned char ENABLE_SINKS_SYNCHRONOUSLY = 1;
const unsigned char DISABLE_SINKS_SYNCHRONOUSLY = 0;
const unsigned char FORCE_DIM_LEVEL = 1;
const unsigned char CONTRL_DIM_LEVEL = 0;
const unsigned char NORMAL_MODE = 1;
const unsigned char STANDBY_MODE = 0;
/********************************/
const unsigned char ENABLE_INTERRUPT = 1;
const unsigned char DISABLE_INTERRUPT = 0;
/********************************/
const unsigned char OVERRIDE_BACKLIGHT_FADEIN = 1;
const unsigned char ENABLE_BACKLIGHT_FADEIN = 0;
const unsigned char BL_LINEAR_LAW = 0;
const unsigned char BL_SQUARE_LAW = 1;
const unsigned char BL_CUBIC1_LAW = 2;
const unsigned char BL_CUBIC2_LAW = 3;
const unsigned char FORCE_BACKLIGHT_DAYLIGHT = 0;
const unsigned char FORCE_BACKLIGHT_OFFICE = 1;
const unsigned char FORCE_BACKLIGHT_DARK = 2;
const unsigned char DISABLE_FORCE_BACKLIGHT = 3;
const unsigned char D6_IS_2nd_PHOTOSENSOR = 1;
const unsigned char D6_IS_CURRENT_SINK = 0;
const unsigned char SELECT_2nd_PHOTOSENSOR = 1;
const unsigned char SELECT_1st_PHOTOSENSOR = 0;
/********************************/
const unsigned char LED_INDEPENDENT_SINK = 1;
const unsigned char LED_IS_BACKLIGHT = 0;
/********************************/
const unsigned char FADE_DISABLE = 0;
const unsigned char FADING_0p3SEC = 1;
const unsigned char FADING_0p6SEC = 2;
const unsigned char FADING_0p9SEC = 3;
const unsigned char FADING_1p2SEC = 4;
const unsigned char FADING_1p5SEC = 5;
const unsigned char FADING_1p8SEC = 6;
const unsigned char FADING_2p1SEC = 7;
const unsigned char FADING_2p4SEC = 8;
const unsigned char FADING_2p7SEC = 9;
const unsigned char FADING_3p0SEC = 10;
const unsigned char FADING_3p5SEC = 11;
const unsigned char FADING_4p0SEC = 12;
const unsigned char FADING_4p5SEC = 13;
Rev. 0 | Page 36 of 44
Software User Guide
UG-005
const unsigned char FADING_5p0SEC = 14;
const unsigned char FADING_5p5SEC = 15;
/********************************/
const unsigned char SINK_LINEAR_LAW = 0;
const unsigned char SINK_SQUARE_LAW = 1;
const unsigned char SINK_CUBIC1_LAW = 2;
const unsigned char SINK_CUBIC2_LAW = 3;
/********************************/
const unsigned char ENABLE_ISINK = 1;
const unsigned char DISABLE_ISINK = 0;
/********************************/
const unsigned char ISINK_0p2SEC_ON = 0;
const unsigned char ISINK_0p6SEC_ON = 1;
const unsigned char ISINK_0p9SEC_ON = 2;
const unsigned char ISINK_1p2SEC_ON = 3;
const unsigned char ISINK_ALWAYS_ON = 0;
const unsigned char ISINK_0p6SEC_OFF = 1;
const unsigned char ISINK_1p2SEC_OFF = 2;
const unsigned char ISINK_1p8SEC_OFF = 3;
/********************************/
const unsigned char SINK7_60mA = 1;
const unsigned char SINK7_30mA = 0;
const float FULL_SCALE_30mA = 30;
const float FULL_SCALE_60mA = 60;
/********************************/
const unsigned char L2_AUTO_LEVEL = 1;
const unsigned char L2_COMP_DISABLED = 0;
const unsigned char L3_AUTO_LEVEL = 1;
const unsigned char L3_COMP_DISABLED = 0;
const unsigned char FORCE_COMP_READ = 1;
const unsigned char LIGHTSENS_FILTER_80mS = 0;
const unsigned char LIGHTSENS_FILTER_160mS = 1;
const unsigned char LIGHTSENS_FILTER_320mS = 2;
const unsigned char LIGHTSENS_FILTER_640mS = 3;
const unsigned char LIGHTSENS_FILTER_1280mS = 4;
const unsigned char LIGHTSENS_FILTER_2560mS = 5;
const unsigned char LIGHTSENS_FILTER_5120mS = 6;
const unsigned char LIGHTSENS_FILTER_10240mS = 7;
/********************************/
const float L2_LUX_X_LSB = 10;
const float L2_uA_X_LSB = 4;
const float L3_LUX_X_LSB = 1.25;
const float L3_uA_X_LSB = 0.5;
/********************************/
Rev. 0 | Page 37 of 44
UG-005
Software User Guide
LISTING FOR ADP8860 RESET.H
/*********************************************************************************/
struct reg_0x00 mfdvid;
/*********************************************************************************/
struct reg_0x01 mdcr = {0,0,0,0,0,0};
/*********************************************************************************/
struct reg_0x02 mdcr2 = {0,0,0,0,0};
/*********************************************************************************/
struct reg_0x03 intr_en = {0,0,0,0,0};
/*********************************************************************************/
struct reg_0x04 cfgr = {0,0,0,0,0};
/*********************************************************************************/
struct reg_0x05 blsen = {0,0,0,0,0,0,0};
/*********************************************************************************/
struct reg_0x08 blfr = {0,0};
/*********************************************************************************/
struct reg_0x10 iscc = {0,0,0,0,0,0,0};
/*********************************************************************************/
struct reg_0x11 isct1 = {0,0,0,0};
/*********************************************************************************/
struct reg_0x12 istc2 = {0,0,0,0};
/*********************************************************************************/
struct reg_0x13 iscf = {0,0};
/*********************************************************************************/
struct reg_0x14 isc7 = {0,0};
/*********************************************************************************/
struct reg_0x1B ccfg = {0,0,0,0,0,0};
/*********************************************************************************/
struct reg_0x1C ccfg2 = {0,0,0,0,0,0};
/***********************************
Rev. 0 | Page 38 of 44
Software User Guide
UG-005
LISTING FOR ADP8860 MAINPROGRAM.C
#include <stdio.h>
#include <tcconio.h>
#include <string.h>
#include <math.h>
#include "ADP8860 regs.h"
#include "ADP8860 constants.h"
#include "ADP8860 reset.h"
const unsigned char SLAVE_ID_WR = 0x54;
const unsigned char SLAVE_ID_RD = 0x55;
/*********************************************************************
* This main program simulates the ADP8860 registers initialization
* using the following conditions:
*
LED1 to LED4 are part of the backlight
*
LED5 and LED7 are individual sinks.
*
Backlight current is controlled automatically by two comparators
*
The brightness levels in the three modes are as follows:
*
Dark: MAX = 13.5 mA − DIM = 3.5 mA
*
Office: MAX = 20.7 mA − DIM = 5 mA
*
Daylight: MAX = 27.4 mA − DIM = 8.5 mA
*
Backlight fade-in time is 1.5 sec
*
Backlight fade-out time is 4 sec
*
Time backlight driven at MAX level is 30 sec
*
Time backlight driven at DIM level is 15 sec
*
Current for LED5 is 20 mA
*
Current for LED7 is 55 mA (drives keypad light)
*
Individual sinks fade-in time is 0.6 sec
*
Individual sinks fade-out time is 4 sec
*
LED5, when activated, is turned on for 0.6 sec and off for 1.8 sec
*
LED7, when activated, is always on
*
Dark-to-office comparator threshold (L3) is 100 LUX
*
L3 comparator hysteresis is +15 LUX (115 LUX)
*
Office to daylight comparator threshold (L2) is 700 LUX
*
L2 comparator hysteresis is +100 LUX (800 LUX)
*
The values given before do not represent the real operating conditions
*
and are only provided as an indicative example to set up the device operation
***********************************************************************/
Rev. 0 | Page 39 of 44
UG-005
Software User Guide
int main(void)
{
clrscr();
/* Control Registers and Interrupt Initialization */
mdcr.CMP_AUTOEN = LIGHT_SENSOR_AUTO; /* Enable backlight auto control from comparator */
cfgr.LAW = BL_SQUARE_LAW;
/* Default transfer law for setting backlight LED current */
cfgr.CMP2_SEL = D6_IS_2nd_PHOTOSENSOR; /* Select D6 (LED6) as input for 2nd phototransistor */
cfgr.BLV = DISABLE_FORCE_BACKLIGHT;
/* Backlight levels are not software forced */
cfgr.FOVR = ENABLE_BACKLIGHT_FADEIN; /* Allows backlight fade-in time */
intr_en.CMP_IEN = DISABLE_INTERRUPT; /* Disable interrupts from Comparator 1 */
intr_en.CMP2_IEN = DISABLE_INTERRUPT; /* Disable interrupts from Comparator 2 */
intr_en.OVP_IEN = ENABLE_INTERRUPT;
/* Enable interrupt caused by overvoltage conditions */
intr_en.TSD_IEN = ENABLE_INTERRUPT;
/* Enable interrupt caused by thermal shutdown */
intr_en.SHORT_IEN = ENABLE_INTERRUPT; /* Enable interrupt caused by short circuits */
/* Backlight Parameters Initialization */
blsen.D5EN = LED_INDEPENDENT_SINK;
/* LED 5 selected as individual sink */
blsen.D7EN = LED_INDEPENDENT_SINK;
/* LED 7 selected as individual sink */
dimt = 30;
/* Backlight timeout in MAX phase is 30 sec */
offt = 15;
/* Backlight timeout in DIM phase is 15 sec */
blfr.BL_FI = FADING_1p5SEC;
/* Backlight fade-in time is 1.5 sec */
blfr.BL_FO = FADING_4p0SEC;
/* Backlight fade-out time is 4 sec */
const float BLMAX_DAYLIGHT_CURRENT_mA = 27.4; /* Default MAX daylight backlight desired current in mA */
const float BLMAX_OFFICE_CURRENT_mA = 20.7;
/* Default MAX office backlight desired current in mA */
const float BLMAX_DARK_CURRENT_mA = 13.5;
/* Default MAX dark backlight desired current in mA */
const float BLDIM_DAYLIGHT_CURRENT_mA = 8.5;
/* Default DIM daylight backlight desired current in mA */
const float BLDIM_OFFICE_CURRENT_mA = 5;
/* Default DIM office backlight desired current in mA */
const float BLDIM_DARK_CURRENT_mA = 3.5;
/* Default DIM dark backlight desired current in mA */
blmx1 = CalcCurrent(BLMAX_DAYLIGHT_CURRENT_mA,cfgr.LAW,FULL_SCALE_30mA); /* Calculate the brightness
register value corresponding to the desired backlight current */
blmx2 = CalcCurrent(BLMAX_OFFICE_CURRENT_mA,cfgr.LAW,FULL_SCALE_30mA);
blmx3 = CalcCurrent(BLMAX_DARK_CURRENT_mA,cfgr.LAW,FULL_SCALE_30mA);
blmd1 = CalcCurrent(BLDIM_DAYLIGHT_CURRENT_mA,cfgr.LAW,FULL_SCALE_30mA);
blmd2 = CalcCurrent(BLDIM_OFFICE_CURRENT_mA,cfgr.LAW,FULL_SCALE_30mA);
blmd3 = CalcCurrent(BLDIM_DARK_CURRENT_mA,cfgr.LAW,FULL_SCALE_30mA);
/* Individual Sinks Parameters Initialization */
sc_law = SINK_SQUARE_LAW;
/* Individual sink transfer law is square */
isct1.SCON = ISINK_0p6SEC_ON;
/* Enabled individual sinks on for 0.6 sec */
isct1.SC7OFF = ISINK_ALWAYS_ON;
/* LED7 when activated is always on (keypad light) */
isct1.SC5OFF = ISINK_1p8SEC_OFF;
/* LED5 when activated stays on 0.6 sec and off 1.8 sec */
iscf.SCFI = FADING_0p6SEC;
/* Fade-in time for the individual sinks is 0.6 sec */
iscf.SCFO = FADING_4p0SEC;
/* Fade-out time for the individual sinks is 4 sec */
const float SC5MAX_CURRENT_mA = 20;
/* Default max current for LED5 in mA */
const float SC7MAX_CURRENT_mA = 55;
/* Default max current for LED7 in mA */
isc5 = CalcCurrent(SC5MAX_CURRENT_mA,sc_law,FULL_SCALE_30mA);
isc7.SCD7 = CalcCurrent(SC7MAX_CURRENT_mA,sc_law,FULL_SCALE_60mA);
isc7.SCR = SINK7_60mA;
Rev. 0 | Page 40 of 44
Software User Guide
UG-005
/* Comparator Parameters Initialization */
ccfg.FILT = LIGHTSENS_FILTER_1280mS;
/* Select 1.28 sec filter */
ccfg.FILT2 = LIGHTSENS_FILTER_1280mS;
/* Select 1.28 sec filter */
ccfg.L2_EN = L2_AUTO_LEVEL;
/* L2 Comparator 1 allowed to auto control backlight */
ccfg.L3_EN = L3_AUTO_LEVEL;
/* L3 comparator 1 allowed to auto control backlight */
ccfg2.L2_EN2 = L2_AUTO_LEVEL;
/* L2 comparator 2 allowed to auto control backlight */
ccfg2.L3_EN2 = L3_AUTO_LEVEL;
/* L3 comparator 2 allowed to auto control backlight */
l2trp = rint(700/L2_LUX_X_LSB);
/* Set L2 trip point threshold */
l2hys = rint(100/L2_LUX_X_LSB);
l2trp level */
/* Set L2 hysteresis threshold, this value is added to
l3trp = rint(100/L3_LUX_X_LSB);
/* Set L2 trip point threshold */
l3hys = rint(15/L3_LUX_X_LSB);
added to l3trp level */
/* Set L3 hysteresis point threshold, this value is
seam_read = ENABLE_SEAMLESS;
/* Enable special Motorola seamless mode */
2
/* Simulate Commands Sent Out Through the I C Interface */
printf("- (I2C Write) DevID+W = 0x%X [RegAddr = 0x%X], [Value = 0x%X]\n", SLAVE_ID_WR,_MDCR,mdcr);
printf("- (I2C Write) DevID+W = 0x%X,[RegAddr = 0x%X], [Value = 0x%X]\n",SLAVE_ID_WR,_CFGR,cfgr);
printf("- (I2C Write) DevID+W = 0x%X,[RegAddr = 0x%X], [Value =
0x%X]\n",SLAVE_ID_WR,_INTR_EN,intr_en);
printf("- (I2C Write) DevID+W = 0x%X,[RegAddr = 0x%X], [Value = 0x%X]\n",SLAVE_ID_WR,_BLSEN,blsen);
printf("- (I2C Write) DevID+W = 0x%X,[RegAddr = 0x%X], [Value = 0x%X]\n",SLAVE_ID_WR,_BLOFF,offt);
printf("- (I2C Write) DevID+W = 0x%X,[RegAddr = 0x%X], [Value = 0x%X]\n",SLAVE_ID_WR,_BLDIM,dimt);
printf("- (I2C Write) DevID+W = 0x%X,[RegAddr = 0x%X], [Value = 0x%X]\n",SLAVE_ID_WR,_BLFR,blfr,0);
printf("- (I2C Write) DevID+W = 0x%X,[RegAddr = 0x%X], [Value = 0x%X]\n",SLAVE_ID_WR,_BLMX1,blmx1);
printf("- (I2C Write) DevID+W = 0x%X,[RegAddr = 0x%X], [Value = 0x%X]\n",SLAVE_ID_WR,_BLMD1,blmd1);
printf("- (I2C Write) DevID+W = 0x%X,[RegAddr = 0x%X], [Value = 0x%X]\n",SLAVE_ID_WR,_BLMX2,blmx2);
printf("- (I2C Write) DevID+W = 0x%X,[RegAddr = 0x%X], [Value = 0x%X]\n",SLAVE_ID_WR,_BLMD2,blmd2);
printf("- (I2C Write) DevID+W = 0x%X,[RegAddr = 0x%X], [Value = 0x%X]\n",SLAVE_ID_WR,_BLMX3,blmx3);
printf("- (I2C Write) DevID+W = 0x%X,[RegAddr = 0x%X], [Value = 0x%X]\n",SLAVE_ID_WR,_BLMD3,blmd3);
printf("- (I2C Write) DevID+W = 0x%X,[RegAddr = 0x%X], [Value = 0x%X]\n",SLAVE_ID_WR,_ISCFR,sc_law);
printf("- (I2C Write) DevID+W = 0x%X,[RegAddr = 0x%X], [Value = 0x%X]\n",SLAVE_ID_WR,_ISCT1,isct1);
printf("- (I2C Write) DevID+W = 0x%X,[RegAddr = 0x%X], [Value = 0x%X]\n",SLAVE_ID_WR,_ISCF,iscf);
printf("- (I2C Write) DevID+W = 0x%X,[RegAddr = 0x%X], [Value = 0x%X]\n",SLAVE_ID_WR,_ISC5,isc5);
printf("- (I2C Write) DevID+W = 0x%X,[RegAddr = 0x%X], [Value = 0x%X]\n",SLAVE_ID_WR,_ISC7,isc7);
printf("- (I2C Write) DevID+W = 0x%X,[RegAddr = 0x%X], [Value = 0x%X]\n",SLAVE_ID_WR,_CCFG,ccfg);
printf("- (I2C Write) DevID+W = 0x%X,[RegAddr = 0x%X], [Value = 0x%X]\n",SLAVE_ID_WR,_CCFG2,ccfg2);
printf("- (I2C Write) DevID+W = 0x%X,[RegAddr = 0x%X], [Value = 0x%X]\n",SLAVE_ID_WR,_L2TRP,l2trp);
printf("- (I2C Write) DevID+W = 0x%X,[RegAddr = 0x%X], [Value = 0x%X]\n",SLAVE_ID_WR,_L2HYS,l2hys);
printf("- (I2C Write) DevID+W = 0x%X,[RegAddr = 0x%X], [Value = 0x%X]\n",SLAVE_ID_WR,_L3TRP,l3trp);
printf("- (I2C Write) DevID+W = 0x%X,[RegAddr = 0x%X], [Value = 0x%X]\n",SLAVE_ID_WR,_L3HYS,l3hys);
return 0;
}
Rev. 0 | Page 41 of 44
UG-005
Software User Guide
/***********************************************************************************************
Support Functions
/***********************************************************************************************/
/* Returns the LED current value based on the value written in the register, the transfer law, and the fullscale current value */
float GetCurrent(int CurrVal, int Law, int FullScale )
{
if (Law == 1)
return (CurrVal*0.236);
else return pow((CurrVal*sqrt(FullScale)/127),2);
}
/*********************************************************************************************************/
/* Returns the value to write in the LED current register based on the desired current value, transfer law,
and full-scale current value */
unsigned char CalcCurrent(float DesiredCurrent, int Law, float FullScale)
{
if (Law == 0)
return rint((DesiredCurrent * 127)/FullScale);
else return rint(127*sqrt(DesiredCurrent)/sqrt(FullScale));
}
Rev. 0 | Page 42 of 44
Software User Guide
UG-005
NOTES
Rev. 0 | Page 43 of 44
UG-005
Software User Guide
NOTES
©2009 Analog Devices, Inc. All rights reserved. Trademarks and
registered trademarks are the property of their respective owners.
UG08158-0-7/09(0)
Rev. 0 | Page 44 of 44