Разработка, производство и продажа радиоэлектронной аппаратуры
|
Требуется программист в Зеленограде - обработка данных с датчиков; ColdFire; 40 тыс.
e-mail: jobsmp@pochta.ru
|
//ICC-AVR application builder : 18.07.2008
// Target : M640 Crystal: 14.7456Mhz
#include <iom640v.h>
#include <macros.h>
void SpiInit(void);
void SpiWriteByte(unsigned char);
unsigned char SpiReadByte(void);
signed long uzmerenie3(void);
void Init_ADC(void);
//SPI initialize clock rate: 1843198hz
void SpiInit(void)
{
PORTF|=BIT(0); // CS1 установить в 1
PORTF|=BIT(1); // CS2 установить в 1
PORTF|=BIT(2); // CS3 установить в 1
DDRB|=0x07; //Установка SCK=1, MOSI=1, MISO=0, SS=1
PORTB&=~BIT(2); // очистка MOSI
PORTB&=~BIT(1); //очистка SCK
SPCR = 0x51; //установка SPI в режиме ведущий и задание скорости
SPSR = 0x01; //setup SPI
SPCR|=BIT(6);
}
//Функция записи байта в SPI порт
void SpiWriteByte(unsigned char byte)
{
PORTB&=~BIT(2); // очистка MOSI
PORTB&=~BIT(1); //очистка SCK
SPCR|=BIT(6);
SPDR = byte;
while (!(SPSR&0x80)); // ожидание готовности порта, прежде чем считывать
byte = SPDR;
SPCR&=~BIT(6);
}
//Функция чтения байта с SPI порта
unsigned char SpiReadByte(void)
{
unsigned char tmp=0;
PORTB&=~BIT(2); // очистка MOSI
PORTB&=~BIT(1); //очистка SCK
SPCR|=BIT(6);
SPDR = 0x00;
while (!(SPSR&0x80)); // ожидание готовности порта, прежде чем считывать
tmp=SPDR;
SPCR&=~BIT(6);
return tmp;
}
// Функция получения данных от 3-го АЦП
signed long uzmerenie3(void)
{
unsigned char buf;
unsigned int j;
unsigned char store[3];
unsigned int reg;
unsigned long A, B, C;
signed long rez;
double U;
//Чтение регистра ADC Status
PORTF&=~BIT(2); // CS3 установить в 0 - выбор 3 АЦП
SpiWriteByte(0x04+0x40);
reg=SpiReadByte();
PORTF|=BIT(2); // CS3 установить в 1
// Выбор канала готовых данных (аппаратно RDY дает сигнал только о готовности данных,без указания канала
switch (reg)
{
case 0x01:
{
// Установка чтение 0 канала данных
//Устанавливаем регистр для чтения - выходные данные 24 бит - 3 байта
PORTF&=~BIT(2); // CS3 установить в 0 - выбор 3 АЦП
SpiWriteByte(0x08+0x40);
PORTF|=BIT(2); // CS3 установить в 1
buf=0x01;
}
break;
case 0x04:
{
// Установка чтение 1 канала данных
//Устанавливаем регистр для чтения - выходные данные 24 бит - 3 байта
PORTF&=~BIT(2); // CS3 установить в 0 - выбор 3 АЦП
SpiWriteByte(0x0A+0x40);
PORTF|=BIT(2); // CS3 установить в 1
buf=0x04;
}
break;
default: { return (0x00);}
}
//Чтение данных из регистра АЦП
// Читаем и заносим в буфер
for (j=0; j<3; j++)
{
PORTB&=~BIT(2); // очистка MOSI
PORTB&=~BIT(1); //очистка SCK
PORTF&=~BIT(2); // CS3 установить в 0 - выбор 3 АЦП
SPCR|=BIT(6);
SPDR = 0x00;
while (!(SPSR&0x80)); // ожидание готовности порта, прежде чем считывать
store[j]=SPDR; //считать SPDR в массив хранения
SPCR&=~BIT(6);
PORTF|=BIT(2); // CS3 установить в 1
}
//Отправляем на монитор RS232 - для тестирования
rs232_byte(buf);
rs232_byte(store[0]);
rs232_byte(store[1]);
rs232_byte(store[2]);
// Делаем преобразования полученных данных в напряжение микровольтах
A=store[0];
B=store[1];
C=store[2];
// Получаем длиное целое из полученных байт
// с учетом что первым идет старший байт
rez=(C+(B<<8)+(A<<16));
// Далее преобразуем с типу double и Преобразуем к напряжению
U=(((double)(rez))*20)/0xFFFFFF; // Получаем напряжение от 0 до 20 В
// Отнимаем 10 В - для сдига в биполярный сигнал - получаем изменение напряжения от -10 до 10В
U=U-10;
// Преобразуем в микровольты и возращаем результат
rez=(signed long)(U*1000000);
return (rez);
}
// Функция инициализации АЦП
void Init_ADC(void)
{
//Запись команд в АЦП
//Общий сброс АЦП
PORTF&=~BIT(2); // CS3 установить в 0 - выбор 3 АЦП
SpiWriteByte(0x00);
SpiWriteByte(0xFF);
SpiWriteByte(0xFF);
SpiWriteByte(0xFF);
SpiWriteByte(0xFF);
// Записываем в регистры управления АЦП
// Установка режима синхронной работы через вывод SYNC
SpiWriteByte(0x01);// Установка регистра I/O Port=0b00110000
SpiWriteByte(0x30);
// Установка регистра - время преобразования FW=125=0x7D - 200 Гц
SpiWriteByte(0x30);// Установка регистра для 1 канала
SpiWriteByte(0x80+0x7D);
SpiWriteByte(0x32);// Установка регистра для 2 канала
SpiWriteByte(0x80+0x7D);
// Установка режима работы -+10В и разрешение работы АЦП
SpiWriteByte(0x28);// Установка регистра для 1 канала
SpiWriteByte(0x08);
SpiWriteByte(0x2A);// Установка регистра для 2 канала
SpiWriteByte(0x08);
//Установка режима работы - непрерывный, самостоятельный, попеременный - Mode=0b00100010
SpiWriteByte(0x38);// Установка регистра для 1 канала
SpiWriteByte(0x22);
PORTF|=BIT(2); // CS3 установить в 1
//Закрытия выбора 3-х АЦП
}
Составить ответ | Вернуться на конференцию
Ответы
- Ответ: - Точка опоры (27.08.2008 02:44:22 213.87.81.5, 312 байт)