seven segment sayıcı

Başlatan usta, 22 Ocak 2013, 23:40:55

usta

Merhaba digit 595 ile sayıcı yapmaya çalışıyorum ama bir türlü ekrana bir şey basabilmiş değilim  nerede hata yapıyorum

PORTB=0
PORTA=0

TRISB=0
TRISA=%00000011
CMCON=7


Symbol CLK=PortB.0 '11
SYMBOL DTA=PORTB.1  '14
SYMBOL AKTAR=PORTB.2  '12
SYMBOL YUKARI=PORTA.0
SYMBOL ASAGI=PORTA.1
X VAR word
SAYMA VAR WORD
BIRLER VAR BYTE
ONLAR VAR BYTE
YUZLER VAR BYTE

PORTA=0
X=0
SAYMA=0
BIRLER=0
ONLAR=0
YUZLER=0
PAUSE 100
BASLA:
if sayma<=0 then sayma =0
IF YUKARI=1 THEN SAYMA=SAYMA+1
PAUSE 100
IF ASAGI=1 & sayma>=0 THEN SAYMA=SAYMA-1
PAUSE 100
if SAYMA=999 then SAYMA=0
GOSUB SAYI_AL
SHIFTOUT PORTB.0,PORTB.1,1,[BIRLER,ONLAR,YUZLER]
pulsout PORTB.2,2
SAYMA=SAYMA+1
PAUSE 100
if sayma = 999 then sayma = 0
GOTO BASLA

SAYI_AL:
X= SAYMA DIG 0
LOOKUP X,[63,6,91,79,102,109,125,7,127,111,99,57,64],BIRLER
X= SAYMA DIG 1
LOOKUP X,[63,6,91,79,102,109,125,7,127,111,99,57,64],ONLAR
X= SAYMA DIG 2
LOOKUP X,[63,6,91,79,102,109,125,7,127,111,99,57,64],YUZLER

RETURN
End

usta

Bir önerisi  yol gösteren olmayacakmı.

artapon

#2
devre şemanıda keşke koysaydın....

ETE hocanın notlarından 74HC595 nasıl çalıştığı hakkında bilgi mevcut vereyim belki işe yarar.
-74HC595 in 11 nolu bacağı CLK girişidir.
-74HC595 in 14 nolu bacağı DATA girişidir.
-74HC595 in 12 nolu bacağı KILIT (Latch) girişidir.
Puls verilirse bilgi çıkışa verilir
-74HC595 in 10 nolu bacağı MR (Mater Reset) girişidir.
Low verilirse reset atar.High da beklemelidir.
-74HC595 in 13 nolu bacağı OE (Output Enable) girişidir. Low da tutulmalıdır.
-74HC595 in 15 ve 1 den 7 ye kadar olan bacakları Paralel çıkış uçlarıdır.
-74HC595 in 9 nolu bacağı seri data çıkış bacağıdır. Bir sonraki 595'e bilgi aktarır.
Hepsi bu kadar. Data girişine verilen bilgi her clk palsi eşliğinde bit bazında içeri
alınır ve ön hafızada tutulur.
8 bitlik (1 byte) bilgi tamamlandıktan sonra Kilit bacağına bir puls
uygulanır ise içeri alına bilgi paralel çıkışlara aktarılır.

mesaj birleştirme:: 24 Ocak 2013, 19:05:36

http://elektrobilim.org/forum/pic-yazilim/5676-pic-basic-ile-74hc595-kontrol.html

bu link belki sana yardımncı olur...
Aldanma İnsanların Samimiyetine, Menfaatleri İçin Gelirler Vecde, Vaad Etmeseydi Allah cenneti, O'na Bile Etmezlerdi Secde!   (NFK)

ete

#3
Shiftout komut parametrelerin yanlış.
SHIFTOUT  DTA,CLK,1,[SAYI1,sayı2....]
şeklinde vermen lazım. Sen her ne hikmetse Symbol olarak,
Symbol CLK=PortB.0 '11
SYMBOL DTA=PORTB.1  '14
şeklinde tanımlama yapmışsın ama komut kullanırken şöyle vermişsin.
SHIFTOUT PORTB.0,PORTB.1,1,[BIRLER,ONLAR,YUZLER]
Birinci parametreye bakarsan PORTB.0 yani CLK halbuki orada DTA olması gerekirdi.
Bu komutu madem semboltanımlaması yaptın
SHIFTOUT DTA , CLK,1,[BIRLER,ONLAR,YUZLER]  şeklinde kullanmalısın.

Programında hiç bir sigorta ayarın yok. Config satırlarını programa ilave etmen gerekir.
Ayrıca çalışma frekansını belirleyecek olan Define OSC 4 şeklinde kristal frekansını belirtmen gerekir.

Açılış gecikmesi olarak 100 ms yeterli değildir. Bunu enaz 250 ms yada en iyisi 500 ms vermelisin.

