Здравствуйте!
Хочу мерить напряжение с электронного умножителя (минимальное порядка 10^-7V) с частотой примерно 500-1000Hz. Выбрал в качестве АЦП ADS1255/1256.
Подключаю его к ATmega168 через USART в MSPIM. Т.к. основной SPI к сожалению занят. Для этого использую код из AppNote AVR317: Using the USART on the ATmega48/88/168 as a SPI master. Там как я понял организуется циклический буфер в который можно записывать данные и забирать оттуда данные, а он сам будет делать все остальное

.
DRDY от ADS1255 подключаю к INT1. Хочу заполнять массив по прерыванию INT1.
Делаю вот так:
*****main.c*****
Код
#define F_CPU 12500000UL // 12.5 MHz
int main(void){
/***init SPI as USART MSPIM and ~SS line ***/
//Calculation of BRREG value. USART MSPIM:
#define BPS 10000 //Desired bit rate for SPI communication.
#define BRREG ((F_CPU/(2*BPS))-1) // Calculated brreg value.
//SPI clock t1: max = 4*tclock_ads1256 = 2 MHz
init_usart_spi(0, BRREG);
/***enable interrupt***/
sei();
/***enable ADS1256***/
init_ads1256();
while(1){.....}
}
** Инициализация ads1256
void init_ads1256(void){
//***Initialise ADS1256
char Byte=(WREG | 0x00); //Starting at address 0x00,
queue_byte(Byte);
queue_byte(0x04); //write to a total of 5 registers (5 - 1 = 0x04)
queue_byte(0x06); //STATUS register = 0x06
queue_byte(0x01); //MUX register = 0x01
queue_byte(0x01); //ADCON register = 0x01
queue_byte(0xC1); //DRATE register = 0xC1
queue_byte(0x00); //GPIO register = 0x00
//ADS1256 Self Calibration
queue_byte(SELFCAL); //Initiate self calibration
_delay_ms(10);
// do{char temp = PD3;} while((temp & 0x08) == 0x08); //Wait for DRDY to go low
//Set sample freq. to 500SPS
//***Initialise External interrupt 1
//PORTD3 is input by default
//The low level of INT1 generates an interrupt request
cbi(EICRA, ISC11);
cbi(EICRA, ISC10);
//enable INT1 interrupt
sbi(EIMSK, INT1);
}
** Действия когда DRDY становится низким
//The following function will be called when analog conversion is done: DRDY connecting to PD3/INT1 is going low
ISR(INT1_vect) {
//spi_send_mssp(_ADS1256_cmd_read_regs | _ADS1256_regs_io)
queue_byte(RDATA);
//spi_send_mssp(0)
queue_byte(0);
_delay_us(10); //*ADS1256 t6 VERY IMPORTANT* min_us=t6/F_ADS1256=50/7.68MHz=7us
//spi_read_mssp(data)
DAT[conv]=fetch_byte();
DAT[conv+1]=fetch_byte();
DAT[conv+2]=fetch_byte();
conv=conv+3;
//clear INT1 interrupt flag
sbi(EIFR, INTF1);
}
файл USART in MSPIM в аттаче. там определяются функции init_usart_spi(), queue_byte(), fetch_byte()
Подскажите пожалуйста, все ли я делаю правильно? Будет ли такое вообще работать?
Сообщение отредактировал Filov - Jan 28 2008, 12:22