Для начала: для обращения к регистрам у меня написан такой файл (не нашел как сюда загрузить файл, поэтому втыкаю его в текст):
CODE
//
// Чтение/запись по SPI
//
.global ReadStatus
ReadStatus: ldi r18, 0x10
out 0x0f, r18
sbis 0x0e, 7
rjmp .-4
out 0x0f, r1
sbis 0x0e, 7
rjmp .-4
in r24, 0x0f
ret
// Data
.global ReadData
ReadData: ldi r18, 0x11
out 0x0f, r18
sbis 0x0e, 7
rjmp .-4
/* mov r25, r1 // 3
out 0x0f, r1
sbis 0x0e, 7
rjmp .-4
in r24, 0x0f // 2
out 0x0f, r1
sbis 0x0e, 7
rjmp .-4
in r23, 0x0f // 1
out 0x0f, r1
sbis 0x0e, 7
rjmp .-4
in r22, 0x0f // 0
*/
out 0x0f, r1
sbis 0x0e, 7
rjmp .-4
in r25, 0x0f // 2
out 0x0f, r1
sbis 0x0e, 7
rjmp .-4
in r24, 0x0f // 1
subi r25, 0x80
ret
// Mode
.global ReadMode, WriteMode
ReadMode: ldi r18, 0x12
out 0x0f, r18
sbis 0x0e, 7
rjmp .-4
out 0x0f, r1
sbis 0x0e, 7
rjmp .-4
in r25, 0x0f
out 0x0f, r1
sbis 0x0e, 7
rjmp .-4
in r24, 0x0f
ret
WriteMode: ldi r18, 0x02
out 0x0f, r18
sbis 0x0e, 7
rjmp .-4
out 0x0f, r25
sbis 0x0e, 7
rjmp .-4
out 0x0f, r24
sbis 0x0e, 7
rjmp .-4
ret
// Filter
.global ReadFilter, WriteFilter
ReadFilter: ldi r18, 0x13
out 0x0f, r18
sbis 0x0e, 7
rjmp .-4
mov r25, r1 // 3
out 0x0f, r1
sbis 0x0e, 7
rjmp .-4
in r24, 0x0f // 2
out 0x0f, r1
sbis 0x0e, 7
rjmp .-4
in r23, 0x0f // 1
out 0x0f, r1
sbis 0x0e, 7
rjmp .-4
in r22, 0x0f // 0
ret
WriteFilter:ldi r18, 0x03
out 0x0f, r18
sbis 0x0e, 7
rjmp .-4
out 0x0f, r24
sbis 0x0e, 7
rjmp .-4
out 0x0f, r23
sbis 0x0e, 7
rjmp .-4
out 0x0f, r22
sbis 0x0e, 7
rjmp .-4
ret
// DAC
.global ReadDAC, WriteDAC
ReadDAC: ldi r18, 0x14
out 0x0f, r18
sbis 0x0e, 7
rjmp .-4
out 0x0f, r1
sbis 0x0e, 7
rjmp .-4
in r24, 0x0f // 2
ret
WriteDAC: ldi r18, 0x04
out 0x0f, r18
sbis 0x0e, 7
rjmp .-4
out 0x0f, r24
sbis 0x0e, 7
rjmp .-4
ret
// Offset
.global ReadOffset, WriteOffset
ReadOffset: ldi r18, 0x15
out 0x0f, r18
sbis 0x0e, 7
rjmp .-4
mov r25, r1 // 3
out 0x0f, r1
sbis 0x0e, 7
rjmp .-4
in r24, 0x0f // 2
out 0x0f, r1
sbis 0x0e, 7
rjmp .-4
in r23, 0x0f // 1
out 0x0f, r1
sbis 0x0e, 7
rjmp .-4
in r22, 0x0f // 0
ret
WriteOffset:ldi r18, 0x05
out 0x0f, r18
sbis 0x0e, 7
rjmp .-4
out 0x0f, r24
sbis 0x0e, 7
rjmp .-4
out 0x0f, r23
sbis 0x0e, 7
rjmp .-4
out 0x0f, r22
sbis 0x0e, 7
rjmp .-4
ret
// Gain
.global ReadGain, WriteGain
ReadGain: ldi r18, 0x16
out 0x0f, r18
sbis 0x0e, 7
rjmp .-4
mov r25, r1 // 3
out 0x0f, r1
sbis 0x0e, 7
rjmp .-4
in r24, 0x0f // 2
out 0x0f, r1
sbis 0x0e, 7
rjmp .-4
in r23, 0x0f // 1
out 0x0f, r1
sbis 0x0e, 7
rjmp .-4
in r22, 0x0f // 0
ret
WriteGain: ldi r18, 0x06
out 0x0f, r18
sbis 0x0e, 7
rjmp .-4
out 0x0f, r24
sbis 0x0e, 7
rjmp .-4
out 0x0f, r23
sbis 0x0e, 7
rjmp .-4
out 0x0f, r22
sbis 0x0e, 7
rjmp .-4
ret[/code]
Прототипы в h-файле:
[code]// AdcComm.h
uint8_t ReadStatus();
#define NOREF 0x10 // No reference voltage
#define STBY 0x20 // Standby mode
#define STDY 0x40 // Steady
#define RDY 0x80 // Ready
/////////////////////////////////////////////////////////////////////////////
//long ReadData();
int ReadData();
/////////////////////////////////////////////////////////////////////////////
int ReadMode();
void WriteMode(int);
#define BO 0x0004 // BurnoutCurrent
#define CLKDIS 0x0008 // Master clock disable
#define RANGE10 0x0000 // Input range
#define RANGE20 0x0010
#define RANGE40 0x0020
#define RANGE80 0x0030
#define HIREF 0x0080 // High reference (5V)
#define WL 0x0100 // Word length (1-24 bit)
#define DO 9 // Digital output bits position
#define DEN 0x0800 // Digital output enable
#define UNI 0x1000 // 1 - unipolar
#define MD_IDLE 0x0000 // Idle mode
#define MD_CC 0x2000 // Continuous conversion
#define MD_SC 0x4000 // Single conversion
#define MD_STBY 0x6000 // Standby
#define MD_IC0 0x8000 // Internal zero-scale calibration
#define MD_ICF 0xa000 // Internal full-scale calibration
#define MD_SC0 0xc000 // System zero-scale calibration
#define MD_SCF 0xe000 // System full-scale calibration
/////////////////////////////////////////////////////////////////////////////
long ReadFilter();
void WriteFilter(long);
#define CHOP 0x000010 // Chop enable
#define AC 0x000020 // AC excitation
#define FAST 0x000100 // FASTStep mode
#define SKIP 0x000200 // FIR filter skip
/////////////////////////////////////////////////////////////////////////////
uint8_t ReadDAC();
void WriteDAC(uint8_t);
long ReadOffset();
void WriteOffset(long);
long ReadGain();
void WriteGain(long);
Схема примерно такая:
CS у меня постоянно выбран, SPI программируется так:
SPCR = _BV(SPE) | _BV(MSTR) | 0x0;
Дальнейшая работа такая:
WriteFilter((1791L<<12)|CHOP|AC|15); // 57 Гц (1791), CHOP, AC, задержка 15
WriteDAC(ReadEE(DAC_EE));
WriteOffset(ReadEE4(OFFSET_EE));
WriteGain(ReadEE4(GAIN_EE));
WriteMode(MD_CC|REF|BO|Range); // запуск АЦП
ReadEE - это считывание калибровок и прочей фигни из EEPROM
После этого в прерывании считываются значения путем обращения ReadData()