Max7219 iletişim problemi ?

Katılım
18 Ocak 2008
Mesajlar
1,068
Puanları
156
Yaş
39
Herkese selamun aleyküm değerli arkadaşlar bir siteden 8 haneli 7 segment display ile max7219 un hazır halde yapılmış olanını satın aldım. Ürün bu

https://www.robiz.net/8dgt7segmentmax7219?search=max7219

kendi kurduğum pic16f877a devresi ile 3 kanallı soft spi iletişimi yapmaya çalıştım.

Pic devrem ile max7219 u bir türlü çalıştıramadım sonra dedim ki spi iletişim mi çalışmıyor acaba ve bunun üzerine usb lojik analizör cihazını bilgisayara bağladım pic den gelen dataları 7 sn boyunca bilgisayar üzerinde dinledim ve 3 hattın üçünde de sinyal var yani komut gönderimi mevcut.

Lakin max7219 un datasheet bilgileri ile ilgili yanlış yapmış olma ihtimalim yüksek olduğu için burada sormak istedim...

max7219 datasheet : https://datasheets.maximintegrated.com/en/ds/MAX7219-MAX7221.pdf

Aşağıda programı olduğu gibi yapıştıracağım ve program üzerinde neyi niçin yaptığım konusunda da açıklamalar yapacağım bana bu konuda bir el atmanız mümkün mü acaba ?
Kod:
///////////////////////////////////soft spi iletişimi için gerekli ayarlamaları yaptım///////////////////

sbit Chip_Select at RB7_bit;

sbit SoftSpi_CLK at RB6_bit;

sbit SoftSpi_SDI at RB5_bit;

sbit SoftSpi_SDO at RB4_bit;



sbit Chip_Select_Direction at TRISB7_bit;

sbit SoftSpi_CLK_Direction at TRISB6_bit;

sbit SoftSpi_SDI_Direction at TRISB5_bit;

sbit SoftSpi_SDO_Direction at TRISB4_bit;

////////////////////////////////////////////////////////////////////////////////////////////



char sayi;             //sayı adında değişken tanımladım.

void main() {

adcon1=7;              //portları dijital olacak şekilde ayarladım.

trisb=0x00;            // portb yi çıkış yaptım

portb=0x00;            // portb nin içini temizledim.



////////////////////////////////

  Chip_Select = 1;                        // DAC seçimini kaldırın

  Chip_Select_Direction = 0;             // CS # pinini Output olarak ayarla

  Soft_SPI_Init ();                     // Soft_SPI'yi başlat





            Chip_select=0;

            soft_spi_write(0x0C);   // Max7219 un 0x0c adresine

  soft_spi_write(0x01);   // 0x01 gönderdim buradaki amacım = max7219 normal operasyon modunda //çalışması için

            Chip_select=1;



            Chip_select=0;

            soft_spi_write(0x09);  //max7219 un 0x09 adresine

            soft_spi_write(0x00);  // 0x00 gönderdim yoğunluk kayıt formatıymış 1/32 de çalışsın diye

            Chip_select=1;



            Chip_select=0;

            soft_spi_write(0x0B);           // max7219 un 0x0b adresine

           soft_spi_write(0x07);         ////0x07 gönderdim Scan-Limit Register bütün dijitler aktif olsun diye

//ama burada yanlış yapmış olabilirim doğrusunu bilmiyorum.

            Chip_select=1;



            Chip_select=0;

            soft_spi_write(0x0F);  // Display-Test Register Format Adresine 00 gönderdim

            soft_spi_write(0x00);  // test değil de normal modda çalışması için

            Chip_select=1;



            Chip_select=0;

            soft_spi_write(0x0A);

            soft_spi_write(0x01);

            Chip_select=1;

            sayi=0;

          

            while(1){

          

            Chip_select=0;

            soft_spi_Write(0x07);   // işte ekranda görmek istediğim değerleri buraya yazdım ama muhtemel

// olasıkla yanlış adres çünkü tam adresini bilmiyorum

            soft_spi_Write(sayi);    // sayı adındaki registerin içini 0x07 adresine yani ekrana gösterme

// adresine yazmaya çalıştım ama burada yapmak istediğim şey şu : soldan sağa 7 dijit 0 göstersin en sağ en

// düşük değerli dijit sayı registerinin içini göstersin.

            Chip_select=1;

            sayi++;

            if     (sayi>9){

            sayi=0;

}

            delay_ms(250);

            }

            }
