|
|
  |
Датчик давления HP03 глючит ?, глючит HP03 или программа ? |
|
|
|
Jan 19 2010, 16:29
|
Группа: Участник
Сообщений: 7
Регистрация: 19-01-10
Пользователь №: 54 925

|
Здравствуйте уважаемые. Прошу помочь всех кто сталкивался с датчиком давления HP03 HopeRF. Значит сам вопрос: вроде, все работает нормально, нормально считываются коэффициенты и D1, D2. НО! со временим один из коэфициентов может ПОМЕНЯТЬСЯ, а так же может поменяться скачкообразно значение температуры !!! расчет ведется по коэффициентам, которые записал в программе, и эти изменения коэффициента на расчет естественно не влияют, но вот температура скачет  Приведу пример, как это выглядит, вот нормальные коэффициенты (по два байта - старший и затем младший): С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 Что это может быть ? Неужели вся партия датчиков глючная, кто нибудь сталкивался с подобным ?
|
|
|
|
|
Jan 20 2010, 01:00
|
Группа: Участник
Сообщений: 7
Регистрация: 19-01-10
Пользователь №: 54 925

|
Спасибо, буду просматривать программу на предмет ошибок, только смущает то, что подобная ошибка (считывание данных из HP03) может возникнуть через 5 минут после включения устройства, а может через часов 10! P.S. Вот сейчас, в данный момент C5 (142) опять поменялся на 14, но с D2 все в порядке, т.е. хочу сказать, что меняются они не оба сразу, а могут по отдельности. И еще попробывал выключить на полминуты, и включить заново, С5 все так же 14 (а должен быть 142)
Сообщение отредактировал tothema - Jan 20 2010, 01:11
|
|
|
|
|
Jan 21 2010, 01:10
|
Группа: Участник
Сообщений: 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; }
|
|
|
|
|
Jan 21 2010, 07:02
|
Группа: Участник
Сообщений: 7
Регистрация: 19-01-10
Пользователь №: 54 925

|
Спасибо, "рабочий код" получил, буду изучать. У меня в коде выше вроде же все переменные UNSIGNED, или я чего то не понял ? В каком даташите ? Можно на него ссылку ? (насколько помню у меня даташит без кода, просто описание работы) да, и как можно отредактировать свое сообщение ?
|
|
|
|
|
Jan 21 2010, 18:13
|
Знающий
   
Группа: Свой
Сообщений: 589
Регистрация: 24-04-05
Пользователь №: 4 447

|
unsigned по стандарту - это значит unsigned int. В смысле для краткости int можно опустить.
|
|
|
|
|
Jan 22 2010, 14:57
|
Группа: Участник
Сообщений: 7
Регистрация: 19-01-10
Пользователь №: 54 925

|
Да я понял про unsigned, у меня в коде итак все переменные unsigned, кроме нескольких, которые по идее не должны влиять т.к. используются в циклах и т.п. Просмотрев коды (признаюсь не очень досканально, т.к. не работал никогда ни с чем кроме PIC`ов) не обнаружил у себя каких либо неточностей. Единственное, что у меня не было в коде, это перевод порта A в из аналога в цифру: (хотя и так работало  ) VROE=0; CMCON=7; Может из за этого ? Сейчас нет возможности попробывать. А еще как вариант хочу подключить вместо датчика HP03 - память24C02 и погонять денек другой, если пятый коэф. так же будет прыгать тогда точно станет ясно что грабли в проге.
|
|
|
|
|
Jan 26 2010, 14:12
|
Группа: Участник
Сообщений: 7
Регистрация: 19-01-10
Пользователь №: 54 925

|
VROE=0; CMCON=7; не помогло  кое чего выяснил. Давление считывается плавно, а вот температура скачками по 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; Вот графики (данные с датчика без математических преобразований): температура:  А вот давление:  Не знаю уже в какую сторону копать
|
|
|
|
|
Feb 6 2010, 13:25
|
Группа: Участник
Сообщений: 7
Регистрация: 19-01-10
Пользователь №: 54 925

|
Итак, переделал плату (раньше было на макетке) и переписал прогу - ту которая в даташите, переписал в PIC. Пока вроде показания считываются плавно, без скачков, НО, у меня на PIC`е выходит всего около 11кГц для HP03 (вместо 32кГц), и при этом все работает, и данные похожи на правду. Можно так оставить, или все же нужно добиться 32кГц ?
|
|
|
|
|
  |
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|