Требуется программист в Зеленограде
- обработка данных с датчиков; ColdFire; 40 тыс. e-mail:jobsmp@pochta.ru |
void InitADC(unsigned char inputRange, unsigned char signalType)
{
// Инициализация АЦП
// Сброс последовательного интерфейса
WrADC(0xff);
WrADC(0xff);
WrADC(0xff);
WrADC(0xff);
// Запись в CONFIGURATION REGISTER (0х10)
// WEN - 0
// R/W - 0
// RS2 - 0
// RS1 - 1
// RS0 - 0
// CREAD - 0
// 0 - 0
// 0 - 0
WrADC(0x10);
// Записать в регистр
//
// 0 - 0
// 0 - 0
// BO - 0
// U/B - 0
// 0 - 0
// G2 - 0
// G1 - 0
// G0 - 0
//
// 0 - 0
// 0 - 0
// REF_DET - 0
// BUF - 0
// 0 - 0
// CH2 - 0
// CH1 - 0
// CH0 - 0
WrADC(0x00 | inputRange | signalType);
WrADC(0x00);
// Калибровка канала 0
// Калибровка нуля
// Запись в MODE REGISTER (0х08)
// WEN - 0
// R/W - 0
// RS2 - 0
// RS1 - 0
// RS0 - 1
// CREAD - 0
// 0 - 0
// 0 - 0
WrADC(0x08);
// Записать в регистр
// MD2 - 1
// MD1 - 0
// MD0 - 0
// PSW0 - 0
// 0 - 0
// 0 - 0
// 0 - 0
// 0 - 0
//
// 0 - 0
// 0 - 0
// 0 - 0
// 0 - 0
// FS3 - 1
// FS2 - 1
// FS1 - 1
// FS0 - 1
WrADC(0x80);
WrADC(0x0f);
// Ждать окончания преобразования
while(DOUT) {};
// Калибровка полной шкалы
WrADC(0x08);
WrADC(0xa0);
WrADC(0x0f);
while(DOUT) {};
// Калибровка канала 1
WrADC(0x10);
WrADC(0x00 | inputRange | signalType);
WrADC(0x01);
WrADC(0x08);
WrADC(0x80);
WrADC(0x0f);
while(DOUT) {};
WrADC(0x08);
WrADC(0xa0);
WrADC(0x0f);
while(DOUT) {};
// Калибровка канала 2
WrADC(0x10);
WrADC(0x00 | inputRange | signalType);
WrADC(0x02);
WrADC(0x08);
WrADC(0x80);
WrADC(0x0f);
while(DOUT) {};
WrADC(0x08);
WrADC(0xa0);
WrADC(0x0f);
while(DOUT) {};
}
void WrADC(unsigned char byte)
{
unsigned char data i;
for (i = 0; i < 8; i++)
{
SCLK = 0;
// Сдвинуть байт
byte <<= 1;
// Поместить бит данных в DIN
DIN = CY;
// Сформировать фронт записи на SCLK
SCLK = 1;
}
DIN = 1;
}
unsigned char RdADC(void)
{
unsigned char data byte, i;
for (i = 0; i < 8; i++)
{
// Выдать низкий уровень на SCLK перед чтением бита данных
SCLK = 0;
// Сдвинуть байт и подготовить его младший бит для приема бита данных АЦП
byte <<= 1;
// Поместить бит данных АЦП в младший бит байта
byte |= DOUT;
SCLK = 1;
}
DOUT = 1;
return byte;
}
Работа с АЦП собственно:
// Выбрать канал 1
WrADC(0x10);
WrADC(0x00 | inputRange | signalType);
WrADC(0x01);
// Сделать единичное преобразование
WrADC(0x08);
WrADC(0x20);
WrADC(updateRate);
// Ожидать конца преобразования
while(DOUT) {};
// Прочитать регистр данных
// WEN - 0
// R/W - 1
// RS2 - 0
// RS1 - 1
// RS0 - 1
// CREAD - 0
// 0 - 0
// 0 - 0
WrADC(0x58);
// Прочитать три байта результата
b0 = RdADC();
b1 = RdADC();
b2 = RdADC();