Integer değişkenler kullanınca aşağıdaki komut anlamsız olmaktadır.
if sayma<=0 then sayma =0
Bir defa Sayma=0 ise Sayma=0 demek sana mantıklı geliyormu? Bir şey kendine eşitse yeniden eşitlemenin anlamı varmıdır.
İkincisi Sayma değeri integer değişkenlerde kesinlikle sıfırdan küçük olamaz. Sayı yı sürekli eksiltirsen önce sıfır olur sonra en başa döner. Byte ise 255 olur Word ise 65535 olur. O nedenle bu komut şöyle yazılmalıdır.
if sayma=65535 then sayma =0

Şu satırlar böyle yazılmamalı. Lüzumsuz yere programı gecikmeye uğratır.
IF YUKARI=1 THEN SAYMA=SAYMA+1
PAUSE 100
IF ASAGI=1 & sayma>=0 THEN SAYMA=SAYMA-1
PAUSE 100
Şöyle yazarsan yalnızca tuşa basılınca gecikme uygulanır değilse uygulanmaz.
IF YUKARI=1 then
   SAYMA=SAYMA+1
   PAUSE 100
ENDIF
diğerinide buna benzer yaparsın.

pulsout PORTB.2,2 komut satırı yerine  pulsout AKTAR,1 şeklinde komut kullan. Tanımladığın aktar sembolü boşa gitmesin.

Sayı değeri 999 olunca değil 1000 olunca sıfırlanmalıdır.
if sayma = 999 then sayma = 0  komutundaki 999 yerine 1000 yazmalısın.

Hem tuşlara basınca sayma yaptırıyorsun hemde program içine tuşlardan bağımsız olarak
SAYMA=SAYMA+1   şeklinde komut koymuşsun. Bu komut satırını silmen gerekir. Yoksa program hızlı bir şekilde sayar.

Ete



Bilgi hazinedir paylaştıkça büyür.            http://etepic.com

usta

#4
Merhaba arkadaşlar ve ete bey, satır satır yardımınız için teşekkür ederim sayenizde programda değişiklikleri yaptım ve çalışmaya başladı SIFTOUT CLK=PORTB.0  şeklinde derleme yaparken kırmızı satır hatası aldıgımdan bende onu Symbol CLK=PortB.0 değiştiince sorun kalktı anlayamadım diye böyle yapmıştım.Yeni uygulayarak yapmaya çalışıyorum anlamadıgıım yerde çok hali ile uygularken pekişiyor iş, neyse bende şu an çalışmakta ama butona her bastığımda sayma değilde 3-5 basışta 1 artma oluyor bunun sebebi simülasyondanmıdır gercektede uygulamada da böyle olacaktır buna bir bakmanızı istiyorum.Bu arada aklıma 1 reset 1 ileri 1 hafızaya alma için buton eklemek geldi toplam 5 tuş  senaryo şu her hane 1 buton 2 li çalışsın 10 saniye basılı tutunca ekrana hafızaya alınması için ayar menüsüne geçsin atıyorum yanıp sönsün devamlı 1  butonla ileri yani hanelerde 0-9 arası sayı yazsın 2 ci haneye gecsin ileri ile gene sayı yazsın 3 haneye geçsin  en son 10 saniye bastıgımz butona bu  sefer kısa basışta bu sayı hafızaya alınsın sonra sayıcı hafızaya aldıgı sayıya ulaştıgında PORTB.7 den bir çıkış alalım.
Şu an aklımdan gecenleri yazdım yanlışım veya yanlışım var ise katkıda bulunmanızdır.Sizin de öneriniz olursa lütfen yazın herkesin işine yarayabileceği bir uygulama olacaktır yaparkende öğrenmiş olacagız sizlerin katkıları ile  tabi.Ete bey yardımınz için tekrar teşekkür ederim + yardımlarınızı gene bekliyorum ,

Benim düşündüğüm şekli ile ,

ete

Programında hata var.
Bu tür hataları nasıl göremiyorsunuz gerçekten anlamıyorum. Bak şu kodlarına;

IF YUKARI=1 then
SAYMA=SAYMA+1
PAUSE 10
ENDIF

IF YUKARI=1 then
SAYMA=SAYMA-1
PAUSE 10
ENDIF
Yukarı tuşuna basınca SAYMA=SAYMA+1 yapılıyor
Ama hemen altında Yine Yukarı tuşuna basılınca bu seferde Sayma=sayma-1 yapılıyor.
Bu bir ileri bir geri gitme nedeni ile programın saymıyor demektir. Arada bir tuşa hızlı basarsan birinden biri çalışacaktır.
Tuş ekleme konusuna diyecek bir şeyim yok. EKle takıldığın yerde yeniden sor.

Ete

Bilgi hazinedir paylaştıkça büyür.            http://etepic.com

usta

Hocam işte kafa dönüyor demekki bakar kör moduna geçiyoruz   ;D ondan böyle hatalar oluşuyor teşekkürler katkıda bulunmak isteyen arkadaşlarında yardımını bekliyorum.