Uzun lafın kısası ben hangi registerin içini yada hangilerinin içini yanlış yapmışım anlayamadım şu anda sisteme enerji verdiğim zaman bütün dijitteki displaylar tamamen sönük duruyor...
 
Moderatör tarafında düzenlendi:
Arkadaşlar ve değerli ustalarım programda biraz daha çalıştım proteus isis ile bir de deneme yaptım 1 ve 4 numaralı sayıları göremedim yani gördüm ama tam karakterinde değil...

programı da şu şekile getirdim ama aktif ettiğim dijitlerde isis yanıp sönme gösteriyor daha realde deneme şansım olmadı.

Bir siteden 3 tane max7219 sipariş ettim elime geçtiğinde gerçek ortamda da deneme yapmaya çalışacağım eğer bir aksilik çıkmazsa ve deneme yaparsam burada sonucu sizinle paylaşmaktan onur duyarım...
Kod:
sbit Chip_Select at RB7_bit;

sbit SoftSpi_CLK at RB6_bit;

sbit SoftSpi_SDI at RB5_bit;

sbit SoftSpi_SDO at RB4_bit;



sbit Chip_Select_Direction at TRISB7_bit;

sbit SoftSpi_CLK_Direction at TRISB6_bit;

sbit SoftSpi_SDI_Direction at TRISB5_bit;

sbit SoftSpi_SDO_Direction at TRISB4_bit;



char sayi;



void yaz(){ //

            if (sayi>9){

            sayi=0;}

            Chip_select=0;

            soft_spi_Write(0x01); //1'ler basamağı display yazma adresi 0x01- 10'lar basamağı displayı 0x02 gibi 1 artarak gider

            soft_spi_Write(sayi);

            Chip_select=1;

            sayi++;

            }

void main() {

adcon1=7;

trisa=255;

trisb=0x00;

portb=0x00;

////////////////////////////////

  Chip_Select = 1;                        // DAC seçimini kaldırın

  Chip_Select_Direction = 0;             // CS # pinini Output olarak ayarla

  Soft_SPI_Init ();                     // Soft_SPI'yi başlat



            Chip_select=0;

            soft_spi_write(0x0A);// DİSPLAY TARAMA HIZINI BELİRLEYEN ADRES ( OSİLATÖR BÖLME ORANI DATASHEET'E BAK )

            soft_spi_write(0xff);// BÖLME ORANI 31/32

            Chip_select=1;

          

            Chip_select=0;

            soft_spi_write(0x0B);// DİSPLAY AKTİF ETME DEĞERİ YANİ 8 DİSPLAYDAN KAÇ TANE AKTİF EDİLMEK İSTENİYORSA BU ADRES BELİRLER

            soft_spi_write(0x02);// 0X00 DEĞERİ SADECE 1'LER BASAMAĞINDAKİ DİSPLAYI AKTİF EDER. 0X07 BÜTÜN BASAMAK DİSPLAYLERİ AKTİF EDER

            Chip_select=1;



            Chip_select=0;

            soft_spi_write(0x0C);//DSİPLAYLERE VERİ YOLLAMAYI AÇMA VE KAPAMA BİTİ

            soft_spi_write(0x01);//0X00 OLURSA DİSPLAYLER KAPALI 0X01 OLURSA DİSPLAYLER AÇIK MODDADIR.

            Chip_select=1;

          

            Chip_select=0;

            soft_spi_write(0x0F);//DİSPLAY TEST MODU REGİSTERİ

            soft_spi_write(0x00);//0X00 OLURSA TEST MODU KAPALI KONUMDA OLUR 0X01 OLURSA BÜTÜN DİPLYALARIN BÜTÜN DİJİTLERİNİ YAKAR

            Chip_select=1;



            Chip_select=0;

            soft_spi_write(0x09);//KOD ÇÖZME MODU KAYIT ÖRNEKLERİ REGİSTERİ

            soft_spi_write(0xFF);

            Chip_select=1;



            sayi=0;



            while(1){

                     yaz();

                     delay_ms(250);}

            }
 
Moderatör tarafında düzenlendi:
Displaydaki delay kısmını 10uS civarına
düşürürseniz; düzgün görüntü alırsınız.
 

Forum istatistikleri

Konular
128,125
Mesajlar
915,224
Kullanıcılar
449,837
Son üye
betül hüsrevoğlu

Yeni konular

Geri
Üst