pic16f628a ile 4 lü led display sürmek için kod

Başlatan yolcu27, 16 Şubat 2016, 20:04:59

yolcu27

arkadaşlar elimde ltc-4627g kodlu bir 7 segment ortak anot display vardı bununla sayıcı devre yapmak istiyorum bağlantılarını şuradaki şemaya göre yaptım fakat orada

ama kodları asm dilinde yazılmış ve pic olarak 16f84 kullanılmış ben bu bağlantı ile 16f628a da kullanabilmek için kod yazmak istiyorum.

amacım birşeyler öğrenmek ama devreyi kurdum kaldım aklım dondu nereden başlamalıuyım

mesela önce 1 displa ile 0-9 arası filan için örnek kod filan lazım

şimdiden teşekkür ederim iyi forumlar

Cemre.

Örnek koda ihtiyacınız yok. Basit düşünün. Mesela bir display'de herhangi bir şekil vs göstermek için ne yapmanız gerekiyor?
Displaydeki 7 ledin durumlarına karar vermeniz gerekiyor. Misal 1 yazmak için b ve c segmentleri yanmalı diğerleri sönmeli.

Bunu nasil sağlayacaksınız?
Bir tane ortak anod displayde portB.ye bağladığınızı varsayarsak ortak uca + besleme, yanmalarini istediğiniz ledlerin uçlarına - besleme bağlayacaksınız.

Buraya kadar hersey tamamsa yapmanız gereken kabaca
PortB'ye değer atamak olacak.

Biz bunu normal led yakip sondururken de yapiyoruz. Misal portb.nin 1inci ve 2nci pinine bagli ledler yansin digerleri sönsün.
Portb.nin alacağı değer
00000110 olmalı.

Display.in çalışma mantığına gore tam tersi olmasi gerekiyordu.
Yani 11111001

Bu değeri portb.ye atamak için derleyicinizin kutuphanesindeki fonksiyonları kullanabilirsiniz. Bunu yapın, gerisini yine birlikte hallederiz.

Kolay gelsin, iyi akşamlar.

Cemre.

Not. Uygulamada her pine ayri ayri uygun degerde akım sınırlama direnci eklenmeli.

yolcu27

#3
devreyi bahsettiğiniz mantıkta kuracağım dediğiniz gibi her bir segment bir nevi porta bağlı bir ledi teşkil ediyor. bununla istediğim harf rakam kombinasyonlarını yapabilirim.

benim istediğim değişkenleri kullanarak sayıcı bir devre yapmak en basitinden 0-9 ileri geri sayıcı bir devre. bunu etiketler oluşturarak hangi segmentlerin yanmasını ayarlayarak yapabilirim.

misal 7 yazmak için bir etiket oluştururum ve yanması gereken segmentlerin bağlı olduğu pinleri high yaparım . toplamda 10 etiket olur bunu 0-9 sırasıyla her butona bastıkca bir sonraki etikete gitmesi için if then komutunu kullanırım. ama bu işin ameleliğidir bunun farkındayım.

0-99 için 100 tane etiket yapıp gerekli pinleri high low yaparak yapılmayacaktır.

bunların kısa yolu nedir ne değildir bunu öğrenmek istiyorum.

açıklamalarınız için ayrıca teşekkür ederim


Edit:

dediğiniz gibi bread boarda kurdum devremi ortak anotta 1 değilde sıfır oldukça yanacak şekilde dediğim etiketleri oluşturdum if komutları ile ileri geri etiketlere yöneldim . fakat dediğim gibi 100 tane yada 1000 tane etiket yazmam imkansız . örnek olarak 0-9 yada 0-99 buton ile ileri geri nasıl bir kod ile gerçekleştirebilirm maksatım burada değişkenleri öğrenmek formülleri anlamak

Cemre.

Buraya kadar tamamsa yapacağınız iş şudur.

Bir değişken tanımladık. Değerini butonlarla değiştiriyoruz.
Misal counter değişkeni,
Counter=12; olsun.

Bunu iki displaye nasıl yazarız? Birler basamağı bir displaye diğeri diğerine.

Birler basamagi = Counter mod 10
Onlar basamagi = Counter / 10

Sanırım doğru.

Bir dizi tanimlayalım.

Dizi[10] = {0..9 arasi rakamlarin hex karşılığı};

Bir de fonksiyon tanimlayalım

Misal

Goster(onlarBasamagi, birlerBasamagi)
{
  Porta.0 = high
  Portb = Dizi[birlerBasamagi];
  Delay
  Porta.0 = low
  Porta.1 = high
  Portb = Dizi[onlarBasamagi];
  Delay
  Porta.1 = low
}

Gibi bir fonksiyon.

Bu fonksiyon sürekli ana döngüden çağırılsın.

Ana dongude bir de buton kontrolu ile Counter degeri degistirilsin.
Counter degeri degistirdikten sonra birler onlar hesaplansin.
Gosterme fonksiyonu cagirilsin.

Gibi bir algoritma oluşturalım.

Telefondan yazdığım için hiç anlaşılabilir olmadı sanırım ama bu şekilde yapılıyor genelde bu uygulama.

Kolay gelsin, iyi günler.

Maxim


dursuncemal

#6
once etiketlerini hazirla

sonra o etiket degerlerini          etiketler[10] = {etiket0,etiket1,.............etiket0};  < bir dizinin icine yerlestir.//ben etiket diye belitiyorum ama sen buldugun sayilari yazacaksin

0 dan 9 a kada sayan bir sayici yap.//adida sayici olsun displaylerin anod mu katod mu bilemiyorun ama ortak anod kabul ederekten;

ra0 = 1;//displaylerin ortak ucunu set (+) yaptiktan sonra;

portb =  etiketler[sayici] ; //buradaki sayici,etiketler dizisindeki senin her rakkam icin  hazirlamis oldugun etiketi isaret ederek portb ye atar, bu isleri interrupt icinde kulanmalisin. once 0 dan 9 u yap sonra interrupt kurup daha buyuk sayilari da gostermeyi deneriz.






:=

mehmet

Goster(onlarBasamagi, birlerBasamagi)
{
  Porta.0 = high
  Portb = Dizi[birlerBasamagi];
  Delay
  Portb = 0//Pin değişiminde önceki displayda gölge kalmaması için
  Porta.0 = low
  Porta.1 = high
  Portb = Dizi[onlarBasamagi];
  Delay
  Portb = 0//Pin değişiminde önceki displayda gölge kalmaması için
  Porta.1 = low
}
Olan olmuştur,
olacak olan da olmuştur.
Olacak bir şey yoktur.
---------------------------------------------
http://www.mehmetbilgi.net.tr
https://creativecommons.org/licenses/by/4.0/deed.tr "CC BY"

ete

Aşağıdaki linkte bir projem yer almaktadır. 0-9999 arası sayabilir. 7 segment ile çalışmaktadır

Yukarıda yer alan şema teorik olarak simulasyonda çalışır ama gerçekte ortak uçları bir transistörle sürmeniz gerekir.
Çünki pic pini ancak 20 ma akımı kaldırabilir. Ortak ucu direk pic'e bağlarsanız ve segmentlerin hepsi aktif ise display ortak uçtan yaklaşık 70 ma akım asılır buda pinin yada picin bozulmasına yol açar. Bu nedenle ortak ucun en azında 100ma akım verebilen bir NPN transistör ile sürülmesi gerekir.

Ete

http://etepic.com/index.php/topic,2985.0.html

Bilgi hazinedir paylaştıkça büyür.            http://etepic.com