74hc164

Başlatan sahinler64, 03 Aralık 2012, 22:08:52

sahinler64

HOCAM MERHABA.bir konuda yard1ma ve biraz bilgiye ihtiyac1m var.
simdi hocam normalde her 7 segment display için 1 er adet 74hc595 kullanarak sayici yapmayi basardim.
ama bazi inceledigim devrelerde adamlar 1 tek 74hc164m kullanarak 3 adet 7 segment display sürmüsler.
bu konuda sizden kod konusunda yard1m istiyorum.
sizin 13. ders konunuzuda inceledim, internettede biraz arastirma yaptim fakat pek anlayamadim.
kusuruma bakmazsaniz ve pek vaktinizi almaz ise ufak bir kod örnegi istiyorum.

kesme vs. ile degil.sadece yukari yada asagi saysin yeter hocam.
simdiden tesekkur ederim.
(bu arada pc yeni formatlaninca klevye sorunu oldu kusura bakmayin.)

POWER

#1
3 tabanlı sayıcı için en mantıklısı tarama yöntemini kullanmak.böylece 3 adet transistör ve 16f628 yardımıyla direkt dısplayları sürebilirsin.

ete

Burada çok güzel bir örneğimiz var zaten m
http://etepic.com/index.php/topic,5.0.html
Ete

sahinler64

#3
hocam ilginiz için çok tesekkur edeerim.
ama bu sizin sisteminiz benim için çok profesyonel.yinede çok yardimi oldu.
kesme olusturmadan ben 2 display ve 1 adet 74hc164 kullanarak birseyler yaptim.
ama bir sorunum var. sayi beklerken bir problem yok. ama sayiyi manuel veya otomatik olarak arttirdigimde say1lar gidip geliyor.
acaba normaldede yani pratiktede aynisini yaparmi...

@ DEVICE pic16F628A                      'işlemci 16F628                               
@ DEVICE pic16F628A, WDT_ON              'Watch Dog timer açık
@ DEVICE pic16F628A, PWRT_ON             'Power on timer açık
@ DEVICE pic16F628A, PROTECT_OFF         'Kod Protek kapalı
@ DEVICE pic16F628A, MCLR_ON             'MCLR pini kullanılıyor.
@ DEVICE pic16F628A, INTRC_OSC_NOCLKOUT  'Dahili osilatör kullanılacak
@ DEVICE pic16F628A, BOD_OFF ' düşük gerilimle çalışma,reset yok

TRISA=%00000000         
TRISB=%00000000         
DEFINE OSC 4           
PORTA=0:PORTB=0         
include "modedefs.bas"
CMCON=7    '16F628 de komparatör pinleri iptal hepsi giriş çıkış
SAYAC VAR WORD
X     var byte
RAKAM VAR BYTE
DTA  VAR PORTA.1
CLK  VAR PORTA.0
SAYAC=0:X=0:RAKAM=0
BASLA:
SAYAC=SAYAC+1
IF SAYAC=99 THEN SAYAC=0
PAUSE 500
X=SAYAC DIG 0
GOSUB SAYILAR
SHIFTOUT DTA,CLK,1,[RAKAM]    '1. HANE
HIGH PORTB.1:PAUSEus 2000:X=0:LOW PORTB.1
X=SAYAC DIG 1
GOSUB SAYILAR
SHIFTOUT DTA,CLK,1,[RAKAM]    '2. HANE
HIGH PORTB.0:PAUSEus 2000:X=0:LOW PORTB.0
goto BASLA
SAYILAR:
lookup X,[63,6,91,79,102,109,125,7,127,111,99,57],RAKAM
RETURN
END

ete

Başarılı bir display sisteminde her bir segmentin en azından 1-2 ms yanık kalması gözün aldanması açısından gereklidir.
Bunu ancak kesme ile garanti altına alabilirsin. Kesme kullanmaz isen bazısında fazladan bekler bazısında az bekler böylece display de kaymalar görürsün. Neden kesme kullanmadığını pek anlamadım. Ortada örnek de var. Yapman gereken tek şey oradaki sistemin yalnızca bir sırasını kullanmak olacak idi. Çok kolay aslında ama tercih senin elbette.
Sonuç olarak gerçek devrende de kaymalar görülebilir. Bazıları isisin problemi olarak çıkıyor ortaya ama emin olmak zor.

Ete

sahinler64

HOCAM dedigim gibi. sizin sisteminiz çok iyi fakat benim gibi yeni ba_layan biri için çok profesyonel ve karisik geldi.
cok seymi isteyecegim bilmiyorum ama bu konuda yardim istiyorum.
kesme kullanmayi bilmiyorum. daha öncede kesme ile hiç isim olmadi.
kusura bakmaz iseniz benim programin içinde nerede kesme kullanacagim konusunda yardim edermisiniz.

