7segment tarama yöntemi ile menü olusturma

Başlatan Ömerkaya, 29 Mayıs 2021, 16:59:43

Ömerkaya

merhaba öncelikle 7segment tarama ile menü olusturmaya calısıyorum bu kodları baska nasıl yazabilir yardımcı olurmusunuz.


Case 1

    For I=0 To 100
    PORTD =%11001110 :GoSub  display_1_tara
    PORTD =%11111100 :GoSub  display_2_tara ;0
    PORTD =0         :GoSub  display_3_tara
    PORTD =0         :GoSub  display_4_tara
    Next I
       
Case 2

    For I=0 To 100
    PORTD =%11001110 :GoSub  display_1_tara
    PORTD =%01100000 :GoSub  display_2_tara ;1
    PORTD =0         :GoSub  display_3_tara
    PORTD =0         :GoSub  display_4_tara
    Next I

     
Case 3

    For I=0 To 100
    PORTD =%11001110 :GoSub  display_1_tara
    PORTD =%11111100 :GoSub  display_2_tara ;2
    PORTD =0         :GoSub  display_3_tara
    PORTD =0         :GoSub  display_4_tara
    Next I

ete

Kullandığın yöntemde bir çok kusur var. Yanlı demiyorum kusur diyorum.
7 segment sürücüsünde segmentler bir port dan çıkan bilgi ile sürülecek ise segment-A,  PORTX.0 pinine denk getirilir Böylece her bir pine denk gelen bitleri teker teker vermektense PORTX=xxxx diyerek bütün segmentleri sürmüş olursun. Senin yaptığında aynı ama portu otomatik kullanamazsın. Ne yazacak isen PORTD=xxxxxxx şeklinde manuel olarak vermek zorunda kalırsın. Daha basit anlatım ile, o porta sayac değerini verecek olsan nasıl saydıracaksın. Sürekli olarak 1 ise şunu ver 2 ise şunu ver gibi belirleme zorunluluğun olur.
Burada temel fikir şöyle olmalı. PORTX.0 pinine Segment-A, PORTX.6 pinine Segment-G denk gelecek şekilde segment bağlantıların olmalı.
Her bir sayının 7 segment karşılığı bir lookup tablosunda tutulup sayıya göre 7 segment karşılığı oradan okunup porta direk yazılmalı. Böylece sistem otomatikleşmiş olur.
Gelelim tarama işine. Bu işide otomatikleştirmek istersen ortak uçları tarayarak her 1ms de bir değiştiren ve hangi ortak uç sürülecek ise ona ait 7 segment bilgisini otomatik verdiren bir kesme alt programı düşünmen gerekir. Böylece hem işin otomatikleşmiş olur hemde yazacağın kod azalmış olur.

Örnek verecek olursak, Diyelimki PORTD ye 7 segmentleri benim dediğim gibi bağladın.
Kesme alt programında, her 1 ms de bir kesme oluşarak şu kodu çalıştırmalısın.
SIRA=SIRA+1:IF SIRA>3 then SIRA=0  (0-1-2-3 ve 4 olunca yeniden sıfır nolu ortak uç sürülecek)
IF SIRA=0 THEN
  DIS4=0
  PORTD=DISPLAY1  
  DIS1=1
ENDIF

IF SIRA=1 THEN
  DIS1=0
  PORTD=DISPLAY2
  DIS2=1
ENDIF

IF SIRA=2 THEN
  DIS2=0
  PORTD=DISPLAY3
  DIS3=1
ENDIF

IF SIRA=3 THEN
  DIS3=0
  PORTD=DISPLAY4
  DIS4=1
ENDIF

TMR0=xxxx  '1 ms için yeniden yükleme değeri verilmeli
...
...

