реклама на сайте
подробности

 
 
 
Reply to this topicStart new topic
> Датчик давления HP03 глючит ?, глючит HP03 или программа ?
tothema
сообщение Jan 19 2010, 16:29
Сообщение #1





Группа: Участник
Сообщений: 7
Регистрация: 19-01-10
Пользователь №: 54 925



Здравствуйте уважаемые.

Прошу помочь всех кто сталкивался с датчиком давления HP03 HopeRF.

Значит сам вопрос:

вроде, все работает нормально, нормально считываются коэффициенты и D1, D2.

НО! со временим один из коэфициентов может ПОМЕНЯТЬСЯ, а так же может поменяться скачкообразно значение температуры !!!
расчет ведется по коэффициентам, которые записал в программе, и эти изменения коэффициента на расчет естественно не влияют, но вот температура скачет sad.gif
Приведу пример, как это выглядит, вот нормальные коэффициенты (по два байта - старший и затем младший):

С1 081 032
С2 014 213
С3 001 074
С4 004 015
> С5 146 060
C6 021 248
C7 009 196
A 7
B 21
C 6
D 9
D1 156 207
> D2 124 165

Так вот, иногда (закономерность не установлена) коэффициент С5, а точнее старший байт (146) может поменяться на 014 !!!
Остальные не меняются, и С5 младший байт тоже не меняется, ТОЛЬКО СТАРШИЙ.
а так же иногда скачкообразно может измениться значение температуры а именно старший байт D2

На графике это выглядит так: (в районе 10:00 и 20:00)



У меня, есть два датчика HP03, и я подключал оба, РЕЗУЛЬТАТ ТОТ ЖЕ!
Т.е. коэффициенты то разные, но симптом тот же, скачет старший байт С5 и D2

Что это может быть ? Неужели вся партия датчиков глючная, кто нибудь сталкивался с подобным ?
Go to the top of the page
 
+Quote Post
rx3apf
сообщение Jan 19 2010, 17:58
Сообщение #2


Гуру
******

Группа: Участник
Сообщений: 3 834
Регистрация: 14-06-06
Из: Moscow, Russia
Пользователь №: 18 047



Цитата(tothema @ Jan 19 2010, 19:29) *
У меня, есть два датчика HP03, и я подключал оба, РЕЗУЛЬТАТ ТОТ ЖЕ!
Т.е. коэффициенты то разные, но симптом тот же, скачет старший байт С5 и D2

Коэффициенты записаны в встроенный EEPROM, и если по ходу работы считывается разное значение - больше всего похоже на ошибку работы с памятью. Вряд ли это проблема самого датчика...
Go to the top of the page
 
+Quote Post
alux
сообщение Jan 19 2010, 19:07
Сообщение #3


Знающий
****

Группа: Свой
Сообщений: 589
Регистрация: 24-04-05
Пользователь №: 4 447



Имел дело с этим датчиком. Полет нормальный... В вашем случае очень похоже на ошибки переполнения в результате расчетов. Проверьте правильность типов переменных.
Go to the top of the page
 
+Quote Post
tothema
сообщение Jan 20 2010, 01:00
Сообщение #4





Группа: Участник
Сообщений: 7
Регистрация: 19-01-10
Пользователь №: 54 925



Спасибо, буду просматривать программу на предмет ошибок, только смущает то, что подобная ошибка (считывание данных из HP03) может возникнуть через 5 минут после включения устройства, а может через часов 10!

P.S. Вот сейчас, в данный момент C5 (142) опять поменялся на 14, но с D2 все в порядке, т.е. хочу сказать, что меняются они не оба сразу, а могут по отдельности.
И еще попробывал выключить на полминуты, и включить заново, С5 все так же 14 (а должен быть 142) sad.gif

Сообщение отредактировал tothema - Jan 20 2010, 01:11
Go to the top of the page
 
+Quote Post
alux
сообщение Jan 20 2010, 20:22
Сообщение #5


