← Previouos chapter | Table of Contents | Next chapter →
Chapter 1: Introduction to PSoC
From the free online book “Architecture and Programming of PSoC Microcontrollers”
Introduction
When developing more complex projects, there is often a need for additional peripheral units, such as operational and instrument amplifiers, filters, timers, digital logic circuits, AD and DA convertors, etc. As a general rule, implementation of the extra peripherals brings in additional difficulties: new components take space, require additional attention during production of a printed circuit board, increase power consumption... All of these factors can significantly affect the price and development cycle of the project.
The introduction of PSoC microcontrollers has made many engineers’ dream come true of having all their project needs covered in one chip.
PSoC: Programmable System on Chip
PSoC (Programmable System on Chip) represents a whole new concept in microcontroller development. In addition to all the standard elements of 8-bit microcontrollers, PSoC chips feature digital and analog programmable blocks, which themselves allow implementation of large number of peripherals.
Digital blocks consist of smaller programmable blocks that can be configured to allow different development options. Analog blocks are used for development of analog elements, such as analog filters, comparators, intrumentational (non–)inverting amplifiers, as well as AD and DA convertors.
There’s a number of different PSoC families you can base your project upon, depending on the project requirements. Basic difference between PSoC families is the number of available programmable blocks and the number of input/output pins.
Number of components that can be devised is primarily a function of the available programmable blocks. Depending on the microcontroller family, PSoC chips have 4–16 digital blocks, and 3–12 analog programmable blocks.
Characteristics of PSoC microcontrollers
Some of the most prominent features of PSoC microcontrollers are:
- MAC unit, hardware 8x8 multiplication, with result stored in 32-bit accumulator,
- Changeable working voltage, 3.3V or 5V,
- Possibility of small voltage supply, to 1V,
- Programmable frequency choice.
Programmable blocks allow you to devise:
- 16K bytes of programmable memory,
- 256 bytes of RAM,
- AD convertors with maximum resolution af 14 bits,
- DA convertors with maximum resolution of 9 bits,
- Programmable voltage amplifier,
- Programmable filters and comparators,
- Timers and counters of 8, 16, and 32 bits,
- Pseudorandom sequences and CRC code generators,
- Two Full-Duplex UART’s,
- Multiple SPI devices,
- Option for connection on all output pins,
- Option for block combining,
- Option for programming only the specified memory regions and write protection,
- For every pin there is an option of Pull up, Pull down, High Z, Strong, or Open pin state,
- Possibility of interrupt generation during change of state on any input/output pin,
- I²C Slave or Master and Multi-Master up to speed of 400KHz,
- Integrated Supervisory Circuit,
- Built-in precise voltage reference.
Is PSoC good enough for my project?
Perhaps the best way to recognize the true value of PSoC microcontrollers is through comparison with other options.
Major advantages of PSoC microcontroller include the following:
- There is no other microcontroller that has programmable voltage, instrumentational, inverting, and non-inverting amplifiers;
- Hardware generators of pseudorandom and CRC code, as well as analog modulators, are unique to PSoC families;
- MAC (Multiply-accumulate) is an essential part of digital signal processors, which allows implementation of digital signal processing algorithms. It’s worth noting that hardware accumulator multiplication is not a common feature of 8-bit microcontrollers;
- Having the advantage of changeable working voltage doesn’t really need a comment. This feature is particularly important for development of new devices as it eliminates the need for redesigning the PCB and implementing the level translator;
- Option for low voltage supply (~1V) is a tremendous advantage in battery operated systems;
- Timers, counters, and PWM units are more flexible than the usual implementation;
- Automatic code writing for accessing all the peripherals in use;
- In case you need a larger array of components, there is an option for dynamic reconfiguration, allowing you to change peripherals during run-time. In this way, it’s possible to minimize the processor workload at an time, leaving the largest part of the job to the specialized hardware.
On the other hand, there are certain limitations of PSoC that could influence the choice of microcontroller for your design.
- In systems which require highly precise or fast measurement, problems may occur with analog device characteristics. In this case, you should analyze if speed of AD convertors and offset/noise of analog amplifiers are able to satisfy the project demands.
- Analog components do not have the ability to work with usual negative supply voltage. For example, zero voltage for inverting amplifiers is taken to be the analog ground AGND (usually 2.5V). All voltages above AGND are taken as positive, while voltages below AGND are taken as negative.
- Most PSoC microcontrollers have 256 bytes of RAM, which could prove to be insuficient for some projects.
1.1 System overview
PSoC microcontrollers are based on 8-bit CISC architecture. Their general structure with basic blocks is presented in the following image:

