0-99 sayıcı 16f628a

Başlatan muyat, 18 Aralık 2019, 11:34:14

muyat

16f628a 0-99 sayıcı ekledim..Devrenın isis dosyası ekte...
fakat simulasyonda displayde çalışması gerektigi gibi çalışmıyor hata nerde hocam?

****************************************************************
'*  Name    : Sayıcı.BAS                                      *
'*  Author  : [ETE]                                             *
'*  Notice  : Copyright (c) 2005 [ERO]                          *
'*          : All Rights Reserved                               *
'*  Date    : 17.05.2005                                        *
'*  Version : 1.0                                               *
'*  Notes   :                                                   *
'*          :                                                   *
'****************************************************************
@ __config _BODEN_ON & _BOREN_ON & _CP_ON & _DATA_CP_ON & _PWRTE_ON & _WDT_ON & _LVP_OFF & _MCLRE_OFF & _INTRC_OSC_NOCLKOUT 


CMCON=7    '16F628 de komparatör pinleri iptal hepsi giriş çıkış
DEFINE OSC 4 
PortA=0
TrisA=%00000000
PortB=0
TrisB=%00000000
SYMBOL SAG=PORTA.3
SYmBOL SOL=PORTA.2

SAYI     var byte
BIRLER   VAR BYTE
ONLAR    VAR BYTE
SAYAC VAR BYTE
Bir_Karsilik var byte
On_Karsilik var byte
Index var byte
I VAR BYTE

PORTB=0
SAYI=0
'--------------------------------------------------

PAUSE 200


BASLA:
BIRLER=SAYAC DIG 0
ONLAR=SAYAC DIG 1



      Index=Birler
      GOSUB ARA
      Bir_Karsilik=SAYI
      Index=Onlar
      GOSUB ARA
      On_karsilik=SAYI
      
      SAYAC=SAYAC+1   
      
      IF SAYAC=100 then SAYAC=0
      GOsub ekran
      FOR I=0 to 255
        GOSUB EKRAN
      NEXT 
      GOTO BASLA

ARA:
LOOKUP Index,[$3F,$06,$5B,$4F,$66,$6D,$7D,$07,$7F,$6F],SAYI:return

EKRAN:
PORTB=Bir_Karsilik 
SAG=0
Pause 2 '2 ms bekledik
SAG=1  'displayi kapattık
PORTB=On_Karsilik
SOL=0
Pause 2
SOL=1
Return
      GOTO BASLA
      END
                  

ete

#1
Ekran kullanım şeklin yanlış.
Aşağıdakini bir dene istersen

#CONFIG
 __config _BODEN_ON & _BOREN_ON & _CP_ON & _PWRTE_ON & _WDT_ON & _LVP_OFF & _MCLRE_OFF & _INTRC_OSC_NOCLKOUT 
#ENDCONFIG

CMCON=7    '16F628 de komparatör pinleri iptal hepsi giriş çıkış
DEFINE OSC 4 
PortA=0
TrisA=%00000000
PortB=0
TrisB=%00000000
SYMBOL SAG=PORTA.3
SYmBOL SOL=PORTA.2

SAYI    var byte
BIRLER  VAR BYTE
ONLAR    VAR BYTE
SAYAC VAR BYTE
Bir_Karsilik var byte
On_Karsilik var byte
Index var byte
I VAR BYTE
W VAR WORD

PORTB=0
SAYI=0
'--------------------------------------------------

PAUSE 200


BASLA:
      BIRLER=SAYAC DIG 0
      ONLAR=SAYAC DIG 1  
      Index=Birler
      GOSUB ARA
      Bir_Karsilik=SAYI
      Index=Onlar
      GOSUB ARA
      On_karsilik=SAYI
      
      SAYAC=SAYAC+1  
      
      IF SAYAC=100 then SAYAC=0
      GOsub ekran
      GOSUB DELAY
      GOTO BASLA

ARA:
LOOKUP Index,[$3F,$06,$5B,$4F,$66,$6D,$7D,$07,$7F,$6F],SAYI:return

EKRAN:
      SAG=0:SOL=0
      PORTB=Bir_Karsilik      
      SAG=1
      Pause 2 '2 ms bekledik
      SAG=0  'displayi kapattık
      
      PORTB=On_Karsilik
      SOL=1
      PAUSE 2
      SOL=0
Return

DELAY:
FOR W=0 TO 50
  GOSUB EKRAN
NEXT
RETURN  
      END

Hatta ekran kısmını şöyle yapsan belkide daha kararlı görüntü alırsın.

EKRAN:
      PORTB=Bir_Karsilik      
      SAG=1
      Pause 2 '2 ms bekledik
      SAG=0  'displayi kapattık
            
      PORTB=On_Karsilik
      SOL=1
      PAUSE 2
      sol=0
Return

unutma ekrandaki değişiklik yani yeni sayı değeri verilmesi işlemi displayler kapalı iken yapılmalıdır. SAG yada SOL değişkenlerine 1 verilmesi ilgili display'i aktif ediyor. Sıfır verinece de pasif oluyor.

