S

16f886

Başlatan sahin, 12 Aralık 2013, 18:58:45

sahin

devrenin ısıs dosyasını paylaştım 0- 99 sayıcı programlamasını nasıl yaparım

sahin

hoca bize 9 a kadar sayıcıyı göstermişti

ete

Gerçek hayatta hiç bir şekilde çalışamıyacak olan şemaları şema diye kullanmamak gerekir. Bu bilmeyenleri yanlış yönlendirir. Senin şemanda onlardan birisi.
Çalışmayacak tarafı ortak uçların direk pic pininden sürülüyor olmasıdır. Bu hali ile o pin displayde 8 rakamı gösterildiğinde 7 segmenti besleyecek kadar GND sağlamak zorundadır. Buda yaklaşık her segment 10 ma akım çekse 70 mal akım demektirki pic bunun ancak 25 ma kısmını sağlayabilir. Bu durumda o pin hemen bozulur. Böyle durumları önlemek için ortak uçlar birer transistörle sürülmelidir. Transistör bir kaç mili amper ile sğrğlğrken transistör displayin ortak ucunu rahatlıkla sürecek akımı sağlar.
Şema bu hali ile simulasyon amaçlı kullanılabilir.
Gelelim sayaç programına.
İşe bir SAYAC değişkeni tanımlama ile başlayalım. Sayac limitimiz 100 olacağına göre Byte değişkeni bunu sağlayacaktır.
SAYAC VAR BYTE
Elimizde iki adet display olacağına göre sayac değerinin birler hanesini sağdaki displayde (DISP_1) ,onlar hanesini ise soldaki displayde göstereceğiz.

Programı kolayca anlamak ve programlarken kolaylık sağlamak üzere ortak uç süren uçlara isim vermemiz gerekiyor.
SYMBOL SAG=PORTB.4
SYMBOL SOL=PORTB.5
şeklinde isim verdik.
Bir değişken içinde kayıtlı sayının birler hanesini çekip almak DIG isimli komut ile sağlanmaktadır. Yanında yer alan parametre hangi dijit'in alınacağını belirler. Parametre sıfır olur ise birler hanesini, 1 olur ise onlar hanesini devam edersek 2 olursa yüzler hanesini alabilirsiniz.
Önce BIRLER isimli değişkenimizi tanımlayalım
BIRLER VAR BYTE
Sonra onlar hanesini saklayacağımız değişkeni tanımlayalım
ONLAR VAR BYTE
Şimdi Sayac değişkenimizden birler ve Onlar hanesini hanesini çekip alalım,
BIRLER=SAYAC DIG 0
ONLAR=SAYAC DIG 1
Şimdi elimizde displaylerde gösterilecek rakamlar mevcut. Ancak bunların 7 segment karşılıklarını bulmamız ve onları displaylere vermemiz gerekir. 7 segment karşılığı ne demek diye soracak olursanız,
0 Rakamını displayde gösterebilmek için a-b-c-d-e-f segmentlerini aktif (set) etmek gerekir. Bunu sayı olarak düşünürsek 7segment=%xgfedcba şeklinde bitler sıralanır. Bu durumda sıfır sayısı için displaye %00111111
sayısını vermemiz gerekir ki bu sayının desimal değeri 63 dür.
Benzer şekilde displayde 1 sayısını gösterebilmek için segmentlerden b ve c segmentlerini set etmek gerekir.
Bunu sayı şeklinde gösterirsek %00000110 şeklinde yazabiliriz buda desimal olarak 6 sayısına eşittir.
Gösterilecek sayıların 7 segment karılıklarını sayı değerine bağlı olarak bir LOOKUP tablosundan almak en akıllıca iş olacaktır. LOOKUP tablosu şöyle çalışır.
LOOKUP Index,[63,6,91,79,102,109,125,7,127,111],SAYI
Index değişkeni gösterilmesi amaçlanan sayının hane değeridir. SAYI ise onun 7 segment karşılığıdır. Örnekle açıklayalım. ELimizdeki sayı 23 olsun. Birler=3 ve Onlar=2 olacaktır.
Şimdi birler hanesi için elimizdeki rakam 3 sayısı olup bunun 7 segment karşılığını tablodan bulalım.
Index=Birler:GOSUB ARA:Bir_Karsilik=SAYI
Index=Onlar:GOSUB ARA:On_karsilik=SAYI
şeklinde iki satır ile ekrana verilecek değerleri tablodan almış oluruz. Örneğimize bakacak olursak Birler=3 idi.
Index=Birler olunca Index=3 olacaktır. Bu durumda tabloda 0-1-2-3 nolu eleman (79) alınıp SAYI isimli değişkene yerleştirilecektir. Benzer şekilde Index=2 olunca SAYI=91 olarak geri dönecektir.
ARA:
        LOOKUP Index,[63,6,91,79,102,109,125,7,127,111],SAYI:RETURN

