max7219 entegresi hakkında

Başlatan onderakgn_93, 27 Ekim 2016, 17:40:26

onderakgn_93

Bir proje hakkında sizin bilginize başvurmak istiyorum eğer müsaitseniz.
Problemim şu ki Arduino ya 6 adet kaskat bağlı maxım7219 entegresi ile 384 adet çıkış almak istiyorum ve bu çıkışlara bağlı ledleri birbirinden bağımsız kontrol etmek istiyorum.Örneğin Serial port ekranından 32 yazdığımda 32. ledin yanmasını veya 200 yazdığımda 200. ledin yanmasını istiyorum.Arduino nun forum sitesinden bu maxım 7219 entegresini tavsiye ettiler ama nasıl kullanılıyo bilmiyorum.Sizden eğer müsaitseniz bu entegreyi incelemenizi bu işlemleri yapabilir miyim öğrenmek istiyorum.
Proteus da 2 entegreyle örnek olarak bir çizim yaptım ekte paylaştım.

ete

#1
Max7219 konusu defalarca işlendi. Sitede ara butonuna basıp max7219 yaz ve çıkan linkleri tek tek incele.
Mesela aşağıdaki konuda entegrenin çalışma mantığıda açıklanmış durumda.
http://etepic.com/index.php/topic,2258.msg22189.html#msg22189
Ufak bir deneme yaptım ve 1-64 nolu ledleri yakacak şekilde kısacık bir program yazdım.
ADR = $0C : DATAREG = $01   : GoSub MAXYAZ 'On/Off Register.
ADR = $09 : DATAREG = $00   : GoSub MAXYAZ 'Decode register     '00 verirsen sen 7 segment değeri bulacaksın FF verirsen kendi veriyor
ADR = $0A : DATAREG = $07   : GoSub MAXYAZ 'Intensity register.
ADR = $0B : DATAREG = $07   : GoSub MAXYAZ 'Scan-limit register.
ADR = $0F : DATAREG = $00   : GoSub MAXYAZ 'Test mode register (all digits on, 100% bright)
'-----------------------------------------------------------------

BASLA:
         
LED=31 '......................yanacak olan led numarası
ADR=(LED/8):IF (LED//8)>0 THEN adr=adr+1 'hangi sırada olduğunu buluyoruz
x=7-(LED//8) 'bulunan sırada kaçıncı led yanacağınıda
datareg=dcd x  'datareg değişkeni belirliyor
GOSUB MAXYAZ 'bu bilgileri 7219 a shift edince ilgili led yanıyor.     
GOTO BASLA
'-----------------------------------------------------------------
MAXYAZ:
SHIFTOUT DIN,CLK,1,[ADR,DATAREG]
PulsOut LD,1  'load pinine 10us lik bir puls veriyoruz.
Return
End


bu kodlara bakarak sende gerisini halledersin belki.
ete

ete

#2
3 adet MAX7219 'u seri bağlayarak toplamda 192 adet ledin kontrolü yaptırdım.
Bütün yapılacak iş 3 tane daha 7219 u bu devreye bağlamak. Bir kaç kod da ilave etmek.
Bakınca işin mantığıda anlaşılıyor zaten. Anlamayan varsa anlatırım.
Dosya ilişiktedir.
Programın değişken tanımlamasında fazlalıklar olabilir başka bir programdan adapte ettim. Siz değişken tanımlamadan sonrası ile ilgilenin.
Biraz açıklama vermek daha uygun olacak galiba. Bu işte toplam 6 adet max7219 kullanmak gerekiiyor (384/64=6)
bu durumda her yazma işleminde 6 adet shift registere 6 adet adres ve 6 adet data değeri verilmesi gerekiyor. (Ben 3 tane kullandığım için 3 er adet bilgi yolladım.) Bilgi yollama sırası en sondaki max7219 bilgisi en baştan verilmeli. Verirken de her birine önce adres değeri sonra data değeri verilmeli.
Gelelim hesabı nasıl yaptığımıza.
Led isimli bir değişkenimiz mevcut. Buna 1-384 arasında bir değer veriyoruz. Bu yakmak istediğimiz led numarasıdır.
Örnekle devam edecek olursak diyelimki Led=198 değerini verdik.
Öncelikle bu sayının hangi max7219 da yer alacağına bulmamız gerekiyor. temp=led/64 formülü bize bunu sağlıyor.
Temp=198/64=3 olarak bize 3.cü (aslında sıfır ile birlikte 4.cü 7219) 64 lük furupta yer aldığını buluyoruz.
Şimdi TEMP değerine bağlı olarak işlem yapmamız gerekiyor. Zira bulacağımız adres ve data register değerleri bu shift register için geçerli olacaktır. Öncelikle LED sayımızı 3 nolu shift registere indirgememiz gerekiyor. Bunu sağlamak için ,
Led=Led-(64*Temp) eşitliği kullanılabilir. Ben programda Select case komutu kullandığım için 64*temp yerine case işleminde hangi sayı denk geliyor ise onu yazdım sonuç değişmez.
İşleme başlamadan önce registerleri bir sıfırlıyoruz. Bunun için 0-5 aralığında (toplam 6 adet) lik bir döngü kuruyoruz ve Adres ile data regaisterlerini sıfırlıyoruz.
Ardından select case işlemine girerek hangi case'e uygun olduğumuzu buluyor ve orada, önce adres değerini hesaplıyoruz.
Temp=3 bulmuş idik. Bu bize Case 3 işlemini yaptıracaktır.
CASE 3
LED=LED-(64*3) '..........................................indirgenmiş led değerini bu şekilde hesapladık
ADR[3]=(LED/8):IF (LED//8)>0 THEN adr[3]=adr[3]+1 '......buradan adres değerimizi hesapladık
x=7-(LED//8)  'şimdi data değerimizi hesaplıyoruz
DREG[3]=dcd x  'sonuçta data değerimizde hesaplanmış oldu
GOSUB MAXYAZ 'götürüp hesaplananları ilgili yere yazdırıyoruz.

hepsi bu.
Şimdi bu programı select case kullanamdan da nasıl yapılır onu açıklayayım. Aşağıdaki program parçası select case kullanmadan bu satırlarla aynı işi yapar.
Led=198:TEMP=LED/64:LED=LED-(TEMP*64)
FOR X=0 TO 5
ADR[X]=0:DREG[X]=0
NEXT
ADR[TEMP]=(LED/8):IF (LED//8)>0 THEN adr[TEMP]=adr[TEMP]+1
x=7-(LED//8)
DREG[TEMP]=dcd x         
GOSUB MAXYAZ

Bu var iken neden uzun olan diğerini en önce anlattın diye soranlarınız olabilir. İşin anlaşılması açısından birinci sistem daha uygun. İkincisi çok kısa ve her şeyi otomatik yapıyor ama anlaşıılması her kesi için kolay olmayabilir.

Yanlış anlaşılmasın yukarıdaki satırlar toplamda 384 adet ledi kontrol edebilir. Sadece SHIFTOUT komut satırı 6 register'e komut gönderecek şekilde 6 şar adet değişken ihtiva edecek o kadar. Gerisi otomatikman bu işi yapacaktır.
Basic i bu yüzden seviyorum. 384 adet ledi bir kaç satıra kontrol etmiş olduk. Sade kolay yazılabilir ve basit. Şimdi bunu C diline uyarlanmış halini merak ediyorum gerçekten. bakalım ne çıkacak.?

Ete


Powered by EzPortal