LM35 İle Negatif Değer ve Ondalık Kısım

Başlatan ercan_wrc, 14 Mart 2011, 19:54:36

ercan_wrc

Arkadaşlar projemde 3 adet sensör kullanacağım 2 sensör normal dış sıcaklığı ölçecek 1sensör +100 derecelere kadar ölçüm yapaca fakat - (negatif) değer ölçen örnek bir kod bulamadım (pic 16F877)
ayrıca ölçümü 24,3 C gibi ondalık kısmınıda ölçmeyi yapamadım elinde örnek kod olan varsa sevirim :)
yinede ondalık kısım çok çok önemli değil önemli olan negatifi ölçebilmem

bu arada lm35 ile ds18b20 arasında çok büyük fark varmı? elimde iki sensörde mevcut aslında fakat birde dirençle uğraşmayım diye LM35 i bağlıyım diyorum

OG

#1
LM35 analog, DS18B20 digital, tek hatdan haberleşir, kablosunu daha uzağa çekebilirsin,

Device 16F628A

   Config BOREN_OFF, CP_ON, DATA_CP_OFF, PWRTE_ON, WDT_OFF, LVP_OFF, MCLRE_OFF, INTRC_OSC_NOCLKOUT
   Declare Xtal 4 

All_Digital = TRUE
CMCON=7

TRISA=%11111111
TRISB=%00000011

Symbol Gon = PORTB.2 
Symbol DQ = PORTB.0 

Dim ham As Word 
Dim ta1 As Word 
Dim ta2 As Word 
Dim ta3 As Word 
Dim ta4 As Word 
Dim ta5 As Word 

DelayMS 200
 
