MAX7219 ile 7-segment sürme

Başlatan msen, 15 Aralık 2014, 09:56:55

msen

Merhaba arkadaşlar.

MAX7219 entegresini kullanarak 4'lü 7-segment display sürmek istiyorum. Devreyi kurdum, kodunu yazdım, Proteus'da simülasyon yaptım çok güzel çalıştı ancak gerçekleştirdiğim zaman çalışmıyor. Proteus simülasyonunda çalışıp da gerçek devrede çalışmamasının sebebi ne olabilir?

Not: Tüm kablo bağlantılarını ve ledlerin kontrolünü yaptım. 4'lü 7-segment kafasına göre yanıp sönüyor. Bazen 8888 şeklinde sürekli yanıp sönüyor. Yardımcı olursanız sevinirim. Teşekkürler.

Not2: Devreye güç verdiğim anda flaş gibi yanıp sönüyor daha da yanmıyor.

sadogan

Devrede runled gibi ledin varmı varsa yanıp sönüyormu?

Kabil ATICI

Alet ile iletişim kuramıyorsunuz, ve shutdown registeri aktif durumda...

Tabii işlemci devrenizin çalıştığını varsayaraktan.

Not: Isiste çalışması üzülerek bir şey ifade etmiyor.O program çalışırken bir sürü parametreyi göz ardı edebiliyor...
ambar7

MC_Skywalker

MAX7219 un Isense ayağını 9k5,9k8 veya 10k ile pullup yaptın mı?
birde nasıl sürüyorsun doğrudan sayı gönderip iç epromdaki LUT a göremi ekrana bastırıyorsun yoksa sen kendi hazırladığın LUT undan seçip gönderiyorsun? uzun man oldu Picbasic ile denmeler yapmıştım aklımda tam kalmadı ama yanlış hatırlamıyorsam birde kullanmadığın çıkışlar için meskelem yapmak gerkiyordu.

msen

arkadaşlar ilgilenen herkese teşekkür ederim. sorunu çözdüm. 4 mhz'lik kristal ile çalışıyordum 20mhz takayım dedim. ancak taktığım kristal arızalıymış başka bir kristal takınca düzeldi.

yaptığım şey bi tane ntc'den ısı bilgisi alıyorum adc'den geçirip sonra bunu 4'lü segmente yazdırıyorum. max7219'un en sevdiğim özelliği sürekli pic üzerinden kontrol etmek zorunda kalmıyorsunuz, max'a bi bilgi attığınız zaman onu değiştirene kadar ekranda kalıyor. max7219 sıcaklığı gösterirken pic yeni sıcaklık bilgisi için adc üzerinden okuma yapıyor. aynı anda iki iş yapılmış oluyor.

Gökhan BEKEN

Display'ı main fonksiyonunda taramak yerine, timer ile yaparsanız, bir yandan da ADC okuyabilirsiniz. Bu sayede maliyetten kazanırsınız ve PCB'niz küçülür.
Özel mesaj okumuyorum, lütfen göndermeyin.

msen

timer ile nasıl yapılıyor bilmiyorum. main fonksiyonunda iki tane alt programım var. 1.sini çağırarak adcden sıcaklık okuyorum 2.si ile de max7219'a yazdırıyorum. tekrar 1. alt program ile adc'den veri okurken max7219 display'e yazdırmaya devam ediyor. titreme, gecikme vs olmuyor.

timer ile nasıl yapılır özetle anlatırsanız sevinirim hocam.

Gökhan BEKEN

Özel mesaj okumuyorum, lütfen göndermeyin.

interrupter

timere falan gerek yok bu mantıkta. displaya yazdırdığın değişkenin değerini önceki değeriyle sınayıp eğer değişiklik varsa displaya gönderebilirsin .  displaylar işlemci ile taransaydı tamam timer kullanabilirdin ama MAX7219 da gerek yok.

Gökhan BEKEN

Alıntı yapılan: interrupter - 16 Aralık 2014, 09:10:36
timere falan gerek yok bu mantıkta. displaya yazdırdığın değişkenin değerini önceki değeriyle sınayıp eğer değişiklik varsa displaya gönderebilirsin .  displaylar işlemci ile taransaydı tamam timer kullanabilirdin ama MAX7219 da gerek yok.
MAX7219 kullanmayıp timer ile taramaktan bahsetmiştim. PCB'nin küçüldüğünden, maliyetin azaldığından bahsetmiştim. MAX7219 kullandıktan sonra timer kullanmaya gerek yok zaten :)
Özel mesaj okumuyorum, lütfen göndermeyin.

Murat Mert

#10
S.A.
Timer kesmesiyle display taraması inşallah yardımcı olur.

#include <18F4520.h>

#fuses CCP2C1,INTRC_IO,NOPUT,PROTECT,BROWNOUT,NOLVP,NOMCLR,NOWDT

#device ADC=10

#use delay(clock=8000000)


#define SEG0COM PIN_D4
#define SEG1COM PIN_D5
#define SEG2COM PIN_D6
#define SEG3COM PIN_D7

int16 bir,on,yuz,bin;
unsigned int16 say,say1,s,oku;


byte const LED_MAP[10] = {0x3F,0x06,0x5B,0x4F,0X66,0X6D,0X7D,0X07,0X7F,0X6F};



 
#int_TIMER0
void  TIMER0_isr(void)  /// display timer ile sürekli burada taranır
{
disable_interrupts(INT_TIMER0);
say++;

switch (say)
{

  case 5:
   output_low (SEG3COM);
   output_high (SEG0COM); output_b (bir);
  break;
  
  
  case 10:
   output_low (SEG0COM);
   output_high (SEG1COM); output_b (on); 
  break;
  
  case 15:
   output_low (SEG1COM);
   output_high (SEG2COM);output_b (yuz);
  break;
  
  case 20:
   output_low (SEG2COM);
   output_high (SEG3COM); output_b (bin);
say=0;
  //output_low (SEG3COM);
  break;
               
} 

   //enable_interrupts(INT_TIMER0);
   set_timer0(99);
 enable_interrupts(INT_TIMER0);
}




void yaz()  /// displaye yazılacak değer burada ayarlanır
{


      bir = (s % 10);
      on = (s / 10) % (10);
      yuz = (s / 100) % 10;
      bin = (s / 1000) % 10;

      bir = LED_MAP[bir]; 
      on = LED_MAP[on];
      yuz = LED_MAP[yuz];
      bin = LED_MAP[bin];    
      
     

      delay_us (500);

   
}

#ZERO_RAM
void main()
{

   setup_adc_ports(AN0_TO_AN6);
   setup_adc(ADC_CLOCK_DIV_2|ADC_TAD_MUL_2);
   
    setup_timer_0(RTCC_INTERNAL|RTCC_DIV_1|RTCC_8_bit);      
    enable_interrupts(INT_TIMER0);
    enable_interrupts(GLOBAL); 
 set_timer0(99);
    set_adc_channel(5);
   delay_ms(100);
    //s=1216;
    //yaz();
   WHILE (TRUE)
   {
  
  
  
  oku=read_adc();// adc oku
  ................
  ................
  ................
  s=oku;
yaz(); // displaye yazılacak değeri yolla


    


   }
}
mert07