6.0Overview of Timer Modules....................................................................................................................................................... 43
11.0 Synchronous Serial Port (SSP) Module .................................................................................................................................... 63
14.0 Special Features of the CPU...................................................................................................................................................103
15.0 Instruction Set Summary......................................................................................................................................................... 119
16.0 Development Support.............................................................................................................................................................. 137
18.0 DC and AC Characteristics Graphs and Tables......................................................................................................................161
Index .................................................................................................................................................................................................. 177
List of Equations And Examples ........................................................................................................................................................ 181
List of Figures..................................................................................................................................................................................... 181
List of Tables...................................................................................................................................................................................... 182
We constantly strive to improve the quality of all our products and documentation. We have spent an exceptional
amount of time to ensure that these documents are correct. However, we realize that we may have missed a few
things. If you find any information that is missing or appears in error, please use the reader response form in the
back of this data sheet to inform us. We appreciate your assistance in making this a better document.
DS30444E - page 4
1997 Microchip Technology Inc.
PIC16C9XX
1.0GENERAL DESCRIPTION
The PIC16C9XX is a family of
mance, CMOS, fully-static, 8-bit microcontrollers with
an integrated LCD Driver module, in the PIC16CXXX
mid-range family.
All PICmicro™ microcontrollers employ an advanced
RISC architecture. The PIC16CXXX microcontroller
family has enhanced core features, eight-level deep
stack, and multiple internal and external interrupt
sources. The separate instruction and data buses of the
Harvard architecture allow a 14-bit wide instruction
word with the separate 8-bit wide data. The two stage
instruction pipeline allows all instructions to execute in
a single cycle, except for program branches (which
require two cycles). A total of 35 instructions (reduced
instruction set) are available. Additionally, a large register set gives some of the architectural innov ations used
to achieve a very high performance.
PIC16CXXX microcontrollers typically achieve a 2:1
code compression and a 4:1 speed improvement over
other 8-bit microcontrollers in their class.
The PIC16C923 devices have 176 bytes of RAM and
25 I/O pins. In addition several peripheral features are
available including: three timer/counters, one Capture/Compare/PWM module, one serial port and one
LCD module. The Synchronous Serial P ort can be configured as either a 3-wire Serial Peripheral Interface
(SPI) or the two-wire Inter-Integrated Circuit (I
The LCD module features programmable multiplex
mode (static, 1/2, 1/3 and 1/4) and drive bias (static and
1/3). It is capable of driving up to 32 segments and up
to 4 commons. It can also drive the LCD panel while in
SLEEP mode.
The PIC16C924 devices have 176 bytes of RAM and
25 I/O pins. In addition several peripheral features are
available including: three timer/counters, one Capture/Compare/PWM module, one serial port and one
LCD module. The Synchronous Serial P ort can be configured as either a 3-wire Serial Peripheral Interface
(SPI) or the two-wire Inter-Integrated Circuit (I
The LCD module features programmable multiplex
mode (static, 1/2, 1/3 and 1/4) and drive bias (static and
1/3). It is capable of driving up to 32 segments and up
to 4 commons. It can also drive the LCD panel while in
SLEEP mode. The PIC16C924 also has an 5-channel
high-speed 8-bit A/D. The 8-bit resolution is ideally
suited for applications requiring low-cost analog interface, e.g. thermostat control, pressure sensing, and
meters.
The PIC16C9XX family has special features to reduce
external components, thus reducing cost, enhancing
system reliability and reducing power consumption.
There are four oscillator options, of which the single pin
RC oscillator provides a low-cost solution, the LP oscillator minimizes power consumption, XT is a standard
crystal, and the HS is for High Speed crystals. The
SLEEP (power-down) feature provides a power saving
low-cost, high-perfor-
2
C) bus.
2
C) bus.
mode. The user can wake up the chip from SLEEP
through several external and internal interrupts and
reset(s).
A highly reliable Watchdog Timer with its own on-chip
RC oscillator provides recovery in the event of a software lock-up.
A UV erasable CERQUAD (compatible with PLCC)
packaged version is ideal for code development while
the cost-effective One-Time-Programmable (OTP) version is suitable for production in any volume.
The PIC16C9XX family fits perfectly in applications
ranging from handheld meters, thermostats, to home
security products. The EPROM technology makes customization of application programs (LCD panels, calibration constants, sensor interfaces, etc.) extremely
fast and conv enient. The small f ootprint packages make
this microcontroller series perfect for all applications
with space limitations. Low cost, low pow er, high perf ormance, ease of use and I/O flexibility make the
PIC16C9XX very versatile even in areas where no
microcontroller use has been considered before (e.g.
timer functions, capture and compare, PWM functions
and coprocessor applications).
1.1F
Users familiar with the PIC16C5X microcontroller family
will realize that this is an enhanced version of the
PIC16C5X architecture. Please refer to Appendix A for
a detailed list of enhancements. Code written for the
PIC16C5X can be easily ported to the PIC16CXXX
family of devices (Appendix B).
1.2De
PIC16C9XX devices are supported by the complete
line of Microchip Development tools.
Please refer to Section 16.0 for more details about
Microchip’s development tools.
amily and Upward Compatibility
velopment Support
1997 Microchip Technology Inc.DS30444E- page 5
PIC16C9XX
TABLE 1-1: PIC16C9XX FAMILY OF DEVICES
PIC16C923
Clock
Memory
Peripherals
Features
All PICmicro Family devices ha v e Power-on Reset, selectable Watchdog Timer, selectable code protect and high I/O current capability . All PIC16C9XX Family devices use serial programming with clock pin RB6 and data pin RB7.
Maximum Frequency of Operation (MHz)88
EPROM Program Memory 4K4K
Data Memory (bytes)176176
Timer Module(s)TMR0,
TMR1,
TMR2
Capture/Compare/PWM Module(s)11
Serial Port(s)
Interrupt Sources89
I/O Pins2525
Input Pins2727
Voltage Range (Volts)2.5-6.02.5-6.0
In-Circuit Serial ProgrammingYesYes
Brown-out Reset——
Packages64-pin SDIP,
2
SPI/I
CSPI/I
32 Seg
TQFP;
68-pin PLCC,
Die
PIC16C924
TMR0,
TMR1,
TMR2
2
C
4 Com,
32 Seg
64-pin SDIP,
TQFP;
68-pin PLCC,
Die
DS30444E - page 6
1997 Microchip Technology Inc.
PIC16C9XX
2.0PIC16C9XX DEVICE VARIETIES
A variety of frequency ranges and packaging options
are available . Depending on application and production
requirements, the proper device option can be selected
using the information in the PIC16C9XX Product Identification System section at the end of this data sheet.
When placing orders, please use that page of the data
sheet to specify the correct part number.
For the PIC16C9XX family, there are two device “types”
as indicated in the device number:
1. C , as in PIC16 C 924. These devices have
EPROM type memory and operate over the
standard voltage range.
2. LC , as in PIC16 LC 924. These devices have
EPROM type memory and operate over an
extended voltage range.
2.1UV Erasab
The UV erasable version, offered in CERQUAD package, is optimal for prototype dev elopment and pilot programs.
The UV erasable version can be erased and reprogrammed to any of the configuration modes.
Microchip's PICSTART
grammers both support the PIC16C9XX. Third party
programmers also are available; refer to the
Third Party Guide
le Devices
Plus and PRO MATE
for a list of sources.
II pro-
Microchip
2.3Quic
k-Turnaround-Production (QTP)
Devices
Microchip offers a QTP Programming Service for factory production orders. This service is made available
for users who choose not to program a medium to high
quantity of units and whose code patterns have stabilized. The devices are identical to the OTP devices but
with all EPROM locations and configuration options
already programmed by the factory. Certain code and
prototype verification procedures apply before production shipments are available. Please contact your local
Microchip Technology sales office for more details.
2.4Serializ
Production (SQTP
Microchip offers a unique programming service where
a few user-defined locations in each device are programmed with different serial numbers. The serial numbers may be random, pseudo-random or sequential.
Serial programming allows each device to have a
unique number which can serve as an entry-code,
password or ID number.
ed Quick-Turnaround
SM
) De
vices
2.2One-Time-Pr
ogrammable (OTP)
Devices
The availability of OTP devices is especially useful for
customers who need the flexibility for frequent code
updates and small volume applications.
The OTP devices , packaged in plastic packages, permit
the user to program them once. In addition to the program memory, the configuration bits must also be programmed.
1997 Microchip Technology Inc.DS30444E - page 7
PIC16C9XX
NOTES:
DS30444E - page 8
1997 Microchip Technology Inc.
PIC16C9XX
3.0ARCHITECTURAL OVERVIEW
The high performance of the PIC16CXXX family can be
attributed to a number of architectural features commonly found in RISC microprocessors. To begin with,
the PIC16CXXX uses a Harvard architecture, in which,
program and data are accessed from separate memories using separate buses. This improves bandwidth
over traditional von Neumann architecture where program and data are fetched from the same memory
using the same bus. Separating program and data
buses further allows instructions to be sized differently
than the 8-bit wide data word. Instruction opcodes are
14-bits wide making it possible to have all single word
instructions. A 14-bit wide progr am memory access bus
fetches a 14-bit instruction in a single cycle. A
two-stage pipeline overlaps fetch and execution of
instructions (Example 3-1). Consequently, all instructions execute in a single cycle (500 ns @ 8 MHz) e xcept
for program branches.
The PIC16C923 and PIC16C924 both address 4K x 14
of program memory and 176 x 8 of data memory.
The PIC16CXXX can directly or indirectly address its
register files or data memory. All special function registers, including the program counter, are mapped in the
data memory. The PIC16CXXX has an orthogonal
(symmetrical) instruction set that makes it possible to
carry out any operation on any register using any
addressing mode. This symmetrical nature and lack of
‘special optimal situations’ make programming with the
PIC16CXXX simple yet efficient, thus significantly
reducing the learning curve.
PIC16CXXX devices contain an 8-bit ALU and working
register. The ALU is a general purpose ar ithmetic unit.
It performs arithmetic and Boolean functions between
the data in the working register and any register file.
The ALU is 8-bits wide and capable of addition, subtraction, shift and logical operations. Unless otherwise
mentioned, arithmetic operations are two's complement in nature. In two-operand instructions, typically
one operand is the working register (W register). The
other operand is a file register or an immediate constant. In single operand instructions, the operand is
either the W register or a file register.
The W register is an 8-bit working register used f or ALU
operations. It is not an addressable register.
Depending on the instruction executed, the ALU may
affect the values of the Carry (C), Digit Carry (DC), and
Zero (Z) bits in the STATUS register. The C and DC bits
operate as a borro
respectively, in subtraction. See the SUBLW and SUBWF
instructions for examples.
OSC1/CLKIN222414IST/CMOSOscillator crystal input or external clock source input. This
OSC2/CLKOUT232515O—Oscillator crystal output. Connects to crystal or resonator
MCLR/VPP1257I/PSTMaster clear (reset) input or programming voltage input.
RA0/AN04560I/OTTLRA0 can also be Analog input0.
RA1/AN15661I/OTTLRA1 can also be Analog input1.
RA2/AN27863I/OTTLRA2 can also be Analog input2.
RA3/AN3/VREF8964I/OTTLRA3 can also be Analog input3 or A/D Voltage Refer-
RA4/T0CKI9101I/OSTRA4 can also be the clock input to the Timer0
RA5/AN4/SS10112I/OTTLRA5 can be the slave select for the synchronous serial
RB0/INT12134I/OTTL/STRB0 can also be the external interrupt pin. This buffer
RB111123I/OTTL
RB23459I/OTTL
RB32358I/OTTL
RB4646856I/OTTLInterrupt on change pin.
RB5636755I/OTTLInterrupt on change pin.
RB6616553I/OTTL/STInterrupt on change pin. Serial programming clock.
RB7626654I/OTTL/STInterrupt on change pin. Serial programming data.
RC0/T1OSO/T1CKI242616I/OSTRC0 can also be the Timer1 oscillator output or
RC1/T1OSI252717I/OSTRC1 can also be the Timer1 oscillator input.
RC2/CCP1262818I/OSTRC2 can also be the Capture1 input/Compare1 out-
RC3/SCK/SCL13145I/OSTRC3 can also be the synchronous serial clock
RC4/SDI/SDA14156I/OSTRC4 can also be the SPI Data In (SPI mode) or data
RC5/SDO15167I/OSTRC5 can also be the SPI Data Out (SPI mode).
C116178PLCD Voltage Generation.
C217189PLCD Voltage Generation.
VLCD3192011P—LCD Voltage.
VDD20, 6022, 6412, 52P—Digital power.
VSS6, 217, 2313, 62P—Ground reference.
NC—1———These pins are not internally connected. These pins should
DS30444E - page 14 1997 Microchip Technology Inc.
PIC16C9XX
3.1Clocking Scheme/Instruction Cycle
The clock input (from OSC1) is internally divided by
four to generate four non-overlapping quadrature
clocks namely Q1, Q2, Q3 and Q4. Internally, the program counter (PC) is incremented every Q1, the
instruction is fetched from the program memory and
latched into the instruction register in Q4. The instruction is decoded and executed during the following Q1
through Q4. The clocks and instruction execution flow
is shown in Figure 3-3.
FIGURE 3-3:CLOCK/INSTRUCTION CYCLE
Q2Q3Q4
OSC1
Q1
Q2
Q3
Q4
PC
OSC2/CLKOUT
(RC mode)
Q1
PCPC+1PC+2
Fetch INST (PC)
Execute INST (PC-1)Fetch INST (PC+1)
Q1
3.2Instruction Flow/Pipelining
An “Instruction Cycle” consists of four Q cycles (Q1,
Q2, Q3 and Q4). The instruction fetch and execute are
pipelined such that fetch takes one instruction cycle
while decode and execute takes another instruction
cycle. However, due to the pipelining, each instruction
effectively executes in one cycle. If an instruction
causes the program counter to change (e.g. GOTO)
then two cycles are required to complete the instruction
(Example 3-1).
A fetch cycle begins with the program counter (PC)
incrementing in Q1.
In the execution cycle , the fetched instruction is latched
into the “Instruction Register" in cycle Q1. This instruction is then decoded and executed during the Q2, Q3,
and Q4 cycles. Data memory is read during Q2 (operand read) and written during Q4 (destination write).
Q2Q3Q4
Execute INST (PC)Fetch INST (PC+2)
Q2Q3Q4
Q1
Execute INST (PC+1)
Internal
phase
clock
EXAMPLE 3-1:INSTRUCTION PIPELINE FLOW
Tcy0Tcy1Tcy2Tcy3Tcy4Tcy5
1. MOVLW 55h
2. MOVWF PORTB
3. CALL SUB_1
4. BSF PORTA, BIT3 (Forced NOP)
5. Instruction @ address SUB_1
All instructions are single cycle, except for any program branches. These take two cycles since the fetch
instruction is “flushed” from the pipeline while the new instruction is being fetched and then executed.
DS30444E - page 16 1997 Microchip Technology Inc.
PIC16C9XX
4.0MEMORY ORGANIZATION
4.1Program Memory Organization
The PIC16C9XX family has a 13-bit program counter
capable of addressing an 8K x 14 program memory
space.
Only the first 4K x 14 (0000h-0FFFh) is physically
implemented. Accessing a location above the physically implemented addresses will cause a wraparound.
The reset vector is at 0000h and the interrupt vector is
at 0004h.
FIGURE 4-1:PROGRAM MEMORY MAP
AND STACK
PC<12:0>
CALL, RETURN
RETFIE, RETLW
Interrupt Vector
On-chip Program
Space
User Memory
Memory (Page 0)
On-chip Program
Memory (Page 1)
Stack Level 1
Stack Level 8
Reset Vector
13
0000h
0004h
0005h
07FFh
0800h
4.2Data Memory Organization
The data memory is partitioned into four Banks which
contain the General Purpose Registers and the Special
Function Registers. Bits RP1 and RP0 are the bank
select bits.
RP1:RP0 (STATUS<6:5>)
11 = Bank 3 (180h-1FFh)
10 = Bank 2 (100h-17Fh)
01 = Bank 1 (80h-FFh)
00 = Bank 0 (00h-7Fh)
The lower locations of each Bank are reserved for the
Special Function Registers. Above the Special Function Registers are General Purpose Registers implemented as static RAM. All four banks contain special
function registers. Some “high use” special function
registers are mirrored in other banks for code reduction
and quicker access.
4.2.1GENERAL PURPOSE REGISTER FILE
The register file can be accessed either directly , or indi-
rectly through the File Select Register FSR
(Section 4.5).
The following General Purpose Registers are not physically implemented:
• F0h-FFh of Bank 1
• 170h-17Fh of Bank 2
• 1F0h-1FFh of Bank 3
These locations are used for common access across
DS30444E - page 18 1997 Microchip Technology Inc.
70h-7Fh
Bank 1
Unimplemented data memory locations, read as '0'.
Note 1: Not a physical register.
2: These registers are not implemented on the PIC16C923.
EFh
F0h
FFh
Mapped in
Bank 0
70h-7Fh
Bank 2
16F
170
17F
Mapped in
Bank 0
70h-7Fh
Bank 3
1EFh
1F0h
1FFh
PIC16C9XX
4.2.2SPECIAL FUNCTION REGISTERS
The special function registers can be classified into two
sets (core and peripheral). Those registers associated
The Special Function Registers are registers used by
the CPU and Peripheral Modules for controlling the
desired operation of the device. These registers are
implemented as static RAM.
with the “core” functions are described in this section,
and those related to the operation of the peripheral features are described in the section of that peripheral feature.
00hINDFAddressing this location uses contents of FSR to address data memory (not a physical register)0000 0000 0000 0000
01hTMR0Timer0 module’s registerxxxx xxxx uuuu uuuu
02hPCLProgram Counter's (PC) Least Significant Byte0000 0000 0000 0000
03hSTATUSIRPRP1RP0T
04hFSRIndirect data memory address pointerxxxx xxxx uuuu uuuu
05hPORTA
06hPORTBPORTB Data Latch when written: PORTB pins when readxxxx xxxx uuuu uuuu
07hPORTC
08hPORTDPORTD Data Latch when written: PORTD pins when read0000 0000 0000 0000
09hPORTEPORTE pins when read0000 0000 0000 0000
0AhPCLATH
0BhINTCONGIE PEIET0IEINTERBIET0IFINTFRBIF0000 000x 0000 000u
0ChPIR1LCDIFADIF
0Dh—Unimplemented——
0EhTMR1LHolding register for the Least Significant Byte of the 16-bit TMR1 registerxxxx xxxx uuuu uuuu
0FhTMR1HHolding register for the Most Significant Byte of the 16-bit TMR1 registerxxxx xxxx uuuu uuuu
10hT1CON
11hTMR2Timer2 module’s register0000 0000 0000 0000
12hT2CON
13hSSPBUFSynchronous Serial Port Receive Buffer/Transmit Registerxxxx xxxx uuuu uuuu
14hSSPCONWCOLSSPOVSSPENCKPSSPM3SSPM2SSPM1SSPM00000 0000 0000 0000
15hCCPR1LCapture/Compare/PWM Register (LSB)xxxx xxxx uuuu uuuu
16hCCPR1HCapture/Compare/PWM Register (MSB)xxxx xxxx uuuu uuuu
17hCCP1CON
18h—Unimplemented——
19h—Unimplemented——
1Ah—Unimplemented——
1Bh—Unimplemented——
1Ch—Unimplemented——
1Dh—Unimplemented——
(1)
1Eh
1Fh
Legend:x = unknown, u = unchanged, q = value depends on condition, - = unimplemented read as '0',
Note1: Registers ADRES, ADCON0, and ADCON1 are not implemented in the PIC16C923, read as '0'.
ADRESA/D Result Registerxxxx xxxx uuuu uuuu
(1)
ADCON0ADCS1ADCS0CHS2CHS1CHS0GO/DONE
shaded locations are unimplemented, read as ‘0’.
2: These bits are reserved on the PIC16C923, always maintain these bits clear.
3: These pixels do not display, but can be used as general purpose RAM.
4: PIC16C923 reset values for PORTA: --xx xxxx for a POR, and --uu uuuu for all other resets,
PIC16C924 reset values for PORTA: --0x 0000 when read.
5: Bit1 of ADCON0 is reserved on the PIC16C924, always maintain this bit clear.
——PORTA Data Latch when written: PORTA pins when read
——PORTC Data Latch when written: PORTC pins when read--xx xxxx --uu uuuu
———Write Buffer for the upper 5 bits of the Program Counter---0 0000 ---0 0000
80hINDFAddressing this location uses contents of FSR to address data memory (not a physical register)0000 0000 0000 0000
81hOPTIONRBPU
82hPCLProgram Counter's (PC) Least Significant Byte0000 0000 0000 0000
83hSTATUSIRPRP1RP0T
84hFSRIndirect data memory address pointerxxxx xxxx uuuu uuuu
85hTRISA
86hTRISBPORTB Data Direction Register1111 1111 1111 1111
87hTRISC
88hTRISDPORTD Data Direction Register1111 1111 1111 1111
89hTRISEPORTE Data Direction Register1111 1111 1111 1111
8AhPCLATH
8BhINTCONGIEPEIET0IEINTERBIET0IFINTFRBIF0000 000x 0000 000u
8ChPIE1LCDIEADIE
8Dh—Unimplemented——
8EhPCON
8Fh—Unimplemented——
90h—Unimplemented——
91h—Unimplemented——
92hPR2Timer2 Period Register1111 1111 1111 1111
93hSSPADDSynchronous Serial Port (I
94hSSPSTATSMPCKED/A
95h—Unimplemented——
96h—Unimplemented——
97h—Unimplemented——
98h—Unimplemented——
99h—Unimplemented——
9Ah—Unimplemented——
9Bh—Unimplemented——
9Ch—Unimplemented——
9Dh—Unimplemented——
9Eh—Unimplemented——
(1)
9Fh
Legend:x = unknown, u = unchanged, q = value depends on condition, - = unimplemented read as '0',
Note1: Registers ADRES, ADCON0, and ADCON1 are not implemented in the PIC16C923, read as '0'.
ADCON1—————PCFG2PCFG1PCFG0---- -000 ---- -000
shaded locations are unimplemented, read as ‘0’.
2: These bits are reserved on the PIC16C923, always maintain these bits clear.
3: These pixels do not display, but can be used as general purpose RAM.
4: PIC16C923 reset values for PORTA: --xx xxxx for a POR, and --uu uuuu for all other resets,
PIC16C924 reset values for PORTA: --0x 0000 when read.
5: Bit1 of ADCON0 is reserved on the PIC16C924, always maintain this bit clear.
INTEDGT0CST0SEPSAPS2PS1PS01111 1111 1111 1111
OPDZDCC0001 1xxx 000q quuu
——PORTA Data Direction Register--11 1111 --11 1111
——PORTC Data Direction Register--11 1111 --11 1111
———Write Buffer for the upper 5 bits of the PC---0 0000 ---0 0000
(2)
——————POR—---- --0- ---- --u-
——SSPIECCP1IETMR2IETMR1IE00-- 0000 00-- 0000
2
C mode) Address Register0000 0000 0000 0000
PSR/WUABF0000 0000 0000 0000
Value on
Power-on
Reset
Value on all
other resets
DS30444E - page 20 1997 Microchip Technology Inc.
PIC16C9XX
TABLE 4-1: SPECIAL FUNCTION REGISTER SUMMARY (Cont.’d)
100hINDFAddressing this location uses contents of FSR to address data memory (not a physical register)0000 0000 0000 0000
101hTMR0Timer0 module’s registerxxxx xxxx uuuu uuuu
102hPCLProgram Counter's (PC) Least Significant Byte0000 0000 0000 0000
103hSTATUSIRPRP1RP0T
104hFSRIndirect data memory address pointerxxxx xxxx uuuu uuuu
105h—Unimplemented——
106hPORTBPORTB Data Latch when written: PORTB pins when readxxxx xxxx uuuu uuuu
107hPORTFPORTF pins when read0000 0000 0000 0000
108hPORTGPORTG pins when read0000 0000 0000 0000
109h—Unimplemented——
10AhPCLATH
10BhINTCONGIEPEIET0IEINTERBIET0IFINTFRBIF0000 000x 0000 000u
10Ch—Unimplemented——
10DhLCDSESE29SE27SE20SE16SE12SE9SE5SE01111 1111 1111 1111
10EhLCDPS
10FhLCDCONLCDENSLPEN
110hLCDD00
111hLCDD01
112hLCDD02
113hLCDD03
114hLCDD04
115hLCDD05
116hLCDD06
117hLCDD07
118hLCDD08
119hLCDD09
11AhLCDD10
11BhLCDD11
11ChLCDD12
11DhLCDD13
11EhLCDD14
11FhLCDD15
Legend:x = unknown, u = unchanged, q = value depends on condition, - = unimplemented read as '0',
shaded locations are unimplemented, read as ‘0’.
Note1: Registers ADRES, ADCON0, and ADCON1 are not implemented in the PIC16C923, read as '0'.
2: These bits are reserved on the PIC16C923, always maintain these bits clear.
3: These pixels do not display, but can be used as general purpose RAM.
4: PIC16C923 reset values for PORTA: --xx xxxx for a POR, and --uu uuuu for all other resets,
PIC16C924 reset values for PORTA: --0x 0000 when read.
5: Bit1 of ADCON0 is reserved on the PIC16C924, always maintain this bit clear.
———Write Buffer for the upper 5 bits of the PC---0 0000 ---0 0000
180hINDFAddressing this location uses contents of FSR to address data memory (not a physical register)0000 0000 0000 0000
181hOPTIONRBPU
182hPCLProgram Counter's (PC) Least Significant Byte0000 0000 0000 0000
183hSTATUSIRPRP1RP0T
184hFSRIndirect data memory address pointerxxxx xxxx uuuu uuuu
185h—Unimplemented——
186hTRISBPORTB Data Direction Register1111 1111 1111 1111
187hTRISFPORTF Data Direction Register1111 1111 1111 1111
188hTRISGPORTG Data Direction Register1111 1111 1111 1111
189h—Unimplemented——
18AhPCLATH
18BhINTCONGIEPEIET0IEINTERBIET0IFINTFRBIF0000 000x 0000 000u
18Ch—Unimplemented——
18Dh—Unimplemented——
18Eh—Unimplemented——
18Fh—Unimplemented——
190h—Unimplemented——
191h—Unimplemented——
192h—Unimplemented——
193h—Unimplemented——
194h—Unimplemented——
195h—Unimplemented——
196h—Unimplemented——
197h—Unimplemented——
198h—Unimplemented——
199h—Unimplemented——
19Ah—Unimplemented——
19Bh—Unimplemented——
19Ch—Unimplemented——
19Dh—Unimplemented——
19Eh—Unimplemented——
19Fh—Unimplemented——
Legend:x = unknown, u = unchanged, q = value depends on condition, - = unimplemented read as '0',
shaded locations are unimplemented, read as ‘0’.
Note1: Registers ADRES, ADCON0, and ADCON1 are not implemented in the PIC16C923, read as '0'.
2: These bits are reserved on the PIC16C923, always maintain these bits clear.
3: These pixels do not display, but can be used as general purpose RAM.
4: PIC16C923 reset values for PORTA: --xx xxxx for a POR, and --uu uuuu for all other resets,
PIC16C924 reset values for PORTA: --0x 0000 when read.
5: Bit1 of ADCON0 is reserved on the PIC16C924, always maintain this bit clear.
INTEDGT0CST0SEPSAPS2PS1PS01111 1111 1111 1111
OPDZDCC0001 1xxx 000q quuu
———Write Buffer for the upper 5 bits of the PC---0 0000 ---0 0000
Value on
Power-on
Reset
Value on all
other resets
DS30444E - page 22 1997 Microchip Technology Inc.
PIC16C9XX
4.2.2.1STATUS REGISTER
The ST ATUS register, shown in Figure 4-3, contains the
arithmetic status of the ALU, the RESET status and the
bank select bits for data memory.
The STATUS register can be the destination for any
instruction, as with any other register. If the STATUS
register is the destination for an instruction that affects
the Z, DC or C bits, then the write to these three bits is
disabled. These bits are set or cleared according to the
device logic. Furthermore, the T
writable. Therefore, the result of an instruction with the
STATUS register as destination may be different than
intended.
For example, CLRF STATUS will clear the upper-three
bits and set the Z bit. This leaves the STATUS register
as 000u u1uu (where u = unchanged).
O and PD bits are not
It is recommended, therefore, that only BCF, BSF,SWAPF and MOVWF instructions are used to alter the
STATUS register because these instructions do not
affect the Z, C or DC bits from the STA TUS register. For
other instructions, not affecting any status bits, see the
“Instruction Set Summary.”
Note 1: The C and DC bits operate as a borrow
and digit borrow bit, respectively, in subtraction. See the SUBLW and SUBWF
instructions for examples.
bit 7:IRP: Register Bank Select bit (used for indirect addressing)
1 = Bank 2, 3 (100h - 1FFh)
0 = Bank 0, 1 (00h - FFh)
bit 6-5: RP1:RP0: Register Bank Select bits (used for direct addressing)
11 = Bank 3 (180h - 1FFh)
10 = Bank 2 (100h - 17Fh)
01 = Bank 1 (80h - FFh)
00 = Bank 0 (00h - 7Fh)
bit 4:T
bit 3:PD
bit 2:Z: Zero bit
bit 1:DC: Digit carry/borro
bit 0:C: Carry/borro
O: Time-out bit
1 = After power-up, CLRWDT instruction, or SLEEP instruction
0 = A WDT time-out occurred
: Power-down bit
1 = After power-up or by the CLRWDT instruction
0 = By execution of the SLEEP instruction
1 = The result of an arithmetic or logic operation is zero
0 = The result of an arithmetic or logic operation is not zero
w bit (ADDWF, ADDLW,SUBLW,SUBWF instructions) (for borrow the polarity is reversed)
1 = A carry-out from the 4th low order bit of the result occurred
0 = No carry-out from the 4th low order bit of the result
w bit (ADDWF, ADDLW,SUBLW,SUBWF instructions) (for borrow the polarity is reversed)
1 = A carry-out from the most significant bit of the result occurred
0 = No carry-out from the most significant bit of the result occurred
Note: A subtraction is executed by adding the two’s complement of the second operand. For rotate (RRF,RLF) instructions, this bit is loaded with either the high or low order bit of the source register.
W = Writable bit
U = Unimplemented bit,
read as ‘0’
1 = Enables all un-masked interrupts
0 = Disables all interrupts
bit 6:PEIE: Peripheral Interrupt Enable bit
1 = Enables all un-masked peripheral interrupts
0 = Disables all peripheral interrupts
bit 5:T0IE: TMR0 Overflow Interrupt Enable bit
1 = Enables the TMR0 interrupt
0 = Disables the TMR0 interrupt
bit 4:INTE: RB0/INT External Interrupt Enable bit
1 = Enables the RB0/INT external interrupt
0 = Disables the RB0/INT external interrupt
bit 3:RBIE: RB Port Change Interrupt Enable bit
1 = Enables the RB port change interrupt
0 = Disables the RB port change interrupt
bit 2:T0IF: TMR0 Overflow Interrupt Flag bit
1 = TMR0 register has overflowed (must be cleared in software)
0 = TMR0 register did not overflow
bit 1:INTF: RB0/INT External Interrupt Flag bit
1 = The RB0/INT external interrupt occurred (must be cleared in software)
0 = The RB0/INT external interrupt did not occur
bit 0:RBIF: RB Port Change Interrupt Flag bit
1 = At least one of the RB7:RB4 pins changed state (see Section 5.2 to clear interrupt)
0 = None of the RB7:RB4 pins have changed state
Interrupt flag bits get set when an interrupt condition occurs regardless of the state of its corresponding enable bit or the
global enable bit, GIE (INTCON<7>). User software should ensure the appropriate interrupt flag bits are clear prior to
enabling an interrupt.
This register contains the individual enable bits for the
enable any peripheral interrupt.
peripheral interrupts.
FIGURE 4-6:PIE1 REGISTER (ADDRESS 8Ch)
R/W-0R/W-0U-0U-0R/W-0R/W-0R/W-0R/W-0
LCDIEADIE
bit7bit0
bit 7:LCDIE: LCD Interrupt Enable bit
bit 6:ADIE: A/D Converter Interrupt Enable bit
bit 5-4: Unimplemented: Read as '0'
bit 3:SSPIE: Synchronous Serial Port Interrupt Enable bit
bit 2:CCP1IE: CCP1 Interrupt Enable bit
bit 1:TMR2IE: TMR2 to PR2 Match Interrupt Enable bit
bit 0:TMR1IE: TMR1 Overflow Interrupt Enable bit
Note 1: Bit ADIE is reserved on the PIC16C923, always maintain this bit clear.
(1)
——SSPIECCP1IETMR2IETMR1IER = Readable bit
1 = Enables the LCD interrupt
0 = Disables the LCD interrupt
(1)
1 = Enables the A/D interrupt
0 = Disables the A/D interrupt
1 = Enables the SSP interrupt
0 = Disables the SSP interrupt
1 = Enables the CCP1 interrupt
0 = Disables the CCP1 interrupt
1 = Enables the TMR2 to PR2 match interrupt
0 = Disables the TMR2 to PR2 match interrupt
1 = Enables the TMR1 overflow interrupt
0 = Disables the TMR1 overflow interrupt
W = Writable bit
U = Unimplemented bit,
read as ‘0’
- n = Value at POR reset
DS30444E - page 26 1997 Microchip Technology Inc.
PIC16C9XX
4.2.2.5PIR1 REGISTER
This register contains the individual flag bits for the
peripheral interrupts.
Note:Interrupt flag bits get set when an interrupt
condition occurs regardless of the state of
its corresponding enable bit or the global
enable bit, GIE (INTCON<7>). User software should ensure the appropriate interrupt flag bits are clear prior to enabling an
interrupt.
FIGURE 4-7:PIR1 REGISTER (ADDRESS 0Ch)
R/W-0R/W-0U-0U-0R/W-0R/W-0R/W-0R/W-0
LCDIFADIF
bit7bit0
bit 7:LCDIF: LCD Interrupt Flag bit
bit 6:ADIF: A/D Converter Interrupt Flag bit
bit 5-4: Unimplemented: Read as '0'
bit 3:SSPIF: Synchronous Serial Port Interrupt Flag bit
bit 2:CCP1IF: CCP1 Interrupt Flag bit
bit 1:TMR2IF: TMR2 to PR2 Match Interrupt Flag bit
bit 0:TMR1IF: TMR1 Overflow Interrupt Flag bit
Note 1: Bit ADIF is reserved on the PIC16C923, always maintain this bit clear.
Interrupt flag bits get set when an interrupt condition occurs regardless of the state of its corresponding enable bit or the
global enable bit, GIE (INTCON<7>). User software should ensure the appropriate interrupt flag bits are clear prior to
enabling an interrupt.
(1)
——SSPIFCCP1IFTMR2IFTMR1IFR = Readable bit
W = Writable bit
U = Unimplemented bit,
- n = Value at POR reset
1 = LCD interrupt occurred (must be cleared in software)
0 = LCD interrupt did not occur
(1)
1 = An A/D conversion completed (must be cleared in software)
0 = The A/D conversion is not complete
1 = The transmission/reception is complete (must be cleared in software)
0 = Waiting to transmit/receive
Capture Mode
1 = A TMR1 register capture occurred (must be cleared in software)
0 = No TMR1 register capture occurred
Compare Mode
1 = A TMR1 register compare match occurred (must be cleared in software)
0 = No TMR1 register compare match occurred
PWM Mode
Unused in this mode
1 = TMR2 to PR2 match occurred (must be cleared in software)
0 = No TMR2 to PR2 match occurred
1 = TMR1 register overflowed (must be cleared in software)
0 = TMR1 register did not overflow
4.2.2.6PCON REGISTER
The Power Control (PCON) register contains a flag bit
to allow differentiation between a Power-on Reset
(POR) to an external MCLR
Reset or WDT Reset.
For various reset conditions see Table 14-4 and
Table 14-5.
FIGURE 4-8:PCON REGISTER (ADDRESS 8Eh)
U-0U-0U-0U-0U-0U-0R/W-0U-0
——————POR—R = Readable bit
bit7bit0
bit 7-2: Unimplemented: Read as '0'
bit 1:POR
bit 0:Unimplemented: Read as '0'
: Power-on Reset Status bit
1 = No Power-on Reset occurred
0 = A Power-on Reset occurred (must be set in software after a Power-on Reset occurs)
W = Writable bit
U = Unimplemented bit,
- n = Value at POR reset
read as ‘0’
DS30444E - page 28 1997 Microchip Technology Inc.
4.3PCL and PCLATH
The program counter (PC) is 13-bits wide. The lo w byte
comes from the PCL register, which is a readable and
writable register. The upper bits (PC<12:8>) are not
readable, but are indirectly writable through the
PCLATH register. On an y reset, the upper bits of the PC
will be cleared. Figure 4-9 sho ws the two situations for
the loading of the PC. The upper example in the figure
shows how the PC is loaded on a write to PCL
(PCLATH<4:0> → PCH). The lower example in the fig-
ure shows how the PC is loaded during a CALL or GOTO
instruction (PCLATH<4:3> → PCH).
FIGURE 4-9:LOADING OF PC IN
DIFFERENT SITUATIONS
PCHPCL
128 70
PC
PCLATH<4:0>
5
PCLATH
PCHPCL
12 11 100
PC
2
8 7
PCLATH<4:3>
PCLATH
11
8
Instr
uction with
PCL as
Destination
ALU result
GOTO, CALL
Opcode <10:0>
PIC16C9XX
Note 1: There are no status bits to indicate stack
overflow or stack underflow conditions.
Note 2: There are no instructions/mnemonics
called PUSH or POP. These are actions
that occur from the execution of the
CALL, RETURN, RETLW, and RETFIE
instructions, or the vectoring to an interrupt address.
4.4Program Memory Paging
PIC16C9XX devices are capable of addressing a continuous 8K word block of program memory. The CALL
and GOTO instructions provide only 11 bits of address
to allow branching within any 2K program memory
page. When doing a CALL or GOTO instruction the
upper 2 bits of the address are provided by
PCLATH<4:3>. When doing a CALL or GOTO instruction, the user must ensure that the page select bits are
programmed so that the desired program memory
page is addressed. If a return from a CALL instruction
(or interrupt) is executed, the entire 13-bit PC is pushed
onto the stack. Therefore, manipulation of the
PCLATH<4:3> bits are not required for the return
instructions (which POPs the address from the stack).
Note:The PIC16C9XX ignores paging bit
PCLATH<4>, which is used to access program memory pages 2 and 3. The use of
PCLATH<4> as a general purpose
read/write bit is not recommended since
this may affect upward compatibility with
future products.
4.3.1COMPUTED GOTO
A computed GOT O is accomplished by adding an offset
to the program counter (ADDWF PCL). When doing a
table read using a computed GOTO method, care
should be exercised if the tab le location crosses a PCL
memory boundary (each 256 byte block). Refer to the
application note
“Implementing a Table Read”
(AN556).
4.3.2STACK
The PIC16CXXX family has an 8 level deep x 13-bit
wide hardware stack. The stack space is not part of
either program or data space and the stack pointer is
not readable or writable. The PC is PUSHed onto the
stack when a CALL instruction is executed or an interrupt causes a branch. The stack is POPed in the event
of a RETURN, RETLW or a RETFIE instruction execution. PCLATH is not affected by a PUSH or POP operation.
The stack operates as a circular buff er . This means that
after the stack has been PUSHed eight times, the ninth
push overwrites the value that was stored from the first
push. The tenth push overwrites the second push (and
so on).
Example 4-1 shows the calling of a subroutine in
page 1 of the program memory . This example assumes
that PCLA TH is sa ved and restored by the interrupt service routine (if interrupts are used).
The INDF register is not a physical register . Addressing
the INDF register will cause indirect addressing.
Indirect addressing is possible by using the INDF register. Any instruction using the INDF register actually
accesses the register pointed to by the File Select Register (FSR). Reading the INDF register itself indirectly
(FSR = '0') will produce 00h. Writing to the INDF register indirectly results in a no-operation (although status
bits may be affected). An effective 9-bit address is
obtained by concatenating the 8-bit FSR register and
the IRP bit (STATUS<7>), as shown in Figure 4-10.
A simple program to clear RAM locations 20h-2Fh
using indirect addressing is shown in Example 4-2.
DS30444E - page 30 1997 Microchip Technology Inc.
PIC16C9XX
5.0PORTS
Some pins for these ports are multiplexed with an alternate function for the peripheral features on the device.
In general, when a peripheral is enabled, that pin may
not be used as a general purpose I/O pin.
5.1PORTA and TRISA Register
The RA4/T0CKI pin is a Schmitt Trigger input and an
open drain output. All other RA port pins hav e TTL input
levels and full CMOS output drivers. All RA pins have
data direction bits (TRISA register) which can configure
these pins as output or input.
Setting a bit in the TRISA register puts the corresponding output driver in a hi-impedance mode. Clearing a bit
in the TRISA register puts the contents of the output
latch on the selected pin.
Reading the PORTA register reads the status of the
pins whereas writing to it will write to the port latch. All
write operations are read-modify-write operations.
Therefore, a write to a port implies that the port pins are
read, this value is modified, and then written to the port
data latch.
Pin RA4 is multiplexed with the Timer0 module clock
input to become the RA4/T0CKI pin.
For the PIC16C924 only, other PORTA pins are multiplexed with analog inputs and the analog V
The operation of each pin is selected by clearing/setting the control bits in the ADCON1 register (A/D Control Register1).
REF input.
FIGURE 5-1:BLOCK DIAGRAM OF PINS
RA3:RA0 AND RA5
Data
bus
WR
Port
WR
TRIS
RD PORT
To A/D Converter (PIC16C924 only)
Note 1: I/O pins have protection diodes to VDD and VSS.
CK
Data Latch
CK
TRIS Latch
QD
Q
QD
Q
RD TRIS
Analog
input
mode
QD
EN
VDD
P
N
SS
V
I/O pin
TTL
input
buffer
(1)
Note:On a Power-on Reset, these pins are con-
figured as analog inputs and read as '0'.
The TRISA register controls the direction of the RA
pins, even when they are being used as analog inputs.
The user must ensure the bits in the TRISA register are
maintained set when using them as analog inputs.
EXAMPLE 5-1:INITIALIZING PORTA
BCF STATUS, RP0 ; Select Bank0
BCF STATUS, RP1
CLRF PORTA ; Initialize PORTA
BSF STATUS, RP0 ;
MOVLW 0xCF ; Value used to
; initialize data
; direction
MOVWF TRISA ; Set RA<3:0> as inputs
; RA<5:4> as outputs
; RA<7:6> are always
; read as '0'.
05hPORTA——RA5RA4RA3RA2RA1RA0(2)(2)
85hTRISA——PORTA Data Direction Control Register--11 1111--11 1111
(1)
9Fh
Legend: x = unknown, u = unchanged, - = unimplemented locations read as '0'. Shaded cells are not used by PORTA.
Note 1: The ADCON1 register is implemented on the PIC16C924 only.
ADCON1—————PCFG2PCFG1PCFG0---- -000---- -000
2: PIC16C923 reset values for PORTA: --xx xxxx for a POR, and --uu uuuu for all other resets,
PIC16C924 reset values for PORTA: --0x 0000 when read.
Power-on
Reset
Value on
all other
resets
DS30444E - page 32 1997 Microchip Technology Inc.
PIC16C9XX
5.2PORTB and TRISB Register
PORTB is an 8-bit wide bi-directional port. The corresponding data direction register is TRISB. Setting a bit
in the TRISB register puts the corresponding output
driver in a hi-impedance input mode. Clearing a bit in
the TRISB register puts the contents of the output latch
on the selected pin(s).
EXAMPLE 5-2:INITIALIZING PORTB
BCF STATUS, RP0 ; Select Bank0
BCF STATUS, RP1
CLRF PORTB ; Initialize PORTB
BSF STATUS, RP0 ;
MOVLW 0xCF ; Value used to
; initialize data
; direction
MOVWF TRISB ; Set RB<3:0> as inputs
; RB<5:4> as outputs
; RB<7:6> as inputs
Each of the PORTB pins has a weak internal pull-up. A
single control bit can turn on all the pull-ups. This is
performed by clearing bit RBPU
(OPTION<7>). The
weak pull-up is automatically turned off when the port
pin is configured as an output. The pull-ups are also disabled on a Power-on Reset.
FIGURE 5-3:BLOCK DIAGRAM OF
RB3:RB0 PINS
DD
TTL
Input
Buffer
EN
V
weak
P
pull-up
RD Port
I/O
pin
(1)
(2)
RBPU
Data bus
WR Port
WR TRIS
RB0/INT
Note 1: I/O pins have diode protection to V
2: To enable weak pull-ups, set the appropriate TRIS bit
and clear the RBPU
Data Latch
QD
CK
TRIS Latch
QD
CK
RD TRIS
RD Port
Schmitt Trigger
Buffer
bit (OPTION<7>).
QD
DD and VSS.
Four of PORTB’s pins, RB7:RB4, have an interrupt on
change feature. Only pins configured as inputs can
cause this interrupt to occur (i.e. an y RB7:RB4 pin configured as an output is excluded from the interrupt on
change comparison). The input pins (of RB7:RB4) are
compared with the old value latched on the last read of
PORTB. The “mismatch” outputs of RB7:RB4 are
OR’ed together to generate the RB Port Change Interrupt with flag bit RBIF (INTCON<0>).
This interrupt can wake the device from SLEEP. The
user, in the interrupt service routine, can clear the interrupt in the following manner:
a)Any read or write of PORTB. This will end the
mismatch condition.
b)Clear flag bit RBIF.
A mismatch condition will continue to set flag bit RBIF.
Reading PORTB will end the mismatch condition, and
allow flag bit RBIF to be cleared.
This interrupt on mismatch feature, together with software configurable pull-ups on these four pins allow
easy interface to a keypad and make it possible for
wake-up on key-depression. Refer to the
Embedded
Control Handbook, "Implementing Wake-Up on Key
Stroke"
(AN552).
The interrupt on change feature is recommended for
wake-up on key depression operation and operations
where PORTB is only used for the interrupt on change
feature. Polling of PORTB is not recommended while
using the interrupt on change feature.
FIGURE 5-4:BLOCK DIAGRAM OF
RB7:RB4 PINS
DD
EN
EN
TTL
Input
Buffer
V
P
weak
pull-up
I/O
(1)
pin
ST
Buffer
Q1
RD Port
Q3
(2)
RBPU
Data bus
WR Port
WR TRIS
Set RBIF
From other
RB7:RB4 pins
RB7:RB6 in serial programming mode
Note 1: I/O pins have diode protection to VDD and VSS.
2: To enable weak pull-ups, set the appropriate TRIS bit
06h, 106hPORTBRB7RB6RB5RB4RB3RB2RB1RB0xxxx xxxx uuuu uuuu
86h, 186hTRISBPORTB Data Direction Control Register1111 11111111 1111
81h, 181hOPTION RBPUINTEDGT0CST0SEPSAPS2PS1PS01111 11111111 1111
Legend: x = unknown, u = unchanged. Shaded cells are not used by PORTB.
Power-on
Reset
Value on all
other resets
DS30444E - page 34 1997 Microchip Technology Inc.
PIC16C9XX
5.3PORTC and TRISC Register
PORTC is an 6-bit bi-directional port. Each pin is individually configurable as an input or output through the
TRISC register. PORTC is multiplexed with several
peripheral functions (Table 5-5). PORTC pins have
Schmitt Trigger input buffers.
When enabling peripheral functions, care should be
taken in defining TRIS bits for each PORTC pin. Some
peripherals override the TRIS bit to make a pin an output, while other peripherals override the TRIS bit to
make a pin an input. Since the TRIS bit override is in
effect while the peripheral is enabled, read-modify-write instructions (BSF, BCF, XORWF) with TRISC
as destination should be avoided. The user should ref er
to the corresponding peripheral section for the correct
TRIS bit settings.
EXAMPLE 5-3:INITIALIZING PORTC
BCF STATUS,RP0 ; Select Bank0
BCF STATUS,RP1
CLRF PORTC ; Initialize PORTC
BSF STATUS,RP0 ;
MOVLW 0xCF ; Value used to
; initialize data
; direction
MOVWF TRISC ; Set RC<3:0> as inputs
; RC<5:4> as outputs
; RC<7:6> always read 0
FIGURE 5-5:PORTC BLOCK DIAGRAM
(PERIPHERAL OUTPUT
OVERRIDE)
DD
TTL
Input
Buffer
EN
V
P
RD Port
(2)
RBPU
Data bus
WR Port
WR TRIS
RB0/INT
Note 1: I/O pins have diode protection to V
2: To enable weak pull-ups, set the appropriate TRIS bit(s)
and clear the RBPU bit (OPTION<7>).
Data Latch
CK
TRIS Latch
CK
RD TRIS
RD Port
Schmitt Trigger
Buffer
QD
QD
QD
DD and VSS.
weak
pull-up
I/O
pin
(1)
TABLE 5-5: PORTC FUNCTIONS
NameBit#Buffer TypeFunction
RC0/T1OSO/T1CKIbit0STInput/output port pin or Timer1 oscillator output or Timer1 clock input
RC1/T1OSIbit1STInput/output port pin or Timer1 oscillator input
RC2/CCP1bit2STInput/output port pin or Capture input/Compare output/PWM output
RC3/SCK/SCLbit3STInput/output port pin or the synchronous serial clock for both SPI and
RC4/SDI/SDAbit4STInput/output port pin or the SPI Data In (SPI mode) or data I/O (I
2
C modes.
I
2
C
mode).
RC5/SDObit5STInput/output port pin or Synchronous Serial Port data out
Legend: ST = Schmitt Trigger input
TABLE 5-6: SUMMARY OF REGISTERS ASSOCIATED WITH PORTC
PORTD is an 8-bit port with Schmitt Trigger input buffers. The first five pins are configurable as general purpose I/O pins or LCD segment drivers. Pins RD5, RD6
and RD7 can be digital inputs or LCD segment or common drivers.
TRISD controls the direction of pins RD0 through RD4
when PORTD is configured as a digital port.
Note:On a Power-on Reset these pins are con-
figured as LCD segment drivers.
Note:To configure the pins as a digital port, the
corresponding bits in the LCDSE register
must be cleared. Any bit set in the LCDSE
register overrides any bit settings in the
corresponding TRIS register.
DS30444E - page 36 1997 Microchip Technology Inc.
FIGURE 5-7:PORTD<7:5> BLOCK
DIAGRAM
LCD
Segment Data
LCD Segment
Output Enable
LCD
Common Data
PIC16C9XX
LCD Common
Output Enable
LCDSE<n>
Data Bus
RD PORT
RD TRIS
V
DD
QD
EN
EN
Digital Input/
LCD Output pin
Schmitt
Trigger
input
buffer
TABLE 5-7: PORTD FUNCTIONS
NameBit#
RD0/SEG00bit0STInput/output port pin or Segment Driver00
RD1/SEG01bit1STInput/output port pin or Segment Driver01
RD2/SEG02bit2STInput/output port pin or Segment Driver02
RD3/SEG03bit3STInput/output port pin or Segment Driver03
RD4/SEG04bit4STInput/output port pin or Segment Driver04
RD5/SEG29/COM3bit5STDigital input pin or Segment Driver29 or Common Driver3
RD6/SEG30/COM2bit6STDigital input pin or Segment Driver30 or Common Driver2
RD7/SEG31/COM1bit7STDigital input pin or Segment Driver31 or Common Driver1
Legend: ST = Schmitt Trigger input
Buffer
Type
Function
TABLE 5-8: SUMMARY OF REGISTERS ASSOCIATED WITH PORTD
PORTE is an digital input only port. Each pin is multiplexed with an LCD segment driver. These pins have
Schmitt Tr igger input buffers.
Note 1: On a Power-on Reset these pins are con-
figured as LCD segment drivers.
Note 2: To configure the pins as a digital port, the
corresponding bits in the LCDSE register
must be cleared. An y bit set in the LCDSE
register overrides any bit settings in the
corresponding TRIS register.
EXAMPLE 5-5:INITIALIZING PORTE
BCF STATUS,RP0 ;Select Bank2
BSF STATUS,RP1 ;
BCF LCDSE,SE27 ;Make all PORTE
BCF LCDSE,SE5 ;and PORTG<7>
BCF LCDSE,SE9 ;digital inputs
FIGURE 5-8:PORTE BLOCK DIAGRAM
LCD
Segment Data
LCD Segment
Output Enable
LCD
Common Data
LCD Common
Output Enable
LCDSE<n>
Data Bus
RD PORT
V
DD
QD
EN
EN
Digital Input/
LCD Output pin
Schmitt
Trigger
input
buffer
RD TRIS
TABLE 5-9: PORTE FUNCTIONS
NameBit#Buffer TypeFunction
RE0/SEG05bit0STDigital input or Segment Driver05
RE1/SEG06bit1STDigital input or Segment Driver06
RE2/SEG07bit2STDigital input or Segment Driver07
RE3/SEG08bit3STDigital input or Segment Driver08
RE4/SEG09bit4STDigital input or Segment Driver09
RE5/SEG10bit5STDigital input or Segment Driver10
RE6/SEG11bit6STDigital input or Segment Driver11
RE7/SEG27bit7STDigital input or Segment Driver27 (not available on 64-pin devices)
Legend: ST = Schmitt Trigger input
TABLE 5-10: SUMMARY OF REGISTERS ASSOCIATED WITH PORTE
09hPORTERE7RE6RE5RE4RE3RE2RE1RE00000 00000000 0000
89hTRISEPORTE Data Direction Control Register1111 11111111 1111
10DhLCDSESE29SE27SE20SE16SE12SE9SE5SE01111 11111111 1111
Legend: Shaded cells are not used by PORTE.
Power-on
Reset
Value on all
other resets
DS30444E - page 38 1997 Microchip Technology Inc.
PIC16C9XX
5.6PORTF and TRISF Register
PORTF is an digital input only port. Each pin is multiplexed with an LCD segment driver. These pins have
Schmitt Tr igger input buffers.
Note 1: On a Power-on Reset these pins are con-
figured as LCD segment drivers.
Note 2: To configure the pins as a digital port, the
corresponding bits in the LCDSE register
must be cleared. An y bit set in the LCDSE
register overrides any bit settings in the
corresponding TRIS register.
RF0/SEG12bit0STDigital input or Segment Driver12
RF1/SEG13bit1STDigital input or Segment Driver13
RF2/SEG14bit2STDigital input or Segment Driver14
RF3/SEG15bit3STDigital input or Segment Driver15
RF4/SEG16bit4STDigital input or Segment Driver16
RF5/SEG17bit5STDigital input or Segment Driver17
RF6/SEG18bit6STDigital input or Segment Driver18
RF7/SEG19bit7STDigital input or Segment Driver19
Legend: ST = Schmitt Trigger input
TABLE 5-12: SUMMARY OF REGISTERS ASSOCIATED WITH PORTF
107hPORTFRF7RF6RF5RF4RF3RF2RF1RF00000 00000000 0000
187hTRISFPORTF Data Direction Control Register1111 11111111 1111
10DhLCDSESE29SE27SE20SE16SE12SE9SE5SE01111 11111111 1111
PORTG is an digital input only port. Each pin is multiplexed with an LCD segment driver. These pins have
Schmitt Tr igger input buffers.
Note 1: On a Power-on Reset these pins are con-
figured as LCD segment drivers.
Note 2: To configure the pins as a digital port, the
corresponding bits in the LCDSE register
must be cleared. An y bit set in the LCDSE
register overrides any bit settings in the
corresponding TRIS register.
RG0/SEG20bit0STDigital input or Segment Driver20
RG1/SEG21bit1STDigital input or Segment Driver21
RG2/SEG22bit2STDigital input or Segment Driver22
RG3/SEG23bit3STDigital input or Segment Driver23
RG4/SEG24bit4STDigital input or Segment Driver24
RG5/SEG25bit5STDigital input or Segment Driver25
RG6/SEG26bit6STDigital input or Segment Driver26
RG7/SEG28bit7STDigital input or Segment Driver28 (not available on 64-pin devices)
Legend: ST = Schmitt Trigger input
TABLE 5-14: SUMMARY OF REGISTERS ASSOCIATED WITH PORTG
108hPORTGRG7RG6RG5RG4RG3RG2RG1RG00000 00000000 0000
188hTRISGPORTG Data Direction Control Register1111 1111 1111 1111
10DhLCDSESE29SE27SE20SE16SE12SE9SE5SE01111 11111111 1111
Legend: Shaded cells are not used by PORTG.
Power-on
Reset
Value on all
other resets
DS30444E - page 40 1997 Microchip Technology Inc.
PIC16C9XX
5.8I/O Programming Considerations
5.8.1BI-DIRECTIONAL I/O PORTS
Any instruction which writes, operates internally as a
read followed by a write operation. The BCF and BSF
instructions, for example, read the register into the
CPU, ex ecute the bit operation and write the result back
to the register. Caution must be used when these
instructions are applied to a port with both inputs and
outputs defined. For example, a BSF operation on bit5
of PORTB will cause all eight bits of PORTB to be read
into the CPU. Then the BSF operation takes place on
bit5 and PORTB is written to the output latches. If
another bit of PORTB is used as a bi-directional I/O pin
(e.g., bit0) and it is defined as an input at this time, the
input signal present on the pin itself would be read into
the CPU and rewritten to the data latch of this particular
pin, overwriting the previous content. As long as the pin
stays in the input mode, no problem occurs . Ho we ver, if
bit0 is switched into output mode later on, the contents
of the data latch may now be unknown.
Reading the port register, reads the values of the port
pins. Writing to the port register writes the value to the
port latch. When using read-modify-write instructions
(ex. BCF, BSF) on a por t, the value of the port pins is
read, the desired operation is done to this value, and
this value is then written to the port latch.
Example 5-8 shows the effect of two sequential
read-modify-write instructions on an I/O port.
EXAMPLE 5-8:READ-MODIFY-WRITE
INSTRUCTIONS ON AN I/O
PORT
;Initial PORT settings: PORTB<7:4> Inputs
; PORTB<3:0> Outputs
;PORTB<7:6> have external pull-ups and are
;not connected to other circuitry
;
; PORT latch PORT pins
; ---------- -------- BCF PORTB, 7 ; 01pp pppp 11pp pppp
BCF PORTB, 6 ; 10pp pppp 11pp pppp
BCF STATUS, RP1 ;
BSF STATUS, RP0 ;
BCF TRISB, 7 ; 10pp pppp 11pp pppp
BCF TRISB, 6 ; 10pp pppp 10pp pppp
;
;Note that the user may have expected the
;pin values to be 00pp ppp. The 2nd BCF
;caused RB7 to be latched as the pin value
;(high).
A pin actively outputting a Low or High should not be
driven from external devices at the same time in order
to change the level on this pin (“wired-or”, “wired-and”).
The resulting high output currents may damage the
chip.
5.8.2SUCCESSIVE OPERATIONS ON I/O PORTS
The actual write to an I/O port happens at the end of an
instruction cycle, whereas for reading, the data must be
valid at the beginning of the instruction cycle
(Figure 5-11). Therefore, care must be exercised if a
write followed by a read operation is carried out on the
same I/O port. The sequence of instructions should be
such to allow the pin voltage to stabilize (load dependent) before the next instruction which causes that file
to be read into the CPU is executed. Otherwise, the
previous state of that pin may be read into the CPU
rather than the new state. When in doubt, it is better to
separate these instructions with a NOP or another
instruction not accessing this I/O port.
FIGURE 5-11: SUCCESSIVE I/O OPERATION
Q3
PC + 3
NOP
NOP
Q4
Note:
This example shows a write to PORTB
followed by a read from PORTB.
Note that:
data setup time = (0.25TCY - TPD)
where TCY = instruction cycle
TPD = propagation delay
Therefore, at higher clock frequencies,
a write followed by a read ma y be problematic.
DS30444E - page 42 1997 Microchip Technology Inc.
PIC16C9XX
6.0OVERVIEW OF TIMER
MODULES
Each module can generate an interrupt to indicate that
an event has occurred (e.g. timer overflow). Each of
these modules is explained in full detail in the follo wing
sections. The timer modules are:
• Timer0 Module (Section 7.0)
• Timer1 Module (Section 8.0)
• Timer2 Module (Section 9.0)
6.1Timer0 Overview
The Timer0 module is a simple 8-bit timer/counter. The
clock source can be either the internal system clock
(Fosc/4) or an external clock. When the clock source is
an external clock, the Timer0 module can be selected
to increment on either the rising or falling edge.
The Timer0 module also has a programmable prescaler
option. This prescaler can be assigned to either the
Timer0 module or the Watchdog Timer. Bit PSA
(OPTION<3>) assigns the prescaler, and bits PS2:PS0
(OPTION<2:0>) determine the prescaler value. Timer0
can increment at the following rates: 1:1 when prescaler assigned to Watchdog timer, 1:2, 1:4, 1:8, 1:16,
1:32, 1:64, 1:128, and 1:256.
Synchronization of the external clock occurs after the
prescaler. When the prescaler is used, the external
clock frequency may be higher then the device’s frequency. The maximum frequency is 50 MHz, given the
high and low time requirements of the clock.
chronous Serial Port (SSP). The prescaler option
allows Timer2 to increment at the following rates: 1:1,
1:4, 1:16.
The postscaler allows the TMR2 register to match the
period register (PR2) a programmable number of times
before generating an interrupt. The postscaler can be
programmed from 1:1 to 1:16 (inclusive).
6.4CCP Overview
The CCP module can operate in one of these three
modes: 16-bit capture, 16-bit compare, or up to 10-bit
Pulse Width Modulation (PWM).
Capture mode captures the 16-bit value of TMR1 into
the CCPR1H:CCPR1L register pair. The capture event
can be programmed for either the falling edge, rising
edge, fourth rising edge, or the sixteenth rising edge of
the CCP1 pin.
Compare mode compares the TMR1H:TMR1L register
pair to the CCPR1H:CCPR1L register pair. When a
match occurs an interrupt can be generated, and the
output pin CCP1 can be forced to given state (High or
Low), TMR1 can be reset and star t A/D conversion.
This depends on the control bits CCP1M3:CCP1M0.
PWM mode compares the TMR2 register to a 10-bit
duty cycle register (CCPR1H:CCPR1L<5:4>) as well
as to an 8-bit period register (PR2). When the TMR2
register = Duty Cycle register, the CCP1 pin will be
forced low . When TMR2 = PR2, TMR2 is cleared to 00h,
an interrupt can be generated, and the CCP1 pin (if an
output) will be forced high.
6.2Timer1 Overview
Timer1 is a 16-bit timer/counter. The clock source can
be either the internal system clock (Fosc/4), an external
clock, or an external crystal. Timer1 can operate as
either a timer or a counter. When operating as a counter
(external clock source), the counter can either operate
synchronized to the device or asynchronously to the
device. Asynchronous operation allows Timer1 to operate during sleep, which is useful for applications that
require a real-time clock as well as the power savings
of SLEEP mode.
Timer1 also has a prescaler option which allows Timer1
to increment at the following rates: 1:1, 1:2, 1:4, and
1:8. Timer1 can be used in conjunction with the Capture/Compare/PWM module. When used with a CCP
module, Timer1 is the time-base for 16-bit capture or
the 16-bit compare and must be synchronized to the
device. Timer1 oscillator is also one of the clock
sources for the LCD module.
6.3Timer2 Overview
Timer2 is an 8-bit timer with a programmable prescaler
and postscaler, as well as an 8-bit period register
(PR2). Timer2 can be used with the CCP1 module (in
PWM mode) as well as the clock source for the Syn-
DS30444E - page 44 1997 Microchip Technology Inc.
PIC16C9XX
7.0TIMER0 MODULE
The Timer0 module has the following features:
• 8-bit timer/counter
• Readable and writable
• 8-bit software programmable prescaler
• Internal or external clock select
• Interrupt on overflow from FFh to 00h
• Edge select for external clock
Figure 7-1 is a simplified block diagram of the Timer0
module.
Timer mode is selected by clearing bit T0CS
(OPTION<5>). In timer mode, the Timer0 module will
increment every instruction cycle (without prescaler). If
the TMR0 register is written, the increment is inhibited
for the following two instruction cycles (Figure 7-2 and
Figure 7-3). The user can work around this by writing
an adjusted value to the TMR0 register.
Counter mode is selected by setting bit T0CS
(OPTION<5>). In counter mode Timer0 will increment
either on every rising or falling edge of pin RA4/T0CKI.
The incrementing edge is determined by the Timer0
Source Edge Select bit T0SE (OPTION<4>). Clear ing
bit T0SE selects the rising edge. Restrictions on the
external clock input are discussed in detail in
Section 7.2.
The prescaler is mutually exclusively shared between
the Timer0 module and the Watchdog Timer. The prescaler assignment is controlled in software by control bit
PSA (OPTION<3>). Clearing bit PSA will assign the
prescaler to the Timer0 module. The prescaler is not
readable or writable. When the prescaler is assigned to
the Timer0 module, prescale values of 1:2, 1:4, ...,
1:256 are selectable. Section 7.3 details the operation
of the prescaler.
7.1Timer0 Interrupt
The TMR0 interrupt is generated when the TMR0 register overflows from FFh to 00h. This overflow sets bit
T0IF (INTCON<2>). The interr upt can be masked by
clearing bit T0IE (INTCON<5>). Bit T0IF must be
cleared in software by the Timer0 module interrupt service routine before re-enabling this interrupt. The TMR0
interrupt cannot awaken the processor from SLEEP
since the timer is shut off during SLEEP. Figure 7-4 displays the Timer0 interrupt timing.
FIGURE 7-1:TIMER0 BLOCK DIAGRAM
FOSC/4
RA4/T0CKI
pin
T0SE
Note 1: T0CS, T0SE, PSA, PS2:PS0 (OPTION<5:0>).
2: The prescaler is shared with Watchdog Timer (refer to Figure 7-6 for detailed block diagram).
Note 1: Interrupt flag bit T0IF is sampled here (every Q1).
PC
Inst (PC)
Inst (PC-1)
2: Interrupt latency = 4T
3: CLKOUT is available only in RC oscillator mode.
PC +1PC +10004h0005h
Inst (PC+1)
Inst (PC)
CY where TCY = instruction cycle time.
Inst (0004h)Inst (0005h)
Inst (0004h)Dummy cycleDummy cycle
DS30444E - page 46 1997 Microchip Technology Inc.
PIC16C9XX
7.2Using Timer0 with an External Clock
When an external clock input is used for Timer0, it must
meet certain requirements. The requirements ensure
the external clock can be synchronized with the internal
phase clock (T
incrementing of Timer0 after synchronization.
7.2.1EXTERNAL CLOCK SYNCHRONIZATION
OSC). Also, there is a delay in the actual
caler so that the prescaler output is symmetrical. For
the external clock to meet the sampling requirement,
the ripple-counter must be taken into account. Therefore, it is necessary for T0CKI to have a period of at
least 4Tosc (and a small RC delay of 40 ns) divided by
the prescaler value. The only requirement on T0CKI
high and low time is that they do not violate the minimum pulse width requirement of 10 ns. Refer to par ameters 40, 41 and 42 in the electrical specification of the
When no prescaler is used, the external clock input is
desired device.
the same as the prescaler output. The synchronization
of T0CKI with the internal phase clocks is accomplished by sampling the prescaler output on the Q2 and
Q4 cycles of the internal phase clocks (Figure 7-5).
Therefore, it is necessary for T0CKI to be high for at
least 2Tosc (and a small RC delay of 20 ns) and low for
at least 2Tosc (and a small RC delay of 20 ns). Refer to
7.2.2TMR0 INCREMENT DELAY
Since the prescaler output is synchronized with the
internal clocks, there is a small delay from the time the
external clock edge occurs to the time the Timer0 mod-
ule is actually incremented. Figure 7-5 shows the delay
from the external clock edge to the timer incrementing.
the electrical specification of the desired device.
When a prescaler is used, the external clock input is
divided by the asynchronous ripple-counter type pres-
FIGURE 7-5:TIMER0 TIMING WITH EXTERNAL CLOCK
Q1 Q2 Q3 Q4 Q1 Q2 Q3 Q4 Q1 Q2 Q3 Q4 Q1 Q2 Q3 Q4
External Clock Input or
Prescaler output
External Clock/Prescaler
Output after sampling
Increment Timer0 (Q4)
(2)
(1)
(3)
Small pulse
misses sampling
Timer0
Note 1: Delay from clock input change to Timer0 increment is 3Tosc to 7Tosc. (Duration of Q = Tosc).
Therefore, the error in measuring the interval between two edges on Timer0 input = ±4Tosc max.
2: External clock if no prescaler selected, Prescaler output otherwise.
3: The arrows indicate the points in time where sampling occurs.
An 8-bit counter is available as a prescaler for the
Timer0 module, or as a postscaler for the Watchdog
Timer (Figure 7-6). For simplicity, this counter is being
referred to as “prescaler” throughout this data sheet.
Note that the prescaler may be used by either the
Timer0 module or the WDT but not both. Thus, a prescaler assignment for the Timer0 module means that
there is no prescaler for the Watchdog Timer, and
vice-versa.
When assigned to the Timer0 module, all instructions
writing to the TMR0 register (e.g. CLRF 1, MOVWF 1,
BSF 1,x....etc.) will clear the prescaler count. When
assigned to WDT, a CLRWDT instruction will clear the
prescaler count along with the Watchdog Timer. The
prescaler is not readable or writable.
Note:Writing to TMR0 when the prescaler is
assigned to Timer0 will clear the prescaler
count, but will not change the prescaler
assignment.
The PSA and PS2:PS0 bits (OPTION<3:0>) determine
the prescaler assignment and prescale ratio.
FIGURE 7-6:BLOCK DIAGRAM OF THE TIMER0/WDT PRESCALER
CLKOUT (=Fosc/4)
RA4/T0CKI
pin
T0SE
0
1
T0CS
M
U
X
1
M
U
0
X
PSA
SYNC
2
Cycles
Data Bus
8
TMR0 reg
Set flag bit T0IF
on Overflow
0
M
U
1
Watchdog
Timer
WDT Enable bit
Note: T0CS, T0SE, PSA, PS2:PS0 are (OPTION<5:0>).
X
PSA
8-bit Prescaler
8 - to - 1MUX
0
8
M U X
WDT
Time-out
PS2:PS0
1
PSA
DS30444E - page 48 1997 Microchip Technology Inc.
PIC16C9XX
7.3.1SWITCHING PRESCALER ASSIGNMENT
Note:To avoid an unintended device RESET, the
The prescaler assignment is fully under software control, i.e., it can be changed “on the fly” during program
execution.
EXAMPLE 7-1:CHANGING PRESCALER (TIMER0→WDT)
Lines 2 and 3 do NOT have to
be included if the final desired
prescale value is other than 1:1.
If 1:1 is final desired value, then
a temporary prescale value is
set in lines 2 and 3 and the final
prescale value will be set in lines
10 and 11.
To change prescaler from the WDT to the Timer0 module use the precaution shown in Example 7-2.
1) BSF STATUS, RP0 ;Select Bank1
2) MOVLW b'xx0x0xxx' ;Select clock source and prescale value of
3) MOVWF OPTION_REG ;other than 1:1
4) BCF STATUS, RP0 ;Select Bank0
5) CLRF TMR0 ;Clear TMR0 and prescaler
6) BSF STATUS, RP1 ;Select Bank1
7) MOVLW b'xxxx1xxx' ;Select WDT, do not change prescale value
8) MOVWF OPTION_REG ;
9) CLRWDT ;Clears WDT and prescaler
10) MOVLW b'xxxx1xxx' ;Select new prescale value and WDT
11) MOVWF OPTION_REG ;
12) BCF STATUS, RP0 ;Select Bank0
following instruction sequence (shown in
Example 7-1) must be executed when
changing the prescaler assignment from
Timer0 to the WDT. This precaution must
be followed even if the WDT is disabled.
EXAMPLE 7-2:CHANGING PRESCALER (WDT→TIMER0)
CLRWDT ;Clear WDT and prescaler
BSF STATUS, RP0 ;Select Bank1
MOVLW b'xxxx0xxx' ;Select TMR0, new prescale value and
MOVWF OPTION_REG ;clock source
BCF STATUS, RP0 ;Select Bank0
DS30444E - page 50 1997 Microchip Technology Inc.
PIC16C9XX
8.0TIMER1 MODULE
Timer1 is a 16-bit timer/counter consisting of two 8-bit
registers (TMR1H and TMR1L) which are readable and
writable. The TMR1 Register pair (TMR1H:TMR1L)
increments from 0000h to FFFFh and rolls over to
0000h. The TMR1 Interrupt, if enabled, is generated on
overflow which is latched in interrupt flag bit TMR1IF
(PIR1<0>). This interr upt can be enabled/disabled by
setting/clearing TMR1 interrupt enable bit TMR1IE
(PIE1<0>).
Timer1 can operate in one of two modes:
• As a timer
• As a counter
The operating mode is determined by the clock select
bit, TMR1CS (T1CON<1>).
In timer mode, Timer1 increments every instruction
cycle. In counter mode, it increments on every rising
edge of the external clock input.
Timer1 can be turned on and off using the control bit
TMR1ON (T1CON<0>).
Timer1 also has an internal “reset input”. This reset can
be generated by the CCP module (Section 10.0).
Figure 8-1 shows the Timer1 control register.
When the Timer1 oscillator is enabled (T1OSCEN is
set), the RC1/T1OSI and RC0/T1OSO/T1CKI pins
become inputs.
FIGURE 8-1:T1CON: TIMER1 CONTROL REGISTER (ADDRESS 10h)
U-0U-0R/W-0R/W-0R/W-0R/W-0R/W-0R/W-0
——T1CKPS1 T1CKPS0 T1OSCEN T1SYNCTMR1CS TMR1ONR = Readable bit
bit7bit0
bit 7-6: Unimplemented: Read as '0'
bit 5-4: T1CKPS1:T1CKPS0: Timer1 Input Clock Prescale Select bits
11 = 1:8 Prescale value
10 = 1:4 Prescale value
01 = 1:2 Prescale value
00 = 1:1 Prescale value
bit 3:T1OSCEN: Timer1 Oscillator Enable Control bit
1 = Oscillator is enabled
0 = Oscillator is shut off
Note: The oscillator inverter and feedback resistor are turned off to eliminate power drain
bit 2:T1SYNC
: Timer1 External Clock Input Synchronization Control bit
W = Writable bit
U = Unimplemented bit,
- n = Value at POR reset
read as ‘0’
TMR1CS = 1
1 = Do not synchronize external clock input
0 = Synchronize external clock input
TMR1CS = 0
This bit is ignored. Timer1 uses the internal clock when TMR1CS = 0.
bit 1:TMR1CS: Timer1 Clock Source Select bit
1 = External clock from pin T1CKI (on the rising edge)
0 = Internal clock (Fosc/4)
Timer mode is selected by clearing the TMR1CS
(T1CON<1>) bit. In this mode, the input clock to the
timer is Fosc/4. The synchronize control bit T1SYNC
(T1CON<2>) has no effect since the internal clock is
always in sync.
8.2Timer1 Operation in Synchronized
Counter Mode
Counter mode is selected by setting bit TMR1CS. In
this mode the timer increments on every rising edge of
clock input on pin RC1/T1OSI when bit T1OSCEN is
set or pin RC0/T1OSO/T1CKI when bit T1OSCEN is
cleared.
If T1SYNC
synchronized with internal phase clocks. The synchronization is done after the prescaler stage. The prescaler is an asynchronous ripple-counter.
In this configuration, during SLEEP mode, Timer1 will
not increment even if the external clock is present,
since the synchronization circuit is shut off. The prescaler however will continue to increment.
is cleared, then the external clock input is
8.2.1EXTERNAL CLOCK INPUT TIMING FOR
SYNCHRONIZED COUNTER MODE
When an external clock input is used for Timer1 in synchronized counter mode, it must meet certain requirements. The external clock requirement is due to
internal phase clock (T osc) synchronization. Also, there
is a delay in the actual incrementing of TMR1 after synchronization.
When the prescaler is 1:1, the external clock input is
the same as the prescaler output. The synchronization
of T1CKI with the internal phase clocks is accomplished by sampling the prescaler output on the Q2 and
Q4 cycles of the internal phase clocks. Therefore, it is
necessary for T1CKI to be high for at least 2Tosc (and
a small RC delay of 20 ns) and low for at least 2Tosc
(and a small RC delay of 20 ns). Refer to the appropriate electrical specifications, parameters 45, 46, and 47.
When a prescaler other than 1:1 is used, the external
clock input is divided by the asynchronous ripple-counter type prescaler so that the prescaler output
is symmetrical. In order for the external clock to meet
the sampling requirement, the ripple-counter must be
taken into account. Therefore, it is necessary f or T1CKI
to have a period of at least 4Tosc (and a small RC delay
of 40 ns) divided by the prescaler value. The only
requirement on T1CKI high and low time is that the y do
not violate the minimum pulse width requirements of
10 ns). Refer to the appropriate electrical specifications, parameters 40, 42, 45, 46, and 47.
FIGURE 8-2:TIMER1 BLOCK DIAGRAM
Set flag bit
TMR1IF on
Overflow
RC0/T1OSO/T1CKI
RC1/T1OSI
Note 1: When the T1OSCEN bit is cleared, the inverter and feedback resistor are turned off. This eliminates power drain.
TMR1H
T1OSC
TMR1
TMR1L
T1OSCEN
Enable
Oscillator
(1)
Fosc/4
Internal
Clock
TMR1ON
on/off
1
0
T1CKPS1:T1CKPS0
TMR1CS
0
1
T1SYNC
Prescaler
1, 2, 4, 8
2
Synchronized
clock input
Synchronize
det
SLEEP input
DS30444E - page 52 1997 Microchip Technology Inc.
PIC16C9XX
8.3Timer1 Operation in Asynchronous
Counter Mode
If control bit T1SYNC (T1CON<2>) is set, the external
clock input is not synchronized. The timer continues to
increment asynchronous to the internal phase clocks.
The timer will continue to run during SLEEP and can
generate an interrupt on overflow which will wake-up
the processor. However, special precautions in software are needed to read-from or write-to the Timer1
register pair (TMR1H:TMR1L) (Section 8.3.2).
In asynchronous counter mode, Timer1 cannot be used
as a time-base for capture or compare operations.
8.3.1EXTERNAL CLOCK INPUT TIMING WITH
UNSYNCHRONIZED CLOCK
If control bit T1SYNC
completely asynchronously. The input clock must meet
certain minimum high time and low time requirements,
as specified in timing parameters 45, 46, and 47.
8.3.2READING AND WRITING TMR1 IN
ASYNCHRONOUS COUNTER MODE
Reading TMR1H or TMR1L while the timer is running,
from an external asynchronous clock, will ensure a
valid read (taken care of in hardware). However, the
user should keep in mind that reading the 16-bit timer
in two 8-bit values itself poses certain problems since
the timer may overflow between the reads.
For writes, it is recommended that the user simply stop
the timer and write the desired values. A write contention may occur by writing to the timer registers while the
register is incrementing. This may produce an unpredictable value in the timer register.
Reading the 16-bit value requires some care.
Example 8-1 is an example routine to read the 16-bit
timer value. This is useful if the timer cannot be
stopped.
is set, the timer will increment
EXAMPLE 8-1:READING A 16-BIT
FREE-RUNNING TIMER
; All interrupts are disabled
MOVF TMR1H, W ;Read high byte
MOVWF TMPH ;
MOVF TMR1L, W ;Read low byte
MOVWF TMPL ;
MOVF TMR1H, W ;Read high byte
SUBWF TMPH, W ;Sub 1st read
; with 2nd read
BTFSC STATUS,Z ;Is result = 0
GOTO CONTINUE ;Good 16-bit read
;
; TMR1L may have rolled over between the read
; of the high and low bytes. Reading the high
; and low bytes now will read a good value.
;
MOVF TMR1H, W ;Read high byte
MOVWF TMPH ;
MOVF TMR1L, W ;Read low byte
MOVWF TMPL ;
; Re-enable the Interrupt (if required)
CONTINUE ;Continue with your code
8.4Timer1 Oscillator
A crystal oscillator circuit is built in between pins T1OSI
(input) and T1OSO (amplifier output). It is enabled by
setting control bit T1OSCEN (T1CON<3>). The oscillator is a low power oscillator rated up to 200 kHz. It will
continue to run during SLEEP. It is primarily intended
for a 32 kHz crystal. Table 8-1 shows the capacitor
selection for the Timer1 oscillator.
The Timer1 oscillator is identical to the LP oscillator.
The user must provide a software time delay to ensure
proper oscillator start-up.
If the CCP1 module is configured in compare mode to
generate a “special event trigger" (CCP1M3:CCP1M0
= 1011), this signal will reset Timer1.
Note:The special event trigger from the CCP1
module will not set interrupt flag bit
TMR1IF (PIR1<0>).
Timer1 must be configured for either timer or synchronized counter mode to take advantage of this f eature. If
Timer1 is running in asynchronous counter mode, this
8.6Resetting of Timer1 Register Pair
(TMR1H:TMR1L)
TMR1H and TMR1L registers are not reset on a POR
or any other reset except by the CCP1 special event
trigger.
T1CON register is reset to 00h on a Pow er-on Reset. In
any other reset, the register is unaffected.
8.7Timer1 Prescaler
The prescaler counter is cleared on writes to the
TMR1H or TMR1L registers.
reset operation may not work.
In the event that a write to Timer1 coincides with a spe-
cial event trigger from CCP1, the write will take precedence.
In this mode of operation, the CCPR1H:CCPR1L registers pair effectively becomes the period register for
Timer1.
TABLE 8-2: REGISTERS ASSOCIATED WITH TIMER1 AS A TIMER/COUNTER
0ChPIR1LCDIF ADIF
8ChPIE1
0EhTMR1LHolding register for the Least Significant Byte of the 16-bit TMR1 register
0FhTMR1HHolding register for the Most Significant Byte of the 16-bit TMR1 register
10hT1CON
Legend:x = unknown, u = unchanged, - = unimplemented read as '0'. Shaded cells are not used by theTimer1 module.
Note1: Bits ADIE and ADIF are reserved on the PIC16C923, always maintain these bits clear.
DS30444E - page 54 1997 Microchip Technology Inc.
PIC16C9XX
9.0TIMER2 MODULE
Timer2 is an 8-bit timer with a prescaler and a
postscaler. It can be used as the PWM time-base for
the PWM mode of the CCP module. The TMR2 register
is readable and writable, and is cleared on any device
reset.
The input clock (F
1:4 or 1:16 (selected by control bits
T2CKPS1:T2CKPS0 (T2CON<1:0>)).
The Timer2 module has an 8-bit period register, PR2.
TMR2 increments from 00h until it matches PR2 and
then resets to 00h on the next increment cycle. PR2 is
a readable and writable register . The PR2 register is set
during RESET.
The match output of TMR2 goes through a 4-bit
postscaler (which gives a 1:1 to 1:16 scaling inclusive)
to generate a TMR2 interrupt (latched in flag bit
TMR2IF, (PIR1<1>)).
Timer2 can be shut off by clearing control bit TMR2ON
(T2CON<2>) to minimize power consumption.
Figure 9-2 shows the Timer2 control register.
OSC/4) has a prescale option of 1:1,
9.1Timer2 Prescaler and Postscaler
The prescaler and postscaler counters are cleared
when any of the following occurs:
• a write to the TMR2 register
• a write to the T2CON register
• any device reset (Power-on Reset, MCLR
Reset,
or Watchdog Timer Reset)
TMR2 will not clear when T2CON is written.
9.2Output of TMR2
The output of TMR2 (bef ore the postscaler) is fed to the
Synchronous Serial Port module which optionally uses
it to generate shift clock.
FIGURE 9-1:TIMER2 BLOCK DIAGRAM
(1)
Postscaler
1:16
4
Sets flag
bit TMR2IF
1:1
to
Fosc/4
Prescaler
1:1, 1:4, 1:16
2
TMR2 reg
Comparator
PR2 reg
TMR2
output
Reset
EQ
Note 1: TMR2 register output can be software selected
by the SSP Module as the source clock.
FIGURE 9-2:T2CON: TIMER2 CONTROL REGISTER (ADDRESS 12h)
U-0R/W-0R/W-0R/W-0R/W-0R/W-0R/W-0R/W-0
—TOUTPS3 TOUTPS2 TOUTPS1 TOUTPS0 TMR2ON T2CKPS1 T2CKPS0R = Readable bit
bit7bit0
bit 7:Unimplemented: Read as '0'
bit 6-3: TOUTPS3:TOUTPS0: Timer2 Output Postscale Select bits
0000 = 1:1 Postscale
0001 = 1:2 Postscale
•
•
•
1111 = 1:16 Postscale
bit 2:TMR2ON: Timer2 On bit
1 = Timer2 is on
0 = Timer2 is off
bit 1-0: T2CKPS1:T2CKPS0: Timer2 Clock Prescale Select bits
00 = Prescaler is 1
01 = Prescaler is 4
1x = Prescaler is 16
0ChPIR1LCDIFADIF
8ChPIE1
11hTMR2Timer2 module’s register
12hT2CON
92hPR2Timer2 Period Register
Legend:x = unknown, u = unchanged, - = unimplemented read as '0'. Shaded cells are not used by the Timer2 module.
Note1: Bits ADIE and ADIF are reserved on the PIC16C923, always maintain these bits clear.
DS30444E - page 56 1997 Microchip Technology Inc.
PIC16C9XX
10.0CAPTURE/COMPARE/PWM
(CCP) MODULE
The CCP (Capture/Compare/PWM) module contains a
16-bit register which can operate as a 16-bit capture
register, as a 16-bit compare register, or as a PWM
master/slave duty cycle register. Table 10-1 shows the
timer resources used by the CCP module.
Capture/Compare/PWM Register1 (CCPR1) is comprised of two 8-bit registers: CCPR1L (low byte) and
CCPR1H (high byte). The CCP1CON register controls
the operation of CCP1. All three are readable and writable.
Figure 10-1 shows the CCP1CON register.
For use of the CCP module, refer to the
Control Handbook,
"Using the CCP Modules" (AN594).
T ABLE 10-1: CCP MODE - TIMER RESOURCE
CCP ModeTimer Resource
Capture
Compare
PWM
FIGURE 10-1: CCP1CON REGISTER (ADDRESS 17h)
U-0U-0R/W-0R/W-0R/W-0R/W-0R/W-0R/W-0
——CCP1X CCP1Y CCP1M3CCP1M2CCP1M1 CCP1M0R = Readable bit
bit7bit0
bit 7-6: Unimplemented: Read as '0'
bit 5-4: CCP1X:CCP1Y: PWM Least Significant bits
Capture Mode
Unused
Compare Mode
Unused
PWM Mode
These bits are the two LSbs of the PWM duty cycle. The eight MSbs are found in CCPR1L.
bit 3-0: CCP1M3:CCP1M0: CCP1 Mode Select bits
0000 = Capture/Compare/PWM off (resets CCP1 module)
0100 = Capture mode, every falling edge
0101 = Capture mode, every rising edge
0110 = Capture mode, every 4th rising edge
0111 = Capture mode, every 16th rising edge
1000 = Compare mode, set output on match (bit CCP1IF is set)
1001 = Compare mode, clear output on match (bit CCP1IF is set)
1010 = Compare mode, generate software interrupt on match (bit CCP1IF is set, CCP1 pin is unaffected)
1011 = Compare mode, trigger special event (CCP1IF bit is set; CCP1 resets TMR1)
11xx = PWM mode
In Capture mode, CCPR1H:CCPR1L captures the
16-bit value of the TMR1 register when an e v ent occurs
on pin RC2/CCP1 (Figure 10-2). An event is defined as:
• Every falling edge
• Every rising edge
• Every 4th rising edge
• Every 16th rising edge
An event is selected by control bits CCP1M3:CCP1M0
(CCP1CON<3:0>). When a capture is made, the interrupt request flag bit CCP1IF (PIR1<2>) is set. It must
be cleared in software. If another capture occurs before
the value in register CCPR1 is read, the old captured
value will be lost.
10.1.1CCP PIN CONFIGURATION
In capture mode, the RC2/CCP1 pin should be config-
ured as an input by setting the TRISC<2> bit.
Note:If the RC2/CCP1 pin is configured as an
output, a write to the port can cause a capture condition.
FIGURE 10-2: CAPTURE MODE OPERATION
BLOCK DIAGRAM
CCP
Prescaler
÷ 1, 4, 16
RC2/CCP1
pin
and
edge detect
CCP1CON<3:0>
Q’s
10.1.2TIMER1 MODE SELECTION
Timer1 must be running in timer mode or synchronized
counter mode for the CCP module to use the capture
feature. In asynchronous counter mode the capture
operation may not work.
Set CCP1IF
PIR1<2>
Capture
Enable
CCPR1HCCPR1L
TMR1HTMR1L
Switching from one capture prescaler to another may
generate an interrupt. Also, the prescaler counter will
not be cleared, therefore the first capture may be from
a non-zero prescaler. Example 10-1 shows the recommended method for switching between capture prescalers. This example also clears the prescaler counter and
will not generate the “false” interrupt.
EXAMPLE 10-1: CHANGING BETWEEN
CAPTURE PRESCALERS
CLRF CCP1CON; Turn CCP module off
MOVLW NEW_CAPT_PS ; Load the W reg with
; the new prescaler
; mode value and CCP ON
MOVWF CCP1CON; Load CCP1CON with
; this value
10.2Compare Mode
In Compare mode, the 16-bit CCPR1 register value is
constantly compared against the TMR1 register pair
value. When a match occurs, the RC2/CCP1 pin is:
• Driven High
• Driven Low
• Remains Unchanged
The action on the pin is based on the value of control
bits CCP1M3:CCP1M0 (CCP1CON<3:0>). At the
same time, a compare interrupt is also generated.
FIGURE 10-3: COMPARE MODE
OPERATION BLOCK DIAGRAM
Special event trigger will reset Timer1, but not
set interrupt flag bit TMR1IF (PIR1<0>).
Set CCP1IF
PIR1<2>
CCPR1H CCPR1L
match
Comparator
TMR1H TMR1L
RC2/CCP1
TRISC<2>
Output Enable
Trigger
Q S
Output
Logic
R
CCP1CON<3:0>
Mode Select
10.1.3SOFTWARE INTERRUPT
When the Capture mode is changed, a false capture
interrupt may be generated. The user should keep
enable bit CCP1IE (PIE1<2>) clear to avoid false interrupts and should clear flag bit CCP1IF following any
such change in operating mode.
10.1.4CCP PRESCALER
There are four prescaler settings, specified by bits
10.2.1CCP PIN CONFIGURATION
The user must configure the RC2/CCP1 pin as an out-
put by clearing the TRISC<2> bit.
Note:Clearing the CCP1CON register will force
the RC2/CCP1 compare output latch to the
default low level. This is not the data latch.
CCP1M3:CCP1M0. Whenever the CCP module is
turned off, or the CCP module is not in Capture mode,
the prescaler counter is cleared. This means that any
reset will clear the prescaler counter.
DS30444E - page 58 1997 Microchip Technology Inc.
PIC16C9XX
10.2.1TIMER1 MODE SELECTION
Timer1 must be running in Timer mode or Synchronized Counter mode if the CCP module is using the
compare feature. In Asynchronous Counter mode, the
compare operation may not work.
10.2.2SOFTWARE INTERRUPT MODE
When Generate Software Interrupt is chosen, the
CCP1 pin is not affected. Only a CCP interrupt is generated (if enabled).
10.2.3SPECIAL EVENT TRIGGER
In this mode, an internal hardware trigger is generated
which may be used to initiate an action.
The special event trigger output of CCP1 resets the
TMR1 register pair and starts an A/D conversion. This
allows the CCPR1H:CCPR1L register pair to effectively
be a 16-bit programmable period register for Timer1.
Note:The "special event trigger" from the CCP1
module will not set interrupt flag bit
TMR1IF (PIR1<0>).
10.3PWM Mode
In Pulse Width Modulation (PWM) mode, the CCP1 pin
produces up to a 10-bit resolution PWM output. Since
the CCP1 pin is multiplexed with the POR TC data latch,
the TRISC<2> bit must be cleared to make the CCP1
pin an output.
Note:Clearing the CCP1CON register will force
the CCP1 PWM output latch to the default
low level. This is not the PORTC I/O data
latch.
Figure 10-4 shows a simplified block diagram of the
CCP module in PWM mode.
For a step by step procedure on how to set up the CCP
module for PWM operation, see Section 10.3.3.
FIGURE 10-4: SIMPLIFIED PWM BLOCK
DIAGRAM
Duty cycle registers
CCPR1L
CCPR1H (Slave)
Comparator
TMR2
Comparator
PR2
Note 1: 8-bit timer is concatenated with 2-bit internal Q clock
or 2 bits of the prescaler to create 10-bit time-base.
(Note 1)
Clear Timer,
CCP1 pin and
latch D.C.
A PWM output (Figure 10-5) has a time-base (period)
and a time that the output stays high (duty cycle). The
frequency of the PWM is the inverse of the period
(1/period).
CCP1CON<5:4>
R
S
Q
RC1/CCP1
TRISC<2>
FIGURE 10-5: PWM OUTPUT
Period
Duty Cycle
TMR2 = PR2
TMR2 = PR2
TMR2 = Duty Cycle
10.3.1PWM PERIOD
The PWM period is specified by writing to the PR2 reg-
ister. The PWM period can be calculated using the following formula:
PWM period = [ (PR2) + 1 ] • 4 • T
OSC •
(TMR2 prescale value)
PWM frequency is defined as 1 / [PWM period].
When TMR2 is equal to PR2, the following three events
occur on the next increment cycle:
• TMR2 is cleared
• The CCP1 pin is set (exception: if PWM duty
cycle = 0%, the CCP1 pin will not be set)
• The PWM duty cycle is latched from CCPR1L into
CCPR1H
used in the determination of the PWM frequency. The postscaler could be used to
have a servo update rate at a different frequency than the PWM output.
10.3.2PWM DUTY CYCLE
The PWM duty cycle is specified by writing to the
CCPR1L register and to the CCP1CON<5:4> bits. Up
to 10-bit resolution is available: the CCPR1L contains
the eight MSbs and CCP1CON<5:4> contains the two
LSbs. This 10-bit value is represented by
CCPR1L:CCP1CON<5:4>. The following equation is
used to calculate the PWM duty cycle in time:
CCPR1L and CCP1CON<5:4> can be written to at any
time, but the duty cycle value is not latched into
CCPR1H until after a match between PR2 and TMR2
occurs (i.e., the period is complete). In PWM mode,
CCPR1H is a read-only register.
The CCPR1H register and a 2-bit internal latch are
used to double buffer the PWM duty cycle. This double
buffering is essential for glitchless PWM operation.
When the CCPR1H and 2-bit latch match TMR2 concatenated with an internal 2-bit Q clock or 2 bits of the
TMR2 prescaler, the CCP1 pin is cleared.
Maximum PWM resolution (bits) for a given PWM frequency:
OSC
F
F
PWM
)
bits
log(
=
log(2)
Note:If the PWM duty cycle value is longer than
the PWM period the CCP1 pin will not be
cleared.
EXAMPLE 10-2: PWM PERIOD AND DUTY
CYCLE CALCULATION
Desired PWM frequency is 31.25 kHz,
Fosc = 8 MHz
TMR2 prescale = 1
At most, an 8-bit resolution duty cycle can be obtained
from a 31.25 kHz frequency and a 8 MHz oscillator, i.e.,
0 ≤ CCPR1L:CCP1CON<5:4> ≤ 255. An y value greater
than 255 will result in a 100% duty cycle.
In order to achieve higher resolution, the PWM frequency must be decreased. In order to achieve higher
PWM frequency, the resolution must be decreased.
Table 10-2 lists example PWM frequencies and resolutions for Fosc = 8 MHz. TMR2 prescaler and PR2 values are also shown.
10.3.3SET-UP FOR PWM OPERATION
The following steps should be taken when configuring
the CCP module for PWM operation:
1.Set the PWM period by writing to the PR2 register.
2.Set the PWM duty cycle by writing to the
CCPR1L register and CCP1CON<5:4> bits.
3.Make the CCP1 pin an output by clearing the
TRISC<2> bit.
4.Set the TMR2 prescale value and enable Timer2
by writing to T2CON.
5.Configure the CCP module for PWM operation.
PWMRESOLUTION
PWMRESOLUTION
PWMRESOLUTION
• 1/8 MHz • 1
• 125 ns • 1
TABLE 10-2: EXAMPLE PWM FREQUENCIES AND RESOLUTIONS AT 8 MHz
0ChPIR1LCDIF ADIF
8ChPIE1LCDIE ADIE
87hTRISC——PORTC Data Direction Control Register--11 1111 --11 1111
0EhTMR1LHolding register for the Least Significant Byte of the 16-bit TMR1 register
0FhTMR1HHolding register for the Most Significant Byte of the 16-bit TMR1 register
10hT1CON
15hCCPR1LCapture/Compare/PWM1 (LSB)
16hCCPR1HCapture/Compare/PWM1 (MSB)
17hCCP1CON
Legend:x = unknown, u = unchanged, - = unimplemented locations read as '0’. Shaded cells are not used in these modes.
Note1: Bits ADIE and ADIF reserved on the PIC16C923, always maintain these bits clear.
Legend:x = unknown, u = unchanged, - = unimplemented locations read as '0’. Shaded cells are not used in this mode.
Note1: Bits ADIE and ADIF reserved on the PIC16C923, always maintain these bits clear.
INTCONGIEPEIE
LCDIFADIF
LCDIEADIE
——PORTC Data Direction Control Register--11 1111 --11 1111
DS30444E - page 62 1997 Microchip Technology Inc.
PIC16C9XX
11.0SYNCHRONOUS SERIAL
PORT (SSP) MODULE
The Synchronous Serial Port (SSP) module is a serial
interface useful for communicating with other peripheral or microcontroller devices. These peripheral
devices may be serial EEPROMs, shift registers, dis-
play drivers, A/D converters, etc. The SSP module can
operate in one of two modes:
• Serial Peripheral Interface (SPI)
• Inter-Integrated Circuit (I
Refer to Application Note AN578,
Module in the I
2
C Multi-Master Environment."
2
C)
FIGURE 11-1: SSPSTAT: SYNC SERIAL PORT STATUS REGISTER (ADDRESS 94h)
R/W-0 R/W-0R-0R-0R-0R-0R-0R-0
SMPCKED/A
bit7bit0
bit 7:SMP: SPI data input sample phase
SPI Master Mode
1 = Input data sampled at end of data output time
0 = Input data sampled at middle of data output time
SPI Sla
ve Mode
SMP must be cleared when SPI is used in slave mode
bit 6:CKE: SPI Clock Edge Select (Figure 11-5, Figure 11-6, and Figure 11-7)
CKP = 0
1 = Data transmitted on rising edge of SCK
0 = Data transmitted on falling edge of SCK
CKP = 1
1 = Data transmitted on falling edge of SCK
0 = Data transmitted on rising edge of SCK
bit 5:D/A
bit 4:P: Stop bit (I
bit 3:S: Start bit (I
bit 2:R/W
bit 1:UA: Update Address (10-bit I
bit 0:BF: Buffer Full Status bit
: Data/Address bit (I2C mode only)
1 = Indicates that the last byte received or transmitted was data
0 = Indicates that the last byte received or transmitted was address
2
C mode only. This bit is cleared when the SSP module is disabled, or when the Start bit was
detected last)
1 = Indicates that a stop bit has been detected last (this bit is '0' on RESET)
0 = Stop bit was not detected last
2
detected last)
1 = Indicates that a start bit has been detected last (this bit is '0' on RESET)
0 = Start bit was not detected last
: Read/Write bit information (I2C mode only)
This bit holds the R/W bit information following the last address match. This bit is only valid from the
address match to the next start bit, stop bit, or A
1 = Read
0 = Write
1 = Indicates that the user needs to update the address in the SSPADD register
0 = Address does not need to be updated
e (SPI and I2C modes)
Receiv
1 = Receive complete, SSPBUF is full
0 = Receive not complete, SSPBUF is empty
T
ransmit (I2C mode only)
1 = Transmit in progress, SSPBUF is full
0 = Transmit complete, SSPBUF is empty
PSR/WUABFR = Readable bit
W =Writable bit
U = Unimplemented bit,
read as ‘0’
- n =Value at POR reset
C mode only. This bit is cleared when the SSP module is disabled, or when the Stop bit w as
FIGURE 11-2: SSPCON: SYNC SERIAL PORT CONTROL REGISTER (ADDRESS 14h)
R/W-0R/W-0R/W-0R/W-0R/W-0R/W-0R/W-0R/W-0
WCOLSSPOVSSPENCKPSSPM3 SSPM2SSPM1SSPM0R = Readable bit
bit7bit0
bit 7:WCOL: Write Collision Detect bit
1 = The SSPBUF register is written while it is still transmitting the previous word
(must be cleared in software)
0 = No collision
bit 6:SSPOV: Receive Overflow Indicator bit
In SPI mode
1 = A new byte is received while the SSPB UF register is still holding the previous data. In case of ov erflow ,
the data in SSPSR is lost. Ov erflow can only occur in sla v e mode. The user must read the SSPBUF, even
if only transmitting data, to avoid setting overflow. In master mode the overflow bit is not set since each
new reception (and transmission) is initiated by writing to the SSPBUF register.
0 = No overflow
2
In I
C mode
1 = A byte is received while the SSPBUF register is still holding the pre vious byte. SSPO V is a "don’t care"
in transmit mode. SSPOV must be cleared in software in either mode.
0 = No overflow
bit 5:SSPEN: Synchronous Serial Port Enable bit
In SPI mode
1 = Enables serial port and configures SCK, SDO, and SDI as serial port pins
0 = Disables serial port and configures these pins as I/O port pins
2
C mode
In I
1 = Enables the serial port and configures the SDA and SCL pins as serial port pins
0 = Disables serial port and configures these pins as I/O port pins
In both modes, when enabled, these pins must be properly configured as input or output.
bit 4:CKP: Clock Polarity Select bit
In SPI mode
1 = Idle state for clock is a high level
0 = Idle state for clock is a low level
2
In I
C mode
SCK release control
1 = Enable clock
0 = Holds clock low (clock stretch) (Used to ensure data setup time)
bit 3-0: SSPM3:SSPM0: Synchronous Serial Port Mode Select bits
0000 = SPI master mode, clock = F
0001 = SPI master mode, clock = F
0010 = SPI master mode, clock = F
OSC/4
OSC/16
OSC/64
0011 = SPI master mode, clock = TMR2 output/2
0100 = SPI slave mode, clock = SCK pin. SS
0101 = SPI slave mode, clock = SCK pin. SS
0110 = I
0111 = I
1011 = I
1110 = I
1111 = I
2
C slave mode, 7-bit address
2
C slave mode, 10-bit address
2
C Firmware controlled master mode (slave idle)
2
C slave mode, 7-bit address with start and stop bit interrupts enabled
2
C slave mode, 10-bit address with start and stop bit interrupts enabled
pin control enabled.
pin control disabled. SS can be used as I/O pin
W =Writable bit
U = Unimplemented bit,
read as ‘0’
- n =Value at POR reset
DS30444E - page 64 1997 Microchip Technology Inc.
PIC16C9XX
11.1SPI Mode
The SPI mode allows 8-bits of data to be synchronously transmitted and received simultaneously. To
accomplish communication, typically three pins are
used:
• Serial Data Out (SDO) RC5/SDO
• Serial Data In (SDI) RC4/SDI
• Serial Clock (SCK) RC3/SCK
Additionally a fourth pin may be used when in a slave
mode of operation:
• Slave Select (SS
is implemented on the PIC16C924 only)
When initializing the SPI, several options need to be
specified. This is done by programming the appropriate
control bits in the SSPCON register (SSPCON<5:0>)
and SSPSTAT<7:6>. These control bits allow the following to be specified:
• Master Mode (SCK is the clock output)
• Slave Mode (SCK is the clock input)
• Clock Polarity (Idle state of SCK)
• Clock edge (output data on rising/falling edge of
SCK)
• Clock Rate (Master mode only)
• Slave Select Mode (Slave mode only)
The SSP consists of a transmit/receive Shift Register
(SSPSR) and a buffer register (SSPBUF). The SSPSR
shifts the data in and out of the device, MSb first. The
SSPBUF holds the data that was written to the SSPSR,
until the received data is ready. Once the 8-bits of data
have been received, that b yte is mov ed to the SSPBUF
register. Then the buffer full detect bit BF
(SSPSTAT<0>) and interrupt flag bit SSPIF (PIR1<3>)
are set. This double buffering of the received data
(SSPBUF) allows the next b yte to start reception before
reading the data that was just received. Any write to the
SSPBUF register during transmission/reception of data
will be ignored, and the write collision detect bit WCOL
(SSPCON<7>) will be set. User softw are must clear the
WCOL bit so that it can be determined if the following
write(s) to the SSPBUF register completed successfully. When the application software is expecting to
receive valid data, the SSPBUF should be read before
the next byte of data to transfer is written to the
SSPBUF. Buffer full bit BF (SSPSTAT<0>) indicates
when SSPBUF has been loaded with the received data
(transmission is complete). When the SSPBUF is read,
bit BF is cleared. This data may be irrelevant if the SPI
is only a transmitter. Generally the SSP Interrupt is
used to determine when the transmission/reception
has completed. The SSPB UF must be read and/or written. If the interrupt method is not going to be used, then
software polling can be done to ensure that a write collision does not occur. Example 11-1 shows the loading
of the SSPBUF (SSPSR) for data transmission. The
shaded instruction is only required if the received data
is meaningful.
) RA5/AN4/SS (the AN4 function
EXAMPLE 11-1: LOADING THE SSPBUF
(SSPSR) REGISTER
BCF STATUS, RP1 ;Select Bank1
BSF STATUS, RP0 ;
LOOP BTFSS SSPSTAT, BF ;Has data been
;received
;(transmit
;complete)?
GOTO LOOP ;No
BCF STATUS, RP0 ;Select Bank0
MOVF SSPBUF, W ;W reg = contents
; of SSPBUF
MOVWF RXDATA ;Save in user RAM
MOVF TXDATA, W ;W reg = contents
; of TXDATA
MOVWF SSPBUF ;New data to xmit
The block diagram of the SSP module, when in SPI
mode (Figure 11-3), shows that the SSPSR is not
directly readable or writable, and can only be accessed
from addressing the SSPBUF register. Additionally, the
SSP status register (SSPSTAT) indicates the var ious
status conditions.
To enable the serial port, SSP Enable bit, SSPEN
(SSPCON<5>) must be set. To reset or reconfigure SPI
mode, clear bit SSPEN, re-initialize the SSPCON register, and then set bit SSPEN. This configures the SDI,
SDO, SCK, and SS
pins as serial port pins. For the pins
to behave as the serial port function, they must have
their data direction bits (in the TRISC register) appropriately programmed. That is:
• SDI must have TRISC<4> set
• SDO must have TRISC<5> cleared
• SCK (Master mode) must have TRISC<3>
cleared
• SCK (Slave mode) must have TRISC<3> set
• SS
must have TRISA<5> set
Any serial port function that is not desired may be overridden by programming the corresponding data direction (TRIS) register to the opposite value. An example
would be in master mode where you are only sending
data (to a display driver), then both SDI and SS
could
be used as general purpose outputs by clearing their
corresponding TRIS register bits.
Figure 11-4 shows a typical connection between two
microcontrollers. The master controller (Processor 1)
initiates the data transfer by sending the SCK signal.
Data is shifted out of both shift registers on their programmed clock edge, and latched on the opposite edge
of the clock. Both processors should be programmed to
same Clock Polarity (CKP), then both controllers would
send and receive data at the same time. Whether the
data is meaningful (or dummy data) depends on the
application software. This leads to three scenarios for
data transmission:
• Master sends data — Slave sends dummy data
• Master sends data — Slave sends data
• Master sends dummy data — Slave sends data
The master can initiate the data transfer at any time
because it controls the SCK. The master deter mines
when the slave (Processor 2) is to broadcast data by
the firmware protocol.
In master mode the data is transmitted/received as
soon as the SSPBUF register is written to. If the SPI is
only going to receive, the SCK output could be disabled
(programmed as an input). The SSPSR register will
continue to shift in the signal present on the SDI pin at
the programmed clock rate. As each byte is received, it
will be loaded into the SSPBUF register as if a normal
received byte (interrupts and status bits appropriately
set). This could be useful in receiver applications as a
“line activity monitor” mode.
In slave mode, the data is transmitted and received as
the external clock pulses appear on SCK. When the last
bit is latched the interrupt flag bit SSPIF (PIR1<3>) is
set.
The clock polarity is selected by appropriately programming bit CKP (SSPCON<4>). This then would give
waveforms for SPI communication as shown in
Figure 11-5, Figure 11-6, and Figure 11-7 where the
MSB is transmitted first. In master mode, the SPI clock
rate (bit rate) is user programmable to be one of the f ollowing:
• F
OSC/4 (or TCY)
• F
OSC/16 (or 4 • TCY)
• F
OSC/64 (or 16 • TCY)
• Timer2 output/2
This allows a maximum bit clock frequency (at 8 MHz)
of 2 MHz. When in slave mode the external clock must
meet the minimum high and low times.
In sleep mode, the slave can transmit and receive data
and wake the device from sleep.
FIGURE 11-4: SPI MASTER/SLAVE CONNECTION
SPI Master SSPM3:SSPM0 = 00xxb
SDO
Serial Input Buffer
(SSPBUF)
Shift Register
(SSPSR)
MSb
PROCESSOR 1
DS30444E - page 66 1997 Microchip Technology Inc.
LSb
SDI
SCK
Serial Clock
SPI Slave SSPM3:SSPM0 = 010xb
SDI
Serial Input Buffer
(SSPBUF)
SDO
SCK
Shift Register
(SSPSR)
MSb
PROCESSOR 2
LSb
PIC16C9XX
The SS pin allows a synchronous slave mode. The
SPI must be in slave mode (SSPCON<3:0> = 04h)
and the TRISA<5> bit must be set for the synchronous slave mode to be enabled. When the SS
pin is
low, transmission and reception are enabled and the
SDO pin is driven. When the SS
pin goes high, the
SDO pin is no longer driven, even if in the middle of
a transmitted byte, and becomes a floating output.
External pull-up/ pull-down resistors may be desirable,
depending on the application.
FIGURE 11-5: SPI MODE TIMING, MASTER MODE
SCK (CKP = 0,
CKE = 0)
SCK (CKP = 0,
CKE = 1)
SCK (CKP = 1,
CKE = 0)
SCK (CKP = 1,
CKE = 1)
Note:When the SPI is in Slave Mode with SS pin
control enabled, (SSPCON<3:0> = 0100)
the SPI module will reset if the SS
to V
DD.
pin is set
Note:If the SPI is used in Slave Mode with
CKE = '1', then the SS
pin control must be
enabled.
To emulate two-wire communication, the SDO pin can
be connected to the SDI pin. When the SPI needs to
operate as a receiver the SDO pin can be configured as
an input. This disables transmissions from the SDO.
The SDI can always be left as an input (SDI function)
since it cannot create a bus conflict.
0ChPIR1
8ChPIE1LCDIEADIE
13hSSPBUFSynchronous Serial Port Receive Buffer/Transmit Registerxxxx xxxxuuuu uuuu
14hSSPCONWCOLSSPOVSSPENCKPSSPM3SSPM2SSPM1SSPM00000 00000000 0000
85hTRISA——PORTA Data Direction Control Register--11 1111--11 1111
87hTRISC——PORTC Data Direction Control Register--11 1111--11 1111
94hSSPSTATSMPCKED/APSR/WUABF0000 00000000 0000
Legend:x = unknown, u = unchanged, - = unimplemented read as '0'. Shaded cells are not used by the SSP in SPI mode.
Note1: Bits ADIE and ADIF are reserved on the PIC16C923, always maintain these bits clear.
INTCONGIEPEIE
LCDIFADIF
T0IEINTERBIET0IFINTFRBIF0000 000x0000 000u
(1)
——SSPIFCCP1IFTMR2IFTMR1IF00-- 000000-- 0000
(1)
——SSPIECCP1IETMR2IETMR1IE00-- 000000-- 0000
Value on
Power-on
Reset
Value on all
other resets
DS30444E - page 68 1997 Microchip Technology Inc.
PIC16C9XX
11.2 I2C Overview
This section provides an overview of the Inter-Integrated Circuit (I
the operation of the SSP module in I
2
C bus is a two-wire serial interface de v eloped by
The I
the Philips Corporation. The original specification, or
standard mode, was for data transfers of up to 100
Kbps. An enhanced specification, or fast mode is not
supported. This device will communicate with fast
mode devices if attached to the same bus.
2
The I
C interface employs a comprehensiv e protocol to
ensure reliable transmission and reception of data.
When transmitting data, one device is the “master”
which initiates transfer on the bus and generates the
clock signals to permit that transfer, while the other
device(s) acts as the “slave.” All portions of the slave
protocol are implemented in the SSP module’s hardware, except general call support, while portions of the
master protocol need to be addressed in the
PIC16CXXX software. Table 11-2 defines some of the
2
I
C bus terminology. For additional information on the
2
I
C interface specification, refer to the Philips docu-
ment “
The I2C bus and how to use it. ”
which can be obtained from the Philips Corporation.
In the I
address. When a master wishes to initiate a data transfer , it first transmits the address of the device that it
wishes to “talk” to. All devices “listen” to see if this is
their address. Within this address, a bit specifies if the
master wishes to read-from/write-to the slave device.
The master and slave are always in opposite modes
(transmitter/receiver) of operation during a data transfer. That is they can be thought of as operating in either
of these two relations:
• Master-transmitter and Slave-receiver
• Slave-transmitter and Master-receiver
In both cases the master generates the clock signal.
2
C) bus, with Section 11.3 discussing
2
C mode.
#939839340011,
2
C interface protocol each device has an
The output stages of the clock (SCL) and data (SDA)
lines must have an open-drain or open-collector in
order to perform the wired-AND function of the bus.
External pull-up resistors are used to ensure a high
level when no de vice is pulling the line do wn. The number of devices that may be attached to the I
2
C bus is
limited only by the maximum bus loading specification
of 400 pF.
11.2.1INITIATING AND TERMINATING DATA
TRANSFER
During times of no data transfer (idle time), both the
clock line (SCL) and the data line (SDA) are pulled high
through the external pull-up resistors. The START and
STOP conditions determine the start and stop of data
transmission. The ST AR T condition is defined as a high
to low transition of the SDA when the SCL is high. The
STOP condition is defined as a low to high transition of
the SDA when the SCL is high. Figure 11-8 shows the
START and STOP conditions. The master generates
these conditions for starting and terminating data transfer . Due to the definition of the START and STOP conditions, when data is being transmitted, the SDA line
can only change state when the SCL line is low.
FIGURE 11-8: START AND STOP
CONDITIONS
SDA
S
SCL
Start
Condition
Change
of Data
Allowed
Change
of Data
Allowed
P
Stop
Condition
TABLE 11-2: I2C BUS TERMINOLOGY
TermDescription
TransmitterThe device that sends the data to the bus.
ReceiverThe device that receives the data from the bus.
MasterThe device which initiates the transfer, generates the clock and terminates the transfer.
SlaveThe device addressed by a master.
Multi-masterMore than one master device in a system. These masters can attempt to control the bus at the
same time without corrupting the message.
ArbitrationProcedure that ensures that only one of the master devices will control the bus. This ensure that
the transfer data does not get corrupted.
SynchronizationProcedure where the clock signals of two or more devices are synchronized.
11.2.3TRANSFER ACKNOWLEDGE
All data must be transmitted per byte, with no limit to the
number of bytes transmitted per data transfer. After
each byte, the slave-receiver generates an acknowledge bit (A
CK) (Figure 11-11). When a slave-receiver
doesn’t acknowledge the slave address or received
data, the master must abort the transfer. The slave
must leave SDA high so that the master can generate
the STOP condition (Figure 11-8).
= 0 for write
FIGURE 11-11: SLAVE-RECEIVER
ACKNOWLEDGE
Data
Output by
Transmitter
Data
Output by
Receiver
SCL from
Master
S
Start
Condition
If the master is receiving the data (master-receiver), it
generates an acknowledge signal for each received
byte of data, except for the last byte. To signal the end
of data to the slave-transmitter, the master does not
generate an acknowledge (not acknowledge). The
slave then releases the SDA line so the master can
generate the STOP condition. The master can also
generate the STOP condition during the acknowledge
pulse for valid termination of data transfer.
If the slave needs to delay the transmission of the next
byte, holding the SCL line low will f orce the master into
a wait state. Data transfer continues when the slave
releases the SCL line. This allo ws the slave to mo ve the
received data or fetch the data it needs to transfer
before allowing the clock to start. This wait state technique can also be implemented at the bit level,
Figure 11-12. The slave will inherently stretch the clock,
when it is a transmitter, b ut will not when it is a receiver .
The slave will have to clear the SSPCON<4> bit to
enable clock stretching when it is a receiver.
1
not acknowledge
acknowledge
2
8
9
Clock Pulse for
Acknowledgment
FIGURE 11-12:DATA TRANSFER WAIT STATE
SDA
MSBacknowledgment
SCL
S
Start
Condition
DS30444E - page 70 1997 Microchip Technology Inc.
12789123 • 89
AddressR/W
signal from receiver
byte complete
interrupt with receiver
clock line held low while
interrupts are serviced
ACK Wait
State
DataACK
acknowledgment
signal from receiver
P
Stop
Condition
PIC16C9XX
Figure 11-13 and Figure 11-14 show Master-transmitter and Master-receiver data transfer sequences.
When a master does not wish to relinquish the bus (by
generating a STOP condition), a repeated START condition (Sr) must be generated. This condition is identical
to the start condition (SDA goes high-to-low while SCL
FIGURE 11-13: MASTER-TRANSMITTER SEQUENCE
For 7-bit address:
S
Slave AddressR/W A Data A Data A/A P
'0' (write)data transferred
A master transmitter addresses a slave receiver with a
7-bit address. The transfer direction is not changed.
From master to slave
From slave to master
(n bytes - acknowledge)
A = acknowledge (SDA low)
= not acknowledge (SDA high)
A
S = Start Condition
P = Stop Condition
FIGURE 11-14: MASTER-RECEIVER SEQUENCE
For 7-bit address:
Slave AddressR/W
S
'1' (read)data transferred
A master reads a slave immediately after the first byte.
From master to slave
From slave to master
A Data A Data A P
(n bytes - acknowledge)
A = acknowledge (SDA low)
= not acknowledge (SDA high)
A
S = Start Condition
P = Stop Condition
is high), but occurs after a data transfer acknowledge
pulse (not the bus-free state). This allows a master to
send “commands” to the slave and then receive the
requested information or to address a different slave
device. This sequence is shown in Figure 11-15.
For 10-bit address:
Slave Address
SR/W
First 7 bits
(write)
Data ADataP
A master transmitter addresses a slave receiver
with a 10-bit address.
For 10-bit address:
Slave Address
SR/W
First 7 bits
(write)
Slave Address
SrR/W A3AData APData
First 7 bits
A master transmitter addresses a slave receiver
with a 10-bit address.
A1Slave Address
Second byte
A/A
A1Slave Address
Second byte
(read)
A2
A2
FIGURE 11-15: COMBINED FORMAT
(read or write)
(n bytes + acknowledge)
S
Slave AddressR/W A Data A/A SrP
(read)Sr = repeated
Transfer direction of data and acknowledgment bits depends on R/W
Combined format:
Slave Address
SrR/W A
First 7 bits
(write)
Combined format - A master addresses a slave with a 10-bit address, then transmits
data to this slave and reads data from this slave.
Start Condition
Slave Address
Second byte
A = acknowledge (SDA low)
A
= not acknowledge (SDA high)
S = Start Condition
P = Stop Condition
Slave Address R/W
(write)Direction of transfer
DataSr Slave Address
A Data A/A
may change at this point
bits.
First 7 bits
(read)
A Data AAPAAData A/AData
R/W
PIC16C9XX
11.2.4MULTI-MASTER
2
The I
C protocol allows a system to have more than
one master. This is called multi-master. When two or
more masters try to transfer data at the same time, arbitration and synchronization occur.
11.2.4.1ARBITRATION
Arbitration takes place on the SDA line, while the SCL
line is high. The master which transmits a high when the
other master transmits a low loses arbitration
(Figure 11-16), and turns off its data output stage. A
master which lost arbitration can generate clock pulses
until the end of the data byte where it lost arbitration.
When the master devices are addressing the same
device, arbitration continues into the data.
FIGURE 11-16: MULTI-MASTER
ARBITRATION
(TWO MASTERS)
transmitter 1 loses arbitration
DATA 1 SDA
DATA 1
DATA 2
SDA
SCL
11.2.4.2 Clock Synchronization
Clock synchronization occurs after the devices have
started arbitration. This is performed using a
wired-AND connection to the SCL line. A high to low
transition on the SCL line causes the concerned
devices to start counting off their low period. Once a
device clock has gone low, it will hold the SCL line low
until its SCL high state is reached. The lo w to high transition of this clock may not change the state of the SCL
line, if another device clock is still within its low period.
The SCL line is held low by the device with the longest
low period. Devices with shorter low periods enter a
high wait-state, until the SCL line comes high. When the
SCL line comes high, all devices start counting off their
high periods. The first device to complete its high period
will pull the SCL line low. The SCL line high time is
determined by the device with the shortest high period,
Figure 11-17.
FIGURE 11-17: CLOCK SYNCHRONIZATION
start counting
HIGH period
CLK
1
CLK
2
state
counter
reset
wait
Masters that also incorporate the slave function, and
have lost arbitration must immediately switch over to
slave-receiver mode . This is because the winning master-transmitter may be addressing it.
Arbitration is not allowed between:
• A repeated START condition
• A STOP condition and a data bit
• A repeated START condition and a STOP condi-
tion
Care needs to be taken to ensure that these conditions
do not occur.
SCL
DS30444E - page 72 1997 Microchip Technology Inc.
PIC16C9XX
11.3SSP I2C Operation
The SSP module in I2C mode fully implements all slave
functions, except general call support, and provides
interrupts on start and stop bits in hardware to facilitate
firmware implementations of the master functions. The
SSP module implements the standard mode specifications as well as 7-bit and 10-bit addressing. Two pins
are used for data transfer . These are the RC3/SCK/SCL
pin, which is the clock (SCL), and the RC4/SDI/SDA
pin, which is the data (SDA). The user must configure
these pins as inputs or outputs through the
TRISC<4:3> bits. The SSP module functions are
enabled by setting SSP Enable bit SSPEN (SSPCON<5>).
FIGURE 11-18: SSP BLOCK DIAGRAM
(I2C MODE)
Internal
data bus
ReadWrite
shift
MSb
SSPBUF reg
SSPSR reg
Match detect
SSPADD reg
Start and
Stop bit detect
LSb
Addr Match
Set, Reset
S, P bits
(SSPSTAT reg)
RC3/SCK/SCL
clock
RC4/
SDI/
SDA
The SSP module has five registers for I2C operation.
These are the:
• SSP Control Register (SSPCON)
• SSP Status Register (SSPSTAT)
• Serial Receive/Transmit Buffer (SSPBUF)
• SSP Shift Register (SSPSR) - Not directly accessible
• SSP Address Register (SSPADD)
The SSPCON register allows control of the I2C operation. Four mode selection bits (SSPCON<3:0>) allow
one of the following I
2
C Slave mode (7-bit address)
• I
2
• I
C Slave mode (10-bit address)
2
• I
C Slave mode (7-bit address), with start and
2
C modes to be selected:
stop bit interrupts enabled
2
• I
C Slave mode (10-bit address), with start and
stop bit interrupts enabled
2
• I
C Firmware controlled Master Mode, slave is
idle
2
Selection of any I
C mode, with the SSPEN bit set,
forces the SCL and SDA pins to be open drain, provided these pins are programmed to inputs by setting
the appropriate TRISC bits.
The SSPSTAT register gives the status of the data
transfer. This information includes detection of a ST ART
or STOP bit, specifies if the received byte was data or
address if the next byte is the completion of 10-bit
address, and if this will be a read or write data transfer.
The SSPSTAT register is read only.
The SSPBUF is the register to which transfer data is
written to or read from. The SSPSR register shifts the
data in or out of the device. In receive operations, the
SSPBUF and SSPSR create a doubled buffered
receiver. This allows reception of the next byte to begin
before reading the last byte of receiv ed data. When the
complete byte is received, it is transferred to the
SSPBUF register and flag bit SSPIF is set. If another
complete byte is received before the SSPBUF register
is read, a receiver overflow has occurred and bit
SSPOV (SSPCON<6>) is set and the byte in the
SSPSR is lost.
The SSPADD register holds the slave address. In 10-bit
mode, the user needs to write the high byte of the
address (1111 0 A9 A8 0). Following the high byte
address match, the low byte of the address needs to be
loaded (A7:A0).
11.3.1SLAVE MODE
In slave mode, the SCL and SDA pins must be config-
ured as inputs (TRISC<4:3> set). The SSP module will
override the input state with the output data when
required (slave-transmitter).
When an address is matched or the data transfer after
an address match is received, the hardware automatically will generate the acknowledge (A
then load the SSPBUF register with the received value
currently in the SSPSR register.
There are certain conditions that will cause the SSP
module not to give this A
(or both):
a)The buffer full bit BF (SSPSTAT<0>) was set
before the transfer was received.
b)The overflow bit SSPOV (SSPCON<6>) was set
before the transfer was received.
In this case, the SSPSR register value is not loaded into
the SSPBUF, but bit SSPIF (PIR1<3>) is set. Table 11-3
shows what happens when a data transfer byte is
received, given the status of bits BF and SSPOV. The
shaded cells show the condition where user software
did not properly clear the overflow condition. Flag bit BF
is cleared by reading the SSPBUF register while bit
SSPOV is cleared through software.
The SCL clock input must have a minimum high and
low time for proper operation. The high and lo w times of
2
the I
C specification as well as the requirement of the
SSP module is shown in timing parameter #100 and
parameter #101.
11.3.1.1ADDRESSING
Once the SSP module has been enabled, it waits for a
START condition to occur. Following the START condition, the 8-bits are shifted into the SSPSR register. All
incoming bits are sampled with the rising edge of the
clock (SCL) line. The value of register SSPSR<7:1> is
compared to the value of the SSPADD register. The
CK pulse. These are if either
CK) pulse, and
address is compared on the falling edge of the eighth
clock (SCL) pulse. If the addresses match, and the BF
and SSPOV bits are clear, the following events occur:
a)The SSPSR register value is loaded into the
SSPBUF register.
b)The buffer full bit, BF is set.
c)An A
d)SSP interrupt flag bit, SSPIF (PIR1<3>) is set
In 10-bit address mode, two address bytes need to be
received by the slav e (Figure 11-10). The fiv e Most Significant bits (MSbs) of the first address byte specify if
this is a 10-bit address. Bit R/W
specify a write so the slave device will receive the second address byte. For a 10-bit address the first byte
would equal ‘1111 0 A9 A8 0 ’, where A9 and A8 are
the two MSbs of the address. The sequence of events
for a 10-bit address is as follows, with steps 7- 9 for
slave-transmitter:
1.Receive first (high) byte of Address (bits SSPIF,
2.Update the SSPADD register with second (low)
3.Read the SSPBUF register (clears bit BF) and
4.Receive second (low) byte of Address (bits
5.Update the SSPADD register with the first (high)
6.Read the SSPBUF register (clears bit BF) and
7.Receive repeated START condition.
8.Receive first (high) byte of Address (bits SSPIF
9.Read the SSPBUF register (clears bit BF) and
CK pulse is generated.
(interrupt is generated if enabled) - on the falling
edge of the ninth SCL pulse.
(SSPSTAT<2>) must
BF, and bit UA (SSPSTAT<1>) are set).
byte of Address (clears bit UA and releases the
SCL line).
clear flag bit SSPIF.
SSPIF, BF, and UA are set).
byte of Address, if match releases SCL line, this
will clear bit UA.
clear flag bit SSPIF.
and BF are set).
clear flag bit SSPIF.
TABLE 11-3: DATA TRANSFER RECEIVED BYTE ACTIONS
Status Bits as Data
Transfer is Received
BFSSPOV
00YesYesYes
10NoNoYes
11NoNoYes
01NoNoYes
DS30444E - page 74 1997 Microchip Technology Inc.
SSPSR
→ SSPBUF
Generate A
CK
Pulse
Set bit SSPIF
(SSP Interrupt occurs
if enabled)
PIC16C9XX
11.3.1.2RECEPTION
An SSP interrupt is generated for each data transfer
byte. Flag bit SSPIF (PIR1<3>) must be cleared in soft-
When the R/W
address match occurs, the R/W
bit of the address byte is clear and an
bit of the SSPST AT reg-
ware. The SSPSTAT register is used to determine the
status of the byte.
ister is cleared. The received address is loaded into the
SSPBUF register.
When the address byte overflow condition exists, then
no acknowledge (A
CK) pulse is given. An ov erflow condition is defined as either bit BF (SSPSTAT<0>) is set
or bit SSPOV (SSPCON<6>) is set.
FIGURE 11-19: I2C WAVEFORMS FOR RECEPTION (7-BIT ADDRESS)
Receiving Address
A7 A6 A5 A4
12
S
SCL
SSPIF (PIR1<3>)
BF (SSPSTAT<0>)
SSPOV (SSPCON<6>)
R/W=0
CK
A3 A2 A1SDA
3
6
4
5
A
7
9
8
Receiving Data
D5
D6D7
3
12
4
Cleared in software
SSPBUF register is read
Bit SSPOV is set because the SSPBUF register is still full.
An SSP interrupt is generated for each data transfer
byte. Flag bit SSPIF must be cleared in software, and
When the R/W
and an address match occurs, the R/W
SSPSTAT register is set. The received address is
loaded into the SSPBUF register. The A
sent on the ninth bit, and pin RC3/SCK/SCL is held low .
The transmit data must be loaded into the SSPBUF
register, which also loads the SSPSR register . Then pin
RC3/SCK/SCL should be enabled by setting bit CKP
(SSPCON<4>). The master must monitor the SCL pin
prior to asserting another clock pulse. The slave
devices may be holding off the master b y stretching the
clock. The eight data bits are shifted out on the falling
edge of the SCL input. This ensures that the SD A signal
is valid during the SCL high time (Figure 11-20).
bit of the incoming address byte is set
bit of the
CK pulse will be
the SSPSTAT register is used to determine the status of
the byte. Flag bit SSPIF is set on the falling edge of the
ninth clock pulse.
As a slave-transmitter, the A
ter-receiver is latched on the rising edge of the ninth
SCL input pulse. If the SDA line was high (not A
then the data transfer is complete. When the A
latched by the slave, the slave logic is reset and the
slave then monitors for another occurrence of the
START bit. If the SDA line was low (A
data must be loaded into the SSPBUF register, which
also loads the SSPSR register. Then pin
RC3/SCK/SCL should be enabled by setting bit CKP.
FIGURE 11-20: I2C WAVEFORMS FOR TRANSMISSION (7-BIT ADDRESS)
SDA
SCL
SSPIF (PIR1<3>)
BF (SSPSTAT<0>)
CKP (SSPCON<4>)
A7A6 A5A4 A3 A2 A1ACKD7 D6 D5 D4 D3 D2 D1 D0
123456789123456789
S
Data in
sampled
SCL held low
while CPU
responds to SSPIF
cleared in software
SSPBUF is written in software
Set bit after writing to SSPBUF
(the SSPBUF must be written-to
before the CKP bit can be set)
CK pulse from the mas-
CK),
CK is
CK), the transmit
A
CKTransmitting DataR/W = 1Receiving Address
P
From SSP interrupt
service routine
DS30444E - page 76 1997 Microchip Technology Inc.
PIC16C9XX
11.3.2MASTER MODE
Master mode of operation is supported, in firmware,
using interrupt generation on the detection of the
START and STOP conditions. The STOP (P) and
START (S) bits are cleared from a reset or when the
SSP module is disabled. The STOP and START bits will
toggle based on the start and stop conditions. Control
2
of the I
C bus may be taken when the P bit is set, or the
bus is idle with both the S and P bits clear.
In master mode the SCL and SDA lines are manipu-
lated by clearing the corresponding TRISC<4:3> bit(s).
The output level is always low, irrespective of the
value(s) in PORTC<4:3>. So when transmitting data, a
'1' data bit must have the TRISC<4> bit set (input) and
a '0' data bit must have the TRISC<4> bit cleared (output). The same scenario is true for the SCL line with the
TRISC<3> bit.
The following events will cause SSP Interrupt Flag bit,
SSPIF, to be set (SSP Interrupt if enabled):
• START condition
• STOP condition
• Data transfer byte transmitted/received
Master mode of operation can be done with either the
slave mode idle (SSPM3:SSPM0 = 1011) or with the
slave active. When both master and slave modes are
enabled, the software needs to differentiate the
source(s) of the interrupt.
11.3.3MULTI-MASTER MODE
In multi-master mode, the interrupt generation on the
detection of the ST ART and ST OP conditions allows the
determination of when the bus is free. The STOP (P)
and START (S) bits are cleared from a reset or when
the SSP module is disabled. The ST OP and START bits
will toggle based on the start and stop conditions. Control of the I
2
C bus may be taken when bit P (SSPSTAT<4>) is set, or the bus is idle with both the S and
P bits clear. When the bus is busy, enabling the SSP
Interrupt will generate the interrupt when the STOP
condition occurs.
In multi-master operation, the SDA line must be monitored to see if the signal level is the expected output
level. This check only needs to be done when a high
level is output. If a high le v el is expected and a lo w lev el
is present, the device needs to release the SDA and
SCL lines (set TRISC<4:3>). There are two stages
where this arbitration can be lost, they are:
• Address Transfer
• Data Transfer
When the slave logic is enabled, the sla ve continues to
receive. If arbitration was lost during the address transfer stage, communication to the device may be in
progress. If addressed an A
CK pulse will be generated.
If arbitration was lost during the data transfer stage, the
device will need to re-transfer the data at a later time.
TABLE 11-4: REGISTERS ASSOCIATED WITH I2C OPERATION
0ChPIR1
8ChPIE1
13hSSPBUFSynchronous Serial Port Receive Buffer/Transmit Register
93hSSPADDSynchronous Serial Port (I
14hSSPCONWCOLSSPOV SSPENCKPSSPM3 SSPM2SSPM1SSPM0
94hSSPSTATSMPCKED/A
87hTRISC
Legend:x = unknown, u = unchanged, - = unimplemented read as '0'. Shaded cells are not used by SSP in I
Note1: Bits ADIE and ADIF are reserved on the PIC16C923, always maintain these bits clear.
FIGURE 11-21: OPERATION OF THE I2C MODULE IN IDLE_MODE, RCV_MODE OR XMIT_MODE
IDLE_MODE (7-bit):
if (Addr_match){ Set interrupt;
if (R/W
= 1){Send ACK = 0;
set XMIT_MODE;
}
else if (R/W
}
RCV_MODE:
if ((SSPBUF=Full) OR (SSPOV = 1))
{Set SSPOV;
Do not acknowledge;
}
else { transfer SSPSR → SSPBUF;
send A
CK = 0;
}
Receive 8-bits in SSPSR;
Set interrupt;
XMIT_MODE:
While ((SSPBUF = Empty) AND (CKP=0)) Hold SCL Low;
Send byte;
Set interrupt;
if ( A
CK Received = 1){End of transmission;
Go back to IDLE_MODE;
}
else if ( A
IDLE_MODE (10-Bit):
If (High_byte_addr_match AND (R/W
else if (High_byte_addr_match AND (R/W
CK Received = 0) Go back to XMIT_MODE;
= 0))
{ PRIOR_ADDR_MATCH = FALSE;
Set interrupt;
if ((SSPBUF = Full) OR ((SSPOV = 1))
{ Set SSPOV;
Do not acknowledge;
}
else{Set UA = 1;
Send A
CK = 0;
While (SSPADD not updated) Hold SCL low;
Clear UA = 0;
Receive Low_addr_byte;
Set interrupt;
Set UA = 1;
If (Low_byte_addr_match)
{PRIOR_ADDR_MATCH = TRUE;
}
}
}
= 1)
{if (PRIOR_ADDR_MATCH)
{send A
}
else PRIOR_ADDR_MATCH = FALSE;
}
CK = 0;
set XMIT_MODE;
= 0) set RCV_MODE;
Send A
CK = 0;
while (SSPADD not updated) Hold SCL low;
Clear UA = 0;
Set RCV_MODE;
DS30444E - page 78 1997 Microchip Technology Inc.
PIC16C9XX
12.0ANALOG-TO-DIGITAL
CONVERTER (A/D) MODULE
This section applies to the PIC16C924 only.
The analog-to-digital (A/D) converter module has five
inputs.
The A/D allows conversion of an analog input signal to
a corresponding 8-bit digital number (refer to Application Note AN546 for use of A/D Converter). The output
of the sample and hold is the input into the converter,
which generates the result via successive approximation. The analog reference voltage is software selectable to either the device’s A
on the RA3/AN3/V
unique feature of being able to operate while the de vice
is in SLEEP mode.
To operate in sleep, the A/D conversion clock must be
derived from the A/D’s internal RC oscillator.
REF pin. The A/D converter has a
VDD pin or the voltage level
The A/D module has three registers. These registers
are:
• A/D Result Register (ADRES)
• A/D Control Register 0 (ADCON0)
• A/D Control Register 1 (ADCON1)
The ADCON0 register, shown in Figure 12-1, controls
the operation of the A/D module. The ADCON1 register, shown in Figure 12-2, configures the functions of
the port pins. The port pins can be configured as analog inputs (RA3 can also be a voltage reference) or as
digital I/O.
FIGURE 12-1: ADCON0 REGISTER (ADDRESS 1Fh)
R/W-0R/W-0R/W-0R/W-0R/W-0R/W-0R/W-0R/W-0
ADCS1 ADCS0CHS2CHS1CHS0GO/DONE
bit7bit0
bit 7-6: ADCS1:ADCS0: A/D Conversion Clock Select bits
If ADON = 1
1 = A/D conversion in progress (setting this bit starts the A/D conversion)
0 = A/D conversion not in progress (This bit is automatically cleared b y hardware when the A/D conversion
is complete)
bit 1:Reserved: Always maintain this bit clear
bit 0:ADON: A/D On bit
1 = A/D converter module is operating
0 = A/D converter module is shutoff and consumes no operating current
The ADRES register contains the result of the A/D conversion. When the A/D conversion is complete, the
result is loaded into the ADRES register, the GO/DONE
bit (ADCON0<2>) is cleared, and A/D interrupt flag bit
ADIF is set. The block diagram of the A/D module is
shown in Figure 12-3.
After the A/D module has been configured as desired,
the selected channel must be acquired before the conversion is started. The analog input channels must
have their corresponding TRIS bits selected as an
input. To determine acquisition time, see Section 12.1.
After this acquisition time has elapsed the A/D conversion can be started. The following steps should be followed for doing an A/D conversion:
1.Configure the A/D module:
• Configure analog pins / voltage reference /
and digital I/O (ADCON1)
• Select A/D input channel (ADCON0)
• Select A/D conversion clock (ADCON0)
• Turn on A/D module (ADCON0)
2.Configure A/D interrupt (if desired):
• Clear ADIF bit
• Set ADIE bit
• Set GIE bit
REF
VDD
VDD
3.Wait the required acquisition time.
4.Start conversion:
• Set GO/DONE
5.Wait for A/D conversion to complete, by either:
• Polling for the GO/DONE
OR
• Waiting for the A/D interrupt
6.Read A/D Result register (ADRES), clear bit
ADIF if required.
7.For next conversion, go to step 1 or step 2 as
required. The A/D conversion time per bit is
defined as T
required before next acquisition starts.
bit (ADCON0)
bit to be cleared
AD. A minimum wait of 2TAD is
DS30444E - page 80 1997 Microchip Technology Inc.
For the A/D converter to meet its specified accuracy,
the charge holding capacitor (C
HOLD) must be allowed
to fully charge to the input channel voltage level. The
analog input model is shown in Figure 12-4. The source
impedance (R
S) and the internal sampling switch (RSS)
impedance directly affect the time required to charge
the capacitor C
ance varies over the device voltage (V
HOLD. The sampling s witch (RSS) imped-
DD),
(Figure 12-4). The source impedance affects the offset
voltage at the analog input (due to pin leakage current).
The maximum recommended impedance for analog sources is 10 kΩ . After the analog input channel is
selected (changed) this acquisition must be done
before the conversion can be started.
To calculate the minimum acquisition time,
Equation 12-1 may be used. This equation calculates
the acquisition time to within 1/2 LSb error (512 steps
for the A/D). The 1/2 LSb error is the maximum error
allowed for the A/D to meet its specified accuracy.
EQUATION 12-1:A/D MINIMUM CHARGING
TIME
VHOLD = (VREF - (VREF/512)) • (1 - e
Given: VHOLD = (VREF/512), for 1/2 LSb resolution
The above equation reduces to:
TC = -(51.2 pF)(1 kΩ - RSS + RS) ln(1/511)
Example 12-1 shows the calculation of the minimum
required acquisition time (T
based on the following system assumptions.
CHOLD = 51.2 pF
Rs = 10 k
Ω
1/2 LSb error
DD = 5V → Rss = 7 kΩ
V
Temp (system max.) = 50°C
HOLD = 0 @ t = 0
V
(-Tc/CHOLD(RIC + RSS + RS))
ACQ). This calculation is
Note 1: The reference voltage (VREF) has no
effect on the equation, since it cancels
itself out.
Note 2: The charge holding capacitor (C
HOLD) is
not discharged after each conversion.
Note 3: The maximum recommended impedance
for analog sources is 10 kΩ. This is
required to meet the pin leakage specification.
Note 4: After a conversion has completed, a
2.0 T
AD delay must complete before
acquisition can begin again. During this
time the holding capacitor is not connected to the selected A/D input channel.
EXAMPLE 12-1: CALCULATING THE
MINIMUM REQUIRED
SAMPLE TIME
TACQ = Amplifier Settling Time +
Holding Capacitor Charging Time +
Temperature Coefficient
DS30444E - page 82 1997 Microchip Technology Inc.
VT = 0.6V
V
T = 0.6V
IC≤ 1k
R
I leakage
± 500 nA
Sampling
Switch
SS
6V
5V
V
DD
4V
3V
2V
SS
R
CHOLD
= DAC capacitance
= 51.2 pF
SS
V
5 6 7 8 9 10 11
Sampling Switch
( kΩ )
PIC16C9XX
12.2Selecting the A/D Conversion Clock
The A/D conversion time per bit is defined as TAD. The
A/D conversion requires 9.5 T
The source of the A/D conversion clock is software
selected. The four possible options for T
OSC
• 2T
• 8TOSC
• 32TOSC
• Internal RC oscillator
AD per 8-bit conversion.
AD are:
12.3Configuring Analog Port Pins
The ADCON1 and TRISA registers control the operation of the A/D port pins. The port pins that are desired
as analog inputs must have their corresponding TRIS
bits set (input). If the TRIS bit is cleared (output), the
digital output level (V
The A/D operation is independent of the state of the
CHS2:CHS0 bits and the TRIS bits.
Note 1: When reading the port register, all pins
For correct A/D conversions, the A/D conversion clock
(T
AD) must be selected to ensure a minimum TAD time
of 1.6 µs.
Table 12-1 shows the resultant T
AD times derived from
the device operating frequencies and the A/D clock
source selected.
Note 2: Analog levels on any pin that is defined as
TABLE 12-1: TAD vs. DEVICE OPERATING FREQUENCIES
A/D Clock Source (TAD)Device Frequency
OH or VOL) will be converted.
configured as analog inputs will read as
cleared (a low level). Pins configured as
digital inputs, will convert an analog input.
Analog levels on a digitally configured
input will not affect the conversion accuracy.
a digital input (including the AN4:AN0
pins), may cause the input buffer to consume current that is out of the devices
specification.
OperationADCS1:ADCS08 MHz5 MHz1.25 MHz333.33 kHz
OSC00250 ns
2T
OSC011 µs1.6 µs6.4 µs24 µs
8T
(2)
32TOSC104 µs6.4 µs25.6 µs
RC112 - 6 µs
(1,4)
2 - 6 µs
400 ns
(2)
(1,4)
1.6 µs6 µs
(3)
(1,4)
2 - 6 µs
96 µs
2 - 6 µs
(3)
(3)
(1)
Legend: Shaded cells are outside of recommended range.
Note 1: The RC source has a typical T
2: These values violate the minimum required T
AD time of 4 µs.
AD time.
3: For faster conversion times, the selection of another clock source is recommended.
4: When derived frequency is greater than 1 MHz, the RC A/D conversion clock source is recommended for
sleep mode only
5: For extended voltage devices (LC), please refer to the electrical specifications section.
Example 12-2 show how to perform an A/D conv ersion.
The RA pins are configured as analog inputs. The analog reference (V
rupt is enabled, and the A/D conversion clock is F
The conversion is performed on the RA0 pin
(channel0).
Note:The GO/DONE bit should NOT be set in
REF) is the device VDD. The A/D inter-
RC.
the same instruction that turns on the A/D.
Clearing the GO/DONE bit during a conversion will
abort the current conversion. The ADRES register will
NOT be updated with the partially completed A/D conversion sample. That is, the ADRES register will continue to contain the value of the last completed
conversion (or the last value written to the ADRES register). After the A/D conversion is aborted, a 2T
is required before the next acquisition is started. After
this 2T
AD wait, an acquisition is automatically started on
the selected channel.
EXAMPLE 12-2: DOING AN A/D CONVERSION
BCF STATUS, RP1 ; Select Bank1
BSF STATUS, RP0 ;
CLRF ADCON1 ; Configure A/D inputs
BSF PIE1, ADIE ; Enable A/D interrupts
BCF STATUS, RP0 ; Select Bank0
MOVLW 0xC1 ; RC Clock, A/D is on, Channel 0 is selected
MOVWF ADCON0 ;
BCF PIR1, ADIF ; Clear A/D interrupt flag bit
BSF INTCON, PEIE ; Enable peripheral interrupts
BSF INTCON, GIE ; Enable all interrupts
;
; Ensure that the required acquisition time for the selected input channel has elapsed.
; Then the conversion may be started.
;
BSF ADCON0, GO ; Start A/D Conversion
: ; The ADIF bit will be set and the GO/DONE bit
: ; is cleared upon completion of the A/D Conversion.
AD wait
DS30444E - page 84 1997 Microchip Technology Inc.
user must use some method (a timer, software loop,
etc.) to determine when the A/D oscillator may be
Not all applications require a result with 8-bits of resolution, but may instead require a f aster conv ersion time.
The A/D module allows users to make the trade-off of
conversion speed to resolution. Regardless of the resolution required, the acquisition time is the same. To
speed up the conversion, the clock source of the A/D
module may be switched so that the T
AD time violates
the minimum specified time (see the applicable electrical specification). Once the T
AD time violates the mini-
changed. Example 12-3 shows a comparison of time
required for a conversion with 4-bits of resolution, versus the 8-bit resolution conversion. The example is for
devices operating at 8 MHz (The A/D clock is programmed for 32T
after 6T
The 2T
AD, the A/D clock is programmed for 2TOSC.
OSC violates the minimum TAD time, therefore
OSC), and assumes that immediately
the last 4-bits will not be converted to correct values.
mum specified time, all the following A/D result bits are
not valid (see A/D Conversion Timing in the Electrical
Specifications section.) The clock sources may only be
switched between the three oscillator versions (cannot
be switched from/to RC). The equation to determine
the time before the oscillator can be switched is as follows:
The A/D module can operate during SLEEP mode. This
requires that the A/D clock source be set to RC
(ADCS1:ADCS0 = 11). When the RC clock source is
selected, the A/D module waits one instruction cycle
before starting the conversion. This allows the SLEEP
instruction to be executed, which eliminates all digital
switching noise from the conversion. When the conversion is completed the GO/DONE
the result loaded into the ADRES register. If the A/D
interrupt is enabled, the device will wake-up from
SLEEP. If the A/D interrupt is not enabled, the A/D module will then be turned off, although the ADON bit will
remain set.
When the A/D clock source is another clock option (not
RC), a SLEEP instruction will cause the present conversion to be aborted and the A/D module to be turned off,
though the ADON bit will remain set.
Turning off the A/D places the A/D module in its lowest
current consumption state.
Note:For the A/D module to operate in SLEEP,
the A/D clock source must be set to RC
(ADCS1:ADCS0 = 11). To perform an A/D
conversion in SLEEP, ensure the SLEEP
instruction immediately follows the instruction that sets the GO/DONE
bit will be cleared, and
bit.
12.6A/D Accuracy/Error
The absolute accuracy specified for the A/D converter
includes the sum of all contributions for quantization
error, integral error , diff erential error , full scale error, offset error, and monotonicity. It is defined as the maximum deviation from an actual transition versus an ideal
transition for any code. The absolute error of the A/D
converter is specified at < ±1 LSb for V
the device’s specified operating range). However, the
accuracy of the A/D converter will degrade as V
diverges from VREF.
For a given range of analog inputs, the output digital
code will be the same. This is due to the quantization of
the analog input to a digital code. Quantization error is
typically ± 1/2 LSb and is inherent in the analog to digital conversion process. The only way to reduce quantization error is to increase the resolution of the A/D
converter.
Offset error measures the first actual transition of a
code versus the first ideal transition of a code. Offset
error shifts the entire transfer function. Offset error can
be calibrated out of a system or introduced into a system through the interaction of the total leakage current
and source impedance at the analog input.
Gain error measures the maximum deviation of the last
actual transition and the last ideal transition adjusted for
offset error. This error appears as a change in slope of
the transfer function. The difference in gain error to full
DD = VREF (over
DD
scale error is that full scale does not take offset error
into account. Gain error can be calibrated out in software.
Linearity error refers to the uniformity of the code
changes. Linearity errors cannot be calibrated out of
the system. Integral non-linearity error measures the
actual code transition versus the ideal code transition
adjusted by the gain error for each code.
Differential non-linearity measures the maximum actual
code width versus the ideal code width. This measure
is unadjusted.
The maximum pin leakage current is ± 1 µA.
In systems where the device frequency is low, use of
the A/D RC clock is preferred. At moderate to high frequencies, T
lator. T
≤ 8 µs for preferred operation. This is because T
when derived from T
phase clock transitions. This reduces, to a large extent,
the effects of digital switching noise . This is not possib le
with the RC derived clock. The loss of accuracy due to
digital switching noise can be significant if many I/O
pins are active.
In systems where the device will enter SLEEP mode
after the start of the A/D conversion, the RC clock
source selection is required. In this mode, the digital
noise from the modules in SLEEP are stopped. This
method gives high accuracy.
AD should be derived from the device oscil-
AD must not violate the minimum and should be
AD,
OSC, is kept away from on-chip
12.7Effects of a RESET
A device reset forces all registers to their reset state.
This forces the A/D module to be turned off, and any
conversion is aborted.
The value that is in the ADRES register is not modified
for a Power-on Reset. The ADRES register will contain
unknown data after a Power-on Reset.
DS30444E - page 86 1997 Microchip Technology Inc.
PIC16C9XX
12.8Use of the CCP Trigger
An A/D conversion can be started by the “special e v ent
trigger” of the CCP1 module. This requires that the
CCP1M3:CCP1M0 bits (CCP1CON<3:0>) be programmed as 1011 and that the A/D module is enabled
(ADON bit is set). When the trigger occurs, the
GO/DONE
bit will be set, starting the A/D conversion,
and the Timer1 counter will be reset to zero. Timer1 is
reset to automatically repeat the A/D acquisition period
with minimal software overhead (moving the ADRES to
the desired location). The appropriate analog input
channel must be selected and the minimum acquisition
done before the “special event trigger” sets the
GO/DONE
bit (starts a conversion).
If the A/D module is not enabled (ADON is cleared),
then the “special event trigger” will be ignored by the
A/D module, but will still reset the Timer1 counter.
12.9Connection Considerations
If the input voltage exceeds the rail v alues (VSS or VDD)
by greater than 0.2V, then the accuracy of the conversion is out of specification.
An external RC filter is sometimes added for anti-aliasing of the input signal. The R component should be
selected to ensure that the total source impedance is
kept under the 10 kΩ recommended specification. Any
external components connected (via hi-impedance) to
an analog input pin (capacitor, zener diode , etc.) should
have very little leakage current at the pin.
12.10Transfer Function
The ideal transfer function of the A/D conv erter is as follows: the first transition occurs when the analog input
voltage (V
——RA5RA4RA3RA2RA1RA0
——PORTA Data Direction Control Register
Legend:x = unknown, u = unchanged, - = unimplemented read as '0'. Shaded cells are not used for A/D conversion.
Note1: Bit1 of ADCON0 is reserved, always maintain this bit clear.
DS30444E - page 88 1997 Microchip Technology Inc.
PIC16C9XX
13.0LCD MODULE
The LCD module generates the timing control to drive
a static or multiplexed LCD panel, with support for up to
32 segments multiplexed with up to 4 commons . It also
provides control of the LCD pixel data.
The interface to the module consists of 3 control registers (LCDCON, LCDSE, and LCDPS) used to define
the timing requirements of the LCD panel and up to 16
LCD data registers (LCD00-LCD15) that represent the
array of the pixel data. In normal operation, the control
registers are configured to match the LCD panel being
used. Primarily, the initialization information consists of
selecting the number of commons required by the LCD
panel, and then specifying the LCD Frame cloc k rate to
be used by the panel.
Once the module is initialized for the LCD panel, the
individual bits of the LCD data registers are cleared/set
to represent a clear/dark pixel respectively.
Once the module is configured, the LCDEN
(LCDCON<7>) bit is used to enable or disable the LCD
module. The LCD panel can also operate during sleep
by clearing the SLPEN (LCDCON<6>) bit.
Figure 13-4 through Figure 13-7 provides waveforms
for Static, 1/2, 1/3, and 1/4 MUX drives.
FIGURE 13-1: LCDCON REGISTER (ADDRESS 10Fh)
R/W-0R/W-0U-0R/W-0R/W-0R/W-0R/W-0R/W-0
LCDENSLPEN
bit7bit0
bit 7:LCDEN: Module drive enable bit
1 = LCD drive enabled
0 = LCD drive disabled
bit 6:SLPEN: LCD display sleep enable
1 = LCD module will stop operating during SLEEP
0 = LCD module will continue to display during SLEEP
bit 5:Unimplemented: Read as '0'
bit 4:VGEN: Voltage Generator Enable
1 = Internal LCD Voltage Generator Enabled, (powered-up)
0 = Internal LCD Voltage Generator powered-down, voltage is expected to be provided externally
bit 3-2: CS1:CS0: Clock Source Select bits
00 = Fosc/256
01 = T1CKI (Timer1)
1x = Internal RC oscillator
bit 1-0: LMUX1:LMUX0: Common Selection bits
Specifies the number of commons and the bias method
DS30444E - page 94 1997 Microchip Technology Inc.
PIC16C9XX
13.1LCD Timing
The LCD module has 3 possible clock source inputs
and supports static, 1/2, 1/3, and 1/4 multiplexing.
13.1.1TIMING CLOCK SOURCE SELECTION
The clock sources for the LCD timing generation are:
• Internal RC oscillator
• Timer1 oscillator
• System clock divided by 256
The first timing source is an internal RC oscillator which
runs at a nominal frequency of 14 kHz. This oscillator
provides a lower speed clock which may be used to
continue running the LCD while the processor is in
sleep. The RC oscillator will pow er-do wn when it is not
selected or when the LCD module is disabled.
FIGURE 13-8: LCD CLOCK GENERATION
FOSC
TMR1 32 kHz
crystal oscillator
Internal RC oscillator
Nominal F
÷256
RC = 14 kHz
÷4
÷2
Static
1/2
1/3
1/4
The second source is the Timer1 external oscillator.
This oscillator provides a lower speed clock which ma y
be used to continue running the LCD while the processor is in sleep. It is assumed that the frequency provided on this oscillator will be 32 kHz. To use the
Timer1 oscillator as a LCD module clock source, it is
only necessary to set the T1OSCEN (T1CON<3>) bit.
The third source is the system clock divided by 256.
This divider ratio is chosen to provide about 32 kHz
output when the external oscillator is 8 MHz. The
divider is not programmable. Instead the LCDPS register is used to set the LCD frame clock rate.
All of the clock sources are selected with bits CS1:CS0
(LCDCON<3:2>). Ref er to Figure 13-1 for details of the
register programming.
13.1.2MULTIPLEX TIMING GENERATION
The timing generation circuitry will generate 1 to 4 com-
mon clocks based on the display mode selected. The
mode is specified by bits LMUX1:LMUX0
(LCDCON<1:0>). Table 13-1 shows the formulas for
calculating the frame frequency.
DS30444E - page 96 1997 Microchip Technology Inc.
PIC16C9XX
13.2LCD Interrupts
The LCD timing generation provides an interrupt that
defines the LCD frame timing. This interrupt can be
used to coordinate the writing of the pixel data with the
start of a new frame. Wr iting pixel data at the frame
boundary allows a visually crisp transition of the image.
This interrupt can also be used to synchronize external
events to the LCD. For example, the interface to an
external segment driver, such as a Microchip AY0438,
can be synchronized for segment data update to the
LCD frame.
A new frame is defined to begin at the leading edge of
the COM0 common signal. The interrupt will be set
immediately after the LCD controller completes
accessing all pixel data required for a frame. This will
occur at a certain fixed time before the frame boundary
as shown in Figure 13-9. The LCD controller will begin
to access data for the next frame within T
interrupt.
13.3.1LCDD (PIXEL DATA) REGISTERS
The pixel registers contain bits which define the state of
each pixel. Each bit defines one unique pixel.
Table 13-4 shows the correlation of each bit in the
LCDD registers to the respective common and segment signals.
Any LCD pixel location not being used for display can
be used as general purpose RAM.
FIGURE 13-10:GENERIC LCDD REGISTER LAYOUT
R/W-xR/W-xR/W-xR/W-xR/W-xR/W-xR/W-xR/W-x
SEGs
COMc
bit7bit0
bit 7-0: SEGsCOMc: Pixel Data Bit for segment s and common c
SEGs
COMc
1 = Pixel on (dark)
0 = Pixel off (clear)
SEGs
COMc
SEGs
COMc
SEGs
COMc
SEGs
COMc
SEGs
COMc
SEGs
COMc
R =Readable bit
W =Writable bit
U =Unimplemented bit,
Read as ‘0’
-n =Value at POR reset
DS30444E - page 98 1997 Microchip Technology Inc.
PIC16C9XX
13.4Operation During Sleep
The LCD interrupt can be used to determine the frame
boundary. See Section 13.2 for the formulas to calcu-
The LCD module can operate during sleep. The selection is controlled by bit SLPEN (LCDCON<6>). Setting
the SLPEN bit allows the LCD module to go to sleep.
Clearing the SLPEN bit allows the module to continue
to operate during sleep.
If a SLEEP instruction is executed and SLPEN = '1', the
LCD module will cease all functions and go into a very
low current consumption mode. The module will stop
operation immediately and drive the minimum LCD
voltage on both segment and common lines. Figure
13-11 shows this operation. To ensure that the LCD
late the delay.
If a SLEEP instruction is executed and SLPEN = '0', the
module will continue to display the current contents of
the LCDD registers. To allow the module to continue
operation while in sleep, the clock source must be
either the internal RC oscillator or Timer1 external
oscillator. While in sleep, the LCD data cannot be
changed. The LCD module current consumption will
not decrease in this mode, however the overall consumption of the device will be lower due to shutdown of
the core and other peripheral functions.
completes the frame, the SLEEP instruction should be
executed immediately after a LCD frame boundary.
Note:The internal RC oscillator or external
Timer1 oscillator must be used to operate
the LCD module during sleep.
FIGURE 13-11:SLEEP ENTRY/EXIT WHEN SLPEN = 1 OR CS1:CS0 = 00
13.4.1SEGMENT ENABLES
The LCDSE register is used to select the pin function
for groups of pins. The selection allows each group of
pins to operate as either LCD drivers or digital only
pins. To configure the pins as a digital por t, the corresponding bits in the LCDSE register must be cleared.
If the pin is a digital I/O the corresponding TRIS bit controls the data direction. Any bit set in the LCDSE register overrides any bit settings in the corresponding TRIS
register.
Note 1: On a Power-on Reset these pins are con-
figured as LCD drivers.
Note 2: The LMUX1:LMUX0 takes precedence
over the LCDSE bit settings for pins RD7,
RD6 and RD5.