Pic16F877A ile Max7219 iletişim problemi ?

Başlatan tekniker_murat, 30 Ekim 2019, 19:27:13

tekniker_murat

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 ?
///////////////////////////////////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...


[email]murat.yagci.1984@gmail.com[/email]

tekniker_murat

#1
Evet arkadaşlar proteus isis ile küçük çaplı bir deneme yaptım ve programı şu şekilde yorumladım belki birisi bakar ve doğru yada yanlış diye yorum yapar yada biri kullanır faydalanır :D
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);}
            }
[email]murat.yagci.1984@gmail.com[/email]

mehmet

Simülasyonda artık 1 ve 4
rakamını görebiliyor musunuz?
Olan olmuştur,
olacak olan da olmuştur.
Olacak bir şey yoktur.
---------------------------------------------
http://www.mehmetbilgi.net.tr

tekniker_murat

Alıntı yapılan: mehmet - 02 Kasım 2019, 13:55:44Simülasyonda artık 1 ve 4
rakamını görebiliyor musunuz?

Evet hocam bütün rakamları görebiliyorum ve hiç bir sorun teşkil etmiyor...

Hatta bir sitenin birinden max7219 dip entegre sipariş ettim bir kaç tane kadar elimde ortak katod 7 segment displayler de var entegreler de geldikten sonra gerçek ortamda bir uygulama yapmaya çalışacağım eğer umduğum gibi başarılı bir uygulama olursa gerçekten çok sevdiğim iki tane forum sitesi var bir tanesi burası diğeri de www.kontrolkalemi.com/forum buralarda ilgili alanlarda paylaşacağım. Ama tır şoförlüğü yaptığım ve aynı zamanda da vardiyeli çalıştığım için biraz zaman alacak gibi görünüyor :)
[email]murat.yagci.1984@gmail.com[/email]