BASLA: 
    OWrite DQ, 1, [$CC, $44]                    ''' rom code olmadan ISI değerini oku 
    
    While ORead DQ, 4 = 0 : Wend               
    
    
    OWrite DQ, 1, [$CC, $BE]                   
    ORead DQ, 0, [ham.LowByte, ham.HighByte]    ' İki byte oku ve okumayı bitir.

    If ham.11 = 0 Then HESAPLA        ''' ölçülen + değer ise
    If ham.11 = 1 Then HESAPLA1       ''' - değerler
GoTo BASLA 

HESAPLA: 
    ta2 = ham.LowByte 
    ta2 = ta2 // 16      
    ta2 = ta2 / 2 
    ta2 = ta2 * 125 
    ta2 = ta2 / 10 

    ta1 = ham // 16 
    ta1 = ham - ta1 
    ta1 = ta1 / 16 
SerOut Gon, 396 ,[Dec ta1,".", Dec ta2, 13,10] 
GoTo BASLA 


HESAPLA1: 
    ta3 =  $FFFF - ham  + 1  
    ta4 = ta3 // 16 
    ta4 = ta4 / 2 
    ta4 = ta4 * 125 
    ta4 = ta4 / 10 

    ta5 = ta3 // 16 
    ta5 = ta3 - ta5 
    ta5 = ta5 / 16 
    SerOut Gon, 396, ["-",Dec ta5,".", Dec ta4,13,10] 
GoTo BASLA


[IMG]http://img703.imageshack.us/img703/8353/ekranalntse.png[/img]


http://hotfile.com/dl/110225728/f97c038/ds18b20.rar.html
FORUMU İLGİLENDİREN KONULARA ÖM İLE CEVAP VERİLMEZ.

Erol YILMAZ

Aslında sıcaklık ölçümü için NTC baya iyi ama yatırım gerektiriyor....

Bir direnci bağlamayayım diye düşünüyorsan sana çok ağır gelir :D

ercan_wrc

Alıntı yapılan: Allegro - 14 Mart 2011, 20:07:09
Aslında sıcaklık ölçümü için NTC baya iyi ama yatırım gerektiriyor....

Bir direnci bağlamayayım diye düşünüyorsan sana çok ağır gelir :D


1pot 6 led lcd 4buton 2 swich vs vs ekledikten sonra ağır geliyor valla yeter diyorum :D

Maxim

#4
@OG hocam bu 18b20 sensörünü okumak için elnizde interruptlı bir kod varmı örnek ?
malumunuz okuma sırasında bekleme çok uzun sürüyor bunlarda, 12bit te 720ms falandı galiba

edit:
yada şöyle sorayım dallas 1 wire protokol birşeyi daha hızlı nasıl okuyabiliriz ? döngümüzü bekletmeden ?
Owrite-Oread komutları dışında çözümü varmıdır ?

Klein

Ds18b20 sistemi bekletmemek için aşağıdaki gibi bir okuma yapıyorum.  Sadece sıcaklıkokuduğum için kod parametrik değil. biraz düzenlemeyle parametrik hale getirilebilir.  5 mikrosaniyede bir interrupt'a  girip  her seferinde tek işlem yaparak dönüyorum. onewire için yapabildiğim en hızlı okuma çözmü bu. Bu tekniği sadece bu iş için değil , uzun bekleme gerektiren ama beklemeye tahamül edilemeyecek her yerde kullanırım.
void  far ta0int (void) {
		 ow_delaycounter++;
	switch(ow_eventcounter){
		case 0: 
			switch(ow_delaycounter){
				case 1  : owdir=out; owpin=0; break;
				case 33 : owpin=1; break;
				case 38 : owdir=in;break;
				case 39 : ow_presence=owpin;break;
				case 67 : ow_delaycounter =0;ow_eventcounter++; break;
			} break;
		case 1: 
			switch(ow_delaycounter){
				case 1  : owdir=out;break;
				case 2  : owpin =1;owpin=0;break;
				case 9  : owpin =1;owpin=0;break;
				case 16 : owpin =1;owpin=0;owpin=1;break;
				case 23 : owpin =1;owpin=0;owpin=1;break;
				case 30 : owpin =1;owpin=0;break;
				case 37 : owpin =1;owpin=0;break;
				case 44 : owpin =1;owpin=0;owpin=1;break;
				case 51 : owpin =1;owpin=0;owpin=1;break;
				case 66 : ow_delaycounter=0;ow_eventcounter++;break;
			} break;
		case 2: 
			switch(ow_delaycounter){
//				case 1  : owdir=out;break;
				case 2  : owdir=out; owpin =1;owpin=0;break;
				case 9  : owpin =1;owpin=0;break;
				case 16 : owpin =1;owpin=0;owpin=1;break;
				case 23 : owpin =1;owpin=0;break;
				case 30 : owpin =1;owpin=0;break;
				case 37 : owpin =1;owpin=0;break;
				case 44 : owpin =1;owpin=0;owpin=1;break;
				case 51 : owpin =1;owpin=0;break;
				case 58 : owpin=1;break;
//				case 66 : ow_delaycounter=0;ow_eventcounter++;break;
				case 0xFFFF : ow_delaycounter=0;ow_eventcounter++;break;
			} break;
		case 3: 
			switch(ow_delaycounter){
				case 1  : owdir=out; owpin=0; break;
				case 33 : owpin=1; break;
				case 38 : owdir=in;break;
				case 39 : ow_presence=owpin; break;
				case 74 : ow_delaycounter =0;ow_eventcounter++; break;
			} break;
		case 4: 
			switch(ow_delaycounter){
				case 1  : owdir=out;break;
				case 2  : owpin =1;owpin=0;break;
				case 9  : owpin =1;owpin=0;break;
				case 16 : owpin =1;owpin=0;owpin=1;break;
				case 23 : owpin =1;owpin=0;owpin=1;break;
				case 30 : owpin =1;owpin=0;break;
				case 37 : owpin =1;owpin=0;break;
				case 44 : owpin =1;owpin=0;owpin=1;break;
				case 51 : owpin =1;owpin=0;owpin=1;break;
				case 66 : ow_delaycounter=0;ow_eventcounter++;break;
			} break;
		case 5: 
			switch(ow_delaycounter){
				case 1  : owdir=out;break;
				case 2  : owpin =1;owpin=0;break;
				case 9  : owpin =1;owpin=0;owpin=1;break;
				case 16 : owpin =1;owpin=0;owpin=1;break;
				case 23 : owpin =1;owpin=0;owpin=1;break;
				case 30 : owpin =1;owpin=0;owpin=1;break;
				case 37 : owpin =1;owpin=0;owpin=1;break;
				case 44 : owpin =1;owpin=0;break;
				case 51 : owpin =1;owpin=0;owpin=1;break;
				case 66 : ow_delaycounter=0;ow_eventcounter++;
						  ow_lsb=0; ow_msb=0;
						  break;
			} break;
		case 6: 
			switch(ow_delaycounter){
				case 1  : owdir=out;owpin=0;owdir=in;break;
				case 2	: if(owpin) ow_lsb |=0x01;break;
				case 10 : owdir=out;owpin=0;owdir=in;break;
				case 11	: if(owpin) ow_lsb |=0x02;break;
				case 19 : owdir=out;owpin=0;owdir=in;break;
				case 20	: if(owpin) ow_lsb |=0x04;break;
				case 28 : owdir=out;owpin=0;owdir=in;break;
				case 29	: if(owpin) ow_lsb |=0x08;break;
				case 37 : owdir=out;owpin=0;owdir=in;break;
				case 38	: if(owpin) ow_lsb |=0x10;break;
				case 46 : owdir=out;owpin=0;owdir=in;break;
				case 47	: if(owpin) ow_lsb |=0x20;break;
				case 55 : owdir=out;owpin=0;owdir=in;break;
				case 56	: if(owpin) ow_lsb |=0x40;break;
				case 64 : owdir=out;owpin=0;owdir=in;break;
				case 65	: if(owpin) ow_lsb |=0x80;break;
				case 73 : ow_delaycounter=0;ow_eventcounter++;break;
			} break;
		case 7: 
			switch(ow_delaycounter){
				case 1  : owdir=out;owpin=0;owdir=in;break;
				case 2	: if(owpin) ow_msb |=0x01;break;
				case 10 : owdir=out;owpin=0;owdir=in;break;
				case 11	: if(owpin) ow_msb |=0x02;break;
				case 19 : owdir=out;owpin=0;owdir=in;break;
				case 20	: if(owpin) ow_msb |=0x04;break;
				case 28  : owdir=out;owpin=0;owdir=in;break;
				case 29	: if(owpin) ow_msb |=0x08;break;
				case 37  : owdir=out;owpin=0;owdir=in;break;
				case 38	: if(owpin) ow_msb |=0x10;break;
				case 46 : owdir=out;owpin=0;owdir=in;break;
				case 47	: if(owpin) ow_msb |=0x20;break;
				case 55 : owdir=out;owpin=0;owdir=in;break;
				case 56	: if(owpin) ow_msb |=0x40;break;
				case 64 : owdir=out;owpin=0;owdir=in;break;
				case 65	: if(owpin) ow_msb |=0x80;break;
				case 73 : ow_delaycounter=0;ow_eventcounter=0;ow_convert=1;ta0s=0;
							break;
			} break;
	
	}
}// end of time 0 service funcTion


Aynı şekilde sht'yi sistemi bekletmeden şu şekilde okuyabilirsiniz.
void read_sht(void){
  switch(shtstep){
      case 0: 
            s_connectionreset();
            shtstep++;
            break;
      case 1:
            s_transstart();
            shtstep++;
            break;
      case 2:
            if(s_write_byte(sht_modemap[shtmode])){shtstep=8;break;}
            delay_counter=1000; // çevirim süresi
            shtstep++;
            break;
      case 3: // çevrim süresi beklenir
            if(!delay_counter) shtstep=8; 
            if(!SHT_DATA)shtstep++;
            break;
      case 4:
            sht_valarray[shtmode]=s_measure();
            shtstep++;
            break;
      case 5:
            calc_sth11(sht_valarray[1],sht_valarray[0]);
//            dewpoint=calc_dewpoint(humidity,temperature);
            sht_read_ok=1;
            sht_error=0;
            shtstep++;
            break;
      case 6:
            shtmode++;
            if(shtmode>1) shtmode=0;
//            delay_counter=1000;
            shtstep++;
            break;
      case 7:
            if(!delay_counter) shtstep=0;
            break;
      case 8:
            sht_error=1;
            sht_err_count++;
            shtstep=0;
            break;    
  default: shtstep=0;
  }
}