ete

#6
Programına bakılırsa işin mantığını da anlamamışsın.
Her bir display en fazla 2 ms yanık kalacak diyorum.
Sen araya 500 ms lik gecikme koymuşsun bununla program çalışırmı?
Başla satırından hemen sonrasına bak bakalım. pause 500 var orada .
Bu şu demek her display 500 ms lik aralıklarla çalışıyor. Ekrandaki kopma da o yüzden oluyor zaten.
Bu gecikmeyi kaldırırsan bu seferde program süper hızla sayıyor nasıl durduracaksın ? Yolu var tabiiki ama biraz düşünmek gerekir. Oraya Pause 500 koyacağına 1000'e kadar sayan bir başka değişken koy ve değişken değeri 1000 olunca
SAYAC=SAYAC+1 yapsın. Kesme ne demektir derslerde açıklanıyor. Burada bir kez daha açıklamak istemiyorum artık.
Örnek programda kesme nasıl açılmış görebilmen gerekir. Programın en sonunda da kesme alt programı mevcut.
Yazılanları tekrar oku bence. Burada anlatsam yine anlamayacağından eminim.
Biraz daha gayret.
Aslında pause yerine değişken tanımlayınca bu hali ile kesmeye gerek olmadan sistem doğru çalışabiliyor.

W     var word  şeklinde değişkeni tanımla
BASLA satırından hemen sonrasına;
w=w+1
if w=300 then
   SAYAC=SAYAC+1
   IF SAYAC=99 THEN SAYAC=0
   w=0
endif
satırlarını ekle.

Sonra çalıştır programı doğru çalıştığını göreceksin.  Kesmeye gerek yok.

Ete

sahinler64

#7
HOCAM buyuksun. allah razi olsun.
kesme konusunu baya inceledim ama anlayamadigim ici kesme kullanmadan yapmak istedim.
ama ögrenecegim.
ama hocam sormadanda edemeyecegim.kesme kullanmaya kalksam bu program üzerinde nasil degisiklikler yapmaliyim.

ete

TMR0 kesmesini açacaksın ve her 2 ms de bir kesme yaratacaksın.
Kesme etiketinde
TOGGLE SIRA
IF SIRA=0 then
SHIFTOUT DTA,CLK,1,[BIRLER]    '1. HANE
HIGH PORTB.1:PAUSE 2:X=0:LOW PORTB.1
ENDIF

IF SIRA=1 THEN
SHIFTOUT DTA,CLK,1,[ONLAR]    '2. HANE
HIGH PORTB.0:PAUSE 2:X=0:LOW PORTB.0
ENDIF
Kesme bayrağı sıfırlanacak
RESUME
ENABLE
şeklinde bitireceksin.
Dİkkat edersen shift komutlarını kesmeye aldık.
Ayrıca yazılacak değerleri BIRLER ve ONLAR diye ayırdık.
O halde programın BASLA satırı ile GOTO BASLA arasında,
Sayac önceki gibi bir artırılacak
X=SAYAC DIG 0:GOSUB SAYILAR:BIRLER=RAKAM
X=SAYAC DIG 1:GOSUB SAYILAR:ONLAR=RAKAM
yer alacak .
Hepsi bu kadar.
Umarım yapabilirsin.

Ete

sahinler64

HOCAM ALLAH RAZI OLSUN.
yardimlarinizla isimi hallettim. ama bir konuda daha yardima ihtiyacim var.simdi hocam ileri veya geri sayma isi tamam.hafizaya aldigim sayi kadar  kadar saydiktan sonra sistem bastan basliyor.
sorun su.sayac degiskeni word olarak yaptigimde maximum sayi 535 byte yaptigimda 255 olarak gorunuyor.sayac var byte deyip saydirmak istedigim sayiyi 260 yaparak hafizaya aldigimde hafizaya alinip sayilan sayi 5 olarak görünüyor.bu konuda yardimlrinizi bekliyorum.

ete

Word değişkeninde maksimum sayı 65535 dir 535 değil.
Byte değişkeninde maksimum sayı 255 dir. Bu sayıyı 260 yapamazsın.
Nasıl göründükleri senin elinde olan bir iş. O konuda benden yardım isteme çünki öyle görünmelerini sen ayarlamışsın. Nasıl istiyorsan öyle görünmelerini sağlamalısın.

Ete

greatgonzo

"hıgh byte" "low byte " gibi okuyosun sanki. Bir word iki byte tır sen nasıl okuyorsan sadece birini okuyormuşsun gibi. Bununla ilgili forumda tartısmalar var. Ete hocamın altını çizdiği kavramları araştır bence

İyi çalışmalar...

Powered by EzPortal