Знающий
****

Группа: Свой
Сообщений: 589
Регистрация: 24-04-05
Пользователь №: 4 447



Выкладывай исходники, посмотрим.

PS. Включи свой личный ящик, либо дай свой e-mail, по которому вышлю рабочий код.
Go to the top of the page
 
+Quote Post
tothema
сообщение Jan 21 2010, 01:10
Сообщение #6





Группа: Участник
Сообщений: 7
Регистрация: 19-01-10
Пользователь №: 54 925



Цитата(alux @ Jan 21 2010, 02:22) *
Выкладывай исходники, посмотрим.

PS. Включи свой личный ящик, либо дай свой e-mail, по которому вышлю рабочий код.


Ящик: tothema@mail.ru

Но я работаю с PIC`ом. Код еще не приведен в должный вид, такой как есть:

Код
#include <pic.h>
#include <stdio.h>
#include "usart.h"
#include "usart.c"
#include "delay.c"
#include "1-wire.h"
#include "i2c.h"

/* Метеостанция
* Измерение температуры
*/

unsigned char x, p, v, MSB, LSB;
unsigned char on,sign,i,val,delay;
unsigned char  c1MSB, c1LSB, c2MSB, c2LSB, c3MSB, c3LSB, c4MSB, c4LSB, c5MSB, c5LSB, c6MSB, c6LSB, c7MSB, c7LSB;
unsigned char AA, BB, CC, DD;
unsigned char pMSB, pLSB, tMSB, tLSB;

void out(unsigned int data)
{
   unsigned char a,b,c;
   char text[]="---";
   char *q=text;

   a=data/100;
   b=(data-(a*100))/10;
   c=data-((a*100)+(b*10));
   *q++='0'+a;
   *q++='0'+b;
   *q='0'+c;
   printf(text);
}


void main(void){

TRISA=255;
PORTA=0;
TRISB=0;


x=99;
GIE=0;

    init_comms();    // иницализация UART
    i2c_init();                // инициализация i2c
    printf("METEO STATION v0.89 12 jan 2010\r");


reset_DS1820();
write_DS(0xCC); write_DS(0xBE);

reset_DS1820();
write_DS(0xCC);write_DS(0x44);
    
DelayMs(250);
DelayMs(250);


while(1)
{
//**************************************************** Работа с термометром DS18B20
    reset_DS1820(); write_DS(0xCC);write_DS(0x44);
    
    DelayMs(250);
    DelayMs(250);

     reset_DS1820();

     write_DS(0xCC);
     write_DS(0xBE);
     LSB = read_DS(); MSB = read_DS();



//************************************************** Работа с HP03
i2c_start();
i2c_send (0b10100000);
i2c_ask();
i2c_send (16);
i2c_ask();
i2c_start();
i2c_send (0b10100001);
i2c_ask();
c1MSB=i2c_read();
i2c_mask();
c1LSB=i2c_read();
i2c_ask();
i2c_stop();
//**************************************************
i2c_start();
i2c_send (0b10100000);
i2c_ask();
i2c_send (18);
i2c_ask();
i2c_start();
i2c_send (0b10100001);
i2c_ask();
c2MSB=i2c_read();
i2c_mask();
c2LSB=i2c_read();
i2c_ask();
i2c_stop();
//**************************************************
i2c_start();
i2c_send (0b10100000);
i2c_ask();
i2c_send (20);
i2c_ask();
i2c_start();
i2c_send (0b10100001);
i2c_ask();
c3MSB=i2c_read();
i2c_mask();
c3LSB=i2c_read();
i2c_ask();
i2c_stop();
//**************************************************
i2c_start();
i2c_send (0b10100000);
i2c_ask();
i2c_send (22);
i2c_ask();
i2c_start();
i2c_send (0b10100001);
i2c_ask();
c4MSB=i2c_read();
i2c_mask();
c4LSB=i2c_read();
i2c_ask();
i2c_stop();
//**************************************************
i2c_start();
i2c_send (0b10100000);
i2c_ask();
i2c_send (24);
i2c_ask();
i2c_start();
i2c_send (0b10100001);
i2c_ask();
c5MSB=i2c_read();
i2c_mask();
c5LSB=i2c_read();
i2c_ask();
i2c_stop();
//**************************************************
i2c_start();
i2c_send (0b10100000);
i2c_ask();
i2c_send (26);
i2c_ask();
i2c_start();
i2c_send (0b10100001);
i2c_ask();
c6MSB=i2c_read();
i2c_mask();
c6LSB=i2c_read();
i2c_ask();
i2c_stop();
//**************************************************
i2c_start();
i2c_send (0b10100000);
i2c_ask();
i2c_send (28);
i2c_ask();
i2c_start();
i2c_send (0b10100001);
i2c_ask();
c7MSB=i2c_read();
i2c_mask();
c7LSB=i2c_read();
i2c_ask();
i2c_stop();
//**************************************************
i2c_start();
i2c_send (0b10100000);
i2c_ask();
i2c_send (30);
i2c_ask();
i2c_start();
i2c_send (0b10100001);
i2c_ask();
AA=i2c_read();
i2c_mask();
BB=i2c_read();
i2c_ask();
i2c_stop();
//**************************************************
i2c_start();
i2c_send (0b10100000);
i2c_ask();
i2c_send (32);
i2c_ask();
i2c_start();
i2c_send (0b10100001);
i2c_ask();
CC=i2c_read();
i2c_mask();
DD=i2c_read();
i2c_ask();
i2c_stop();
//**************************************************
TRISA2=0;
DelayMs(200);
TRISA2=1;
DelayMs(200);
//**************************************************
i2c_start();
i2c_send (0b11101110);
i2c_ask();
i2c_send (0b11111111);
i2c_ask();
i2c_send (0b11110000);
i2c_ask();
i2c_stop();

DelayMs(100);

i2c_start();
i2c_send (0b11101110);
i2c_ask();
i2c_send (0b11111101);
i2c_ask();
i2c_start();
i2c_send (0b11101111);
i2c_ask();
pMSB=i2c_read();
i2c_mask();
pLSB=i2c_read();
i2c_ask();
i2c_stop();
//**************************************************
i2c_start();
i2c_send (0b11101110);
i2c_ask();
i2c_send (0b11111111);
i2c_ask();
i2c_send (0b11101000);
i2c_ask();
i2c_stop();

DelayMs(100);

i2c_start();
i2c_send (0b11101110);
i2c_ask();
i2c_send (0b11111101);
i2c_ask();
i2c_start();
i2c_send (0b11101111);
i2c_ask();
tMSB=i2c_read();
i2c_mask();
tLSB=i2c_read();
i2c_ask();
i2c_stop();
//**************************************************

    printf("\r");
    printf("\rDS18b20=");out(MSB);printf(" ");out(LSB);

printf("\rC1=");out(c1MSB);printf(" ");out(c1LSB);
printf("\rC2=");out(c2MSB);printf(" ");out(c2LSB);
printf("\rC3=");out(c3MSB);printf(" ");out(c3LSB);
printf("\rC4=");out(c4MSB);printf(" ");out(c4LSB);
printf("\rC5=");out(c5MSB);printf(" ");out(c5LSB);
printf("\rC6=");out(c6MSB);printf(" ");out(c6LSB);
printf("\rC7=");out(c7MSB);printf(" ");out(c7LSB);

printf("\rA=");out(AA);printf(" B=");out(BB); printf(" C=");out(CC);printf(" D=");out(DD);

printf("\rD1=");out(pMSB);printf(" ");out(pLSB);
printf("\rD2=");out(tMSB);printf(" ");out(tLSB);


printf("\rcount=");out(x); if (x) x--; else x=99;
    

}
}


а вот модуль i2c:

Код
#define SDA TRISA4
#define SCL TRISA3
#define t1 DelayUs(100)
#define t2 DelayUs(100)
#define t3 DelayUs(100)

void i2c_init(void)
{
SDA=1;
}

void i2c_start (void)
{
SCL=1;
t1;
SDA=0;
t2;
SCL=0;
t3;
}

void i2c_send (unsigned char data)
{
signed char i;

for(i=7; i>=0; i--)
    {
    if ((data>>i)&0x01) SDA=1; else SDA=0;
    t1;
    SCL=1;
    t2;
    SCL=0;
    t3;
    }
}

unsigned char i2c_read(void)
{
    unsigned char i, val;

    SDA=1;     
    val = 0;
    for (i = 1; i <= 8; i++)
    {
    t1;
    SCL=1;
    t2;
    val = val << 1;
    if(RA4) val=val | 0b00000001;
    SCL=0;
    t3;
    }
    return val;
}

void i2c_ask (void)
{
    SDA=1;
    t1;
    SCL=1;
    t2;
    SCL=0;
    t3;
}

void i2c_mask (void)
{
    SDA=0;
    t1;
    SCL=1;
    t2;
    SCL=0;
    t3;
}

void i2c_stop (void)
{
SDA=0;
t1;
SCL=1;
t2;
SDA=1;
t3;
}
Go to the top of the page
 
+Quote Post
alux
сообщение Jan 21 2010, 06:00
Сообщение #7


Знающий
****

Группа: Свой
Сообщений: 589
Регистрация: 24-04-05
Пользователь №: 4 447



Переменные должны иметь тип unsigned.
В даташите же есть пример кода.

PS. Отредактируйте свое сообщение, удалите свой ящик, чтобы не светить его для спама. Я выслал рабочий код.
Go to the top of the page
 
+Quote Post
tothema
сообщение Jan 21 2010, 07:02
Сообщение #8





Группа: Участник
Сообщений: 7
Регистрация: 19-01-10
Пользователь №: 54 925



Спасибо, "рабочий код" получил, буду изучать.

У меня в коде выше вроде же все переменные UNSIGNED, или я чего то не понял ?
В каком даташите ? Можно на него ссылку ? (насколько помню у меня даташит без кода, просто описание работы)

да, и как можно отредактировать свое сообщение ? smile.gif
Go to the top of the page
 
+Quote Post
MrYuran
сообщение Jan 21 2010, 07:16
Сообщение #9


Беспросветный оптимист
******

Группа: Свой
Сообщений: 4 640
Регистрация: 26-12-07
Из: Н.Новгород
Пользователь №: 33 646



Цитата(tothema @ Jan 21 2010, 10:02) *
да, и как можно отредактировать свое сообщение ? smile.gif

Если кнопка "ЕДИТ" уже пропала, то просите модераторов


--------------------
Программирование делится на системное и бессистемное. ©Моё :)
— а для кого-то БГ — это Bill Gilbert =)
Go to the top of the page
 
+Quote Post
alux
сообщение Jan 21 2010, 18:13
Сообщение #10


Знающий
****

Группа: Свой
Сообщений: 589
Регистрация: 24-04-05
Пользователь №: 4 447



unsigned по стандарту - это значит unsigned int. В смысле для краткости int можно опустить.
Прикрепленные файлы
Прикрепленный файл  hp03_code.pdf ( 115.59 килобайт ) Кол-во скачиваний: 90
 
Go to the top of the page
 
+Quote Post
tothema
сообщение Jan 22 2010, 14:57
Сообщение #11





Группа: Участник
Сообщений: 7
Регистрация: 19-01-10
Пользователь №: 54 925



Да я понял про unsigned, у меня в коде итак все переменные unsigned, кроме нескольких, которые по идее не должны влиять т.к. используются в циклах и т.п.
Просмотрев коды (признаюсь не очень досканально, т.к. не работал никогда ни с чем кроме PIC`ов) не обнаружил у себя каких либо неточностей.

