Ortak katot 7 segment sürmede bc547 sorunu

Başlatan sard.555, 05 Nisan 2014, 00:23:09

sard.555

Öncelikle merhabalar bu siteden sayısızca yararlandım hep, sorunlarımı arayarak bulduğum için hiç konu açma gereği duymadım. O şekilde bana yardım ettiğiniz için teşekkürler :). Şimdi benim arayıp bulamadığım sorunuma geleyim. Bayağı aradım ama bulamadım umarım gözümden kaçmamıştır. Şöyle bir sorunum var başlıktan da anlaşılacağı gibi küçük bir ödev gibi varsayılacak bir çalışma yapıyorum ancak öğrendiğim bildiğim araştırdığım üzere ortak katot 7 segment sürerken bc547 gibi bir transistörle sürmek. Ancak böyle yapınca isis de hata alıyorum. bc547 yi çıkardığımda ve direk picin bacaklarını ortak katot uçlara bağladığımda ise sorunsuz çalışıyor. Nedenini anlayamadım ben mi yanlış biliyorum yoksa farketmediğim başka bir yerde mi hata var. Yardımlarınız ve verdiğiniz değerli bilgiler için şimdiden teşekkürler.

isis görüntüsü



Kod
#include <16f628A.h>
#include <ds18b20.c>
#include <ds18b21.c>

#fuses INTRC_IO,NOWDT,NOPROTECT,NOBROWNOUT,NOLVP,NOPUT,NOCPD
 
#use delay(clock=4000000)

#use fast_io(a)
#use fast_io(b)

#define up pin_a3
#define down pin_a4 
 
#define dspUnits 0b01100000 
#define dspTens 0b10100000 
#define dspHundreds 0b11000000

boolean start = false;
char units = 0, tens = 0, hundreds = 0;
unsigned int16 count = 0, upC = 0, downC = 0, temp0 = 0, temp1 = 0;
 
const int digit[10]={0x00,0x01,0x02,0x03,0x04,0x05,0x06,0x07,0x08,0x09}; 

void setTemp()
{
   units=count%10; 
   tens=(count/10)%10; 
   hundreds=(count/100)%10; 
   
   output_b(digit[units]|(dspunits));
   delay_ms(5);
   output_b(digit[tens]|(dsptens));
   delay_ms(5);
   output_b(digit[hundreds]|(dsphundreds));
   delay_ms(5);
   
   if (!input(up) && (count != 130)) 
   { 
      //if (count > 130) count=0; Döngü istersem
      
      count++;
      
      units=count%10; 
      tens=(count/10)%10; 
      hundreds=(count/100)%10;
      
      if (upC >= 45)
      {
         output_b(digit[units]|(dspunits));
         delay_ms(5);
         output_b(digit[tens]|(dsptens));
         delay_ms(5); 
         output_b(digit[hundreds]|(dsphundreds));
         delay_ms(5);
      }
      
      while(!input(up) && upC < 45)
      {
         upC++;
         
         output_b(digit[units]|(dspunits));
         delay_ms(5);
         output_b(digit[tens]|(dsptens));
         delay_ms(5); 
         output_b(digit[hundreds]|(dsphundreds));
         delay_ms(5);
      }
   }
   else
   {
      upC = 0;
   }
   
   if (!input(down) && (count != 0))
   {      
      count--; 
      
      //if (count < 1) count=130; Döngü istersem
      
      units=count%10; 
      tens=(count/10)%10; 
      hundreds=(count/100)%10; 
      
      if (downC >= 45)
      {
         output_b(digit[units]|(dspunits));
         delay_ms(5);
         output_b(digit[tens]|(dsptens));
         delay_ms(5);
         output_b(digit[hundreds]|(dsphundreds));
         delay_ms(5);
      }
      
      while(!input(down) && downC <= 45)
      {
         downC++;
      
         output_b(digit[units]|(dspunits));
         delay_ms(5);
         output_b(digit[tens]|(dsptens));
         delay_ms(5);
         output_b(digit[hundreds]|(dsphundreds));
         delay_ms(5);
      }
   }
   else
   {
      downC = 0;
   }
}

