Отговори на тема  [ 8 мнения ] 
Температурен сензор TCN75 
Автор Съобщение
Ранг: Форумен бог
Ранг: Форумен бог
Аватар

Регистриран на: Пет Фев 25, 2005 1:58 pm
Мнения: 4585
Местоположение: US
Мнение Температурен сензор TCN75
Нещо не мога да схвана, бъркам ли или така си работи TCN75.

От документацията му става ясно, че като се въведе в Shutdown Mode консумацията му пада и спира измерването на температурата. Чета го веднъж на една секунда. Преди четене го вкарвам в нормален режим, изчаквам 10-тина ms и тогава чета температурата. Показва едно и също, 23 градуса, нагрявам го, не помръдва. След четене на температурата го вкарвам обратно в Shutdown Mode. Направих обратното, преди четене го вкарвам в Shutdown Mode, чета го и тогава го вкарвам в нормален режим, така работи.

Прочетох няколко пъти документацията, не видях някъде да бъркам, а TCN75 продължава да работи "наопаки"

Код:
#include "i2c.h"

const int8 TCN75_SLAVE_ADDRESS = 0x9E;   // A0=A1=A2=VCC;

const int8 TCN75_TEMP_REG = 0x00;
const int8 TCN75_CONFIG_REG = 0x01;
const int8 TCN75_THYST_REG = 0x02;
const int8 TCN75_TSET_REG = 0x03;

const int8 TCN75_SHUTDOWN_MODE = 0x01;
const int8 TCN75_ONE_SHOT_MODE = 0x81;
const int8 TCN75_CONTINUOUS_MODE = 0x00;


/*
   ReadTCN75() ïðî÷èòà òåìïåðàòóðàòà îò ñåíçîð TCN75-5.0MUA
   Ïðîìåíÿ i2cslave àäðåñà !
   Ïîäïðîãðàìàòà å èçòåñòâàíà è ðàáîòè êîðåêòíî.
*/
int16 ReadTCN75(int8 RegisterPointer)   {
int16 tcn75;
#byte tcn75_low=tcn75
#byte tcn75_high=tcn75+1
   RegisterPointer &= 0x03;
   i2cslave = TCN75_SLAVE_ADDRESS;      
   I2CClearColision();
   I2CIsFree();                  // If I2C is free ?
   if(   i2c_error )
      return 0;                  // bus is busy !
   I2CStart();                     // Send Start signal
   I2CWrite( i2cslave );            // Slave address, set Write operation
   if( i2c_error )
      return 0;
   I2CWrite( RegisterPointer );      // Pointer byte, select TEMP register
   if( i2c_error )
      return 0;
   I2CRepStart();                  // Second Start ...
   if( i2c_error )
      return 0;                  // bus is busy !
   if( RegisterPointer == TCN75_CONFIG_REG ) {
      tcn75_low = 0;
      tcn75_high = I2CRead();
   } else {
      tcn75_high = I2CRead();
      tcn75_low = I2CRead();
   }
   I2CWriteNotAck();               // Send Not Acknowledge signal
   I2CStop();                     // Generate Stop condition

   if( RegisterPointer == TCN75_TEMP_REG ) {
      // Ðîòàöèÿòà â öèêúë å ïî-åôåêòèâíà êàòî êîä ñ 22 áàéòà,
      // çàòîâà ñå èçïîëçâà âìåñòî return 0.5 * (tcn75 >> 7);
      i2ccount = 7;
      do {
         tcn75 >>= 1;
      } while( --i2ccount );
   }
   return tcn75;
}

void WriteTCN75(int8 RegisterPointer,int8 value)   {
   RegisterPointer &= 0x03;
   i2cslave = TCN75_SLAVE_ADDRESS;      
   I2CClearColision();
   I2CIsFree();                  // If I2C is free ?
   if(   i2c_error )
      return;                     // bus is busy !
   I2CStart();                     // Send Start signal
   I2CWrite( i2cslave );            // Slave address, set Write operation
   if( i2c_error )
      goto WriteTCN75End;
   I2CWrite( RegisterPointer );      // Pointer byte, select TEMP register
   if( i2c_error )
      goto WriteTCN75End;
   I2CWrite( value );
WriteTCN75End:
   I2CStop();                     // Generate Stop condition
}

