Вт май 17, 2011 20:57:21
Ser60 писал(а):Кстати, о каком датчике идет речь?
Вт май 17, 2011 21:46:54
Ср май 18, 2011 08:01:58
Ср май 18, 2011 09:02:51
//----------
//Модуль обслуживания датчика давления HP02S
//----------
#include "Main.h"
#include "HP02S.h"
#include "I2C.h"
//---------- Используемые модулем аппаратные ресурсы: ----------
//Датчик давления использует тактовую частоту, которую формирует таймер 1
//на выходе OC1A. Для обмена данными с датчиком используется порт I2C,
//реализованный программно.
//---------- Константы: ----------
#define F_MCLK 32768 //тактовая частота датчика, Гц
#define TADC 50 //время преобразования АЦП, мс
#define TIDLE 900 //время ожидания следующего преобразования, мс
#define T1VAL (F_CLK * 5E5 / F_MCLK + 0.5)
enum { //коды состояний измерителя
HP_IDLE, //измеритель в состоянии ожидания
HP_MEASD, //измерение давления
HP_MEAST, //измерение температуры
HP_CALC //вычисление давления
};
//---------- Переменные: ----------
static char State; //состояние измерителя
static unsigned int Hp_D0; //калибровочный коэффициент D0
static unsigned int Hp_T0; //калибровочный коэффициент T0
static unsigned int Hp_P0; //калибровочный коэффициент P0
static unsigned int Hp_S; //калибровочный коэффициент S
static unsigned int Hp_C; //калибровочный коэффициент C
static unsigned int Hp_D1; //измеренный код давления D1
static unsigned int Hp_T1; //измеренный код температуры T1
static int Pressure; //текущее значение давления
//---------- Инициализация подсистемы измерителя: ----------
void HP02S_Init(void)
{
TCCR1A = (1 << COM1A0); //toggle OC1A on compare
TCCR1B = (1 << WGM12) | (1 << CS10); //CTC, CK/1
OCR1A = T1VAL - 1;
//чтение калибровочных коэффициентов:
I2C_Start(); //start
I2C_Wr(0xA0); //address
I2C_Wr(2); //subaddress
I2C_Stop(); //stop
I2C_Start(); //start
I2C_Wr(0xA0 | I2C_RD); //address + read
Hp_D0 = I2C_RdAck() << 8; //D0 (MSB)
Hp_D0 = Hp_D0 | I2C_RdAck(); //D0 (LSB)
Hp_T0 = I2C_RdAck() << 8; //T0 (MSB)
Hp_T0 = Hp_T0 | I2C_RdAck(); //T0 (LSB)
Hp_P0 = I2C_RdAck() << 8; //P0 (MSB)
Hp_P0 = Hp_P0 | I2C_RdAck(); //P0 (LSB)
Hp_S = I2C_RdAck() << 8; //S (MSB)
Hp_S = Hp_S | I2C_RdAck(); //S (LSB)
Hp_C = I2C_RdAck() << 8; //C (MSB)
Hp_C = Hp_C | I2C_RdNak(); //C (LSB) + NAK
I2C_Stop(); //stop
State = HP_IDLE;
}
//---------- Процесс измерения: ----------
void HP02S_Exe(bool t)
{
static int Interval = 0; //измерительный интервал
if(t)
{
if(Interval)
{
Interval--;
}
else
{
switch(State)
{
case HP_IDLE:
{
//запуск измерения давления:
Port_XCLR_1;
I2C_Start();
I2C_Wr(0xEE);
I2C_Wr(0xFF);
I2C_Wr(0xF0);
I2C_Stop();
Interval = ms2sys(TADC);
State = HP_MEASD;
break;
}
case HP_MEASD:
{
//чтение измеренного кода давления:
I2C_Start();
I2C_Wr(0xEE);
I2C_Wr(0xFD);
I2C_Stop();
I2C_Start();
I2C_Wr(0xEE | I2C_RD);
Hp_D1 = I2C_RdAck() << 8;
Hp_D1 = Hp_D1 | I2C_RdNak();
I2C_Stop();
//запуск измерения температуры:
I2C_Start();
I2C_Wr(0xEE);
I2C_Wr(0xFF);
I2C_Wr(0xE8);
I2C_Stop();
Interval = ms2sys(TADC);
State = HP_MEAST;
break;
}
case HP_MEAST:
{
//чтение измеренного кода температуры:
I2C_Start();
I2C_Wr(0xEE);
I2C_Wr(0xFD);
I2C_Stop();
I2C_Start();
I2C_Wr(0xEE | I2C_RD);
Hp_T1 = I2C_RdAck() << 8;
Hp_T1 = Hp_T1 | I2C_RdNak();
I2C_Stop();
Port_XCLR_0;
State = HP_CALC;
break;
}
case HP_CALC:
{
//вычисление давления:
long dUP = (long)Hp_D1 - (long)Hp_D0;
long dT = (long)Hp_T1 - (long)Hp_T0;
long dUT = (((dT * 29L) / 50L - (dT * dT) / 76666L) * (long)Hp_S) / (long)Hp_C;
Pressure = (long)Hp_P0 + ((dUP + dUT) * 100L) / (long)Hp_S;
Interval = ms2sys(TIDLE);
State = HP_IDLE;
break;
}
}
}
}
}
//---------- Считывание текущего значения давления: ----------
int HP02S_GetP(void)
{
return(Pressure);
}
//----------
Ср май 18, 2011 18:36:41
Ср май 18, 2011 20:20:22
Чт май 19, 2011 04:06:57
Чт май 19, 2011 22:55:23
Ser60 писал(а):Успеха в отладке! Напишите потом в чем была проблема.
Чт май 19, 2011 23:05:51
Пт май 20, 2011 09:22:01
Ser60 писал(а):Кстати, вы сняли с него защитную пленку?
Пт май 20, 2011 16:44:53
Пт май 20, 2011 18:24:37
Сб май 28, 2011 19:56:56
Вт ноя 22, 2011 18:35:35
Ничегонеработает писал(а):У меня так:
- Код:
//----------
//Модуль обслуживания датчика давления HP02S
//----------
#include "Main.h"
#include "HP02S.h"
#include "I2C.h"
//---------- Используемые модулем аппаратные ресурсы: ----------
//Датчик давления использует тактовую частоту, которую формирует таймер 1
//на выходе OC1A. Для обмена данными с датчиком используется порт I2C,
//реализованный программно.
//---------- Константы: ----------
#define F_MCLK 32768 //тактовая частота датчика, Гц
#define TADC 50 //время преобразования АЦП, мс
#define TIDLE 900 //время ожидания следующего преобразования, мс
#define T1VAL (F_CLK * 5E5 / F_MCLK + 0.5)
enum { //коды состояний измерителя
HP_IDLE, //измеритель в состоянии ожидания
HP_MEASD, //измерение давления
HP_MEAST, //измерение температуры
HP_CALC //вычисление давления
};
//---------- Переменные: ----------
static char State; //состояние измерителя
static unsigned int Hp_D0; //калибровочный коэффициент D0
static unsigned int Hp_T0; //калибровочный коэффициент T0
static unsigned int Hp_P0; //калибровочный коэффициент P0
static unsigned int Hp_S; //калибровочный коэффициент S
static unsigned int Hp_C; //калибровочный коэффициент C
static unsigned int Hp_D1; //измеренный код давления D1
static unsigned int Hp_T1; //измеренный код температуры T1
static int Pressure; //текущее значение давления
//---------- Инициализация подсистемы измерителя: ----------
void HP02S_Init(void)
{
TCCR1A = (1 << COM1A0); //toggle OC1A on compare
TCCR1B = (1 << WGM12) | (1 << CS10); //CTC, CK/1
OCR1A = T1VAL - 1;
//чтение калибровочных коэффициентов:
I2C_Start(); //start
I2C_Wr(0xA0); //address
I2C_Wr(2); //subaddress
I2C_Stop(); //stop
I2C_Start(); //start
I2C_Wr(0xA0 | I2C_RD); //address + read
Hp_D0 = I2C_RdAck() << 8; //D0 (MSB)
Hp_D0 = Hp_D0 | I2C_RdAck(); //D0 (LSB)
Hp_T0 = I2C_RdAck() << 8; //T0 (MSB)
Hp_T0 = Hp_T0 | I2C_RdAck(); //T0 (LSB)
Hp_P0 = I2C_RdAck() << 8; //P0 (MSB)
Hp_P0 = Hp_P0 | I2C_RdAck(); //P0 (LSB)
Hp_S = I2C_RdAck() << 8; //S (MSB)
Hp_S = Hp_S | I2C_RdAck(); //S (LSB)
Hp_C = I2C_RdAck() << 8; //C (MSB)
Hp_C = Hp_C | I2C_RdNak(); //C (LSB) + NAK
I2C_Stop(); //stop
State = HP_IDLE;
}
//---------- Процесс измерения: ----------
void HP02S_Exe(bool t)
{
static int Interval = 0; //измерительный интервал
if(t)
{
if(Interval)
{
Interval--;
}
else
{
switch(State)
{
case HP_IDLE:
{
//запуск измерения давления:
Port_XCLR_1;
I2C_Start();
I2C_Wr(0xEE);
I2C_Wr(0xFF);
I2C_Wr(0xF0);
I2C_Stop();
Interval = ms2sys(TADC);
State = HP_MEASD;
break;
}
case HP_MEASD:
{
//чтение измеренного кода давления:
I2C_Start();
I2C_Wr(0xEE);
I2C_Wr(0xFD);
I2C_Stop();
I2C_Start();
I2C_Wr(0xEE | I2C_RD);
Hp_D1 = I2C_RdAck() << 8;
Hp_D1 = Hp_D1 | I2C_RdNak();
I2C_Stop();
//запуск измерения температуры:
I2C_Start();
I2C_Wr(0xEE);
I2C_Wr(0xFF);
I2C_Wr(0xE8);
I2C_Stop();
Interval = ms2sys(TADC);
State = HP_MEAST;
break;
}
case HP_MEAST:
{
//чтение измеренного кода температуры:
I2C_Start();
I2C_Wr(0xEE);
I2C_Wr(0xFD);
I2C_Stop();
I2C_Start();
I2C_Wr(0xEE | I2C_RD);
Hp_T1 = I2C_RdAck() << 8;
Hp_T1 = Hp_T1 | I2C_RdNak();
I2C_Stop();
Port_XCLR_0;
State = HP_CALC;
break;
}
case HP_CALC:
{
//вычисление давления:
long dUP = (long)Hp_D1 - (long)Hp_D0;
long dT = (long)Hp_T1 - (long)Hp_T0;
long dUT = (((dT * 29L) / 50L - (dT * dT) / 76666L) * (long)Hp_S) / (long)Hp_C;
Pressure = (long)Hp_P0 + ((dUP + dUT) * 100L) / (long)Hp_S;
Interval = ms2sys(TIDLE);
State = HP_IDLE;
break;
}
}
}
}
}
//---------- Считывание текущего значения давления: ----------
int HP02S_GetP(void)
{
return(Pressure);
}
//----------
Вт ноя 22, 2011 18:59:43
Макс электронщик писал(а):С?
Макс электронщик писал(а):объясните пожалуйста как разговаривать с HP03-02
Ср ноя 23, 2011 15:57:49
Ничегонеработает писал(а):Макс электронщик писал(а):Макс электронщик писал(а):объясните пожалуйста как разговаривать с HP03-02
Так исходник же перед Вами. Что конкретно не понятно?
Ср ноя 23, 2011 16:01:53
Ср ноя 23, 2011 20:47:33
urry писал(а):http://ru.wikipedia.org/wiki/%D0%98%D1%81%D1%85%D0%BE%D0%B4%D0%BD%D1%8B%D0%B9_%D0%BA%D0%BE%D0%B4
http://ru.wikipedia.org/wiki/I%C2%B2C
Чт ноя 24, 2011 14:42:03
urry писал(а):http://ru.wikipedia.org/wiki/%D0%98%D1%81%D1%85%D0%BE%D0%B4%D0%BD%D1%8B%D0%B9_%D0%BA%D0%BE%D0%B4
http://ru.wikipedia.org/wiki/I%C2%B2C
Вс дек 18, 2011 18:08:16