Şimdi elimizde displaylere verilecek sayılar hazır hale gelmiş oldu. Artık bunları displaylere vermek kalıyor.
Bu işte de temel prensip şöyledir.
Ortak uç sürücüleri kapatılıp sayı segmentlere verilir.Sonra verilen sayı hangi haneye ait ise ona ait ortak uç aktif edilip yaklaşık 1-3 ms süre ile aktif halde tutulur.
Sonra yine ortak uç sürücüleri kapatılıp diğer haneye ait karşılık segmentlere verilir ve ona ait ortak uç sürülüp yine bir kaç ms aktif tutulur.
İşlem bu şekilde sürekli tekrarlanır.
Şimdi işin bu kısmına ait kodu yazalım.
EKRAN:
            PORTC=Bir_Karsilik  'Birler hanesinde gösterilecek sayı karşılığını segmentlere verdik
            SAG=1 'sağdaki displayi aktif hale getirdik. Böylece gösterilecek sayı ekranda belirdi
            Pause 2 '2 ms bekledik
            SAG=0  'displayi kapattık
            PORTC=On_Karsilik  'bu seferde onlar hanesi değerini displaye verdik
            SOL=1
            Pause 2
            SOL=0
            Return
Artık geriye yalnızca rakamların belirli aralıklarla artırılması işi kalıyor.
Bunuda SAYAC=SAYAC+1 şeklinde yapıyoruz.
SAYAC değerimiz 99'dan büyük olmaması gerekiyor. O halde sınır koymamız gerekecek.
IF SAYAC=100 then SAYAC=0 olsun diyelim.
Bundan sonra biraz gecikme vermek gerekir. Ancak burada 2ms den uzun bir gecikme verirsek ekranda titreme olur. Bunu önlemek için Döngü şeklinde gecikme yaratıp arada Gosub Ekran dememiz lazımki kesintisiz görüntü sağlanabilsin.
Bu duurmda birde döngü değişkeni tanımlamak gerekiyor. Onuda şöyle yapalım
I VAR BYTE
vede döngümüz;
FOR I=0 to 255
   GOSUB EKRAN
   PAUSEUS 100
   PAUSEUS 100
NEXT
şeklinde yapılabilir.

Şimdi işin nasıl yapılacağını parçalar halinde açıklamış oldum. Bütün iş bunları bir program haline getirmek kalıyor. Bunuda sizden bekliyorum.

Ete
 



sahin

saolun ete hocam biraz uğraşıyım bilmediğim terimler var hoca bize daha göstermedi

sahin

#4
SYMBOL SAG=PORTB.4
SYMBOL SOL=PORTB.5 
Bir_Karsilik var byte
On_Karsilik var byte
Index var byte
SAYI var byte
SAYAC VAR BYTE
BIRLER VAR BYTE
ONLAR VAR BYTE
I VAR BYTE       
ANSEL=0:ANSELH=0:TRISC=0 

BIRLER=SAYAC DIG 0
ONLAR=SAYAC DIG 1
LOOKUP Index,[$3F,$06,$5B,$4F,$66,$6D,$7D,$07,$7F,$6F],SAYI
  Index=Birler:GOSUB ARA:Bir_Karsilik=SAYI
  Index=Onlar:GOSUB ARA:On_karsilik=SAYI
ARA:
LOOKUP Index,[$3F,$06,$5B,$4F,$66,$6D,$7D,$07,$7F,$6F],SAYI:return