CPU unit is the main part of a microcontroller whose purpose is to execute program instructions and control workflow of other blocks.
Frequency generator facilitates signals necessary for CPU to work, as well as an array of frequencies that are used by programmable blocks. These signals could be based on internal or external referent oscillator.
Reset controller enables microcontroller start action and brings a microcontroller to regular state in the case of irregular events.
Watch Dog timer is used to detect software dead-loops.
Sleep timer can periodically wake up microcontroller from power saving modes. It could be also used as a regular timer.
Input-Output pins enable communication between the CPU unit, digital and analog programmable blocks and outside world.
Digital programmable blocks are used to configure digital programmable components which are selected by user.
Analog programmable blocks are used to configure analog components, like AD and DA converters, filters, DTMF receivers, programmable, instrumental, inverting, non-inverting and operational amplifiers. Interrupt controller handles necessary operations in the case of interrupts.
I2C controller Enables hardware realization of an I2C communication.
Voltage reference is vital for the work of analog components that reside inside of analog programmable blocks.
MAC unit is used for operations of hardware signed multiplication of 8-bit numbers.
SMP is a system which can be used as a part of a voltage regulator. For example, it is possible to supply power to a PSoC microcontroller from a single 1.5V battery.
1.2 CPU
During the programming, instructions are stored in program (FLASH) memory in a way which is familiar to microcontroller. CPU fetches one instruction at a time from program memory, decodes it and executes appropriate operations. CPU unit has internal registers PC, SP, A, X and F, as well as ALU unit and instruction decoding unit, that are associated to instruction execution process.

Internal Registers of CPU
Program counter (PC) is used as a pointer to the next program instruction that should be executed. With each new instruction value of program counter is being set to point on the next instruction in program memory, which is going to be decoded and executed.
Stack pointer (SP) points to the address of SRAM memory where data is written to or read from in case of PUSH and POP instructions respectively. When these instructions occur value stored in SP is internally incremented or decremented.
Accumulator register (A) is the main register which handles all arithmetical, logical or data transfer operations.
Index register (X) could behave as register A in large number of instructions. Also, register X is used in the case of index addressing.
Flag register (F) contains bits which describe result of a previously executed instruction. It also has a role during selection of a RAM memory page in case when PSoC microcontroller has more than 256 bytes of RAM. Bit Flag Zero (Z) marks that accumulator stores a zero, while Carry (C) marks that there has been carrying during arithmetic or logic operations.
Arithmetic logic unit (ALU) is a standard part of a CPU, which is used for arithmetic operations like addition, subtracting and shifting (left or right), as well as logic operations. Data handled by instructions could be stored in internal registers A and X, or in RAM data memory
1.3 Frequency generator
Frequency generator is vital to CPU unit functioning, as well as programmable blocks. Each of programmable components has certain demands regarding speed. PSoC microcontrollers have a system for generation of different frequency signals, which is done by graphically selecting appropriate parameters. Picture shows two independent systems for generating signals SYSCLK and CLK 32k.