Единственное, что у меня не было в коде, это перевод порта A в из аналога в цифру: (хотя и так работало smile.gif )

VROE=0;
CMCON=7;

Может из за этого ? Сейчас нет возможности попробывать.

А еще как вариант хочу подключить вместо датчика HP03 - память24C02 и погонять денек другой,
если пятый коэф. так же будет прыгать тогда точно станет ясно что грабли в проге.
Go to the top of the page
 
+Quote Post
tothema
сообщение Jan 26 2010, 14:12
Сообщение #12





Группа: Участник
Сообщений: 7
Регистрация: 19-01-10
Пользователь №: 54 925



VROE=0;
CMCON=7;

не помогло sad.gif

кое чего выяснил. Давление считывается плавно, а вот температура скачками по 2,5 С (приблизит.) Тут на форуме читал, что было уже такое у кого то, но там была ошибка с типом переменных.
У меня же 2 куска кода скопипастены, заменил только переменные данных и адреса для считывания:

Считывание температуры:
Код
i2c_start();
i2c_send (0b11101110);//EE
i2c_ask();
i2c_send (0b11111111);//FF
i2c_ask();
i2c_send (0b11101000);//E8
i2c_ask();
i2c_stop();

DelayMs(200);

i2c_start();
i2c_send (0b11101110);
i2c_ask();
i2c_send (0b11111101);
i2c_ask();
i2c_start();
i2c_send (0b11101111);
i2c_ask();
tMSB=i2c_read();
i2c_mask();
tLSB=i2c_read();
i2c_ask();
i2c_stop();


