Max7219 entegresi kullanırken shiftout komutu sorunu

Başlatan cemilsivas, 20 Ocak 2022, 23:29:55

cemilsivas

Merhabalar. Ben 4 adet max7219 entegresini birbirine bağlayıp dot-matrix ile kayan yazı uygulaması yapmaya çalışıyorum. Öncelikle max entegresi ile belirlediğim karakterleri bastım. Ancak 2. max entegresine geçemedim. Shiftout komutu ile iki kere üst üste adres ve veri komutu gönderdiğimde sadece 1. max entegresinin üzerindeki dot-matrixte harf çıkıyor. Kod ve devre ektedir. Yardımcı olursanız sevirinim.

ete

Gördüğüm kadarı ile asıl sorun ikinci max7219'a erişemiyor olman.
Max7219 bir shift register mantığı ile çalışıyor. Özellikle kaskad bağlantılarda bu önemli hale geliyor. 8 bitlik iki shift registeri seri olarak bir birine bağladığın zaman birincinin Din girişinden girersin birincinin dout çıkışını ise ikincinin Din girişine bağlarsın. Bu bağlantıyı doğru şekilde yapmışsın burada sorun yok. Ancak bilgiyi birinciden ikinciye aktarırken birinciyi taşırman lazım. Bu ne demek dersen vereceğin ilk 8 bit bilgi birinciye yerleşir. Bilgiyi çıkışa aktarmadan vereceğin ikinci 8 bit ise birincideki 8 bitlik bilgiyi kaydırıp ikinciye geçirir ve ikinci verilen ise birincide kalır. Bu söylediklerimi iyice anlamaya çalış lütfen.

Dotmatrix ledler ile çalıştığımıza göre önce en soldaki displayin yani seri bağlantının en sonundaki displayin ilk sırasında yer alan bilgiyi hatta vermen hemen ardından bir öncekine ait bilgiyi hatta vermen ve bu şekilde kaç tane seri bağlı ise sağdan sola doğru gelecek şekilde bütün displaylerin ilk sıra bilgilerini ard arda vermen ve ardından Load girişine bir puls uygulaman gerekir. Bu sayde verdiğin bütün bilgiler sırası ile displaylerin ilk satırlarına yerleşmiş olur.
Ardından ikinci sıraları da benzer şekilde vermen ve bu şekilde 8 sıra bilgiyi aktarman gerekir.
Buraya kadar her şey anlaşılmıştır umarım. Diğer bir önemli konu da ilk açılışta max7219 ların setup değerlerini de bütün max7219 lara ulaşacak şekilde aynı mantıkla vermen gerekir. Senin yaptığın gibi yapılır ise yanlızca en baştaki tek 7219 bu setup bilgilerini alır ve uygular diğerleri hiç bir şey yapmadan dururlar.

Aşağıda iki displayi çalıştıracak kodlarını yeniden düzenleyerek veriyorum. Kod vermede değişik mantık kullanabilirsin. Bu tür sistemlerde ben her bir display için genellikle ona has ayrı değişken kullanırım. Burada bende benzer mantık ile bunu gerçekleştirdim. Sen kendine göre farklı bir sistem yapabilirsin.

Ete

#CONFIG
 __config _BODEN_ON & _BOREN_ON & _CP_ON & _PWRTE_ON & _WDT_OFF & _LVP_OFF & _MCLRE_OFF & _INTRC_OSC_NOCLKOUT 
#ENDCONFIG 

DEFINE OSC 4
OPTION_REG=%00000000
cmcon=7
'max entegresinin pinleri
SYMBOL  DIN=PORTA.0
SYMBOL  CLK=PORTA.2
SYMBOL  LD=PORTA.1

ADR1 VAR byte
DATAREG1 VAR byte
ADR2 VAR BYTE
DATAREG2 VAR BYTE

char var word
sayi var byte
i var byte
a var byte
b var byte
deger var byte
MEM   VAR BYTE[8]
mem1 var byte[8]
mem2 var byte[8]
artir var byte
artir=0
ADR1 = $0C:datareg1=$01:gosub ayaryaz ' Aç/Kapat Adresi                     VERI=$00 Kapat - $01 aç
ADR1 = $09:datareg1=$00:gosub ayaryaz' Decode Mode Adresi               VERI=$00
ADR1 = $0A:datareg1=$15:gosub ayaryaz' Parlaklık Seviyesi                   VERI=0-15 arası
ADR1 = $0B:datareg1=$07:gosub ayaryaz' Sürülecek olan Display Sayısı  VERI=0-7 arası
ADR1 = $0F:datareg1=$00:gosub ayaryaz 'Display Test Adresi                 VERI=0 test kapalı

basla:

I=0:GOSUB HARF_AL  'a HARFİ ALINDI MEM DEĞİŞKENİNE YERLEŞTİ
FOR I=0 TO 7
  MEM1[I]=MEM[I]  'MEM DEĞİŞKENİNDEKİLER MEM1 E AKTARILDI