SYSCLK is the main internal clock signal with a speed of 24MHz. It is used as a reference clock for most of other signals.
SYSCLKx2 is a clock signal with double frequency (48MHz) of SYSCLK signal.
24V1 is a signal derived by dividing frequency SYSCLK with parameter N1, which varies in range from 1 to 16. 24V1 frequency equals SYSCLK/N1, with a frequency from 1.5MHz (N1=16) to 24MHz (N1=1).
24V2 is a signal derived by dividing 24MHz frequency with parameter N1, which varies in range between 1 and 16. 24V2 signal frequency equals SYSCLK/N1N2., which means that possible frequency ranges from 93.75kHz (N1,N2=16) to 24MHz (N1,N2=1).
24V3 signal is derived by dividing frequency of one of the signals 24V2, 24V1, SYSCLK or SYSCLKx2, with number N, in the range from 1 to 256.
CPU_CLK is used as a CPU unit frequency which has a direct impact on instruction execution speed. CPU_CLK can have any of eight frequencies that are in range from 93.75MHz to 24MHz.
Frequency 24V1, 24V2, 24V3 and CPUCLK selection is done easily, by setting appropriate parameters in Device Editor or during program runtime by selecting three lower bits of OSCCR0 register.
CLK32K is a slow signal with a frequency of 32kHz. It can be used as a programmable component input. It can also be used for Sleep timer wake-up operation in the case when other SYSCLK derived signals are inactive.
Signal SYSCLK can be acquired using internal main oscillator (IMO), while CLK32K signal is acquired through internal local oscillator (ILO).
Fault tolerance of 2.5% in the case of internal frequency generation, is the limit factor in a precise timing applications. In such case external SYSCLK clock reference should be used. External frequency ranges from 1 to 24MHz. It connects to PSoC through pin P1[4].
Similar situation is in the case of CLK32K, which also can be generated by internal local oscillator (ILO), as said before, or more precise external 32kHz oscillator. In the both cases microcontroller starts with internal frequency generators, after which is necessary to satisfy appropriate procedure.
1.4 Microcontroller power consumption
Processor signal frequency CPUCLK is directly connected with the instruction execution speed of the microcontroller. Doubling the frequency, program executes approximately twice faster. On the other hand, higher frequency doesn’t necessary always mean better overall performances. Main disadvantage in rising the frequency is it’s unwanted effect on microcontroller power consumption, which is one of the main problems it the case of battery supply. Other disadvantage of higher frequency is more intensive generation of electromagnetic interference, which may affect on surrounding devices. Because of these problems general rule should be applied, which says that lowest possible satisfactory frequency should be used. Default value of PSoC microcontroller signal frequency is 3MHz, which is a compromise between speed and consumption.
To maintain the longest possible uninterrupted work time, it is an imperative to bring power consumption to its lowest satisfactory functional level in battery operated devices. Most of microcontrollers operate only periodically, while being in the idle state for the most of their time. Major power saving can be achieved by bringing microcontroller to sleep mode while microcontroller does no important role. Saving is achieved because of all the frequencies, except CPU32K and SLEEP become inactive, while processor stops instruction execution. Microcontroller could be woken up from sleep mode only by reset or a interrupt.
Interrupt could be generated by a sleep timer or some digital block which use CPU_32k frequency. Also GPIO pin or analog column interrupts can be used for CPU waking-up. Sleep timer represents a special counter whose main role is to generate periodic interrupts which enable waking microcontroller from power saving mode. Sleep timer frequency interrupt ranges from 1 to 512Hz. After waking microcontroller does all needed operations after which it’s being switched back to sleep mode and waits for another sleep timer interrupt. There is a appropriate type of interrupt needed to wake the microcontroller from sleep mode. Because of possibility for various irregularities to occurs during the work of microcontroller there is a need to reset it in those cases, or in other words, brought to beginning state. Begin state means all internal registers are initialized and program continues its execution from beginning.

1.5 Reset
POR
During the work of microcontroller, supply voltage variations occurs. It is very dangerous if voltage drops beneath certain limit, because microcontroller can make some unpredictable actions. In the case of such voltage drop detection, microcontroller is switched into Power on Reset mode in which it remains until voltage stabilizes above critical limit which is defined by Trip Voltage parameter.
XRES
External reset allows user to bring microcontroller to start state by switching a button. Reset is achieved when XRES pin reads logic ONE. Simplest reset circuit can be made with pull-down resistor and one switch.

WDR
Watch dog reset (WDR) is used for avoiding software dead-loops or other irregularities, bringing the system in the start state. Using WDR, it is watch dog timer (WDT) is periodically restarted inside of a main program, after which appropriate subprograms are executed. In normal mode after certain time WDT is being restarted once again and subprogram cycle continues. But, if program blocks in one of the subprograms WDT is not reset, and WDR occurs.
1.6 Digital Inputs and Outputs
Connection between a PSoC microcontroller with an outside world is achieved over input-output pins. Eight pin group which could be accessed simultaneously are parts of one port. Although port number differs from the type of the microcontroller, write and read operations are done in the same way in any case. Port access registers are stored inside of register address space noted as PRT0DR, PRT1DR, PRT2DR, PRT3DR, PRT4DR or PRT5DR.