inline void TCN75_ShutDownMode(void) {
   WriteTCN75( TCN75_CONFIG_REG, TCN75_SHUTDOWN_MODE );
}

inline void TCN75_NotShutDownMode(void) {
   WriteTCN75( TCN75_CONFIG_REG, 0 );
}

inline void TCN75_Init(void) {
   WriteTCN75( TCN75_CONFIG_REG, 0x1A );   // TB052 Microchip app note ???
}


Главна програма, така не работи:

Код:
#if ch1_sensor == SENSOR_TCN75
                  I2CInitMaster();
                  TCN75_NotShutDownMode();                  
                  delay_ms(10);
                  an1.result = ReadTCN75( TCN75_TEMP_REG );
                  TCN75_ShutDownMode();
                  SSPEN = 0;
                  if( an_hex_mode )
                     ShowAnalogAsHex( &an0.result );
                  else
                     CalcTemperature( 1 );
#endif



Главна програма, така работи:
Код:
#if ch1_sensor == SENSOR_TCN75
                  I2CInitMaster();
                  TCN75_ShutDownMode();      
            delay_ms(10);
                  an1.result = ReadTCN75( TCN75_TEMP_REG );
                  TCN75_NotShutDownMode();
                  SSPEN = 0;
                  if( an_hex_mode )
                     ShowAnalogAsHex( &an0.result );
                  else
                     CalcTemperature( 1 );
#endif



Някой да има идея, защо така става ?

_________________
Ето аз дишам, работя, живея и програми пиша тъй както умея, с проца под вежди се гледаме строго и боря се с него доколкото мога....


Пет Ное 17, 2006 4:19 pm
Профил WWW
Ранг: Популярен
Ранг: Популярен

Регистриран на: Пет Ное 26, 2004 9:50 pm
Мнения: 374
Мнение 
никой май не иска или не може да ти помогне. Не е ли малко 10ms за реагиране на сензора?


Съб Ное 18, 2006 11:03 am
Профил
Ранг: Почетен член
Ранг: Почетен член
Аватар

Регистриран на: Пет Авг 19, 2005 11:38 am
Мнения: 978
Местоположение: Europe -> BG
Мнение 
offtopic: стига бе човек -> петък , събота е ; хората почиват. 8O
Изчакай малко.

не съм пипал TCN75 не мога да помогна :cry:
А на теория да си говорим , по-добре да изчакаш/м някои , който знае проблема. :-)

_________________
един факт :-)
Съжалявам , че исках да помогна ...


Съб Ное 18, 2006 11:49 am
Профил ICQ
Ранг: Форумен бог
Ранг: Форумен бог
Аватар

Регистриран на: Нед Ное 21, 2004 11:31 pm
Мнения: 10088
Мнение 
ами аз взех преди година 5 такива чипа да ги видя колко струват.
сега гледам, че ги нямат вече в комет.
но пради придобития ми рефлекс към въпросния производител, чиповете си седят още в кутийка.

пирев, верно ли 250uA са ти много за оперативен режим? за какво ти е да го успиваш?
времето за конверсия го дават типично 55ms. няма максимално, което си е типично за майкрочип.
това важи и за тока на консумаци. а напрежението е 2.7-5.5 в безмерни единици.

за съжаление и аз не видях нищо в комументацията, касаещо времето за разбуждане. вероятно не е важен такъв детайл.
опитай да го вдигнеш това време - след като го събудиш, дай му поне 1s да си изпие кафето и да влезе в час.
и споеред мен, недей да разчиташ на 100ms при измерване.

ще сме ти много благодарни ако постнеш после резултата от чесането по главата


Съб Ное 18, 2006 12:04 pm
Профил
Ранг: Форумен бог
Ранг: Форумен бог
Аватар