Ete

elektro77

#2
şu an tamda bir sayıcı devresi ile başım belada iken yetişti bu devre.
Ortak anot displayli 4 haneli bir sayıcı devresini ortak katota çevirerek 1-2-3-4 uçlarına NPN transistör ekleyerek sürmeye çalışıyorum bir kaç gündür. Fakat kafayı yemiştim neredeyse.
Bu devre imdadıma yetişti sanki.Resimdeki devrede kullanılan "gerçek devrede olmayacak" yazılı dirençler ne işe yarar. Benim de hatam tamda buymuş meğer. Bu dirençleri kullanmadan simüle etmeye çalışıyordum. Buna benzer bir nota da rastlamadım biryerlerde. Nedir buradaki amaç. Gerçek devrede neden kullanılmayacak.
ikincisi ise:kendi sayıcımda bulunan
PORTB=240 | BIRLER           
LOW PORTB.7                 
PAUSE 1
HIGH PORTB.7
PAUSE 1
Yukarıdaki kodlarda "240" sayısı ve dik çizgi ne anlama geliyor.


"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

İsis de display segmentlerin ortak uçları bir diyot gibi davranıp HIGH - LOW değişiminde olması gereken konuma geçmiyor. Simulasyonu yapan kişiler displayi diyot gibi düşünmüşler yada her ne düşündüler ise sen ortak uçları değiştirsende konumları değişmiyor. Bu nedenle oraya pullup direnci bağlayarak transistör kesime gittiğinde pinin HIGH olması sağlanmış oluyor. Gerçek devrede de olsa sorun olmaz yararı olur aslında. Ama tecrübelerim gerekmediğini gösteriyor. Çünki gerçek devrede mantık çalışıyor. Transistör OFF olursa ortak uçta GND olmayacaktır. Float olur en azından ama HIGH olmaz ve Float olmasıda bizim işimizi görüyor.
PORTB=240 | BIRLER   meselesine gelince ;  "|" işareti OR işlemine ait lojik operatördür. Burada PORTB ye yerleşen sayı 240 sayısı ile BIRLER değişkenindeki sayının OR işlemine tabi tutulduktan sonraki halini yerleştiriyor. Neden OR yapıyoruz onu hatırlamıyorum programa ve devre şemasına bakmak lazım. Gerekiyormuş demekki. Or işlemi sonunda 240 sayısı (%11110000) aslında BIRLER ile toplanıp PORTB ye yazdırılmış oluyor. Diyelimki Birler=7  240 OR 7=247 olur. Buradanda şu sonuç çıkıyor. Sondaki o 4 bit sabit 1 olarak kalmasını istiyoruz demekki ve değişen kısım ilk 4 bit olmuş oluyor.


Ete



muyat

Hocam peki ordaki 50 degerini 250 yaparsak Delaydan sonra ekran etiketine atladıgında pause 2 den 2 adet oldugundan
250X4=1000ms ediyor.
Bu şekilde değiştirme yaparsam birebir normal kol saatinin saniye kısmıyla eş zamanlı süre tamamlanır mı veya ne yapmak gerekiyor?

ete

KOmut gecikmelerini hesaba katmazsan teorik olarak dediğin doğru. Ancak pratikte durum öyle olmuyor maalesef. Süre ayarı o şekilde kesin bir değere denk getirilemez. Yaklaşık değerler elde edersin ana sapmalar kaçınılmazdır.
Tutacağın zamanın önemine bağlı olarak kesme kullanmak veya RTC kullanmak gerekir.

Ete

muyat

Bu arada daha az değişken kullanıp biraz satır sayısını artırmak kendimce daha anlaşılır hale geldiginden bu şekilde yaptım...Bu şekilde de düzgün çalışıyor.

BASLA:
      BIRLER=SAYAC DIG 0
      ONLAR=SAYAC DIG 1  
      

      GOSUB ARABIRLER
      GOSUB ARAONLAR
      
      SAYAC=SAYAC+1  
      
      IF SAYAC=100 then SAYAC=0
      GOsub ekran
      GOSUB DELAY
      GOTO BASLA

ARABIRLER:
LOOKUP BIRLER,[$3F,$06,$5B,$4F,$66,$6D,$7D,$07,$7F,$6F],Bir_Karsilik:return  

ARAONLAR:
LOOKUP ONLAR,[$3F,$06,$5B,$4F,$66,$6D,$7D,$07,$7F,$6F],On_karsilik:return 



EKRAN:
      SAG=0:SOL=0
      PORTB=Bir_Karsilik      
      SAG=1
      Pause 2 '2 ms bekledik
      SAG=0  'displayi kapattık
      
      PORTB=On_Karsilik
      SOL=1
      PAUSE 2
      SOL=0
Return

DELAY:
FOR W=0 TO 15
  GOSUB EKRAN
NEXT
RETURN  
      END

Powered by EzPortal