Writing to port
Writing value to PRTxDR initializes register which through init circuit drives the state of pins. Init circuit can pass the signal from PRTxDR register directly (strong), over pull-up or pull-down resistors or through open drain output. Beside that, there is a possibility to isolate value of register from pin state (Hi-Z).
Reading port
Reading value from address PRTxDR digital state of voltage on pins is stored to register A. In case that voltage is dictated by some external device, read value could differ from voltage on PRTxDR register.
Drive Mode
Selection of the way in which init register PRTxDR is connected to pins can be set inside of Device Editor or during runtime initializing registers PRTxDM2, PRTxDM1 and PRTxDM0. There is eight methods to initialize pins in total, which enables connection to different types of devices, with considerate smaller amount of external components. Pin work modes are defined according to the following table depending on contents of appropriate bit from registers DM2, DM1 and DM0.
| DM2 bit | DM1 bit | DM0 bit | Mode | Data = 0 | Data = 1 |
|---|---|---|---|---|---|
| 0 | 0 | 0 | Resistive Pull Down | Resistive | Strong |
| 0 | 0 | 1 | Strong Drive | Strong | Strong |
| 0 | 1 | 0 | High Impedance | Hi-Z | Hi-Z |
| 0 | 1 | 1 | Resistive Pull Up | Strong | Resistive |
| 1 | 0 | 0 | Open Drain, Drives High | Hi-Z | Strong (Slow) |
| 1 | 0 | 1 | Slow Strong Drive | Strong (Slow) | Strong (Slow) |
| 1 | 1 | 0 | High Impedance Analog | Hi-Z | Hi-Z |
| 1 | 1 | 1 | Open Drain, Drives Low | Strong (Slow) | Hi-Z |
Strong mode is used when it is needed to connect the state on PRTxDR register directly to pins. This way of connection is applied when pin is used as an input.

Analog Hi-Z mode is used when connecting analog signals, like AD converter input. In this case, all internal connections between PRTxDR register and pin are disconnected, so not to interfere with value of brought voltage.

Pull-up or pull-down resistors are used when connecting with buttons or some other devices which demand this type of components. These resistors are defining the state on input when button is not pushed.
Open drain mode is used when it is needed to bring several devices to the same line, when it is needed to add one external pull-up or pull-down resistor. This mode is convenient for realization of a line which signals if there has been a mistake to one of the microcontrollers. For example, when used pull-up resistor version when zero (error) occurs on any of output pins state of this line will be zero. Pins on PSoC microcontroller allow user to generate interrupt on any pin, when signal changes, or on signal rising or falling edge.

1.7 Analog inputs and outputs
Some of input-output pins, beside their standard use can perform analog input or output operation. Any pin of port P0 as well as lower four pins of port P2 can be used as analog input. Inputs of port P0 are connected to analog blocks over analog multiplexers, while in case of port P2 they are connected directly to programmable SC blocks. Pins P2[4] and P2[6] can serve as external referent voltage inputs. Outputs from analog blocks can be connected to 4 output buffers, which are connected to P0[2],P0[3],P0[4] and P0[5] pins.

1.8 Accessing programmable digital blocks
Digital components, which are stored inside of programmable blocks, aren’t connected directly to input or output pins. It is done in a way shown on following picture, which depicts group of four digital programmable blocks. As it could be seen, pin connection is established using global connection lines, multiplexer and lines of programmable blocks. PSoC microcontrollers can have one, two or four digital programmable block groups like this one depending on their family.

1.9 Global input lines
Global input lines establishes connection between the pins and input multiplexers. Global input lines are divided in two groups, depending on weather they can connect to ports with odd (GIO) or even (GIE) index. Rule of connection is that it is possible to connect only between a line and a pin which have the same index. For example, line GIO_0 can connect only to zero pin of some of the odd index ports (P1[0],P3[0],P5[0]).

Input multiplexers of block lines
Input multiplexer selects one of global lines and connects it to signal carrying line which leads to programmable blocks. Picture shows that input block lines can be connected to GIO or GIE lines with same index, or with index with offset four.

1.10 Digital programmable blocks
Inside of digital programmable blocks user can configure components like timers, counters, PWM, PRS, CRC generators and devices for SPI, IrDA and UART communication, which enables custom hardware adjustment of the system for specific uses. The process of setting and connecting using PSoC Designer is very simple to understand, but at first is necessary to understand the way those components function. Most components, like counters, PRS and CRC generators can be stored inside of any free block. On the other side, communication components like Rx, Tx, UART and SPI can be set on the right side of the programmable blocks.