Bunu hazırladıktan sonra menü işi dahada basitleşmiş olacaktır.
Ekranda sayıların yanısıra harfleride kullanacağın için kaç harf var ise onlara ait 7 segment karşılığını lookup tablosunda rakam değerlerinden sonra yerleştirmelisin. Bu şekilde olursa ilk 0-9 aralığı sana rakamları, 10=a , 11=y , 12=r yi verecek şekilde yerleşmiş olur. Yada o şekilde yerleştirirsin.
        LOOKUP D,[63,3,107,171,184,173,237,138,239,175],SAYI
şeklindeki kod sana 0-9 arası 7 segment değerlerini verir.
        LOOKUP D,[63,3,107,171,184,173,237,138,239,175,xxx,xxx,xxx],SAYI şeklinde yerleştirme sonucu 10cu sıraya A, 11 ci sıraya Y, 12.ci sıraya R nin değerlerini yazarsan bu değerleri de kolaylıkla alıp ilgili registerlere yerleştirebilirsin.
Bunda örnek vereyim.
Ekranda ayar yazdırmak için şunu yapman yeterli,
D=10:GOSUB AL (lookup) :DISPLAY1=SAYI
D=11:GOSUB AL :DISPLAY2=SAYI
D=10:GOSUB AL:DISPLAY3=SAYI
D=12:GOSUB AL:DISPLAY4=SAYI
şeklinde yerleştirdiğin anda ekranda ayar kelimesini görmüş olursun. Çünki tarama kesmeye bağlı olarak çalışıyor ve 7 segmentlere ilgili değerler yerleşir yerleşmez onları ekranda görmüş olursun.
 Ete
   

Ömerkaya

Hocam sağolun dediğiniz gibi yaptım geçişlerde butona bastığım sürede program duruyor.uzun süre uğraştım ama bundan ileriye gidemedim. 

Ömerkaya

Ete hocam bu sekilde yaptım eksiklerim illaki vardır ilginiz için teşekkür ederim.dosyayı ekliyorum

ete

#4
Program rayına oturmuş gözüküyor. Anlattıklarımı doğru şekilde uygulamışsın.
Eksikler elbette olabilir ama kullanırken görülebilir. Bir bakışta şu eksik yada fazla denilecek durumda değil. Hatta eksik yok gibi gözüküyor. Ama bu hali ile program her şekilde geliştirilebilir. Çünki pragram iskeleti sağlam oldu.
Kolay gesin.
Ete

not: Pic işlemcilerde B portu özeldir. Bu port genelde dışarıdan buton anahtar vs bağlanması için ayrılmıştır. Bu amaçla B portu pinleri içeriden dahili Pullup dirençlere sahiptir. Bunlar yazılımla aktif edilir ve genelde butona basılınca portpinine LOW tatbik edilir. Sen ise tersi yöntem kullanıp port pinlerine harici pull-down dirençleri bağlamışsın. Tasarımda genel amaç mümkün olan en az malzeme ile tasarımı yapmaktır. Madem adamlar sana bir özellik sunmuş bunun tersine gitmenin bir anlamı yok değilmi. Buton bağlantını değiştir bence. Dahili pulluplar için OPTION_REG.7 bitini LOW yapman yeterlidir. Ayrıca ilgili pinin giriş pini olması da gereklidir.

Devreni gerçek anlamda kullanıyormuş gibi çizmelisin. Çizdiğin şekil tamamen simulasyon amaçlıdır. Devre basit iken sorun olmaz gerçeğinde belki doğrusunu yaparsın ama hata takibi açısından o devre doru çizilmelidir. Eksikler yada kusurlar şunlar;
1. Segmentlerin akım sınırlama dirençleri eksik 220 ohm her birine eklenmelidir.
2. Ortak uçları ya birer transistör ile sürmek yada oraa ULN2803 gibi bir transistör paketi ekleyip onunla sürmen gerekir tabiiki NOT elemanlarını oradan kaldıracaksın.
3. Unutmamak adına devrenin kristal yada rezonatörünü de devreye eklemen doğru olur.

Ömerkaya

teşekkürler hocam söylediklerini dikkate alaçagım.devreyi deneme kartında deneyerek yapıyorum deneme kartının tasarıma göre port çıkışlarını uyarladım.pcb kart tasarımı yaparken söylediklerine göre tasarlayıp inşallah forumda paylaşırım hocam.
 

