7 segmenti parlaklık için en uygun direnç (Termometre)

Başlatan baran123, 23 Aralık 2014, 19:34:03

baran123

Arkadaşım için basit bir termometre devresi hazırladım.Malzemeler kendisinde devreyi deneyemiyorum 4x7 segmenti pic ile sürüyorum 74hc falan yok transistörde kullanmadan digit pinlerine kaclık direnc koymam uygun olur ? taramayı timer0 ile yapmaktayım.

Birde devreyi denediğim zaman proteus bir sürü ram command hatası veriyor bunun sebebi nedir timer dan dolayımı acaba ?
Kullanmak isteyen olursa kodlarda mevcut 

ds18b20
#define ONE_WIRE_PIN PIN_A0

void onewire_reset() 
{
   output_low(ONE_WIRE_PIN);
   delay_us(500);
   output_float(ONE_WIRE_PIN);
   delay_us(500); 
   output_float(ONE_WIRE_PIN);
} 

void onewire_write(int data)
{
   int count;
   for (count=0; count<8; ++count)
   {
      output_low(ONE_WIRE_PIN);
      delay_us(2);
      output_bit(ONE_WIRE_PIN, shift_right(&data,1,0)); 
      delay_us(60);
      output_float(ONE_WIRE_PIN); 
      delay_us(2); 
   }
} 

int onewire_read()
{
   int count, data;
   for (count=0; count<8; ++count)
   {
      output_low(ONE_WIRE_PIN);
      delay_us(2);
      output_float(ONE_WIRE_PIN);
      delay_us(8);
      shift_right(&data,1,input(ONE_WIRE_PIN)); 
      delay_us(120);
   }
   return(data);
} 

float ds1820_read()
{
   static int1 ds_flag=0;
   int8 busy=0, temp1, temp2; 
   signed int16 temp3; 
   static float result; 
   
   if(ds_flag==0)
   {
      onewire_reset(); 
      onewire_write(0xCC); 
      onewire_write(0x44); 
      ds_flag=1;
   }
   
   else
   {
      busy = onewire_read(); 
      if(busy==0)return result;
   }
   
   ds_flag=0;
   onewire_reset(); 
   onewire_write(0xCC); 
   onewire_write(0xBE); 
   temp1 = onewire_read(); 
   temp2 = onewire_read(); 
   temp3 = make16(temp2, temp1); 
   
   result = (float) temp3 / 16.0;
   
   return(result); 
}


#INCLUDE <16F628A.h>
#FUSES XT, NOWDT, NOMCLR, NOBROWNOUT
#USE DELAY(CRYSTAL = 4M)

#include <DS18B20.c>

#define DIGIT_1  pin_A1
#define DIGIT_2  pin_A2
#define DIGIT_3  pin_A3
#define DIGIT_4  pin_A4

int temp,sayac,binler,yuzler;
const int digit[10]={0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7C,0x07,0x7F,0x6F}; 

#INT_TIMER0
void timer0_kesme(void) 
{
   disable_interrupts(INT_TIMER0);
  
   switch(sayac)
   {
      case 0:
      output_high(DIGIT_1);
      output_b(0x39);
      output_low(DIGIT_4);
      break;
      
      case 1:
      output_high(DIGIT_4);
      output_b(0x63);
      output_low(DIGIT_3);
      break;
      
      case 2:
      output_high(DIGIT_3);
      yuzler = temp % 10;
      output_b(digit[yuzler]);
      output_low(DIGIT_2);
      break;
      
      case 3:
      output_high(DIGIT_2);
      binler = temp / 10;
      output_b(digit[binler]);
      output_low(DIGIT_1);
      break;
   }
   
   sayac++;
   
   if(sayac > 3)
   {
      sayac = 0;
   }
   enable_interrupts(INT_TIMER0);
}

void main(void)
{

   setup_timer_0(T0_INTERNAL | T0_DIV_16 );
   setup_timer_1(T1_DISABLED);
   setup_timer_2(T2_DISABLED,0,1);
   setup_CCP1(CCP_OFF);
   set_timer0(6);
   enable_interrupts(INT_TIMER0);
   enable_interrupts(GLOBAL);
   
   set_tris_a(0x01);
   set_tris_b(0x00);
   output_b(0x00);
   
   while(TRUE)
   {
      temp = ds1820_read();
   }
}

akineton


Kabil ATICI

Bu kullandığın anot-katon, ekranın rengi, tarama için kullandığın frekans, darbe süresi gibi parametrelere bağlıdır.
4 tane kırmızı ,ortak anot, mux display segmanları için 220 Ohm gibi bir değer kullanıyorum.
ambar7

baran123

Hocam ortak katot 4 tane kırmızı timer 4 mili saniyeye kurulu

Kabil ATICI

Ortak uçlar transistörle mi sürülüyor... Teorik olarak öyle olması gerekir. Öyle değilse ciddi bir sıkıntı olur. Simülasyonda çalışır ama gerçek devrede işlemcin iyi ısınır.