Считывание давления:
Код
i2c_start();
i2c_send (0b11101110);//EE
i2c_ask();
i2c_send (0b11111111);//FF
i2c_ask();
i2c_send (0b11110000);//F0
i2c_ask();
i2c_stop();

DelayMs(200);

i2c_start();
i2c_send (0b11101110);
i2c_ask();
i2c_send (0b11111101);
i2c_ask();
i2c_start();
i2c_send (0b11101111);
i2c_ask();
pMSB=i2c_read();
i2c_mask();
pLSB=i2c_read();
i2c_ask();
i2c_stop();


Вот объявление переменных:
Код
unsigned char pMSB, pLSB, tMSB, tLSB;


Вот графики (данные с датчика без математических преобразований):
температура:


А вот давление:


Не знаю уже в какую сторону копать crying.gif
Go to the top of the page
 
+Quote Post
tothema
сообщение Feb 6 2010, 13:25
Сообщение #13





Группа: Участник
Сообщений: 7
Регистрация: 19-01-10
Пользователь №: 54 925



Итак, переделал плату (раньше было на макетке) и переписал прогу - ту которая в даташите, переписал в PIC.
Пока вроде показания считываются плавно, без скачков, НО, у меня на PIC`е выходит всего около 11кГц для HP03 (вместо 32кГц), и при этом все работает, и данные похожи на правду.
Можно так оставить, или все же нужно добиться 32кГц ?
Go to the top of the page
 
+Quote Post
alux
сообщение Feb 10 2010, 03:51
Сообщение #14


Знающий
****

Группа: Свой
Сообщений: 589
Регистрация: 24-04-05
Пользователь №: 4 447



Цитата(tothema @ Feb 6 2010, 17:25) *
НО, у меня на PIC`е выходит всего около 11кГц для HP03 (вместо 32кГц),
Неужели на PIC,е нельзя организовать 32кГц? По даташиту HP-03 заявлена тактовая частота в пределах 30 ... 35 кГц. Не стоит отклоняться от этих параметров, если хотим получить достоверные данные.
Go to the top of the page
 
+Quote Post

Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 19th July 2025 - 17:25
Рейтинг@Mail.ru


Страница сгенерированна за 0.01476 секунд с 7
ELECTRONIX ©2004-2016