beautypg.com

Texas Instruments MSC1210 User Manual

Page 154

background image

Summation/Shifter Register

12-18

12.13.1

Manual Summation Mode

The first mode of operation, manual summation, allows you to quickly add
32-bit values. In this mode, your program simply write the values to be added
to the SUMR0, SUMR1, SUMR2, and SUMR3 SFRs. When a value is written
to SUMR0, the current value of SUMR0-3 will be added to the summation
register. For example, the following code will add 0x00123456 to
0x0051AB04:

SSCON = 0x00; // Clear summation register, manual summation

SUMR3 = 0x00; // High byte of 0x00123456

SUMR2 = 0x12; // Next byte of 0x00123456

SUMR1 = 0x034; // Next byte of 0x00123456

SUMR0 = 0x56; // Next byte of 0x0012345 – Perform addition

SUMR3 = 0x00; // High byte of 0x0051AB04

SUMR2 = 0x51; // Next byte of 0x0051AB04

SUMR1 = 0xAB; // Next byte of 0x0051AB04

SUMR0 = 0x04; // Next byte of 0x0051AB04 – Performs addition

ANSWER = (SUMR3 << 24) + (SUMR2 << 16) + (SUMR1 << 8) + SUMR0;

The previous code, although certainly more verbose than a simple
ANSWER = 0x00123456 + 0x0051AB04 instruction in ‘C’, is much, much
faster when analyzed in assembly language. In assembly language, the above
solution requires just four MOV instructions for each summation, whereas the
simple addition approach (which does not take advantage of the MSC1210
summation register) takes at least 8 MOV instructions and 4 ADD instructions.

12.13.2

ADC Summation Mode

The ADC summation mode functions very similarly to the manual summation
mode, but instead of your program writing values to the SUMRx registers, the
ADC writes values to the SUMRx registers.

In this mode, the CNT bits of SSCON are set to indicate how many ADC
conversions should be summed in the summation register. The ADC will then
deliver the requested number of results to the summation register and trigger
a summation auxiliary interrupt, if enabled (see Chapter 10, Interrupts).

SSCON = 0x00; // Clear summation register, manual summation

SSCON = 0x50; // ADC summation, 8 samples from ADC

while(! (AISTAT & 0x40)); // Wait for 8 samples to be added

SUM = (SUMR3 << 24) + (SUMR2 << 16) + (SUMR1 << 8) + SUMR0;

The previous code first clears the summation registers by setting SSCON to
0, and then sets SSCON to ADC summation and requests that eight samples
from the ADC be summed. The while() loop then waits for the summation auxil-
iary interrupt flag to be set, which indicates the requested operation was com-
plete. The final line then takes the four individual SFRs and calculates the total
summation value.