The number of necessary blocks which are used for component configuration shown in the table:
| Number of blocks | Components |
|---|---|
| 1 | Counter8, Timer8, PWM8, PRS8, RX8/TX8, SPIM/SPIS |
| 2 | Counter16, Timer16, PWM16, PRS16, PWMDB8, CRC16, UART, IrDARx/IrDATx |
| 3 | Counter24, Timer24, PWMDB16 |
| 4 | Counter32, Timer32 |
Frequency signal (CLK)
Frequency signal is needed for digital components to work. Depending on wanted speed there is a range of several built-in frequencies to choose from:
- internal signal frequency VC1, VC2, VC3, SYSCLKx2, CPU_32
- output from adjacent blocks
- common Broadcast line (BC)
- input (RI) or output (RO) block lines

Most common internal signals are VC1, VC2 and VC3, because when used with different prescalers, they offer broad range of possible frequencies. In case that signals VC1,VC2 and VC3 could not offer specified frequency, outputs from Counter, Timer or PWM, which can be used like like additional prescalers. Picture above shows in dotted line direct way to connect output of previous block with the input of the next block. In case that signal needs to be routed across several blocks, connection is done over common frequency line BC.
Component input signal
Most of the components, beside frequency signal, has one or two digital inputs. For example, in the case of a counter and PWM generator input is used for enabling counting. There are different possibilities in selection of the component input signal:
- block input lines (RI), which is a case of external signal
- block output lines (RO), in the case of component cascading
- analog block comparator lines
- signal of logic one(high)
- signal of logic zero (low)
Component output signals
Digital outputs of the component are used for connecting programmable blocks with output lines RO. Signal could be routed from output lines further toward output of the microcontroller or input of some other component. Output multiplexers are used for connecting lines of programmable blocks with global output lines.
Multiplexer
Depending on the state of multiplexer, output (RO) or input (RI) line of programmable block could be connected.
Logic circuit
Selected signal can be brought to the output of logic circuit. As other input could be used some of adjacent lines of programmable blocks (RO). Logic circuit can:
- pass one of two signals
- invert input signals
- do logic operations AND, OR or XOR over input signals which could be inverted previously.

Output drivers
Logic circuit output can be routed to four output drivers, which can make connection to one, or more, global output lines. Line of programmable blocks with some index can be connected to GOO or GOE lines with same or by four higher index. Global output lines makes connection between drivers and pins. They are separated in two groups, depending on where they can be connected to ports with odd (FGIO) or even (GIE) index. Rule of connection says that only lines and pins with the same index can be interconnected. Beside that there is a possibility to establish a connection between input and output lines, which enables additional processing of the input signal.

1.11 Analog programmable blocks
Analog programmable blocks are grouped in columns of three programmable blocks. Depending on family of microcontroller, there could be 1, 2 or 4 analog columns. Each column has input multiplexer, one frequency line, output analog and a comparator line.

Analog multiplexers of port P0
Signals from port 0 are connected to analog ACB blocks over appropriate input multiplexers. Multiplexers can select even (Port0_even) or odd (Port0_Odd) pins, while two middle columns have the ability to choose either pins of port P0.
Analog inputs of port P2
Beside port P0, as analog inputs could be used four lower pins of port P2. This pins can be connected directly to analog programmable blocks.
Analog columns
One column of analog blocks is made of three types of blocks: ACB, ASC i ASD. Outputs of these blocks can be routed to some of adjacent blocks, output analog line or comparator line.

ACB blocks are used to store amplifiers with rail-to-rail inputs and outputs, digital controlled resistors and internal multiplexers. Depending on interconnections made inside of ACB blocks, it is possible to implement inverting, noninverting, instrument amplifier or comparator. As input to ACB blocks can be used analog multiplexer or output signal of some of adjacent blocks.
ASC and ASD blocks are of switched capacitor (SC) type. They contains amplifiers with rail-to-rail input and outputs, condensators and internal multiplexers. AD, DA and analog filters could be implemented depending on configuration inside of these blocks. As inputs to SC blocks, input from some adjacent block could be used. It should be noted, that signals from analog multiplexers couldn’t be brought directly to SC blocks, but over ACB blocks.
Analog outputs
For every analog column is common to have an AnalogOutBus line. Analog output lines can be are connected, through a buffer, to four middle pins of port A.