EKRAN:
PORTC=Bir_Karsilik 
SAG=1
Pause 2 '2 ms bekledik
SAG=0  'displayi kapattık
PORTC=On_Karsilik
SOL=1
Pause 2
SOL=0
Return
SAYAC=SAYAC+1   
IF SAYAC=100 then SAYAC=0
pause 2
GOsub ekran
FOR I=0 to 255
GOSUB EKRAN
PAUSEUS 100
PAUSEUS 100
NEXT
hocam biraz yardım edermisiniz nerde yanlışımvar bikaç kere değiştirdim

ete

#5
Bi rprogram nasıl yazılır en ufak bir fikrin yok aslında. Burada derslerde yayınlamışım ama onlara bakmaya bile üşeniyorsun anlaşılan.
Bir pogram BASLA ise GOTO BASLA arasında yazılmış komutları sırası ile yerine getirir.
Bu komutlar arasında GOSUB ETIKET şeklinde bir komut görünce ETIKET adındaki (yada etiket yerine ne yazıyor ise) satıra gider ve orada RETURN görünceye kadar olan bütün komutları yerine getirip RETURN görüncede ayrıldığı yere yani GOSUB ETİKET den bir sonraki satıra yada komuta geri döner.

Yazdıklarına bir bak çorba gibi yazmışsın. Biraz insan çalışır öğrenmeye gayret eder. Bu bilgiler sana hayatında lazım olacak. Yalnızca mezun olmak yeterli değilki. Yarın bir gün bunları çalıştığın yerde kullanacaksın.

Her neyse ben yinede çabuk öğrenirsin diye programın doğrusunu veriyorum. Umarım bu bilgiler kafanda bir yerlerde kalır.

Ete


@ DEVICE PIC16F886
@ DEVICE PIC16F886, WRT_OFF
@ DEVICE PIC16F886, BOR21V
@ DEVICE PIC16F886, LVP_OFF
@ DEVICE PIC16F886, FCMEN_ON
@ DEVICE PIC16F886, IESO_OFF
@ DEVICE PIC16F886, BOD_OFF
@ DEVICE PIC16F886, CPD_OFF
@ DEVICE PIC16F886, PROTECT_OFF
@ DEVICE PIC16F886, MCLR_OFF
@ DEVICE PIC16F886, PWRT_ON
@ DEVICE PIC16F886, WDT_ON 
@ DEVICE PIC16F886, INTRC_OSC_NOCLKOUT
define OSC 4
PORTA=0:TRISA=%00000000
PORTB=0:TRISB=%00000000
PORTC=0:TRISC=0
OSCCON=%01101110 'dahili osc 4Mhz e ayarlandı
ANSEL= 0 'A portu analog pinler iptal
ANSELH=0  'B portu Analog pinler iptal
CM1CON0=0 'C1 Komparatör iptal
CM2CON0=0 'C2 Komparatör iptal
WPUB=0  'PORTB pullup lar kapalı

SYMBOL SAG=PORTB.4
SYMBOL SOL=PORTB.5
Bir_Karsilik var byte
On_Karsilik var byte
Index var byte
SAYI var byte
SAYAC VAR BYTE
BIRLER VAR BYTE
ONLAR VAR BYTE
I VAR BYTE       


Pause 300

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:
PORTC=Bir_Karsilik
SAG=0
Pause 2 '2 ms bekledik
SAG=1  'displayi kapattık
PORTC=On_Karsilik
SOL=0
Pause 2
SOL=1
Return


Not: yukarıda işin mantığını anlatırken ekran kısmında transistörle sürme şekline göre anlatmışım.
Displaylerin ortak uçları direk PortB.4 ve PortB.5 pinlerine bağlandığı için ilgili displayin aktif olması için pinden LOW çıkarmak gerekiyor. Bu nedenle aktive etme bit değeri SAĞ=1 değil SAĞ=0 olacaktır.
Bu nedenle onları değiştirdim.


yanuma

hocam teşekkür ederim aslında bende öğrenmiş oldum  ve öğreniyorum'da halen

Powered by EzPortal