Normalde bu tür sürme pek uygun değil. Tüm displaylerin çektiği akımı işlemcinin Vcc hattına yükleneceğini unutma. Bu şekilde dirençleri düşür diyemem işlemcin ısınır.

Tabii işlemci besleme geriliminin 5V olduğunu kabul ediyoruz.

Bugüne kadarki uygulamalarımda hiç ms hesabı yapmadım ama hiç sorun çıkarmadı...

Bildiğim kadarı ile bu DS1820  iletişim esnasında kesintiye uğramaması gerekiyor. Çünkü DS1820 ciddi bir şekilde zamanlama esasına dayanan bir haberleşme protokolü kullanıyor. Eğer haberleşme esnasında kesinti oluşursa iletişimde gönderilen veya alınan veri kimbilir ne olur.
ambar7

baran123

Hocam ortak uçları transistörsüz sürdüm ama çokta sağlam olacak gibi durmuyor transistör eklerim problem değil beyzlerine yine 100 koyuyordum değil mi ?
Ayrıca ds18b20 de beklemesiz kütüphane kullanıyorum 750 ms bekleme mevcut değil yani

Kabil ATICI

Transistör baz 1k kullanabilirsin. Normalde baz-gnd arasına 10k pull-down direnci koyarım ne olur ne olmaz...

ds1820 okursen timer devreye girerse sıkıntı olabilir.
ambar7

baran123

#7
Hocam bu arada sıcaklık okumayı kesmeye girdiği zaman yaptım sonuç beklediğimden daha iyi, gayet stabilçalışıyor.Tabı proteus da devrede bir problem olur mu ? Pull-Down da ekledim, beyzlere 1k

sema da su şekilde ;


mesaj birleştirme:: 23 Aralık 2014, 20:55:17

beyzlere 1K yaptıgım zaman displayler 8888 seklınde oluyor proteustan olsa gerek 100 da normal ama

Kabil ATICI

10k dirençler baz-gnd arasında olacak.
Dirençlere dijital özellik atadığını varsayıyorum.

R1 öyle bağlamasan iyi olur. Onu segmanlara yay ve transistör emetörleri gnd'de olsun.
R3 4k7 olabilir.
ambar7

baran123

Bütün dirençleri dijital yaptım, emiterleri gnd ye bağladım, collectorlere 220 ohm yaydım baz gnd arasına 4x10 k ekledim şuan tamam mıdır ? Displayler 8888 değerini gösteriyor bu halde proteusdan olsa gerek devrede denerim.Hocam benım kafamı karıstıran kısım 5V ile beslediğim zaman voltaj sorunu olacak gibi çünkü bu 7805 hep ısınma gibi problemler yaratıyor.

Kabil ATICI

LED ekran segman çıkışları neresi? (a,b,c,d,e,f,g,dp)
220 Ohm direnci işlemci ile LED ekran arasında olacak. (sebebi de senin bağlantında akan akım tek bir dirençten geçecek ve üzerindeki gerilim düşümü akıma göre değişiklik gösterecektir) Dolayısı ile parlaklık değişecek.

Dirençleri segmanlara bağlarsan bir direnç üzerinden tek segman akımı geçecek ve parlaklık değişmeyecek.

Simülasyonda bu fark etmez ama gerçek devrelerde ciddi olarak fark eder.
http://3.bp.blogspot.com/_mKk1EG_cc4c/S9J9HJzumyI/AAAAAAAABIM/hzZal0uhoUI/s320/led_termometre_semab.jpg
bu devrede gördüğün gibi segmanlar direnç ile işlemciye bağlı, LED ekranların ortak uçları transistör kollektörlerine, transistör baz ve işlemci arasına 1K, emetör-baz uçları arasına 10k direnç bağlı. Senin devrenden tek farkı ortak anot için olması(dolayısı ile transistörler farklı).  Birde işlemci ile termometre çipi farklı.

Devre isis üzerinde kalacaksa transistör ve dirençleri gerekli değildir ama gerçek devreye geçilecekse gereklidir.
ambar7

baran123

Dediğiniz düzenlemeleri yaptım bir problem kaldı mı ?


Kabil ATICI

Tamam.

İşlemci mclr  ile +5V arasına 10k direnci unutma,
işlemci besleme ucları (+5V ve GND ) arasına 100nF ve DS1820 besleme ucları (+5V ve GND ) arasına 100nF eklemeyi unutma.
ambar7

baran123

#13
Tabi hocam çok teşekkür ederim.

mesaj birleştirme:: 23 Aralık 2014, 23:08:20

Son olarak proteusda bc237 transistör kullanıyorum fakat 8888 degerini gösteriyor ama transistörler yerini mcu ile digitleri kontrol etsem bir problem olmuyor gerçek devredede böyle bir şey olur mu ?

akineton

baran hocam bunun şemasını paylaşacakmısınız acaba devreyi bende evime yapmak istiyorum ..