Comparator outputs
Every analog column has one comparator line, to which could be connected digital output from one of analog blocks. Comparator output could be connected to digital blocks (most common way of doing it is as counter signal, or timer). Before connecting, there is a possibility to modify or combine comparator output of some column (A) with next comparator line (B), using some logic operation.
Frequency signal
Many components, such as AD, DA convertors and filters, need to have a frequency signal in the specific range, which affects the component’s speed. Frequency signal selection done over appropriate multiplexers. For each of the columns it is possible to select:
- internal frequency VC1
- internal frequency VC2
- output over some of the digital blocks, most commonly counter timer and PWM generator, which is selected through the multiplexer.

1.12 Referent voltage generators
There are three stable voltage generators in PSoC microcontroller:
- AGND
- RefH
- RefLo
AGND is ground voltage for analog components. Voltage values higher than AGND are considered as positive, while less are negative. PSoC microcontrollers have one-side power supply, so value of analog ground is somewhere in between GND and VDD. AGND value is selected by user.

RefHi and RefLo represent referent higher and lower voltage, for AD and DA components. PSoC microcontrollers have a system that can generate several referent signal values AGND, RefHi and RefLo. This enables simple adjustment to different types of voltage sensors. Referent voltages are made from internal temperature stabilized bandgap voltage reference Vbg = 1.3V, supply voltage VDD or external signal as shown in the following table. PSoC microcontrollers are well adjusted to work with battery supply.
| Ref Mux | AGND [V] | RefLo [V] | RefHi [V] |
|---|---|---|---|
| Vdd/2 ± Vbg | 2.5/1.65 | 1.2/0.35 | 3.8/2.95 |
| Vdd/2 ± Vdd/2 | 2.5/1.65 | 0 | 5.0/3.3 |
| Vbg ± Vbg | 1.3 | 0 | 2.6 |
| 1.6Vbg ± 1.6Vbg | 2.08 | 0 | 4.16 |
| 2Vbg ± Vbg | 2.6 | 1.3 | 3.9 |
| 2Vbg ± P2[6] | 2.6 | 1.6 | 3.6 |
| P2[4] ± Vbg | 2.2 | 0.9 | 3.5 |
| P2[4] ± P2[6] | 2.2 | 1.2 | 3.2 |

1.13 Switch Mode Pump
In the case of battery suply Switch Mode Pump (SMP) system can be used. Its operation is based on principle of BOOSTDC/DC convertor. This type of convertor gives voltage supply value higher than battery voltage, which makes possible power suplly with 1.5V battery. For SMP to function properly, it is necessary to connect, beside battery, a diode, inductivity and a capacitive.

1.14 MAC
MAC unit is a device that implements operation of hardware multiplication of 8-bit signed numbers, as well as sum of product. For execution of these operations there is no special instruction, but all of the work is done by writing to and reading from certain registers.
Hardware multiplication
Multiplication operation is done by writing 8-bit inputs X and Y into registers MUL_X and MUL_Y, and reading output from 16-bit result from registers MUL_DH and MUL_DL.

;file: main.asm
;project: MAC
mov reg[MUL_X],0x64 ;Initialize X = 100
mov reg[MUL_Y],0x0C ;Initialize Y = 12
mov A,reg[MUL_DH] ;Read high byte of result (0x04)
mov A,reg[MUL_DL] ;Read low byte of result (0xB0)
mov reg[MUL_X],0xFE ;Initialize X = -2
mov reg[MUL_Y],0x03 ;Initialize Y = 3
mov A,reg[MUL_DH] ;Read high byte of result (0xFF)
mov A,reg[MUL_DL] ;Read low byte of result (0xFA)
Sum of products
During multiplication, result can be added to previously stored value inside of 32-bit accumulator. In that way is made sum product operation, which represents most important operation of digital signal processing for correlations, convolutions and filtering. Beside that MAC unit allows simple implementation of multibyte multiplication.