elektro77

#6
Ömer arkadaş bu konuda gayet başarılı gibi. Tebrik ederim. Konunun takipçisiyim... Kolay gelsin
"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"

Ömerkaya

Alıntı yapılan: elektro77 - 01 Haziran 2021, 10:55:10Ömer arkadaş bu konuda gayet başarılı gibi. Tebrik ederim. Konunun takipçisiyim... Kolay gelsin
Teşekkürler elektro77 devreyi geliştirdikçe forumda paylaşım yapacağım hem kendime(ögrenme açısından)hemde bu işi yapan arkadaşlara faydalı olur inşallah.

Ömerkaya

Herkese iyi günler devreye buzzer ekledim,girilen değerleri kayıt etmesi için hafızaya almayı ekledim P2. programda
arrtır butonuna basıldıgında led veya röle aktif oluyor azalt butonuna basıldığında led veya röle pasif oluyor.programı ve proteus çizimini ekliyorum inşallah birilerine faydalı olur bende yeni yeni ögreniyorum :) deneme kartında çalışmasında bir proplem çıkmadı güzel çalışıyor.sürekli proteusta ve deneme kartında deneyerek yapıyorum.

elektro77

#9
Son yazılımına eksik arayarak baktım ve kendi bilgimce bir eksik buldum. Bilmene rağmen  Saat ve dakika ayarlarında, azalt butonuna sınır değeri koymayı unutmuşsun.
If AZALT=1 Then 
     SAAT=saat-1
      EWrite 10,[SAAT] 
        EndIf

doğrusu şu olmalıydı:

If AZALT=1 Then 
     SAAT=saat-1
If SAAT= 255 Then SAAT=0
      EWrite 10,[SAAT] 
        EndIf

Başka eksikler de var gibi ama Ete Hocam daha iyi bilir. Fakat yeni başlayan birine göre çok başarılı olduğunu söylemeliyim
"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

Hata , kusur ve eksikliği bir birlerinden ayırt etmeliyiz. Her şey hata değildir. Bulduğun şey bir eksik unsurdur ama programın çalışmasını etkilemez yanlızca görsel olarak etkiler programı. Bir program yazarken önce çerçeve olarak çalışmasını amaçlarsın. Sistem çalıştıktan sonra görsel kusur ve eksiklikleri tamamlayıp sona doğru gidersin. Elbette ideal olan en baştan programı kusursuz şekilde yazıp bitirmektir. Ama hiç bir zaman kusursuz program yazmak mümkün değildir.
Pek çok kusur yada eksikliği de program çalışmadan anlayamazsın. Her şey sistem çalıştıktan sonra ortaya dökülür. Bu nedenle iyi program 6 ayda yerine oturur diye bir laf üretmişler. Gerçekte de böyle oluyor. İyi programcı işte bu noktada belli oluyor. Genelde iyiler daha az kusur ve eksik bırakıyorlar. Ama bu bir ölçü değil. Bana göre iyi programcı mantıksal olarak en iyi algoritmaları düşünebilen kişilerdir.

Ete

elektro77

Alıntı yapılan: ete - 02 Haziran 2021, 11:08:32Hata , kusur ve eksikliği bir birlerinden ayırt etmeliyiz. Her şey hata değildir. Bulduğun şey bir eksik unsurdur ama programın çalışmasını etkilemez yanlızca görsel olarak etkiler programı. Bir program yazarken önce çerçeve olarak çalışmasını amaçlarsın. Sistem çalıştıktan sonra görsel kusur ve eksiklikleri tamamlayıp sona doğru gidersin. Elbette ideal olan en baştan programı kusursuz şekilde yazıp bitirmektir. Ama hiç bir zaman kusursuz program yazmak mümkün değildir.
Pek çok kusur yada eksikliği de program çalışmadan anlayamazsın. Her şey sistem çalıştıktan sonra ortaya dökülür. Bu nedenle iyi program 6 ayda yerine oturur diye bir laf üretmişler. Gerçekte de böyle oluyor. İyi programcı işte bu noktada belli oluyor. Genelde iyiler daha az kusur ve eksik bırakıyorlar. Ama bu bir ölçü değil. Bana göre iyi programcı mantıksal olarak en iyi algoritmaları düşünebilen kişilerdir.