Регистриран на: Пон Юни 05, 2006 1:48 pm
Мнения: 4906
Местоположение: където небето среща земята, ракията е Jameson, а бирата Guinness
Мнение 
наскоро правихме една система за следене на околна темература и там ползвахме този или подобен чип на майкрочип...
колегата дето до сетупваше също бучеше, че има некъф шит... но той беше в конфигурирането....за четене на околната температура се четеше, но когато се опиташ за му зададеш хистерезиса на вкл/изкл нещеше и нещеше да му се запишат праговете...
а иначе има шит че данните трябва да са подпряни на захранване със 5-10К ома защото ако го четеш по-бързо чете с грешки....

_________________
... ако трети ден не ти се работи... това означава, че е сряда !


Съб Ное 18, 2006 2:23 pm
Профил
Ранг: Форумен бог
Ранг: Форумен бог
Аватар

Регистриран на: Нед Ное 21, 2004 11:31 pm
Мнения: 10088
Мнение 
MYXATA написа:
а иначе има шит че данните трябва да са подпряни на захранване със 5-10К ома защото ако го четеш по-бързо чете с грешки....


ми то I2C без пулъп резистори е като туршия без сол, оцет и олио. камбите почват да смърдят на втория ден (разбирай: I2C протокола се скапва на втория байт)

той пирев също успява да прочете околната температура - 23градуса.
ама като се измени околната температура, чипа не може да я актуализира.
та в ератата сигурно ще пише: "да се измерват само околни температури от 23 градуса"


Съб Ное 18, 2006 7:58 pm
Профил
Ранг: Форумен бог
Ранг: Форумен бог
Аватар

Регистриран на: Сря Апр 27, 2005 12:48 pm
Мнения: 6094
Мнение 
на саита на М-Чип има пример сорс на асемблер за четене на до 8 ТЦ-та на шината, един приятел го тества... ТЦ-то си работи безупречно, но слип моде не си спомням дали има в примера


Съб Ное 18, 2006 8:20 pm
Профил ICQ
Ранг: Форумен бог
Ранг: Форумен бог
Аватар

Регистриран на: Пет Фев 25, 2005 1:58 pm
Мнения: 4585
Местоположение: US
Мнение 
I2C си има всичко, на същия бъс има вързани памети 4 x 24LC512, работят безупречно на 100kHz, TCN75 също го килохерцам на 100kHz. Всеки микроампер ми е важен, тъй като захранвам 5V система от 2 NiCd x 1.2V чрез конвертор с TL499A. В началото издържаше около 24 часа, с разни заклинания и магии го докарах до около 4 дни, ама ми се ще да е около седмица в режим измерване на температура :) ( това са два канала с LM335 или два канала с SMT160, с TCN75 ще е повече предполагам )

Забелязох, че данните от TCN75 винаги са число кратно на 2, оказа се, че съм изпуснал един Ack в ReadTCN75():
Код:
         .....
         if( RegisterPointer == TCN75_CONFIG_REG ) {
      tcn75_low = 0;
      tcn75_high = I2CRead();
   } else {
      tcn75_high = I2CRead(); I2CWriteAck();
      tcn75_low = I2CRead();
   }
          .....

Сега вече се четат и половинките от градуса.

_________________
Ето аз дишам, работя, живея и програми пиша тъй както умея, с проца под вежди се гледаме строго и боря се с него доколкото мога....


Съб Ное 18, 2006 8:32 pm
Профил WWW
Покажи мненията от миналия:  Сортирай по  
Отговори на тема   [ 8 мнения ] 

Кой е на линия

Потребители разглеждащи този форум: 0 регистрирани и 3 госта


Вие не можете да пускате нови теми
Вие не можете да отговаряте на теми
Вие не можете да променяте собственото си мнение
Вие не можете да изтривате собствените си мнения
Вие не можете да прикачвате файл

Търсене:
Иди на:  
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group.
Designed by ST Software for PTF.
Хостинг и Домейни