Summing products is done when data X and Y are initialized by writing into registers MAC_X or MAC_Y. Input data X and Y could also be initialized by writing into registers MUL_X and MUL_Y, in which case operation of product summing does not take place. Result of product summing operation is stored inside of registers ACC_DR3, ACC_DR2, ACC_DR1 i ACC_DR0. Starting value of accumulator is set to zero by writing any value to register MAC_CL1 or MAC_CL0. In the next example shows method of initializing input data, as well as operation of summing products.
1.15 Decimator
Decimator component is component that is used for digital data processing during sigma delta, as well as some types of incremental AD conversion.
;file: main.asm
;project: MAC
mov reg[MAC_CL0],0 ;Clear Accumulator
;(Acc = 0)
mov reg[MUL_X],5 ;Initialize X
mov reg[MAC_Y],4 ;Initialize Y and execute MAC
;(Acc = 0 + 5 * 4 = 20)
mov reg[MUL_X],6 ;Initialize X
mov reg[MAC_Y],5 ;Initialize Y and execute MAC
;(Acc = 20 + 6 * 5 = 50)
mov reg[MUL_X],3 ;Initialize X
mov reg[MAC_Y],2 ;Initialize Y and execute MAC
;(Acc = 50 + 3 * 2 = 56)
mov reg[MAC_Y],2 ;Initialize Y and execute MAC
;(Acc = 56 + 3 * 2 = 62)
mov reg[MAC_X],4 ;Initialize X and execute MAC
;(Acc = 62 + 4 * 2 = 70)
mov A,reg[Acc_DR0] ;Read low byte of result
;(0x46 = 70dec)
1.16 I2C Controller
I2C controller implements hardware serial I2C communication, and in that way minimizes usage of CPU units resources. Most important operations of I2C controller are:
- Master or Slave, sending or receiving data
- Byte level data processing
- Connected to CPU over interrupts or polling mode.
- Transfer speed: 50K, 100K and 400K
- Frequency synching in case of larger number of masters
- 7or 10-bit addressing of I2C unit
1.17 Interrupt Controller
Interrupts are mechanisms inside of a microcontroller that allow responding to some event immediately after its detection. Events could be internal (timer overrun, end of AD conversion) or external (character receiving over serial connection, pin state change). When interrupt occurs program execution is interrupted (hence the name) by jumping to part of the program that is called interrupt routine. Upon ending of that routine program continues from place in program where interruption took place. Interrupt controller makes hardware interrupt detection, program flow interruption by jumping to interrupt routine, as well as returning to interruption point from the routine. These operations are executed in several steps:
- When event that triggers interruption takes place, interrupt controller stores interrupt type.
- End of current instruction is awaited.
- If interrupt is allowed and if global interrupt permit is set to 0ne (GIE = 1), interrupt processing begins. For later continuing of instructions execution, stack holds values of PCH, PCL and F registers.
- New interrupt occurrence is disabled by setting values of register F to zero (GIE = 0).
- Program counter is set to address of interrupt routine, which is same as interrupt type, after which execution jumps to interrupt routine address.
- Program executes interrupt routine instructions.
- When it gets to instruction reti, which marks return from main program, values of F register are restored from stack, and program counter is reset to old value before interrupt occurred.

Register PRTxIF is used as indication of GPIO interrupt on certain port, while PRTxIC1and PRTxIC0 are appropriate control registers. Every interrupt type can be masked or deleted, which is done with help of INT_MSK and INT_CLR registers, which will be discussed in more detail in examples part.
1.18 Address space
PSoC microcontrollers have three address spaces:
- ROM
- RAM
- registers
As in all Harvard architecture processors access to ROM memory is done with special lines, so microcontroller is able to acquire instructions and access data at the same time.

Program memory
Program memory is the part of ROM, which is used for storing program code, which is written in this part of memory written by programming hardware. Program memory is implemented in FLASH technology, which allows simple development time change of the program inside of microcontroller. Program memory size depends on the family of PSoC microcontrollers and is 2, 4, 8, 16 and 32 kB.
Supervisory ROM
Supervisory ROM is part of ROM which is used during start of PSoC microcontroller, as well as for calibration of components. With special instruction SSC, it is possible access this part of memory.
RAM
RAM enables storing of variables and stack which are used during work of microcontroller. Size of RAM, in most PSoC microcontrollers, is 256 bytes. When microcontrollers have more than 256 bytes of RAM (series CY8C29xx and CY8C21x34), memory is organized in 256 byte pages, with stack residing on the last page. To access some variable, user apart from 8-bit address must state appropriate page.
Register
Register address space contains registers used for peripheral's global parameters and programmable blocks of a PSoC microcontroller. PSoC microcontrollers have 512 registers, which are grouped in two 256 bytes banks. To access some register, beside stating its name, what is needed is to also state the name of the bank in which resides wanted register. Access to certain bank is done by using macros M8C_SetBank0 and M8C_SetBank1, which delete or set bit XIO in CPU_F register.
← Previouos chapter | Table of Contents | Next chapter →