Ete

Cevabınıza istinaden yukarıdaki gönderimi yeniden düzenledim hocam. Uyarınız için teşekkür ederim. Arkadaş iyi programcı olma yönünde ilerliyor maşAllah.
"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"

Ömerkaya

ete hocam öncelikle merhaba.
 elektro77 katkıların için teşekkür ederim sağolasın.önerini dikkate aldım ve uyguladım.
display sayısını 8 adete çıkarttım pr.00,pr.01,pr.02 seklinde menüler oluşacak sekilde üst 4 displeyde alt 4 displeyde programlanaçak baslığın değerleri degişiyor. umarım herkese faydalı olur.

elektro77

#13
Aslında tuşlar için Ete Hoca'mın aşağıdaki mükemmel düşünülmüş algoritmasını kullansan çok iyi olur.
Aşağıdaki kodlar tek tek artırıp azalttığı gibi uzun süreli basılı tutulunca hızlı artırıp azaltabiliyor. Simülasyonda da bir akıcılık sağlayabilir. Ben senin programına göre bir uyarlama yaptım. Sen sadece  'Z' ve 'ekle' değişkenleri word ve byte olarak  tanımlayıp aşağıdaki kodları kopyala yapıştır yapınca çalışır. Benim proton versiyonum "dig 1" gibi tanımlamaları hata görüyor. Galiba versiyonundan. O yüzden kodları denemeden gönderdim. Konu 7 segment ama ben galiba tuşlara kafayı taktım. :)
Birde 4 digit ile devam etseydin daha kullanışlı bir cihaz olurdu düşüncesindeyim. Çünkü piyasadaki birçok cihaz 4 digitlidir. 8 digit çok fazla tercih edilmiyor.
Belki tuş sayısını bir artırabilirsin. Örneğin menü ve seç tuşlarını ayrı ayrı kullansan daha ergonomik olabilir. Menüde dolaşırken hangisi seçilirse onun değeri ekranda görünür ve ayarlanır.
           IF YUKARI=1 THEN
              Z=300:EKLE=0
              WHILE YUKARI=1
                saat=saat+1
                IF saat=24 THEN saat=1
                EKLE=EKLE+1:IF EKLE=5 THEN Z=50              
                PAUSE Z
              WEND              
            ENDIF
                
            IF ASAGI=1 THEN
                Z=300:EKLE=0
                WHILE ASAGI=1
                  saat=saat-1
                  IF saat=0 THEN saat=24
                  EKLE=EKLE+1:IF EKLE=5 THEN Z=50            
                  PAUSE Z
                WEND
            ENDIF
"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"

Ömerkaya

elektro77 merhaba butona kısa süreli bastığımda sayma yapıyor uzun süre basarsam  while ,wend taramayı durduruyor. sanırım. birde kod yükleme yerini bulamadım buraya bırakıyorum.

     If ARTIR=1 Then
              DELAYS=150:EKLE=0
              While ARTIR=1
                SAAT=saat+1
                EWrite 10,[SAAT]
                If SAAT=24 Then SAAT=1
                EKLE=EKLE+1:If EKLE=5 Then DELAYS=50             
                DelayMS DELAYS
              Wend             
            EndIf
               
            If AZALT=1 Then
                DELAYS=150:EKLE=0
                While AZALT=1
                  SAAT=saat-1
                  EWrite 10,[SAAT]
                  If SAAT=0 Then SAAT=24
                  EKLE=EKLE+1:If EKLE=5 Then DELAYS=50           
                  DelayMS DELAYS
                Wend
            EndIf

Powered by EzPortal