Микроконтролери и електроника
http://mcu-bg.com/mcu_site/

Температурен сензор TCN75
http://mcu-bg.com/mcu_site/viewtopic.php?f=7&t=3273
Страница 1 от 1

Автор:  [ Пет Ное 17, 2006 4:19 pm ]
Заглавие:  Температурен сензор 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



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

Автор:  elektronchika [ Съб Ное 18, 2006 11:03 am ]
Заглавие: 

никой май не иска или не може да ти помогне. Не е ли малко 10ms за реагиране на сензора?

Автор:  the_real_maniac [ Съб Ное 18, 2006 11:49 am ]
Заглавие: 

offtopic: стига бе човек -> петък , събота е ; хората почиват. 8O
Изчакай малко.

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

Автор:  ДедоБоре [ Съб Ное 18, 2006 12:04 pm ]
Заглавие: 

ами аз взех преди година 5 такива чипа да ги видя колко струват.
сега гледам, че ги нямат вече в комет.
но пради придобития ми рефлекс към въпросния производител, чиповете си седят още в кутийка.

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

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

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

Автор:  MYXATA [ Съб Ное 18, 2006 2:23 pm ]
Заглавие: 

наскоро правихме една система за следене на околна темература и там ползвахме този или подобен чип на майкрочип...
колегата дето до сетупваше също бучеше, че има некъф шит... но той беше в конфигурирането....за четене на околната температура се четеше, но когато се опиташ за му зададеш хистерезиса на вкл/изкл нещеше и нещеше да му се запишат праговете...
а иначе има шит че данните трябва да са подпряни на захранване със 5-10К ома защото ако го четеш по-бързо чете с грешки....

Автор:  ДедоБоре [ Съб Ное 18, 2006 7:58 pm ]
Заглавие: 

MYXATA написа:
а иначе има шит че данните трябва да са подпряни на захранване със 5-10К ома защото ако го четеш по-бързо чете с грешки....


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

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

Автор:  TheWizard [ Съб Ное 18, 2006 8:20 pm ]
Заглавие: 

на саита на М-Чип има пример сорс на асемблер за четене на до 8 ТЦ-та на шината, един приятел го тества... ТЦ-то си работи безупречно, но слип моде не си спомням дали има в примера

Автор:  [ Съб Ное 18, 2006 8:32 pm ]
Заглавие: 

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();
   }
          .....

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

Страница 1 от 1 Часовете са според зоната UTC + 2 часа [ DST ]
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group
http://www.phpbb.com/