avatar_elektro77

7 Segment Display Kullanımı sorunum...

Başlatan elektro77, 04 Mart 2025, 11:25:58

elektro77

7 segment displayler çok kullandığım bir şey değil ama bir yazılımda ortak anot 7 segment display kullanıyorum. Duruma göre 0 dan 9 a rakam yazdırmak istiyorum.
Fakat displayde doğru şeklilleri oluşturamıyorum. Yardımcı olur musunuz?

Port tanımlarını aşağıdaki şekilde yaptım;
'Pic16f877A
TRISA=%00101111
TRISB=%00011111
TRISC=%10000001
TRISD=%11100000
TRISE=%00000111
PORTA=0
PORTB=0
PORTC=%00110000
PORTD=%00011111
PORTE=0
INDEX     VAR BYTE
SAYI      VAR BYTE
SYMBOL DIGITA    =PORTD.0
SYMBOL DIGITB    =PORTD.1
symbol DIGITC    =PORTD.2
SYMBOL DIGITD    =PORTD.3
SYMBOL DIGITE    =PORTC.4
SYMBOL DIGITF    =PORTC.5
SYMBOL DIGITG    =PORTD.4

Deneme aşamasında ekran yazdırma komutlarını ise aşağıdaki şekilde yaptım;
BASLA:
INDEX=0:GOSUB AL:GOSUB EKRAN
pause 1000
INDEX=1:GOSUB AL:GOSUB EKRAN
pause 1000
INDEX=2:GOSUB AL:GOSUB EKRAN
pause 1000
INDEX=3:GOSUB AL:GOSUB EKRAN
pause 1000
INDEX=4:GOSUB AL:GOSUB EKRAN
pause 1000
INDEX=5:GOSUB AL:GOSUB EKRAN
pause 1000
INDEX=6:GOSUB AL:GOSUB EKRAN
pause 1000
INDEX=7:GOSUB AL:GOSUB EKRAN
pause 1000
INDEX=8:GOSUB AL:GOSUB EKRAN
pause 1000
INDEX=9:GOSUB AL:GOSUB EKRAN
pause 1000
goto basla
AL:    LOOKUP INDEX,[64,121,36,48,25,18,2,120,0,16,127],SAYI :RETURN
       
EKRAN:
      DIGITA=SAYI.0:DIGITB=SAYI.1
      DIGITC=SAYI.2:DIGITD=SAYI.3
      DIGITE=SAYI.4:DIGITF=SAYI.5
      DIGITG=SAYI.6
      RETURN
"Eğer bir konuyu öğrenmek istiyorsan o konunun öğretmeni ol; daha iyi öğrenmek istiyorsan o konuda bir kitap yaz; daha da iyi öğrenmek istiyorsan yazdığın kitabi oku"

ete

#1
Programda bir kusur aramak gerekirse bu yazdıklarının dışında olması gerekenler eksik gözüküyor.
Mesela;
#CONFIG
  __config _BODEN_OFF  & _PWRTE_ON & _WDT_OFF & _LVP_OFF & _XT_OSC
#ENDCONFIG
DEFINE OSC 4
CMCON=7
ADCON1 = 7
ayrıca basla satırından evvel de 200 ms lik bir gecikme eklenmesi gerekir. Bu gecikme olmadan da çalışır ancak gerçek devrede bazı segmentler yanlış değer alabilir. Gecikme işlemci içindeki registerlerin ayarlanması için gereklidir. Yoksa açılışta rastgele değer alırlar.

Bunların dışında belkide şemayada bir göz atmakta yarar olabilir. Mesela, MCLR ucuna bir pullup bağlanması gerekir. Segment beslemeleri 180-220 ohm direnç üzerinden yapılmalıdır.
Ortak anot ucu direk 5V ta bağlanmalıdır.
Anlayacağın program doğru ve bu program segmentlere sayıları yazdırır.

Ete

elektro77

Onlar ilk koyduğum şeyler ve benim bir standardım oldu zaten. Programı yazmaya başlar başlamaz onları koyuyorum. Buraya yapıştırmamışım. Tam program aşağıdaki gibidir. Ama sorun hala devam ediyor. Şemada da bir sorun görünmüyor. Simülasyonda deniyorum.
İndex=0 komutunda ekranda sadece f segmenti yanıyor.
index=1 komutunda hiç bir segment yanmıyor.
index=2 ve 3 komutunda g segmenti yanıyor.
index=4-5-6 komutunda g ve f segmenti yanıyor ve bu şekilde anlamsız şekiller devam ediyor.

#CONFIG
 __CONFIG _CP_OFF & _WRT_256 & _CPD_OFF & _LVP_OFF & _BODEN_OFF & _PWRTE_ON & _WDT_OFF & _XT_OSC
#ENDCONFIG
DEFINE OSC 4
ADCON0=%01000000
ADCON1=%10000010
CMCON=7
TRISA=%00101111
TRISB=%00011111
TRISC=%10000001
TRISD=%11100000
TRISE=%00000111
PORTA=0
PORTB=0
PORTC=%00110000
PORTD=%00011111
PORTE=0
INDEX     VAR BYTE
SAYI      VAR BYTE
SYMBOL DIGITA    =PORTD.0
SYMBOL DIGITB    =PORTD.1
symbol DIGITC    =PORTD.2
SYMBOL DIGITD    =PORTD.3
SYMBOL DIGITE    =PORTC.4
SYMBOL DIGITF    =PORTC.5
SYMBOL DIGITG    =PORTD.4
pause 300
BASLA:
INDEX=0:GOSUB AL:GOSUB EKRAN 
pause 1000
INDEX=1:GOSUB AL:GOSUB EKRAN
pause 1000
INDEX=2:GOSUB AL:GOSUB EKRAN
pause 1000
INDEX=3:GOSUB AL:GOSUB EKRAN
pause 1000
INDEX=4:GOSUB AL:GOSUB EKRAN
pause 1000
INDEX=5:GOSUB AL:GOSUB EKRAN
pause 1000
INDEX=6:GOSUB AL:GOSUB EKRAN
pause 1000
INDEX=7:GOSUB AL:GOSUB EKRAN
pause 1000
INDEX=8:GOSUB AL:GOSUB EKRAN
pause 1000
INDEX=9:GOSUB AL:GOSUB EKRAN
 
GOTO BASLA
       
AL:    LOOKUP INDEX,[64,121,36,48,25,18,2,120,0,16,127],SAYI :RETURN
       
EKRAN:
      DIGITA=SAYI.0:DIGITB=SAYI.1
      DIGITC=SAYI.2:DIGITD=SAYI.3
      DIGITE=SAYI.4:DIGITF=SAYI.5
      DIGITG=SAYI.6
      RETURN
"Eğer bir konuyu öğrenmek istiyorsan o konunun öğretmeni ol; daha iyi öğrenmek istiyorsan o konuda bir kitap yaz; daha da iyi öğrenmek istiyorsan yazdığın kitabi oku"

ete

Basitçe devre çizdim ve senin verdiğin programla sorunsuz çalışıyor.
Ete

elektro77

Segment dirençlerini simülasyonda koymanın gerekli olmadığını sanmıştım. Meğer gerekliymiş. Sorun çözüldü.
Direnç koymam gerektiğini yazdığınızda da gerçek devreden bahsettiğinizi düşündüm.
Çok teşekkür ederim.
"Eğer bir konuyu öğrenmek istiyorsan o konunun öğretmeni ol; daha iyi öğrenmek istiyorsan o konuda bir kitap yaz; daha da iyi öğrenmek istiyorsan yazdığın kitabi oku"

Powered by EzPortal