void getTemp()
{
   //temp0 = ds1820_read0();
   //temp1 = ds1820_read1();
}

void main() 
{
   set_tris_a(0xFF);
   set_tris_b(0x00);
   
   while(1)
   {
      setTemp();
      
      getTemp();
   }
}

JKramer

Tranzistör tersliyor; yani pic'in bacağı lojik-1 olduğunda tranzistör iletime geçeceğinden ortak katot ucu lojik-0 oluyor. Siz de söylemişsiniz, tranzistörü kaldırıp doğrudan bağladığınızda çalışıyor diye.

esensoy

transistor-direnc yerine uln2003 taksak dirençlere de gerek kalmaz,
En tehlikeli an "zafer" anıdır.

Recep METE

#3
Devreyi proteus  programında denediğinizde tam olarak simülasyon yapamayabilirsiniz.Devreyi proteus programında denerken display seçim uçlarını direkt olarak denetleyiciden display'e veriniz.Arada transistör kullanmayınız.Bu şekilde benzetim yaparken programda çıkışları terslemeyi unutmayınız.
printf(lcd_putc,"\f  Ne kadar okursan oku, bilgine, yakışır şekilde davranmıyorsan cahilsin demektir.  \n   semfero");d

admittance

#4
#define dspUnits 0b01100000 
#define dspTens 0b10100000 
#define dspHundreds 0b11000000


NPN transistör kullanmanız durumunda  bu tanımlamalara göre birler onlar ya da yüzler hanesini aktif edebilmeniz için ilgili hanenin katot bitini 1 yapmanız gerekir ki transistör iletime geçsin ve ilgili katodu sıfıra çeksin.

Siz sıfır yapmışsınız.

Sizin de söylediğiniz gibi transistörleri devreden çıkarıp katotları PIC'e direk bağladığınızda devrenin doğru çalışmasının sebebi budur.

Doğrusu :

#define dspUnits 0b10000000 
#define dspTens 0b01000000 
#define dspHundreds 0b00100000


şeklinde olmalıdır.




sard.555

#5
Hepinize ayrı ayrı çok teşekkürler cevap için.

@admittance
Dediğinizi de denedim ama hiçbir değişiklik olmadı.

@semfero
Peki bu şekilde arada direnç ve transistör kullanmadan yapınca çalışıyor hatta sadece direnç koysam da çalışıyor. Ancak devreye geçtiğim vakit sorun yaşamazmıyım. ekranlardan gelen akımı tek başına picin bacağı gnd olarak kaldıramazsa sorun yaşamazmıyım.

@esensoy
Uln2003a kullanmam daha doğru bir seçim mi olur yani sizce

@JKramer
Yani direk bağlarsam dediğim gibi sorun yaşamaz mıyım gerçek devrede

//Ayrıca yeri yeni konu açmadan buradan sormuş olayım. Şimdi ben bir 5v luk motor (basic motor) sürmek istiyorum ama tabiki picin ayağı yetmez bunu nasıl anahtarlayabilirim transistör ile olur mu yoksa röle kullanmak durumunda mıyım. Bir de rezistans sürmek istiyorum ama öyle çok ısınmayan en fazla 80-90 derece olacak bir rezistans bunun için kaç voltluk veya akımlık kullanmam gerekir ayrıca yine anahtarlama yapmak için ne kullanmalıyım.

Saygılarımla

Recep METE

#6
Alıntı yapılan: sard.555 - 05 Nisan 2014, 16:15:56
@semfero
Peki bu şekilde arada direnç ve transistör kullanmadan yapınca çalışıyor hatta sadece direnç koysam da çalışıyor. Ancak devreye geçtiğim vakit sorun yaşamazmıyım. ekranlardan gelen akımı tek başına picin bacağı gnd olarak kaldıramazsa sorun yaşamazmıyım.