NEXT
I=1:GOSUB HARF_AL  'b HARFİ ALINDI  MEM2 DEĞİŞKENİNE YERLEŞTİ
FOR I=0 TO 7
  MEM2[I]=MEM[I]    'MEM DEĞİŞKENİNDEKİLER MEM2 YE AKTARILDI
NEXT
FOR B=0 TO 7
ADR1=B+1
datareg1=mem1[B]
ADR2=B+1
DATAREG2=MEM2[B]
gosub maxyaz
next  
pause 500

goto basla

HARF_AL:
lookup i,["a","b","a","a","b"],sayi
char=sayi
gosub karakterler
RETURN

maxyaz:
shiftout din,clk,1,[adr1,datareg1,ADR2,DATAREG2]
pulsout ld,2
return

karakterler:

select case char
case "a"
for deger=0 to 7
lookup deger,[0,0,52,76,76,52,0,0],sayi
mem[deger]=sayi
'artir=artir+1
next deger

case "b"
for deger=0 to 7
lookup deger,[32,32,32,40,52,52,40,0],sayi
mem[deger]=sayi
'artir=artir+1
next deger
end select

return
ayaryaz:
shiftout din,clk,1,[adr1,datareg1,ADR1,DATAREG1]
pulsout ld,2
return

ete

Şayet tek bir MEM değişkeni kullanarak yapmak istersen onuda aşağıdaki örnekteki şekilde yapmanda fayda var.
Ayrıca 4 displayli sistemi ve onu çalıştıran kodu görmek istersende ilişikteki dosyaya bakmanı öneririm.

ETE

#CONFIG
 __config _BODEN_ON & _BOREN_ON & _CP_ON & _PWRTE_ON & _WDT_OFF & _LVP_OFF & _MCLRE_OFF & _INTRC_OSC_NOCLKOUT 
#ENDCONFIG 

DEFINE OSC 4
OPTION_REG=%00000000
cmcon=7
'max entegresinin pinleri
SYMBOL  DIN=PORTA.0
SYMBOL  CLK=PORTA.2
SYMBOL  LD=PORTA.1

ADR VAR byte
DATAREG VAR byte
DATAREG1 VAR BYTE
DATAREG2 VAR BYTE
char var word
sayi var byte
i var byte
a var byte
b var byte
deger var byte
BILGI VAR BYTE[8]
MEM   VAR BYTE[40]

PAUSE 300

ADR = $0C:datareg=$01:gosub ayaryaz ' Aç/Kapat Adresi                     VERI=$00 Kapat - $01 aç
ADR = $09:datareg=$00:gosub ayaryaz' Decode Mode Adresi               VERI=$00
ADR = $0A:datareg=$15:gosub ayaryaz' Parlaklık Seviyesi                   VERI=0-15 arası
ADR = $0B:datareg=$07:gosub ayaryaz' Sürülecek olan Display Sayısı  VERI=0-7 arası
ADR = $0F:datareg=$00:gosub ayaryaz 'Display Test Adresi                 VERI=0 test kapalı

basla:

I=0:GOSUB HARF_AL   'A HARFİ OKUNDU
FOR I=0 TO 7
  MEM[I]=BILGI[I]
NEXT
I=1:GOSUB HARF_AL    'B HARFİ OKUNDU

FOR I=0 TO 7
  MEM[I+8]=BILGI[I]
NEXT

FOR B=0 TO 7
ADR=B+1
datareg1=mem[b]
DATAREG2=MEM[B+8]
gosub maxyaz
next  
pause 500

goto basla
'----------------------------------------------------------------------------------
HARF_AL:
lookup i,["a","b","a","a","b"],sayi
char=sayi
gosub karakterler
RETURN

maxyaz:
shiftout din,clk,1,[ADR,DATAREG1,ADR,DATAREG2]
pulsout ld,2
return

karakterler:
select case char
case "a"
for deger=0 to 7
lookup deger,[0,0,52,76,76,52,0,0],sayi
BILGI[deger]=sayi
'artir=artir+1
next deger

case "b"
for deger=0 to 7
lookup deger,[32,32,32,40,52,52,40,0],sayi
BILGI[deger]=sayi
'artir=artir+1
next deger
end select
return

ayaryaz:
shiftout din,clk,1,[adr,datareg,ADR,DATAREG]
pulsout ld,2
return


enes

Merhaba.
uzun zaman once max7219 8x8 dotmatrixlerle bı calısmam olmustu.
bi incele ıstersen belkı isine yarayabılır.
saat tarıh sıcaklık gosterımı ve sagdan sola kayan bır yazı fonksıyonu var.

cemilsivas

Evet hocam. Çok araştırma yaptım. Sizin örneğinizi de inceledim. Emeğinize sağlık.

cemilsivas

ETE hocam. Yine hızır gibi yetiştiniz. Çok teşekkür ederim. ;D

Powered by EzPortal