Arkadaşım  isiste simülasyon yaparken transistör kullanma.Devrede kullan,çalışır .Bende "ds18b20" ile 7 segment display çalışması yaptım.İsiste transistörsüz çalıştırıyorum.Aynı devreyi breadboarda transistörlü olarak kurdum çok güzel çalıştı. Aynı olay 'serdar çiçek hocanın "ccs c ile pic programlama" kitabında' geçmektedir.Hocanın hazırladığı kitapta da yer alan programlarda isiste çalışanprogram transistörsüz, gerçek devrede kurulan program transistörlü olarak ye almaktadır.Ama bir şeye dikkat et(tersleme olayına).
printf(lcd_putc,"\f  Ne kadar okursan oku, bilgine, yakışır şekilde davranmıyorsan cahilsin demektir.  \n   semfero");d

sard.555

#7
Alıntı yapılan: semfero - 05 Nisan 2014, 19:40:14

Arkadaşım  isiste simülasyon yaparken transistör kullanma.Devrede kullan,çalışır .Bende "ds18b20" ile 7 segment display çalışması yaptım.İsiste transistörsüz çalıştırıyorum.Aynı devreyi breadboarda transistörlü olarak kurdum çok güzel çalıştı. Aynı olay 'serdar çiçek hocanın "ccs c ile pic programlama" kitabında' geçmektedir.Hocanın hazırladığı kitapta da yer alan programlarda isiste çalışanprogram transistörsüz, gerçek devrede kurulan program transistörlü olarak ye almaktadır.Ama bir şeye dikkat et.

Cevap için çok teşekkürler. Aynen öyle yapacağım o zaman, isiste transistörsüz çalıştıracağım. Peki anahtarlama konusunda ne dersiniz. Hangi yolu izleyeyim.

Salih

Bende isis de denerken direk pic uçlarına bağlıyorum.
Gerçek devrede tr kullanıyorum. Çünkü pic uçlarının akım kapasitesi yetmeyebiliyor.
Programı tr li devreye yüklerken sadece ilgili pin çıkışlarını tersleyeceksin.

sard.555

Arada kaynadığı için bir daha sorayım. Şimdi ben bir 5v luk motor (basic motor) sürmek istiyorum ama tabiki picin ayağı yetmez bunu nasıl anahtarlayabilirim transistör ile olur mu yoksa röle kullanmak durumunda mıyım. Bir de rezistans sürmek istiyorum ama öyle çok ısınmayan en fazla 80-90 derece olacak bir rezistans bunun için kaç voltluk veya akımlık kullanmam gerekir ayrıca yine anahtarlama yapmak için ne kullanmalıyım. Ayrıca bu moderatörün mesajı onaylama olayı ben yeni kullanıcıyım diye mi var yoksa sürekli bir olay mı.

xoom

Belli akım değerlerine kadar Transistör ile anahtarlama yapabilirsin. iSter motor ister rezistans fark etmez önemli olan senin çekmek istediğin akım değerinde çalışabilecek bir transistör seçmen. Önce motorun ve rezistansın çalışmasını istediğin şartlarda ne kadar akım çektiği hesapla.

sard.555

Bulabilirsem eğer 5V'luk güzel bir rezistans 5V 1A'lik bir sistem olacak yoksa 9V veya 12V 1A'lik bir sistem kurup 7805'le pice vermeyi düşünüyorum. İki şekilde de transistör ile anahtarlamam mümkün olur mu?

Recep METE

Mesaj onaylama olayı diye bir şey olmamalı. Bu sitede öyle bir şey yeni mi başladı. Biz mesajı yazıp gönderiyor uz.
printf(lcd_putc,"\f  Ne kadar okursan oku, bilgine, yakışır şekilde davranmıyorsan cahilsin demektir.  \n   semfero");d

skolmashi

#13
Kullandığın Display Ortak Katot olduğu için Bc547 ye gerek yok ŞAyet Ortak Anot olsa idi Bc547 kullanabilirdin. Displayın Parlaklığını anot girişlerine 1k yada 10k direnç koyarak ayarlarsın.
Diyer söyleyeceğim ise Uln2003 bu tür displaylar da kullanılmaz çünki ULN2003'de 7 bit var bu Display'a 12 girişide bağlaman lazım. paralel de bağlarsın fakat fuzuli maliyet eklersin. Kolay gelsin..